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:
Maciek Borzecki 2016-03-05 15:08:51 +01:00 committed by Daniel Kalowsky
commit 14482f0940
2 changed files with 31 additions and 3 deletions

View file

@ -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