summaryrefslogtreecommitdiff
path: root/target/linux/ramips/patches-3.8/0068-reset-MIPS-ralink-add-core-device-reset-wrapper.patch
blob: 29a0991595cf207a7e12d05c7aa2c89e76a7c575 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
From 42c26796ae7bcfe0b33a4145de5a392e32bc9bac Mon Sep 17 00:00:00 2001
From: John Crispin <blogic@openwrt.org>
Date: Wed, 8 May 2013 22:08:39 +0200
Subject: [PATCH 68/79] reset: MIPS: ralink: add core/device reset wrapper

Add a helper for reseting different devices ont he SoC.

Signed-off-by: John Crispin <blogic@openwrt.org>
---
 arch/mips/Kconfig        |    1 +
 arch/mips/ralink/of.c    |   59 ++++++++++++++++++++++++++++++++++++++++++++++
 arch/mips/ralink/reset.c |    1 +
 3 files changed, 61 insertions(+)

diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index 2498972..ef5272f 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -450,6 +450,7 @@ config RALINK
 	select HAVE_MACH_CLKDEV
 	select CLKDEV_LOOKUP
 	select ARCH_REQUIRE_GPIOLIB
+	select ARCH_HAS_RESET_CONTROLLER
 
 config SGI_IP22
 	bool "SGI IP22 (Indy/Indigo2)"
diff --git a/arch/mips/ralink/of.c b/arch/mips/ralink/of.c
index 8efb02b..2faf478 100644
--- a/arch/mips/ralink/of.c
+++ b/arch/mips/ralink/of.c
@@ -14,16 +14,22 @@
 #include <linux/sizes.h>
 #include <linux/of_fdt.h>
 #include <linux/kernel.h>
+#include <linux/module.h>
 #include <linux/bootmem.h>
 #include <linux/of_platform.h>
 #include <linux/of_address.h>
+#include <linux/reset-controller.h>
 
 #include <asm/reboot.h>
 #include <asm/bootinfo.h>
 #include <asm/addrspace.h>
 
+#include <asm/mach-ralink/ralink_regs.h>
+
 #include "common.h"
 
+#define SYSC_REG_RESET_CTRL     0x034
+
 __iomem void *rt_sysc_membase;
 __iomem void *rt_memc_membase;
 
@@ -96,6 +102,53 @@ void __init plat_mem_setup(void)
 				     soc_info.mem_size_max * SZ_1M);
 }
 
+static int ralink_assert_device(struct reset_controller_dev *rcdev, unsigned long id)
+{
+	u32 val;
+
+	if (id < 8)
+		return -1;
+
+	val = rt_sysc_r32(SYSC_REG_RESET_CTRL);
+	val |= BIT(id);
+	rt_sysc_w32(val, SYSC_REG_RESET_CTRL);
+
+	return 0;
+}
+
+static int ralink_deassert_device(struct reset_controller_dev *rcdev, unsigned long id)
+{
+	u32 val;
+
+	if (id < 8)
+		return -1;
+
+	val = rt_sysc_r32(SYSC_REG_RESET_CTRL);
+	val &= ~BIT(id);
+	rt_sysc_w32(val, SYSC_REG_RESET_CTRL);
+
+	return 0;
+}
+
+static int ralink_reset_device(struct reset_controller_dev *rcdev, unsigned long id)
+{
+	ralink_assert_device(rcdev, id);
+	return ralink_deassert_device(rcdev, id);
+}
+
+static struct reset_control_ops reset_ops = {
+	.reset = ralink_reset_device,
+	.assert = ralink_assert_device,
+	.deassert = ralink_deassert_device,
+};
+
+static struct reset_controller_dev reset_dev = {
+	.ops			= &reset_ops,
+	.owner			= THIS_MODULE,
+	.nr_resets		= 32,
+	.of_reset_n_cells	= 1,
+};
+
 static int __init plat_of_setup(void)
 {
 	static struct of_device_id of_ids[3];
@@ -110,6 +163,12 @@ static int __init plat_of_setup(void)
 	if (of_platform_populate(NULL, of_ids, NULL, NULL))
 		panic("failed to populate DT\n");
 
+	reset_dev.of_node = of_find_compatible_node(NULL, NULL, "ralink,rt2880-reset");
+	if (!reset_dev.of_node)
+		panic("Failed to find reset controller node");
+
+	reset_controller_register(&reset_dev);
+
 	ralink_pinmux();
 
 	return 0;
diff --git a/arch/mips/ralink/reset.c b/arch/mips/ralink/reset.c
index 22120e5..6c15f4f 100644
--- a/arch/mips/ralink/reset.c
+++ b/arch/mips/ralink/reset.c
@@ -10,6 +10,7 @@
 
 #include <linux/pm.h>
 #include <linux/io.h>
+#include <linux/module.h>
 
 #include <asm/reboot.h>
 
-- 
1.7.10.4