clock_control: extend API with clock rate query operation
Extend the public API of clock_control driver with a function for querying of clock rate driving given peripheral. This is useful when the driver must calculate or configurae values that depend on the rate of clock driving this subsystem. A baud rate setting of UART port is an example of such operation. To configure a particular baud rate the driver may need to set the internal counters of UART port, where the actual value will depend on the clock rate for this peripheral. The implementation returns DEV_NO_SUPPORT for clock_control drivers that do not implement such functionality. Change-Id: I4e7ec96cd3678a4bb1ff289b0247488289310f2d Origin: Original Signed-off-by: Maciej Borzecki <maciek.borzecki@gmail.com>
This commit is contained in:
parent
5cff3cc561
commit
14482f0940
2 changed files with 31 additions and 3 deletions
|
@ -22,6 +22,7 @@
|
|||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
#include <device.h>
|
||||
#include <misc/__assert.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
@ -41,9 +42,14 @@ typedef void *clock_control_subsys_t;
|
|||
|
||||
typedef int (*clock_control)(struct device *dev, clock_control_subsys_t sys);
|
||||
|
||||
typedef int (*clock_control_get)(struct device *dev,
|
||||
clock_control_subsys_t sys,
|
||||
uint32_t *rate);
|
||||
|
||||
struct clock_control_driver_api {
|
||||
clock_control on;
|
||||
clock_control off;
|
||||
clock_control on;
|
||||
clock_control off;
|
||||
clock_control_get get_rate;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -76,6 +82,27 @@ static inline int clock_control_off(struct device *dev,
|
|||
return api->off(dev, sys);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Obtain the clock rate of given sub-system
|
||||
* @param dev Pointer to the device structure for the clock controller driver
|
||||
* instance
|
||||
* @param sys A pointer to an opaque data representing the sub-system
|
||||
* @param[out] rate Subsystem clock rate
|
||||
*/
|
||||
static inline int clock_control_get_rate(struct device *dev,
|
||||
clock_control_subsys_t sys,
|
||||
uint32_t *rate)
|
||||
{
|
||||
struct clock_control_driver_api *api;
|
||||
|
||||
api = (struct clock_control_driver_api *)dev->driver_api;
|
||||
|
||||
__ASSERT(api->get_rate, "%s not implemented for device %s",
|
||||
__func__, dev->config->name);
|
||||
|
||||
return api->get_rate(dev, sys, rate);
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue