63 lines
2.0 KiB
Diff
63 lines
2.0 KiB
Diff
From 99489f45debd07f6e1cfa36f5c9890409714518d Mon Sep 17 00:00:00 2001
|
|
From: Maxime Ripard <maxime.ripard@free-electrons.com>
|
|
Date: Fri, 20 Dec 2013 22:41:08 +0100
|
|
Subject: [PATCH] clocksource: sun5i: Add support for reset controller
|
|
|
|
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>
|
|
---
|
|
.../devicetree/bindings/timer/allwinner,sun5i-a13-hstimer.txt | 4 ++++
|
|
drivers/clocksource/timer-sun5i.c | 6 ++++++
|
|
2 files changed, 10 insertions(+)
|
|
|
|
--- a/Documentation/devicetree/bindings/timer/allwinner,sun5i-a13-hstimer.txt
|
|
+++ b/Documentation/devicetree/bindings/timer/allwinner,sun5i-a13-hstimer.txt
|
|
@@ -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>;
|
|
};
|
|
--- a/drivers/clocksource/timer-sun5i.c
|
|
+++ b/drivers/clocksource/timer-sun5i.c
|
|
@@ -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 u32 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(stru
|
|
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));
|