aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Michlmayr <tbm@cyrius.com>2009-11-05 15:27:46 -0500
committerNicolas Pitre <nico@fluxnic.net>2009-11-13 12:14:24 -0500
commit8d27b2f7988b652dbabf79291a3e2550c06e1af5 (patch)
tree595ded246acfaf068b3426253bc09864a952e2b8
parent287989cac25ad71002153d55875584210adf78bd (diff)
[ARM] Kirkwood: Remove code duplication in QNAP setup files
Remove the code duplication found in the setup files of TS-219 and TS-41x. Signed-off-by: Martin Michlmayr <tbm@cyrius.com> Signed-off-by: Nicolas Pitre <nico@marvell.com>
-rw-r--r--arch/arm/mach-kirkwood/Makefile4
-rw-r--r--arch/arm/mach-kirkwood/ts219-setup.c105
-rw-r--r--arch/arm/mach-kirkwood/ts41x-setup.c105
-rw-r--r--arch/arm/mach-kirkwood/tsx1x-common.c113
-rw-r--r--arch/arm/mach-kirkwood/tsx1x-common.h7
5 files changed, 128 insertions, 206 deletions
diff --git a/arch/arm/mach-kirkwood/Makefile b/arch/arm/mach-kirkwood/Makefile
index 0c79cedfa64d..9f2f67b2b63d 100644
--- a/arch/arm/mach-kirkwood/Makefile
+++ b/arch/arm/mach-kirkwood/Makefile
@@ -5,8 +5,8 @@ obj-$(CONFIG_MACH_RD88F6192_NAS) += rd88f6192-nas-setup.o
5obj-$(CONFIG_MACH_RD88F6281) += rd88f6281-setup.o 5obj-$(CONFIG_MACH_RD88F6281) += rd88f6281-setup.o
6obj-$(CONFIG_MACH_MV88F6281GTW_GE) += mv88f6281gtw_ge-setup.o 6obj-$(CONFIG_MACH_MV88F6281GTW_GE) += mv88f6281gtw_ge-setup.o
7obj-$(CONFIG_MACH_SHEEVAPLUG) += sheevaplug-setup.o 7obj-$(CONFIG_MACH_SHEEVAPLUG) += sheevaplug-setup.o
8obj-$(CONFIG_MACH_TS219) += ts219-setup.o 8obj-$(CONFIG_MACH_TS219) += ts219-setup.o tsx1x-common.o
9obj-$(CONFIG_MACH_TS41X) += ts41x-setup.o 9obj-$(CONFIG_MACH_TS41X) += ts41x-setup.o tsx1x-common.o
10obj-$(CONFIG_MACH_OPENRD_BASE) += openrd_base-setup.o 10obj-$(CONFIG_MACH_OPENRD_BASE) += openrd_base-setup.o
11 11
12obj-$(CONFIG_CPU_IDLE) += cpuidle.o 12obj-$(CONFIG_CPU_IDLE) += cpuidle.o
diff --git a/arch/arm/mach-kirkwood/ts219-setup.c b/arch/arm/mach-kirkwood/ts219-setup.c
index a7c209d599e8..2830f0fe80e0 100644
--- a/arch/arm/mach-kirkwood/ts219-setup.c
+++ b/arch/arm/mach-kirkwood/ts219-setup.c
@@ -14,87 +14,17 @@
14#include <linux/kernel.h> 14#include <linux/kernel.h>
15#include <linux/init.h> 15#include <linux/init.h>
16#include <linux/platform_device.h> 16#include <linux/platform_device.h>
17#include <linux/mtd/physmap.h>
18#include <linux/spi/flash.h>
19#include <linux/spi/spi.h>
20#include <linux/spi/orion_spi.h>
21#include <linux/i2c.h> 17#include <linux/i2c.h>
22#include <linux/mv643xx_eth.h> 18#include <linux/mv643xx_eth.h>
23#include <linux/ata_platform.h> 19#include <linux/ata_platform.h>
24#include <linux/gpio_keys.h> 20#include <linux/gpio_keys.h>
25#include <linux/input.h> 21#include <linux/input.h>
26#include <linux/timex.h>
27#include <linux/serial_reg.h>
28#include <linux/pci.h>
29#include <asm/mach-types.h> 22#include <asm/mach-types.h>
30#include <asm/mach/arch.h> 23#include <asm/mach/arch.h>
31#include <mach/kirkwood.h> 24#include <mach/kirkwood.h>
32#include "common.h" 25#include "common.h"
33#include "mpp.h" 26#include "mpp.h"
34 27#include "tsx1x-common.h"
35/****************************************************************************
36 * 16 MiB NOR flash. The struct mtd_partition is not in the same order as the
37 * partitions on the device because we want to keep compatability with
38 * the QNAP firmware.
39 * Layout as used by QNAP:
40 * 0x00000000-0x00080000 : "U-Boot"
41 * 0x00200000-0x00400000 : "Kernel"
42 * 0x00400000-0x00d00000 : "RootFS"
43 * 0x00d00000-0x01000000 : "RootFS2"
44 * 0x00080000-0x000c0000 : "U-Boot Config"
45 * 0x000c0000-0x00200000 : "NAS Config"
46 *
47 * We'll use "RootFS1" instead of "RootFS" to stay compatible with the layout
48 * used by the QNAP TS-109/TS-209.
49 *
50 ***************************************************************************/
51
52static struct mtd_partition qnap_ts219_partitions[] = {
53 {
54 .name = "U-Boot",
55 .size = 0x00080000,
56 .offset = 0,
57 .mask_flags = MTD_WRITEABLE,
58 }, {
59 .name = "Kernel",
60 .size = 0x00200000,
61 .offset = 0x00200000,
62 }, {
63 .name = "RootFS1",
64 .size = 0x00900000,
65 .offset = 0x00400000,
66 }, {
67 .name = "RootFS2",
68 .size = 0x00300000,
69 .offset = 0x00d00000,
70 }, {
71 .name = "U-Boot Config",
72 .size = 0x00040000,
73 .offset = 0x00080000,
74 }, {
75 .name = "NAS Config",
76 .size = 0x00140000,
77 .offset = 0x000c0000,
78 },
79};
80
81static const struct flash_platform_data qnap_ts219_flash = {
82 .type = "m25p128",
83 .name = "spi_flash",
84 .parts = qnap_ts219_partitions,
85 .nr_parts = ARRAY_SIZE(qnap_ts219_partitions),
86};
87
88static struct spi_board_info __initdata qnap_ts219_spi_slave_info[] = {
89 {
90 .modalias = "m25p80",
91 .platform_data = &qnap_ts219_flash,
92 .irq = -1,
93 .max_speed_hz = 20000000,
94 .bus_num = 0,
95 .chip_select = 0,
96 },
97};
98 28
99static struct i2c_board_info __initdata qnap_ts219_i2c_rtc = { 29static struct i2c_board_info __initdata qnap_ts219_i2c_rtc = {
100 I2C_BOARD_INFO("s35390a", 0x30), 30 I2C_BOARD_INFO("s35390a", 0x30),
@@ -156,33 +86,6 @@ static unsigned int qnap_ts219_mpp_config[] __initdata = {
156 0 86 0
157}; 87};
158 88
159
160/*****************************************************************************
161 * QNAP TS-x19 specific power off method via UART1-attached PIC
162 ****************************************************************************/
163
164#define UART1_REG(x) (UART1_VIRT_BASE + ((UART_##x) << 2))
165
166void qnap_ts219_power_off(void)
167{
168 /* 19200 baud divisor */
169 const unsigned divisor = ((kirkwood_tclk + (8 * 19200)) / (16 * 19200));
170
171 pr_info("%s: triggering power-off...\n", __func__);
172
173 /* hijack UART1 and reset into sane state (19200,8n1) */
174 writel(0x83, UART1_REG(LCR));
175 writel(divisor & 0xff, UART1_REG(DLL));
176 writel((divisor >> 8) & 0xff, UART1_REG(DLM));
177 writel(0x03, UART1_REG(LCR));
178 writel(0x00, UART1_REG(IER));
179 writel(0x00, UART1_REG(FCR));
180 writel(0x00, UART1_REG(MCR));
181
182 /* send the power-off command 'A' to PIC */
183 writel('A', UART1_REG(TX));
184}
185
186static void __init qnap_ts219_init(void) 89static void __init qnap_ts219_init(void)
187{ 90{
188 /* 91 /*
@@ -193,9 +96,7 @@ static void __init qnap_ts219_init(void)
193 96
194 kirkwood_uart0_init(); 97 kirkwood_uart0_init();
195 kirkwood_uart1_init(); /* A PIC controller is connected here. */ 98 kirkwood_uart1_init(); /* A PIC controller is connected here. */
196 spi_register_board_info(qnap_ts219_spi_slave_info, 99 qnap_tsx1x_register_flash();
197 ARRAY_SIZE(qnap_ts219_spi_slave_info));
198 kirkwood_spi_init();
199 kirkwood_i2c_init(); 100 kirkwood_i2c_init();
200 i2c_register_board_info(0, &qnap_ts219_i2c_rtc, 1); 101 i2c_register_board_info(0, &qnap_ts219_i2c_rtc, 1);
201 kirkwood_ge00_init(&qnap_ts219_ge00_data); 102 kirkwood_ge00_init(&qnap_ts219_ge00_data);
@@ -203,7 +104,7 @@ static void __init qnap_ts219_init(void)
203 kirkwood_ehci_init(); 104 kirkwood_ehci_init();
204 platform_device_register(&qnap_ts219_button_device); 105 platform_device_register(&qnap_ts219_button_device);
205 106
206 pm_power_off = qnap_ts219_power_off; 107 pm_power_off = qnap_tsx1x_power_off;
207 108
208} 109}
209 110
diff --git a/arch/arm/mach-kirkwood/ts41x-setup.c b/arch/arm/mach-kirkwood/ts41x-setup.c
index a1972c948503..de49c2d9e74b 100644
--- a/arch/arm/mach-kirkwood/ts41x-setup.c
+++ b/arch/arm/mach-kirkwood/ts41x-setup.c
@@ -14,87 +14,17 @@
14#include <linux/kernel.h> 14#include <linux/kernel.h>
15#include <linux/init.h> 15#include <linux/init.h>
16#include <linux/platform_device.h> 16#include <linux/platform_device.h>
17#include <linux/mtd/physmap.h>
18#include <linux/spi/flash.h>
19#include <linux/spi/spi.h>
20#include <linux/spi/orion_spi.h>
21#include <linux/i2c.h> 17#include <linux/i2c.h>
22#include <linux/mv643xx_eth.h> 18#include <linux/mv643xx_eth.h>
23#include <linux/ata_platform.h> 19#include <linux/ata_platform.h>
24#include <linux/gpio_keys.h> 20#include <linux/gpio_keys.h>
25#include <linux/input.h> 21#include <linux/input.h>
26#include <linux/timex.h>
27#include <linux/serial_reg.h>
28#include <linux/pci.h>
29#include <asm/mach-types.h> 22#include <asm/mach-types.h>
30#include <asm/mach/arch.h> 23#include <asm/mach/arch.h>
31#include <mach/kirkwood.h> 24#include <mach/kirkwood.h>
32#include "common.h" 25#include "common.h"
33#include "mpp.h" 26#include "mpp.h"
34 27#include "tsx1x-common.h"
35/****************************************************************************
36 * 16 MiB NOR flash. The struct mtd_partition is not in the same order as the
37 * partitions on the device because we want to keep compatability with
38 * the QNAP firmware.
39 * Layout as used by QNAP:
40 * 0x00000000-0x00080000 : "U-Boot"
41 * 0x00200000-0x00400000 : "Kernel"
42 * 0x00400000-0x00d00000 : "RootFS"
43 * 0x00d00000-0x01000000 : "RootFS2"
44 * 0x00080000-0x000c0000 : "U-Boot Config"
45 * 0x000c0000-0x00200000 : "NAS Config"
46 *
47 * We'll use "RootFS1" instead of "RootFS" to stay compatible with the layout
48 * used by the QNAP TS-109/TS-209.
49 *
50 ***************************************************************************/
51
52static struct mtd_partition qnap_ts41x_partitions[] = {
53 {
54 .name = "U-Boot",
55 .size = 0x00080000,
56 .offset = 0,
57 .mask_flags = MTD_WRITEABLE,
58 }, {
59 .name = "Kernel",
60 .size = 0x00200000,
61 .offset = 0x00200000,
62 }, {
63 .name = "RootFS1",
64 .size = 0x00900000,
65 .offset = 0x00400000,
66 }, {
67 .name = "RootFS2",
68 .size = 0x00300000,
69 .offset = 0x00d00000,
70 }, {
71 .name = "U-Boot Config",
72 .size = 0x00040000,
73 .offset = 0x00080000,
74 }, {
75 .name = "NAS Config",
76 .size = 0x00140000,
77 .offset = 0x000c0000,
78 },
79};
80
81static const struct flash_platform_data qnap_ts41x_flash = {
82 .type = "m25p128",
83 .name = "spi_flash",
84 .parts = qnap_ts41x_partitions,
85 .nr_parts = ARRAY_SIZE(qnap_ts41x_partitions),
86};
87
88static struct spi_board_info __initdata qnap_ts41x_spi_slave_info[] = {
89 {
90 .modalias = "m25p80",
91 .platform_data = &qnap_ts41x_flash,
92 .irq = -1,
93 .max_speed_hz = 20000000,
94 .bus_num = 0,
95 .chip_select = 0,
96 },
97};
98 28
99static struct i2c_board_info __initdata qnap_ts41x_i2c_rtc = { 29static struct i2c_board_info __initdata qnap_ts41x_i2c_rtc = {
100 I2C_BOARD_INFO("s35390a", 0x30), 30 I2C_BOARD_INFO("s35390a", 0x30),
@@ -180,33 +110,6 @@ static unsigned int qnap_ts41x_mpp_config[] __initdata = {
180 0 110 0
181}; 111};
182 112
183
184/*****************************************************************************
185 * QNAP TS-x19 specific power off method via UART1-attached PIC
186 ****************************************************************************/
187
188#define UART1_REG(x) (UART1_VIRT_BASE + ((UART_##x) << 2))
189
190void qnap_ts41x_power_off(void)
191{
192 /* 19200 baud divisor */
193 const unsigned divisor = ((kirkwood_tclk + (8 * 19200)) / (16 * 19200));
194
195 pr_info("%s: triggering power-off...\n", __func__);
196
197 /* hijack UART1 and reset into sane state (19200,8n1) */
198 writel(0x83, UART1_REG(LCR));
199 writel(divisor & 0xff, UART1_REG(DLL));
200 writel((divisor >> 8) & 0xff, UART1_REG(DLM));
201 writel(0x03, UART1_REG(LCR));
202 writel(0x00, UART1_REG(IER));
203 writel(0x00, UART1_REG(FCR));
204 writel(0x00, UART1_REG(MCR));
205
206 /* send the power-off command 'A' to PIC */
207 writel('A', UART1_REG(TX));
208}
209
210static void __init qnap_ts41x_init(void) 113static void __init qnap_ts41x_init(void)
211{ 114{
212 /* 115 /*
@@ -217,9 +120,7 @@ static void __init qnap_ts41x_init(void)
217 120
218 kirkwood_uart0_init(); 121 kirkwood_uart0_init();
219 kirkwood_uart1_init(); /* A PIC controller is connected here. */ 122 kirkwood_uart1_init(); /* A PIC controller is connected here. */
220 spi_register_board_info(qnap_ts41x_spi_slave_info, 123 qnap_tsx1x_register_flash();
221 ARRAY_SIZE(qnap_ts41x_spi_slave_info));
222 kirkwood_spi_init();
223 kirkwood_i2c_init(); 124 kirkwood_i2c_init();
224 i2c_register_board_info(0, &qnap_ts41x_i2c_rtc, 1); 125 i2c_register_board_info(0, &qnap_ts41x_i2c_rtc, 1);
225 kirkwood_ge00_init(&qnap_ts41x_ge00_data); 126 kirkwood_ge00_init(&qnap_ts41x_ge00_data);
@@ -228,7 +129,7 @@ static void __init qnap_ts41x_init(void)
228 kirkwood_ehci_init(); 129 kirkwood_ehci_init();
229 platform_device_register(&qnap_ts41x_button_device); 130 platform_device_register(&qnap_ts41x_button_device);
230 131
231 pm_power_off = qnap_ts41x_power_off; 132 pm_power_off = qnap_tsx1x_power_off;
232 133
233} 134}
234 135
diff --git a/arch/arm/mach-kirkwood/tsx1x-common.c b/arch/arm/mach-kirkwood/tsx1x-common.c
new file mode 100644
index 000000000000..7221c20b2afa
--- /dev/null
+++ b/arch/arm/mach-kirkwood/tsx1x-common.c
@@ -0,0 +1,113 @@
1#include <linux/kernel.h>
2#include <linux/pci.h>
3#include <linux/platform_device.h>
4#include <linux/mtd/physmap.h>
5#include <linux/spi/flash.h>
6#include <linux/spi/spi.h>
7#include <linux/spi/orion_spi.h>
8#include <linux/serial_reg.h>
9#include <mach/kirkwood.h>
10#include "common.h"
11
12/*
13 * QNAP TS-x1x Boards flash
14 */
15
16/****************************************************************************
17 * 16 MiB NOR flash. The struct mtd_partition is not in the same order as the
18 * partitions on the device because we want to keep compatability with
19 * the QNAP firmware.
20 * Layout as used by QNAP:
21 * 0x00000000-0x00080000 : "U-Boot"
22 * 0x00200000-0x00400000 : "Kernel"
23 * 0x00400000-0x00d00000 : "RootFS"
24 * 0x00d00000-0x01000000 : "RootFS2"
25 * 0x00080000-0x000c0000 : "U-Boot Config"
26 * 0x000c0000-0x00200000 : "NAS Config"
27 *
28 * We'll use "RootFS1" instead of "RootFS" to stay compatible with the layout
29 * used by the QNAP TS-109/TS-209.
30 *
31 ***************************************************************************/
32
33struct mtd_partition qnap_tsx1x_partitions[] = {
34 {
35 .name = "U-Boot",
36 .size = 0x00080000,
37 .offset = 0,
38 .mask_flags = MTD_WRITEABLE,
39 }, {
40 .name = "Kernel",
41 .size = 0x00200000,
42 .offset = 0x00200000,
43 }, {
44 .name = "RootFS1",
45 .size = 0x00900000,
46 .offset = 0x00400000,
47 }, {
48 .name = "RootFS2",
49 .size = 0x00300000,
50 .offset = 0x00d00000,
51 }, {
52 .name = "U-Boot Config",
53 .size = 0x00040000,
54 .offset = 0x00080000,
55 }, {
56 .name = "NAS Config",
57 .size = 0x00140000,
58 .offset = 0x000c0000,
59 },
60};
61
62const struct flash_platform_data qnap_tsx1x_flash = {
63 .type = "m25p128",
64 .name = "spi_flash",
65 .parts = qnap_tsx1x_partitions,
66 .nr_parts = ARRAY_SIZE(qnap_tsx1x_partitions),
67};
68
69struct spi_board_info __initdata qnap_tsx1x_spi_slave_info[] = {
70 {
71 .modalias = "m25p80",
72 .platform_data = &qnap_tsx1x_flash,
73 .irq = -1,
74 .max_speed_hz = 20000000,
75 .bus_num = 0,
76 .chip_select = 0,
77 },
78};
79
80void qnap_tsx1x_register_flash(void)
81{
82 spi_register_board_info(qnap_tsx1x_spi_slave_info,
83 ARRAY_SIZE(qnap_tsx1x_spi_slave_info));
84 kirkwood_spi_init();
85}
86
87
88/*****************************************************************************
89 * QNAP TS-x1x specific power off method via UART1-attached PIC
90 ****************************************************************************/
91
92#define UART1_REG(x) (UART1_VIRT_BASE + ((UART_##x) << 2))
93
94void qnap_tsx1x_power_off(void)
95{
96 /* 19200 baud divisor */
97 const unsigned divisor = ((kirkwood_tclk + (8 * 19200)) / (16 * 19200));
98
99 pr_info("%s: triggering power-off...\n", __func__);
100
101 /* hijack UART1 and reset into sane state (19200,8n1) */
102 writel(0x83, UART1_REG(LCR));
103 writel(divisor & 0xff, UART1_REG(DLL));
104 writel((divisor >> 8) & 0xff, UART1_REG(DLM));
105 writel(0x03, UART1_REG(LCR));
106 writel(0x00, UART1_REG(IER));
107 writel(0x00, UART1_REG(FCR));
108 writel(0x00, UART1_REG(MCR));
109
110 /* send the power-off command 'A' to PIC */
111 writel('A', UART1_REG(TX));
112}
113
diff --git a/arch/arm/mach-kirkwood/tsx1x-common.h b/arch/arm/mach-kirkwood/tsx1x-common.h
new file mode 100644
index 000000000000..9a592962a6ea
--- /dev/null
+++ b/arch/arm/mach-kirkwood/tsx1x-common.h
@@ -0,0 +1,7 @@
1#ifndef __ARCH_KIRKWOOD_TSX1X_COMMON_H
2#define __ARCH_KIRKWOOD_TSX1X_COMMON_H
3
4extern void qnap_tsx1x_register_flash(void);
5extern void qnap_tsx1x_power_off(void);
6
7#endif