diff options
Diffstat (limited to 'arch/arm/mach-kirkwood/openrd-setup.c')
-rw-r--r-- | arch/arm/mach-kirkwood/openrd-setup.c | 107 |
1 files changed, 100 insertions, 7 deletions
diff --git a/arch/arm/mach-kirkwood/openrd-setup.c b/arch/arm/mach-kirkwood/openrd-setup.c index fd06be618815..c9d77fad10ab 100644 --- a/arch/arm/mach-kirkwood/openrd-setup.c +++ b/arch/arm/mach-kirkwood/openrd-setup.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/ata_platform.h> | 16 | #include <linux/ata_platform.h> |
17 | #include <linux/mv643xx_eth.h> | 17 | #include <linux/mv643xx_eth.h> |
18 | #include <linux/i2c.h> | 18 | #include <linux/i2c.h> |
19 | #include <linux/gpio.h> | ||
19 | #include <asm/mach-types.h> | 20 | #include <asm/mach-types.h> |
20 | #include <asm/mach/arch.h> | 21 | #include <asm/mach/arch.h> |
21 | #include <mach/kirkwood.h> | 22 | #include <mach/kirkwood.h> |
@@ -57,7 +58,22 @@ static struct mvsdio_platform_data openrd_mvsdio_data = { | |||
57 | }; | 58 | }; |
58 | 59 | ||
59 | static unsigned int openrd_mpp_config[] __initdata = { | 60 | static unsigned int openrd_mpp_config[] __initdata = { |
61 | MPP12_SD_CLK, | ||
62 | MPP13_SD_CMD, | ||
63 | MPP14_SD_D0, | ||
64 | MPP15_SD_D1, | ||
65 | MPP16_SD_D2, | ||
66 | MPP17_SD_D3, | ||
67 | MPP28_GPIO, | ||
60 | MPP29_GPIO, | 68 | MPP29_GPIO, |
69 | MPP34_GPIO, | ||
70 | 0 | ||
71 | }; | ||
72 | |||
73 | /* Configure MPP for UART1 */ | ||
74 | static unsigned int openrd_uart1_mpp_config[] __initdata = { | ||
75 | MPP13_UART1_TXD, | ||
76 | MPP14_UART1_RXD, | ||
61 | 0 | 77 | 0 |
62 | }; | 78 | }; |
63 | 79 | ||
@@ -67,6 +83,68 @@ static struct i2c_board_info i2c_board_info[] __initdata = { | |||
67 | }, | 83 | }, |
68 | }; | 84 | }; |
69 | 85 | ||
86 | static int __initdata uart1; | ||
87 | |||
88 | static int __init sd_uart_selection(char *str) | ||
89 | { | ||
90 | uart1 = -EINVAL; | ||
91 | |||
92 | /* Default is SD. Change if required, for UART */ | ||
93 | if (!str) | ||
94 | return 0; | ||
95 | |||
96 | if (!strncmp(str, "232", 3)) { | ||
97 | uart1 = 232; | ||
98 | } else if (!strncmp(str, "485", 3)) { | ||
99 | /* OpenRD-Base doesn't have RS485. Treat is as an | ||
100 | * unknown argument & just have default setting - | ||
101 | * which is SD */ | ||
102 | if (machine_is_openrd_base()) { | ||
103 | uart1 = -ENODEV; | ||
104 | return 1; | ||
105 | } | ||
106 | |||
107 | uart1 = 485; | ||
108 | } | ||
109 | return 1; | ||
110 | } | ||
111 | /* Parse boot_command_line string kw_openrd_init_uart1=232/485 */ | ||
112 | __setup("kw_openrd_init_uart1=", sd_uart_selection); | ||
113 | |||
114 | static int __init uart1_mpp_config(void) | ||
115 | { | ||
116 | kirkwood_mpp_conf(openrd_uart1_mpp_config); | ||
117 | |||
118 | if (gpio_request(34, "SD_UART1_SEL")) { | ||
119 | printk(KERN_ERR "GPIO request failed for SD/UART1 selection" | ||
120 | ", gpio: 34\n"); | ||
121 | return -EIO; | ||
122 | } | ||
123 | |||
124 | if (gpio_request(28, "RS232_RS485_SEL")) { | ||
125 | printk(KERN_ERR "GPIO request failed for RS232/RS485 selection" | ||
126 | ", gpio# 28\n"); | ||
127 | gpio_free(34); | ||
128 | return -EIO; | ||
129 | } | ||
130 | |||
131 | /* Select UART1 | ||
132 | * Pin # 34: 0 => UART1, 1 => SD */ | ||
133 | gpio_direction_output(34, 0); | ||
134 | |||
135 | /* Select RS232 OR RS485 | ||
136 | * Pin # 28: 0 => RS232, 1 => RS485 */ | ||
137 | if (uart1 == 232) | ||
138 | gpio_direction_output(28, 0); | ||
139 | else | ||
140 | gpio_direction_output(28, 1); | ||
141 | |||
142 | gpio_free(34); | ||
143 | gpio_free(28); | ||
144 | |||
145 | return 0; | ||
146 | } | ||
147 | |||
70 | static void __init openrd_init(void) | 148 | static void __init openrd_init(void) |
71 | { | 149 | { |
72 | /* | 150 | /* |
@@ -90,7 +168,6 @@ static void __init openrd_init(void) | |||
90 | kirkwood_ge01_init(&openrd_ge01_data); | 168 | kirkwood_ge01_init(&openrd_ge01_data); |
91 | 169 | ||
92 | kirkwood_sata_init(&openrd_sata_data); | 170 | kirkwood_sata_init(&openrd_sata_data); |
93 | kirkwood_sdio_init(&openrd_mvsdio_data); | ||
94 | 171 | ||
95 | kirkwood_i2c_init(); | 172 | kirkwood_i2c_init(); |
96 | 173 | ||
@@ -99,6 +176,28 @@ static void __init openrd_init(void) | |||
99 | ARRAY_SIZE(i2c_board_info)); | 176 | ARRAY_SIZE(i2c_board_info)); |
100 | kirkwood_audio_init(); | 177 | kirkwood_audio_init(); |
101 | } | 178 | } |
179 | |||
180 | if (uart1 <= 0) { | ||
181 | if (uart1 < 0) | ||
182 | printk(KERN_ERR "Invalid kernel parameter to select " | ||
183 | "UART1. Defaulting to SD. ERROR CODE: %d\n", | ||
184 | uart1); | ||
185 | |||
186 | /* Select SD | ||
187 | * Pin # 34: 0 => UART1, 1 => SD */ | ||
188 | if (gpio_request(34, "SD_UART1_SEL")) { | ||
189 | printk(KERN_ERR "GPIO request failed for SD/UART1 " | ||
190 | "selection, gpio: 34\n"); | ||
191 | } else { | ||
192 | |||
193 | gpio_direction_output(34, 1); | ||
194 | gpio_free(34); | ||
195 | kirkwood_sdio_init(&openrd_mvsdio_data); | ||
196 | } | ||
197 | } else { | ||
198 | if (!uart1_mpp_config()) | ||
199 | kirkwood_uart1_init(); | ||
200 | } | ||
102 | } | 201 | } |
103 | 202 | ||
104 | static int __init openrd_pci_init(void) | 203 | static int __init openrd_pci_init(void) |
@@ -115,8 +214,6 @@ subsys_initcall(openrd_pci_init); | |||
115 | #ifdef CONFIG_MACH_OPENRD_BASE | 214 | #ifdef CONFIG_MACH_OPENRD_BASE |
116 | MACHINE_START(OPENRD_BASE, "Marvell OpenRD Base Board") | 215 | MACHINE_START(OPENRD_BASE, "Marvell OpenRD Base Board") |
117 | /* Maintainer: Dhaval Vasa <dhaval.vasa@einfochips.com> */ | 216 | /* Maintainer: Dhaval Vasa <dhaval.vasa@einfochips.com> */ |
118 | .phys_io = KIRKWOOD_REGS_PHYS_BASE, | ||
119 | .io_pg_offst = ((KIRKWOOD_REGS_VIRT_BASE) >> 18) & 0xfffc, | ||
120 | .boot_params = 0x00000100, | 217 | .boot_params = 0x00000100, |
121 | .init_machine = openrd_init, | 218 | .init_machine = openrd_init, |
122 | .map_io = kirkwood_map_io, | 219 | .map_io = kirkwood_map_io, |
@@ -128,8 +225,6 @@ MACHINE_END | |||
128 | #ifdef CONFIG_MACH_OPENRD_CLIENT | 225 | #ifdef CONFIG_MACH_OPENRD_CLIENT |
129 | MACHINE_START(OPENRD_CLIENT, "Marvell OpenRD Client Board") | 226 | MACHINE_START(OPENRD_CLIENT, "Marvell OpenRD Client Board") |
130 | /* Maintainer: Dhaval Vasa <dhaval.vasa@einfochips.com> */ | 227 | /* Maintainer: Dhaval Vasa <dhaval.vasa@einfochips.com> */ |
131 | .phys_io = KIRKWOOD_REGS_PHYS_BASE, | ||
132 | .io_pg_offst = ((KIRKWOOD_REGS_VIRT_BASE) >> 18) & 0xfffc, | ||
133 | .boot_params = 0x00000100, | 228 | .boot_params = 0x00000100, |
134 | .init_machine = openrd_init, | 229 | .init_machine = openrd_init, |
135 | .map_io = kirkwood_map_io, | 230 | .map_io = kirkwood_map_io, |
@@ -141,8 +236,6 @@ MACHINE_END | |||
141 | #ifdef CONFIG_MACH_OPENRD_ULTIMATE | 236 | #ifdef CONFIG_MACH_OPENRD_ULTIMATE |
142 | MACHINE_START(OPENRD_ULTIMATE, "Marvell OpenRD Ultimate Board") | 237 | MACHINE_START(OPENRD_ULTIMATE, "Marvell OpenRD Ultimate Board") |
143 | /* Maintainer: Dhaval Vasa <dhaval.vasa@einfochips.com> */ | 238 | /* Maintainer: Dhaval Vasa <dhaval.vasa@einfochips.com> */ |
144 | .phys_io = KIRKWOOD_REGS_PHYS_BASE, | ||
145 | .io_pg_offst = ((KIRKWOOD_REGS_VIRT_BASE) >> 18) & 0xfffc, | ||
146 | .boot_params = 0x00000100, | 239 | .boot_params = 0x00000100, |
147 | .init_machine = openrd_init, | 240 | .init_machine = openrd_init, |
148 | .map_io = kirkwood_map_io, | 241 | .map_io = kirkwood_map_io, |