summaryrefslogtreecommitdiffstats
path: root/target/linux/ramips/patches-3.9/0155-reset-MIPS-ralink-add-core-device-reset-wrapper.patch
blob: ca2f298987feb78b16cdb9378838840d87fa8594 (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
From 4bec674c9f3f0bc137cf5aa4d2cb01e9f8027b3d Mon Sep 17 00:00:00 2001
From: John Crispin <blogic@openwrt.org>
Date: Wed, 8 May 2013 22:08:39 +0200
Subject: [PATCH 155/164] 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(+)

--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -444,6 +444,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)"
--- 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;
--- 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>