clocksource: sun5i: Add support for reset controller
authorMaxime Ripard <maxime.ripard@free-electrons.com>
Thu, 17 Apr 2014 09:06:45 +0000 (11:06 +0200)
committerDaniel Lezcano <daniel.lezcano@linaro.org>
Tue, 22 Apr 2014 11:56:50 +0000 (13:56 +0200)
The Allwinner A31 that uses this timer has the timer IP asserted in reset.
Add an optional reset property to the DT, and deassert the timer from reset if
it's there.

Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Documentation/devicetree/bindings/timer/allwinner,sun5i-a13-hstimer.txt
drivers/clocksource/timer-sun5i.c

index 7c26154b8bbb6a39bd2b5d0a748cf2b54b56051b..27cfc7d7ccd741e2542be3b66e46a13c2d956184 100644 (file)
@@ -9,6 +9,9 @@ Required properties:
                one)
 - clocks: phandle to the source clock (usually the AHB clock)
 
+Optionnal properties:
+- resets: phandle to a reset controller asserting the timer
+
 Example:
 
 timer@01c60000 {
@@ -19,4 +22,5 @@ timer@01c60000 {
                     <0 53 1>,
                     <0 54 1>;
        clocks = <&ahb1_gates 19>;
+       resets = <&ahb1rst 19>;
 };
index deebcd6469fced2c9b131447b75085c887068b6d..02268448dc8540a9f53113f28c29e6a292209a5a 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/interrupt.h>
 #include <linux/irq.h>
 #include <linux/irqreturn.h>
+#include <linux/reset.h>
 #include <linux/sched_clock.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
@@ -143,6 +144,7 @@ static u64 sun5i_timer_sched_read(void)
 
 static void __init sun5i_timer_init(struct device_node *node)
 {
+       struct reset_control *rstc;
        unsigned long rate;
        struct clk *clk;
        int ret, irq;
@@ -162,6 +164,10 @@ static void __init sun5i_timer_init(struct device_node *node)
        clk_prepare_enable(clk);
        rate = clk_get_rate(clk);
 
+       rstc = of_reset_control_get(node, NULL);
+       if (!IS_ERR(rstc))
+               reset_control_deassert(rstc);
+
        writel(~0, timer_base + TIMER_INTVAL_LO_REG(1));
        writel(TIMER_CTL_ENABLE | TIMER_CTL_RELOAD,
               timer_base + TIMER_CTL_REG(1));