diff options
author | Vincenzo Frascino <vincenzo.frascino@linaro.org> | 2016-12-13 14:34:18 +0000 |
---|---|---|
committer | Kumar Gala <kumar.gala@linaro.org> | 2017-01-23 15:15:54 -0600 |
commit | d36543828b9f6e178fd5aad8c6b3d465b78e255f (patch) | |
tree | 42581f788986d53e645a6c17b5548acf06a6edbf /drivers | |
parent | 8971da0375711e03e4fe20fd5d4a240c4723ed0f (diff) |
counter: cmsdk: Add clock control to TMR Counters.
This patch adds clock control to the counters based on Timer 0 and 1.
Jira: ZEP-1300
Change-Id: I14499a833fe9720496ab7905bc1466e9b03bb316
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@linaro.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/counter/counter_tmr_cmsdk_apb.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/drivers/counter/counter_tmr_cmsdk_apb.c b/drivers/counter/counter_tmr_cmsdk_apb.c index 98ba80ade..fbe1ff6f2 100644 --- a/drivers/counter/counter_tmr_cmsdk_apb.c +++ b/drivers/counter/counter_tmr_cmsdk_apb.c @@ -9,6 +9,7 @@ #include <errno.h> #include <init.h> #include <soc.h> +#include <clock_control/arm_clock_control.h> #include "timer_cmsdk_apb.h" @@ -16,6 +17,12 @@ struct counter_tmr_cmsdk_apb_cfg { volatile struct timer_cmsdk_apb *timer; + /* Timer Clock control in Active State */ + const struct arm_clock_control_t timer_cc_as; + /* Timer Clock control in Sleep State */ + const struct arm_clock_control_t timer_cc_ss; + /* Timer Clock control in Deep Sleep State */ + const struct arm_clock_control_t timer_cc_dss; }; static int counter_tmr_cmsdk_apb_start(struct device *dev) @@ -72,7 +79,22 @@ static const struct counter_driver_api counter_tmr_cmsdk_apb_api = { static int counter_tmr_cmsdk_apb_init(struct device *dev) { +#ifdef CONFIG_CLOCK_CONTROL + /* Enable clock for subsystem */ + struct device *clk = + device_get_binding(CONFIG_ARM_CLOCK_CONTROL_DEV_NAME); + + const struct counter_tmr_cmsdk_apb_cfg * const cfg = + dev->config->config_info; + +#ifdef CONFIG_SOC_SERIES_BEETLE + clock_control_on(clk, (clock_control_subsys_t *) &cfg->timer_cc_as); + clock_control_on(clk, (clock_control_subsys_t *) &cfg->timer_cc_ss); + clock_control_on(clk, (clock_control_subsys_t *) &cfg->timer_cc_dss); +#endif /* CONFIG_SOC_SERIES_BEETLE */ +#else ARG_UNUSED(dev); +#endif /* CONFIG_CLOCK_CONTROL */ return 0; } @@ -81,6 +103,12 @@ static int counter_tmr_cmsdk_apb_init(struct device *dev) #ifdef CONFIG_COUNTER_TMR_CMSDK_APB_0 static const struct counter_tmr_cmsdk_apb_cfg counter_tmr_cmsdk_apb_cfg_0 = { .timer = ((volatile struct timer_cmsdk_apb *)CMSDK_APB_TIMER0), + .timer_cc_as = {.bus = CMSDK_APB, .state = SOC_ACTIVE, + .device = CMSDK_APB_TIMER0,}, + .timer_cc_ss = {.bus = CMSDK_APB, .state = SOC_SLEEP, + .device = CMSDK_APB_TIMER0,}, + .timer_cc_dss = {.bus = CMSDK_APB, .state = SOC_DEEPSLEEP, + .device = CMSDK_APB_TIMER0,}, }; DEVICE_AND_API_INIT(counter_tmr_cmsdk_apb_0, @@ -95,6 +123,12 @@ DEVICE_AND_API_INIT(counter_tmr_cmsdk_apb_0, #ifdef CONFIG_COUNTER_TMR_CMSDK_APB_1 static const struct counter_tmr_cmsdk_apb_cfg counter_tmr_cmsdk_apb_cfg_1 = { .timer = ((volatile struct timer_cmsdk_apb *)CMSDK_APB_TIMER1), + .timer_cc_as = {.bus = CMSDK_APB, .state = SOC_ACTIVE, + .device = CMSDK_APB_TIMER1,}, + .timer_cc_ss = {.bus = CMSDK_APB, .state = SOC_SLEEP, + .device = CMSDK_APB_TIMER1,}, + .timer_cc_dss = {.bus = CMSDK_APB, .state = SOC_DEEPSLEEP, + .device = CMSDK_APB_TIMER1,}, }; DEVICE_AND_API_INIT(counter_tmr_cmsdk_apb_1, |