diff options
author | Lennert Buytenhek <buytenh@wantstofly.org> | 2008-05-10 17:25:46 -0400 |
---|---|---|
committer | Lennert Buytenhek <buytenh@marvell.com> | 2008-06-22 16:44:47 -0400 |
commit | 19cfd5c09f780ac870fd9d89201c4ebc0b22be81 (patch) | |
tree | 655e4eb79d22a8e9a62676f6fc13391bf8de931f | |
parent | 386a048a1ea42ff9ac87ffa344c4c19a5cc59678 (diff) |
[ARM] Orion: rework MPP handling
Instead of having board code poke directly into the MPP configuration
registers, and separately calling orion5x_gpio_set_valid_pins() to
indicate which MPP pins can be used as GPIO pins, introduce a helper
function for configuring the roles of each of the MPP pins, and have
that helper function handle gpio validity internally.
Signed-off-by: Lennert Buytenhek <buytenh@marvell.com>
Acked-by: Sylver Bruneau <sylver.bruneau@googlemail.com>
Acked-by: Russell King <linux@arm.linux.org.uk>
-rw-r--r-- | arch/arm/mach-orion5x/Makefile | 2 | ||||
-rw-r--r-- | arch/arm/mach-orion5x/common.h | 2 | ||||
-rw-r--r-- | arch/arm/mach-orion5x/db88f5281-setup.c | 47 | ||||
-rw-r--r-- | arch/arm/mach-orion5x/dns323-setup.c | 54 | ||||
-rw-r--r-- | arch/arm/mach-orion5x/gpio.c | 7 | ||||
-rw-r--r-- | arch/arm/mach-orion5x/kurobox_pro-setup.c | 45 | ||||
-rw-r--r-- | arch/arm/mach-orion5x/mpp.c | 163 | ||||
-rw-r--r-- | arch/arm/mach-orion5x/mpp.h | 74 | ||||
-rw-r--r-- | arch/arm/mach-orion5x/rd88f5182-setup.c | 48 | ||||
-rw-r--r-- | arch/arm/mach-orion5x/ts209-setup.c | 48 |
10 files changed, 376 insertions, 114 deletions
diff --git a/arch/arm/mach-orion5x/Makefile b/arch/arm/mach-orion5x/Makefile index 9301bf55910b..55da46eeab8d 100644 --- a/arch/arm/mach-orion5x/Makefile +++ b/arch/arm/mach-orion5x/Makefile | |||
@@ -1,4 +1,4 @@ | |||
1 | obj-y += common.o addr-map.o pci.o gpio.o irq.o | 1 | obj-y += common.o addr-map.o pci.o gpio.o irq.o mpp.o |
2 | obj-$(CONFIG_MACH_DB88F5281) += db88f5281-setup.o | 2 | obj-$(CONFIG_MACH_DB88F5281) += db88f5281-setup.o |
3 | obj-$(CONFIG_MACH_RD88F5182) += rd88f5182-setup.o | 3 | obj-$(CONFIG_MACH_RD88F5182) += rd88f5182-setup.o |
4 | obj-$(CONFIG_MACH_KUROBOX_PRO) += kurobox_pro-setup.o | 4 | obj-$(CONFIG_MACH_KUROBOX_PRO) += kurobox_pro-setup.o |
diff --git a/arch/arm/mach-orion5x/common.h b/arch/arm/mach-orion5x/common.h index da37c204bc38..97db8d88f3db 100644 --- a/arch/arm/mach-orion5x/common.h +++ b/arch/arm/mach-orion5x/common.h | |||
@@ -48,7 +48,7 @@ int orion5x_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin); | |||
48 | * Valid GPIO pins according to MPP setup, used by machine-setup. | 48 | * Valid GPIO pins according to MPP setup, used by machine-setup. |
49 | * (/mach-orion/gpio.c). | 49 | * (/mach-orion/gpio.c). |
50 | */ | 50 | */ |
51 | void orion5x_gpio_set_valid_pins(u32 pins); | 51 | void orion5x_gpio_set_valid(unsigned pin, int valid); |
52 | void gpio_display(void); /* debug */ | 52 | void gpio_display(void); /* debug */ |
53 | 53 | ||
54 | struct machine_desc; | 54 | struct machine_desc; |
diff --git a/arch/arm/mach-orion5x/db88f5281-setup.c b/arch/arm/mach-orion5x/db88f5281-setup.c index eca76b3348bc..3fee400c81ab 100644 --- a/arch/arm/mach-orion5x/db88f5281-setup.c +++ b/arch/arm/mach-orion5x/db88f5281-setup.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <asm/arch/orion5x.h> | 27 | #include <asm/arch/orion5x.h> |
28 | #include <asm/plat-orion/orion_nand.h> | 28 | #include <asm/plat-orion/orion_nand.h> |
29 | #include "common.h" | 29 | #include "common.h" |
30 | #include "mpp.h" | ||
30 | 31 | ||
31 | /***************************************************************************** | 32 | /***************************************************************************** |
32 | * DB-88F5281 on board devices | 33 | * DB-88F5281 on board devices |
@@ -298,6 +299,30 @@ static struct i2c_board_info __initdata db88f5281_i2c_rtc = { | |||
298 | /***************************************************************************** | 299 | /***************************************************************************** |
299 | * General Setup | 300 | * General Setup |
300 | ****************************************************************************/ | 301 | ****************************************************************************/ |
302 | static struct orion5x_mpp_mode db88f5281_mpp_modes[] __initdata = { | ||
303 | { 0, MPP_GPIO }, /* USB Over Current */ | ||
304 | { 1, MPP_GPIO }, /* USB Vbat input */ | ||
305 | { 2, MPP_PCI_ARB }, /* PCI_REQn[2] */ | ||
306 | { 3, MPP_PCI_ARB }, /* PCI_GNTn[2] */ | ||
307 | { 4, MPP_PCI_ARB }, /* PCI_REQn[3] */ | ||
308 | { 5, MPP_PCI_ARB }, /* PCI_GNTn[3] */ | ||
309 | { 6, MPP_GPIO }, /* JP0, CON17.2 */ | ||
310 | { 7, MPP_GPIO }, /* JP1, CON17.1 */ | ||
311 | { 8, MPP_GPIO }, /* JP2, CON11.2 */ | ||
312 | { 9, MPP_GPIO }, /* JP3, CON11.3 */ | ||
313 | { 10, MPP_GPIO }, /* RTC int */ | ||
314 | { 11, MPP_GPIO }, /* Baud Rate Generator */ | ||
315 | { 12, MPP_GPIO }, /* PCI int 1 */ | ||
316 | { 13, MPP_GPIO }, /* PCI int 2 */ | ||
317 | { 14, MPP_NAND }, /* NAND_REn[2] */ | ||
318 | { 15, MPP_NAND }, /* NAND_WEn[2] */ | ||
319 | { 16, MPP_UART }, /* UART1_RX */ | ||
320 | { 17, MPP_UART }, /* UART1_TX */ | ||
321 | { 18, MPP_UART }, /* UART1_CTSn */ | ||
322 | { 19, MPP_UART }, /* UART1_RTSn */ | ||
323 | { -1 }, | ||
324 | }; | ||
325 | |||
301 | static void __init db88f5281_init(void) | 326 | static void __init db88f5281_init(void) |
302 | { | 327 | { |
303 | /* | 328 | /* |
@@ -305,26 +330,8 @@ static void __init db88f5281_init(void) | |||
305 | */ | 330 | */ |
306 | orion5x_init(); | 331 | orion5x_init(); |
307 | 332 | ||
308 | /* | 333 | orion5x_mpp_conf(db88f5281_mpp_modes); |
309 | * Setup Multiplexing Pins: | 334 | orion5x_write(MPP_DEV_CTRL, 0); /* DEV_D[31:16] */ |
310 | * MPP0: GPIO (USB Over Current) MPP1: GPIO (USB Vbat input) | ||
311 | * MPP2: PCI_REQn[2] MPP3: PCI_GNTn[2] | ||
312 | * MPP4: PCI_REQn[3] MPP5: PCI_GNTn[3] | ||
313 | * MPP6: GPIO (JP0, CON17.2) MPP7: GPIO (JP1, CON17.1) | ||
314 | * MPP8: GPIO (JP2, CON11.2) MPP9: GPIO (JP3, CON11.3) | ||
315 | * MPP10: GPIO (RTC int) MPP11: GPIO (Baud Rate Generator) | ||
316 | * MPP12: GPIO (PCI int 1) MPP13: GPIO (PCI int 2) | ||
317 | * MPP14: NAND_REn[2] MPP15: NAND_WEn[2] | ||
318 | * MPP16: UART1_RX MPP17: UART1_TX | ||
319 | * MPP18: UART1_CTS MPP19: UART1_RTS | ||
320 | * MPP-DEV: DEV_D[16:31] | ||
321 | */ | ||
322 | orion5x_write(MPP_0_7_CTRL, 0x00222203); | ||
323 | orion5x_write(MPP_8_15_CTRL, 0x44000000); | ||
324 | orion5x_write(MPP_16_19_CTRL, 0); | ||
325 | orion5x_write(MPP_DEV_CTRL, 0); | ||
326 | |||
327 | orion5x_gpio_set_valid_pins(0x00003fc3); | ||
328 | 335 | ||
329 | /* | 336 | /* |
330 | * Configure peripherals. | 337 | * Configure peripherals. |
diff --git a/arch/arm/mach-orion5x/dns323-setup.c b/arch/arm/mach-orion5x/dns323-setup.c index 9ec53501b2a8..05ce66048741 100644 --- a/arch/arm/mach-orion5x/dns323-setup.c +++ b/arch/arm/mach-orion5x/dns323-setup.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <asm/mach/pci.h> | 27 | #include <asm/mach/pci.h> |
28 | #include <asm/arch/orion5x.h> | 28 | #include <asm/arch/orion5x.h> |
29 | #include "common.h" | 29 | #include "common.h" |
30 | #include "mpp.h" | ||
30 | 31 | ||
31 | #define DNS323_GPIO_LED_RIGHT_AMBER 1 | 32 | #define DNS323_GPIO_LED_RIGHT_AMBER 1 |
32 | #define DNS323_GPIO_LED_LEFT_AMBER 2 | 33 | #define DNS323_GPIO_LED_LEFT_AMBER 2 |
@@ -212,6 +213,29 @@ static struct platform_device dns323_button_device = { | |||
212 | /**************************************************************************** | 213 | /**************************************************************************** |
213 | * General Setup | 214 | * General Setup |
214 | */ | 215 | */ |
216 | static struct orion5x_mpp_mode dns323_mpp_modes[] __initdata = { | ||
217 | { 0, MPP_PCIE_RST_OUTn }, | ||
218 | { 1, MPP_GPIO }, /* right amber LED (sata ch0) */ | ||
219 | { 2, MPP_GPIO }, /* left amber LED (sata ch1) */ | ||
220 | { 3, MPP_UNUSED }, | ||
221 | { 4, MPP_GPIO }, /* power button LED */ | ||
222 | { 5, MPP_GPIO }, /* power button LED */ | ||
223 | { 6, MPP_GPIO }, /* GMT G751-2f overtemp */ | ||
224 | { 7, MPP_GPIO }, /* M41T80 nIRQ/OUT/SQW */ | ||
225 | { 8, MPP_GPIO }, /* triggers power off */ | ||
226 | { 9, MPP_GPIO }, /* power button switch */ | ||
227 | { 10, MPP_GPIO }, /* reset button switch */ | ||
228 | { 11, MPP_UNUSED }, | ||
229 | { 12, MPP_UNUSED }, | ||
230 | { 13, MPP_UNUSED }, | ||
231 | { 14, MPP_UNUSED }, | ||
232 | { 15, MPP_UNUSED }, | ||
233 | { 16, MPP_UNUSED }, | ||
234 | { 17, MPP_UNUSED }, | ||
235 | { 18, MPP_UNUSED }, | ||
236 | { 19, MPP_UNUSED }, | ||
237 | { -1 }, | ||
238 | }; | ||
215 | 239 | ||
216 | /* | 240 | /* |
217 | * On the DNS-323 the following devices are attached via I2C: | 241 | * On the DNS-323 the following devices are attached via I2C: |
@@ -247,34 +271,8 @@ static void __init dns323_init(void) | |||
247 | /* Setup basic Orion functions. Need to be called early. */ | 271 | /* Setup basic Orion functions. Need to be called early. */ |
248 | orion5x_init(); | 272 | orion5x_init(); |
249 | 273 | ||
250 | /* set MPP to 0 as D-Link's 2.6.12.6 kernel did */ | 274 | orion5x_mpp_conf(dns323_mpp_modes); |
251 | orion5x_write(MPP_0_7_CTRL, 0); | 275 | orion5x_write(MPP_DEV_CTRL, 0); /* DEV_D[31:16] */ |
252 | orion5x_write(MPP_8_15_CTRL, 0); | ||
253 | orion5x_write(MPP_16_19_CTRL, 0); | ||
254 | orion5x_write(MPP_DEV_CTRL, 0); | ||
255 | |||
256 | /* Define used GPIO pins | ||
257 | |||
258 | GPIO Map: | ||
259 | |||
260 | | 0 | | PEX_RST_OUT (not controlled by GPIO) | ||
261 | | 1 | Out | right amber LED (= sata ch0 LED) (low-active) | ||
262 | | 2 | Out | left amber LED (= sata ch1 LED) (low-active) | ||
263 | | 3 | Out | //unknown// | ||
264 | | 4 | Out | power button LED (low-active, together with pin #5) | ||
265 | | 5 | Out | power button LED (low-active, together with pin #4) | ||
266 | | 6 | In | GMT G751-2f overtemp. shutdown signal (low-active) | ||
267 | | 7 | In | M41T80 nIRQ/OUT/SQW signal | ||
268 | | 8 | Out | triggers power off (high-active) | ||
269 | | 9 | In | power button switch (low-active) | ||
270 | | 10 | In | reset button switch (low-active) | ||
271 | | 11 | Out | //unknown// | ||
272 | | 12 | Out | //unknown// | ||
273 | | 13 | Out | //unknown// | ||
274 | | 14 | Out | //unknown// | ||
275 | | 15 | Out | //unknown// | ||
276 | */ | ||
277 | orion5x_gpio_set_valid_pins(0x07f6); | ||
278 | 276 | ||
279 | /* | 277 | /* |
280 | * Configure peripherals. | 278 | * Configure peripherals. |
diff --git a/arch/arm/mach-orion5x/gpio.c b/arch/arm/mach-orion5x/gpio.c index 8108c316c426..9fba6a16dc1b 100644 --- a/arch/arm/mach-orion5x/gpio.c +++ b/arch/arm/mach-orion5x/gpio.c | |||
@@ -24,9 +24,12 @@ static DEFINE_SPINLOCK(gpio_lock); | |||
24 | static unsigned long gpio_valid[BITS_TO_LONGS(GPIO_MAX)]; | 24 | static unsigned long gpio_valid[BITS_TO_LONGS(GPIO_MAX)]; |
25 | static const char *gpio_label[GPIO_MAX]; /* non null for allocated GPIOs */ | 25 | static const char *gpio_label[GPIO_MAX]; /* non null for allocated GPIOs */ |
26 | 26 | ||
27 | void __init orion5x_gpio_set_valid_pins(u32 pins) | 27 | void __init orion5x_gpio_set_valid(unsigned pin, int valid) |
28 | { | 28 | { |
29 | gpio_valid[0] = pins; | 29 | if (valid) |
30 | __set_bit(pin, gpio_valid); | ||
31 | else | ||
32 | __clear_bit(pin, gpio_valid); | ||
30 | } | 33 | } |
31 | 34 | ||
32 | /* | 35 | /* |
diff --git a/arch/arm/mach-orion5x/kurobox_pro-setup.c b/arch/arm/mach-orion5x/kurobox_pro-setup.c index 61755fe175cd..f0997a7ba6d2 100644 --- a/arch/arm/mach-orion5x/kurobox_pro-setup.c +++ b/arch/arm/mach-orion5x/kurobox_pro-setup.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <asm/arch/orion5x.h> | 25 | #include <asm/arch/orion5x.h> |
26 | #include <asm/plat-orion/orion_nand.h> | 26 | #include <asm/plat-orion/orion_nand.h> |
27 | #include "common.h" | 27 | #include "common.h" |
28 | #include "mpp.h" | ||
28 | 29 | ||
29 | /***************************************************************************** | 30 | /***************************************************************************** |
30 | * KUROBOX-PRO Info | 31 | * KUROBOX-PRO Info |
@@ -179,6 +180,29 @@ static struct mv_sata_platform_data kurobox_pro_sata_data = { | |||
179 | /***************************************************************************** | 180 | /***************************************************************************** |
180 | * General Setup | 181 | * General Setup |
181 | ****************************************************************************/ | 182 | ****************************************************************************/ |
183 | static struct orion5x_mpp_mode kurobox_pro_mpp_modes[] __initdata = { | ||
184 | { 0, MPP_UNUSED }, | ||
185 | { 1, MPP_UNUSED }, | ||
186 | { 2, MPP_GPIO }, /* GPIO Micon */ | ||
187 | { 3, MPP_GPIO }, /* GPIO Rtc */ | ||
188 | { 4, MPP_UNUSED }, | ||
189 | { 5, MPP_UNUSED }, | ||
190 | { 6, MPP_NAND }, /* NAND Flash REn */ | ||
191 | { 7, MPP_NAND }, /* NAND Flash WEn */ | ||
192 | { 8, MPP_UNUSED }, | ||
193 | { 9, MPP_UNUSED }, | ||
194 | { 10, MPP_UNUSED }, | ||
195 | { 11, MPP_UNUSED }, | ||
196 | { 12, MPP_SATA_LED }, /* SATA 0 presence */ | ||
197 | { 13, MPP_SATA_LED }, /* SATA 1 presence */ | ||
198 | { 14, MPP_SATA_LED }, /* SATA 0 active */ | ||
199 | { 15, MPP_SATA_LED }, /* SATA 1 active */ | ||
200 | { 16, MPP_UNUSED }, | ||
201 | { 17, MPP_UNUSED }, | ||
202 | { 18, MPP_UNUSED }, | ||
203 | { 19, MPP_UNUSED }, | ||
204 | { -1 }, | ||
205 | }; | ||
182 | 206 | ||
183 | static void __init kurobox_pro_init(void) | 207 | static void __init kurobox_pro_init(void) |
184 | { | 208 | { |
@@ -187,26 +211,7 @@ static void __init kurobox_pro_init(void) | |||
187 | */ | 211 | */ |
188 | orion5x_init(); | 212 | orion5x_init(); |
189 | 213 | ||
190 | /* | 214 | orion5x_mpp_conf(kurobox_pro_mpp_modes); |
191 | * Setup Multiplexing Pins -- | ||
192 | * MPP[0-1] Not used | ||
193 | * MPP[2] GPIO Micon | ||
194 | * MPP[3] GPIO RTC | ||
195 | * MPP[4-5] Not used | ||
196 | * MPP[6] Nand Flash REn | ||
197 | * MPP[7] Nand Flash WEn | ||
198 | * MPP[8-11] Not used | ||
199 | * MPP[12] SATA 0 presence Indication | ||
200 | * MPP[13] SATA 1 presence Indication | ||
201 | * MPP[14] SATA 0 active Indication | ||
202 | * MPP[15] SATA 1 active indication | ||
203 | * MPP[16-19] Not used | ||
204 | */ | ||
205 | orion5x_write(MPP_0_7_CTRL, 0x44220003); | ||
206 | orion5x_write(MPP_8_15_CTRL, 0x55550000); | ||
207 | orion5x_write(MPP_16_19_CTRL, 0x0); | ||
208 | |||
209 | orion5x_gpio_set_valid_pins(0x0000000c); | ||
210 | 215 | ||
211 | /* | 216 | /* |
212 | * Configure peripherals. | 217 | * Configure peripherals. |
diff --git a/arch/arm/mach-orion5x/mpp.c b/arch/arm/mach-orion5x/mpp.c new file mode 100644 index 000000000000..a48cadb01590 --- /dev/null +++ b/arch/arm/mach-orion5x/mpp.c | |||
@@ -0,0 +1,163 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-orion5x/mpp.c | ||
3 | * | ||
4 | * MPP functions for Marvell Orion 5x SoCs | ||
5 | * | ||
6 | * This file is licensed under the terms of the GNU General Public | ||
7 | * License version 2. This program is licensed "as is" without any | ||
8 | * warranty of any kind, whether express or implied. | ||
9 | */ | ||
10 | |||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/init.h> | ||
13 | #include <linux/mbus.h> | ||
14 | #include <asm/hardware.h> | ||
15 | #include <asm/io.h> | ||
16 | #include "common.h" | ||
17 | #include "mpp.h" | ||
18 | |||
19 | static int is_5181l(void) | ||
20 | { | ||
21 | u32 dev; | ||
22 | u32 rev; | ||
23 | |||
24 | orion5x_pcie_id(&dev, &rev); | ||
25 | |||
26 | return !!(dev == MV88F5181_DEV_ID && rev >= MV88F5181L_REV_A0); | ||
27 | } | ||
28 | |||
29 | static int is_5182(void) | ||
30 | { | ||
31 | u32 dev; | ||
32 | u32 rev; | ||
33 | |||
34 | orion5x_pcie_id(&dev, &rev); | ||
35 | |||
36 | return !!(dev == MV88F5182_DEV_ID); | ||
37 | } | ||
38 | |||
39 | static int is_5281(void) | ||
40 | { | ||
41 | u32 dev; | ||
42 | u32 rev; | ||
43 | |||
44 | orion5x_pcie_id(&dev, &rev); | ||
45 | |||
46 | return !!(dev == MV88F5281_DEV_ID); | ||
47 | } | ||
48 | |||
49 | static int __init determine_type_encoding(int mpp, enum orion5x_mpp_type type) | ||
50 | { | ||
51 | switch (type) { | ||
52 | case MPP_UNUSED: | ||
53 | case MPP_GPIO: | ||
54 | if (mpp == 0) | ||
55 | return 3; | ||
56 | if (mpp >= 1 && mpp <= 15) | ||
57 | return 0; | ||
58 | if (mpp >= 16 && mpp <= 19) { | ||
59 | if (is_5182()) | ||
60 | return 5; | ||
61 | if (type == MPP_UNUSED) | ||
62 | return 0; | ||
63 | } | ||
64 | return -1; | ||
65 | |||
66 | case MPP_PCIE_RST_OUTn: | ||
67 | if (mpp == 0) | ||
68 | return 0; | ||
69 | return -1; | ||
70 | |||
71 | case MPP_PCI_ARB: | ||
72 | if (mpp >= 0 && mpp <= 7) | ||
73 | return 2; | ||
74 | return -1; | ||
75 | |||
76 | case MPP_PCI_PMEn: | ||
77 | if (mpp == 2) | ||
78 | return 3; | ||
79 | return -1; | ||
80 | |||
81 | case MPP_GIGE: | ||
82 | if (mpp >= 8 && mpp <= 19) | ||
83 | return 1; | ||
84 | return -1; | ||
85 | |||
86 | case MPP_NAND: | ||
87 | if (is_5182() || is_5281()) { | ||
88 | if (mpp >= 4 && mpp <= 7) | ||
89 | return 4; | ||
90 | if (mpp >= 12 && mpp <= 17) | ||
91 | return 4; | ||
92 | } | ||
93 | return -1; | ||
94 | |||
95 | case MPP_PCI_CLK: | ||
96 | if (is_5181l() && mpp >= 6 && mpp <= 7) | ||
97 | return 5; | ||
98 | return -1; | ||
99 | |||
100 | case MPP_SATA_LED: | ||
101 | if (is_5182()) { | ||
102 | if (mpp >= 4 && mpp <= 7) | ||
103 | return 5; | ||
104 | if (mpp >= 12 && mpp <= 15) | ||
105 | return 5; | ||
106 | } | ||
107 | return -1; | ||
108 | |||
109 | case MPP_UART: | ||
110 | if (mpp >= 16 && mpp <= 19) | ||
111 | return 0; | ||
112 | return -1; | ||
113 | } | ||
114 | |||
115 | printk(KERN_INFO "unknown MPP type %d\n", type); | ||
116 | |||
117 | return -1; | ||
118 | } | ||
119 | |||
120 | void __init orion5x_mpp_conf(struct orion5x_mpp_mode *mode) | ||
121 | { | ||
122 | u32 mpp_0_7_ctrl = readl(MPP_0_7_CTRL); | ||
123 | u32 mpp_8_15_ctrl = readl(MPP_8_15_CTRL); | ||
124 | u32 mpp_16_19_ctrl = readl(MPP_16_19_CTRL); | ||
125 | |||
126 | while (mode->mpp >= 0) { | ||
127 | u32 *reg; | ||
128 | int num_type; | ||
129 | int shift; | ||
130 | |||
131 | if (mode->mpp >= 0 && mode->mpp <= 7) | ||
132 | reg = &mpp_0_7_ctrl; | ||
133 | else if (mode->mpp >= 8 && mode->mpp <= 15) | ||
134 | reg = &mpp_8_15_ctrl; | ||
135 | else if (mode->mpp >= 16 && mode->mpp <= 19) | ||
136 | reg = &mpp_16_19_ctrl; | ||
137 | else { | ||
138 | printk(KERN_ERR "orion5x_mpp_conf: invalid MPP " | ||
139 | "(%d)\n", mode->mpp); | ||
140 | continue; | ||
141 | } | ||
142 | |||
143 | num_type = determine_type_encoding(mode->mpp, mode->type); | ||
144 | if (num_type < 0) { | ||
145 | printk(KERN_ERR "orion5x_mpp_conf: invalid MPP " | ||
146 | "combination (%d, %d)\n", mode->mpp, | ||
147 | mode->type); | ||
148 | continue; | ||
149 | } | ||
150 | |||
151 | shift = (mode->mpp & 7) << 2; | ||
152 | *reg &= ~(0xf << shift); | ||
153 | *reg |= (num_type & 0xf) << shift; | ||
154 | |||
155 | orion5x_gpio_set_valid(mode->mpp, !!(mode->type == MPP_GPIO)); | ||
156 | |||
157 | mode++; | ||
158 | } | ||
159 | |||
160 | writel(mpp_0_7_ctrl, MPP_0_7_CTRL); | ||
161 | writel(mpp_8_15_ctrl, MPP_8_15_CTRL); | ||
162 | writel(mpp_16_19_ctrl, MPP_16_19_CTRL); | ||
163 | } | ||
diff --git a/arch/arm/mach-orion5x/mpp.h b/arch/arm/mach-orion5x/mpp.h new file mode 100644 index 000000000000..290e610dc012 --- /dev/null +++ b/arch/arm/mach-orion5x/mpp.h | |||
@@ -0,0 +1,74 @@ | |||
1 | #ifndef __ARCH_ORION5X_MPP_H | ||
2 | #define __ARCH_ORION5X_MPP_H | ||
3 | |||
4 | enum orion5x_mpp_type { | ||
5 | /* | ||
6 | * This MPP is unused. | ||
7 | */ | ||
8 | MPP_UNUSED, | ||
9 | |||
10 | /* | ||
11 | * This MPP pin is used as a generic GPIO pin. Valid for | ||
12 | * MPPs 0-15 and device bus data pins 16-31. On 5182, also | ||
13 | * valid for MPPs 16-19. | ||
14 | */ | ||
15 | MPP_GPIO, | ||
16 | |||
17 | /* | ||
18 | * This MPP is used as PCIe_RST_OUTn pin. Valid for | ||
19 | * MPP 0 only. | ||
20 | */ | ||
21 | MPP_PCIE_RST_OUTn, | ||
22 | |||
23 | /* | ||
24 | * This MPP is used as PCI arbiter pin (REQn/GNTn). | ||
25 | * Valid for MPPs 0-7 only. | ||
26 | */ | ||
27 | MPP_PCI_ARB, | ||
28 | |||
29 | /* | ||
30 | * This MPP is used as PCI_PMEn pin. Valid for MPP 2 only. | ||
31 | */ | ||
32 | MPP_PCI_PMEn, | ||
33 | |||
34 | /* | ||
35 | * This MPP is used as GigE half-duplex (COL, CRS) or GMII | ||
36 | * (RXERR, CRS, TXERR, TXD[7:4], RXD[7:4]) pin. Valid for | ||
37 | * MPPs 8-19 only. | ||
38 | */ | ||
39 | MPP_GIGE, | ||
40 | |||
41 | /* | ||
42 | * This MPP is used as NAND REn/WEn pin. Valid for MPPs | ||
43 | * 4-7 and 12-17 only, and only on the 5181l/5182/5281. | ||
44 | */ | ||
45 | MPP_NAND, | ||
46 | |||
47 | /* | ||
48 | * This MPP is used as a PCI clock output pin. Valid for | ||
49 | * MPPs 6-7 only, and only on the 5181l. | ||
50 | */ | ||
51 | MPP_PCI_CLK, | ||
52 | |||
53 | /* | ||
54 | * This MPP is used as a SATA presence/activity LED. | ||
55 | * Valid for MPPs 4-7 and 12-15 only, and only on the 5182. | ||
56 | */ | ||
57 | MPP_SATA_LED, | ||
58 | |||
59 | /* | ||
60 | * This MPP is used as UART1 RXD/TXD/CTSn/RTSn pin. | ||
61 | * Valid for MPPs 16-19 only. | ||
62 | */ | ||
63 | MPP_UART, | ||
64 | }; | ||
65 | |||
66 | struct orion5x_mpp_mode { | ||
67 | int mpp; | ||
68 | enum orion5x_mpp_type type; | ||
69 | }; | ||
70 | |||
71 | void orion5x_mpp_conf(struct orion5x_mpp_mode *mode); | ||
72 | |||
73 | |||
74 | #endif | ||
diff --git a/arch/arm/mach-orion5x/rd88f5182-setup.c b/arch/arm/mach-orion5x/rd88f5182-setup.c index 403ba9a0c9bd..44ad5de87b79 100644 --- a/arch/arm/mach-orion5x/rd88f5182-setup.c +++ b/arch/arm/mach-orion5x/rd88f5182-setup.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <asm/mach/pci.h> | 26 | #include <asm/mach/pci.h> |
27 | #include <asm/arch/orion5x.h> | 27 | #include <asm/arch/orion5x.h> |
28 | #include "common.h" | 28 | #include "common.h" |
29 | #include "mpp.h" | ||
29 | 30 | ||
30 | /***************************************************************************** | 31 | /***************************************************************************** |
31 | * RD-88F5182 Info | 32 | * RD-88F5182 Info |
@@ -241,6 +242,30 @@ static struct mv_sata_platform_data rd88f5182_sata_data = { | |||
241 | /***************************************************************************** | 242 | /***************************************************************************** |
242 | * General Setup | 243 | * General Setup |
243 | ****************************************************************************/ | 244 | ****************************************************************************/ |
245 | static struct orion5x_mpp_mode rd88f5182_mpp_modes[] __initdata = { | ||
246 | { 0, MPP_GPIO }, /* Debug Led */ | ||
247 | { 1, MPP_GPIO }, /* Reset Switch */ | ||
248 | { 2, MPP_UNUSED }, | ||
249 | { 3, MPP_GPIO }, /* RTC Int */ | ||
250 | { 4, MPP_GPIO }, | ||
251 | { 5, MPP_GPIO }, | ||
252 | { 6, MPP_GPIO }, /* PCI_intA */ | ||
253 | { 7, MPP_GPIO }, /* PCI_intB */ | ||
254 | { 8, MPP_UNUSED }, | ||
255 | { 9, MPP_UNUSED }, | ||
256 | { 10, MPP_UNUSED }, | ||
257 | { 11, MPP_UNUSED }, | ||
258 | { 12, MPP_SATA_LED }, /* SATA 0 presence */ | ||
259 | { 13, MPP_SATA_LED }, /* SATA 1 presence */ | ||
260 | { 14, MPP_SATA_LED }, /* SATA 0 active */ | ||
261 | { 15, MPP_SATA_LED }, /* SATA 1 active */ | ||
262 | { 16, MPP_UNUSED }, | ||
263 | { 17, MPP_UNUSED }, | ||
264 | { 18, MPP_UNUSED }, | ||
265 | { 19, MPP_UNUSED }, | ||
266 | { -1 }, | ||
267 | }; | ||
268 | |||
244 | static void __init rd88f5182_init(void) | 269 | static void __init rd88f5182_init(void) |
245 | { | 270 | { |
246 | /* | 271 | /* |
@@ -248,22 +273,9 @@ static void __init rd88f5182_init(void) | |||
248 | */ | 273 | */ |
249 | orion5x_init(); | 274 | orion5x_init(); |
250 | 275 | ||
276 | orion5x_mpp_conf(rd88f5182_mpp_modes); | ||
277 | |||
251 | /* | 278 | /* |
252 | * Setup Multiplexing Pins -- | ||
253 | * MPP[0] Debug Led (GPIO - Out) | ||
254 | * MPP[1] Debug Led (GPIO - Out) | ||
255 | * MPP[2] N/A | ||
256 | * MPP[3] RTC_Int (GPIO - In) | ||
257 | * MPP[4] GPIO | ||
258 | * MPP[5] GPIO | ||
259 | * MPP[6] PCI_intA (GPIO - In) | ||
260 | * MPP[7] PCI_intB (GPIO - In) | ||
261 | * MPP[8-11] N/A | ||
262 | * MPP[12] SATA 0 presence Indication | ||
263 | * MPP[13] SATA 1 presence Indication | ||
264 | * MPP[14] SATA 0 active Indication | ||
265 | * MPP[15] SATA 1 active indication | ||
266 | * MPP[16-19] Not used | ||
267 | * MPP[20] PCI Clock to MV88F5182 | 279 | * MPP[20] PCI Clock to MV88F5182 |
268 | * MPP[21] PCI Clock to mini PCI CON11 | 280 | * MPP[21] PCI Clock to mini PCI CON11 |
269 | * MPP[22] USB 0 over current indication | 281 | * MPP[22] USB 0 over current indication |
@@ -272,12 +284,6 @@ static void __init rd88f5182_init(void) | |||
272 | * MPP[25] USB 0 over current enable | 284 | * MPP[25] USB 0 over current enable |
273 | */ | 285 | */ |
274 | 286 | ||
275 | orion5x_write(MPP_0_7_CTRL, 0x00000003); | ||
276 | orion5x_write(MPP_8_15_CTRL, 0x55550000); | ||
277 | orion5x_write(MPP_16_19_CTRL, 0x5555); | ||
278 | |||
279 | orion5x_gpio_set_valid_pins(0x000000fb); | ||
280 | |||
281 | /* | 287 | /* |
282 | * Configure peripherals. | 288 | * Configure peripherals. |
283 | */ | 289 | */ |
diff --git a/arch/arm/mach-orion5x/ts209-setup.c b/arch/arm/mach-orion5x/ts209-setup.c index 0ec067fcb514..5ad7ad9b9461 100644 --- a/arch/arm/mach-orion5x/ts209-setup.c +++ b/arch/arm/mach-orion5x/ts209-setup.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <asm/mach/pci.h> | 28 | #include <asm/mach/pci.h> |
29 | #include <asm/arch/orion5x.h> | 29 | #include <asm/arch/orion5x.h> |
30 | #include "common.h" | 30 | #include "common.h" |
31 | #include "mpp.h" | ||
31 | 32 | ||
32 | #define QNAP_TS209_NOR_BOOT_BASE 0xf4000000 | 33 | #define QNAP_TS209_NOR_BOOT_BASE 0xf4000000 |
33 | #define QNAP_TS209_NOR_BOOT_SIZE SZ_8M | 34 | #define QNAP_TS209_NOR_BOOT_SIZE SZ_8M |
@@ -332,6 +333,30 @@ static struct mv_sata_platform_data qnap_ts209_sata_data = { | |||
332 | 333 | ||
333 | * General Setup | 334 | * General Setup |
334 | ****************************************************************************/ | 335 | ****************************************************************************/ |
336 | static struct orion5x_mpp_mode ts209_mpp_modes[] __initdata = { | ||
337 | { 0, MPP_UNUSED }, | ||
338 | { 1, MPP_GPIO }, /* USB copy button */ | ||
339 | { 2, MPP_GPIO }, /* Load defaults button */ | ||
340 | { 3, MPP_GPIO }, /* GPIO RTC */ | ||
341 | { 4, MPP_UNUSED }, | ||
342 | { 5, MPP_UNUSED }, | ||
343 | { 6, MPP_GPIO }, /* PCI Int A */ | ||
344 | { 7, MPP_GPIO }, /* PCI Int B */ | ||
345 | { 8, MPP_UNUSED }, | ||
346 | { 9, MPP_UNUSED }, | ||
347 | { 10, MPP_UNUSED }, | ||
348 | { 11, MPP_UNUSED }, | ||
349 | { 12, MPP_SATA_LED }, /* SATA 0 presence */ | ||
350 | { 13, MPP_SATA_LED }, /* SATA 1 presence */ | ||
351 | { 14, MPP_SATA_LED }, /* SATA 0 active */ | ||
352 | { 15, MPP_SATA_LED }, /* SATA 1 active */ | ||
353 | { 16, MPP_UART }, /* UART1 RXD */ | ||
354 | { 17, MPP_UART }, /* UART1 TXD */ | ||
355 | { 18, MPP_GPIO }, /* SW_RST */ | ||
356 | { 19, MPP_UNUSED }, | ||
357 | { -1 }, | ||
358 | }; | ||
359 | |||
335 | /* | 360 | /* |
336 | * QNAP TS-[12]09 specific power off method via UART1-attached PIC | 361 | * QNAP TS-[12]09 specific power off method via UART1-attached PIC |
337 | */ | 362 | */ |
@@ -364,33 +389,14 @@ static void __init qnap_ts209_init(void) | |||
364 | */ | 389 | */ |
365 | orion5x_init(); | 390 | orion5x_init(); |
366 | 391 | ||
392 | orion5x_mpp_conf(ts209_mpp_modes); | ||
393 | |||
367 | /* | 394 | /* |
368 | * Setup Multiplexing Pins -- | ||
369 | * MPP[0] Reserved | ||
370 | * MPP[1] USB copy button (0 active) | ||
371 | * MPP[2] Load defaults button (0 active) | ||
372 | * MPP[3] GPIO RTC | ||
373 | * MPP[4-5] Reserved | ||
374 | * MPP[6] PCI Int A | ||
375 | * MPP[7] PCI Int B | ||
376 | * MPP[8-11] Reserved | ||
377 | * MPP[12] SATA 0 presence | ||
378 | * MPP[13] SATA 1 presence | ||
379 | * MPP[14] SATA 0 active | ||
380 | * MPP[15] SATA 1 active | ||
381 | * MPP[16] UART1 RXD | ||
382 | * MPP[17] UART1 TXD | ||
383 | * MPP[18] SW_RST (0 active) | ||
384 | * MPP[19] Reserved | ||
385 | * MPP[20] PCI clock 0 | 395 | * MPP[20] PCI clock 0 |
386 | * MPP[21] PCI clock 1 | 396 | * MPP[21] PCI clock 1 |
387 | * MPP[22] USB 0 over current | 397 | * MPP[22] USB 0 over current |
388 | * MPP[23-25] Reserved | 398 | * MPP[23-25] Reserved |
389 | */ | 399 | */ |
390 | orion5x_write(MPP_0_7_CTRL, 0x3); | ||
391 | orion5x_write(MPP_8_15_CTRL, 0x55550000); | ||
392 | orion5x_write(MPP_16_19_CTRL, 0x5500); | ||
393 | orion5x_gpio_set_valid_pins(0x3cc0fff); | ||
394 | 400 | ||
395 | /* | 401 | /* |
396 | * Configure peripherals. | 402 | * Configure peripherals. |