diff options
author | Tanmay Upadhyay <tanmay.upadhyay@einfochips.com> | 2010-08-26 01:41:58 -0400 |
---|---|---|
committer | Nicolas Pitre <nico@fluxnic.net> | 2010-09-19 22:43:43 -0400 |
commit | fd2ce9c59a63d1daec8d76d272eca5149fb8706a (patch) | |
tree | c8fc8ffc61873bde098ac6a9e43f70f44dcf3383 /arch | |
parent | f539dfedbd169e5ed47912bb517c75976ab556f3 (diff) |
[ARM] OpenRD: Enable SD/UART selection for serial port 1
This patch enables users to choose either the SDIO interface or UART1
(RS232/RS485). The selection can be done through kernel parameter.
By default the port would be used for SDIO interface. Passing the string
"kw_openrd_init_uart1=232" or "kw_openrd_init_uart1=485" enables either
the RS-232 or RS-485 port respectively; disabling the SDIO interface.
Anything else selects the default SDIO interface.
"kw_openrd_init_uart1=485" is ignored on OpenRD-Base as it doesn't
have RS485 port.
Signed-off-by: Tanmay Upadhyay <tanmay.upadhyay@einfochips.com>
Acked-by: Alexander Clouter <alex@digriz.org.uk>
Signed-off-by: Nicolas Pitre <nico@fluxnic.net>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/mach-kirkwood/openrd-setup.c | 101 |
1 files changed, 100 insertions, 1 deletions
diff --git a/arch/arm/mach-kirkwood/openrd-setup.c b/arch/arm/mach-kirkwood/openrd-setup.c index fd06be618815..38017c8ac43f 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) |