Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 7 additions & 8 deletions include/drivers/counter.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
};

/**
Expand Down Expand Up @@ -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;
}

/**
Expand All @@ -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;
}
Expand All @@ -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);
}

/**
Expand Down