drivers: counter: Added get_freq to API

Optional counter API function which allows for a driver to determine
counter frequency at runtime; if set, this supersedes whatever is set
statically in the counter_config_info struct.

Signed-off-by: Kent Hall <kjh2166@columbia.edu>
This commit is contained in:
Kent Hall 2021-12-07 21:37:03 -05:00 committed by Christopher Friedt
commit c67b44c96a

View file

@ -188,6 +188,7 @@ typedef uint32_t (*counter_api_get_guard_period)(const struct device *dev,
typedef int (*counter_api_set_guard_period)(const struct device *dev,
uint32_t ticks,
uint32_t flags);
typedef uint32_t (*counter_api_get_freq)(const struct device *dev);
__subsystem struct counter_driver_api {
counter_api_start start;
@ -200,6 +201,7 @@ __subsystem struct counter_driver_api {
counter_api_get_top_value get_top_value;
counter_api_get_guard_period get_guard_period;
counter_api_set_guard_period set_guard_period;
counter_api_get_freq get_freq;
};
/**
@ -251,8 +253,10 @@ static inline uint32_t z_impl_counter_get_frequency(const struct device *dev)
{
const struct counter_config_info *config =
(const struct counter_config_info *)dev->config;
const struct counter_driver_api *api =
(struct counter_driver_api *)dev->api;
return config->freq;
return api->get_freq ? api->get_freq(dev) : config->freq;
}
/**
@ -268,9 +272,7 @@ __syscall uint32_t counter_us_to_ticks(const struct device *dev, uint64_t us);
static inline uint32_t z_impl_counter_us_to_ticks(const struct device *dev,
uint64_t us)
{
const struct counter_config_info *config =
(const struct counter_config_info *)dev->config;
uint64_t ticks = (us * config->freq) / USEC_PER_SEC;
uint64_t ticks = (us * z_impl_counter_get_frequency(dev)) / USEC_PER_SEC;
return (ticks > (uint64_t)UINT32_MAX) ? UINT32_MAX : ticks;
}
@ -288,10 +290,7 @@ __syscall uint64_t counter_ticks_to_us(const struct device *dev, uint32_t ticks)
static inline uint64_t z_impl_counter_ticks_to_us(const struct device *dev,
uint32_t ticks)
{
const struct counter_config_info *config =
(const struct counter_config_info *)dev->config;
return ((uint64_t)ticks * USEC_PER_SEC) / config->freq;
return ((uint64_t)ticks * USEC_PER_SEC) / z_impl_counter_get_frequency(dev);
}
/**