summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorVincenzo Frascino <vincenzo.frascino@linaro.org>2016-12-13 14:34:18 +0000
committerKumar Gala <kumar.gala@linaro.org>2017-01-23 15:15:54 -0600
commitd36543828b9f6e178fd5aad8c6b3d465b78e255f (patch)
tree42581f788986d53e645a6c17b5548acf06a6edbf /drivers
parent8971da0375711e03e4fe20fd5d4a240c4723ed0f (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.c34
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,