Adding support for MOXA ART SoC. Testing port of linux-2.6.32.60-moxart.
[linux-3.6.7-moxart.git] / arch / arm / mach-kirkwood / openrd-setup.c
blob7e99c3f340fc5e61c85e7023afc9e345a5a130d8
1 /*
2 * arch/arm/mach-kirkwood/openrd-setup.c
4 * Marvell OpenRD (Base|Client|Ultimate) Board Setup
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 */
11 #include <linux/kernel.h>
12 #include <linux/init.h>
13 #include <linux/platform_device.h>
14 #include <linux/mtd/nand.h>
15 #include <linux/mtd/partitions.h>
16 #include <linux/ata_platform.h>
17 #include <linux/mv643xx_eth.h>
18 #include <linux/i2c.h>
19 #include <linux/gpio.h>
20 #include <asm/mach-types.h>
21 #include <asm/mach/arch.h>
22 #include <mach/kirkwood.h>
23 #include <plat/mvsdio.h>
24 #include "common.h"
25 #include "mpp.h"
27 static struct mtd_partition openrd_nand_parts[] = {
29 .name = "u-boot",
30 .offset = 0,
31 .size = SZ_1M,
32 .mask_flags = MTD_WRITEABLE
33 }, {
34 .name = "uImage",
35 .offset = MTDPART_OFS_NXTBLK,
36 .size = SZ_4M
37 }, {
38 .name = "root",
39 .offset = MTDPART_OFS_NXTBLK,
40 .size = MTDPART_SIZ_FULL
44 static struct mv643xx_eth_platform_data openrd_ge00_data = {
45 .phy_addr = MV643XX_ETH_PHY_ADDR(8),
48 static struct mv643xx_eth_platform_data openrd_ge01_data = {
49 .phy_addr = MV643XX_ETH_PHY_ADDR(24),
52 static struct mv_sata_platform_data openrd_sata_data = {
53 .n_ports = 2,
56 static struct mvsdio_platform_data openrd_mvsdio_data = {
57 .gpio_card_detect = 29, /* MPP29 used as SD card detect */
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,
68 MPP29_GPIO,
69 MPP34_GPIO,
73 /* Configure MPP for UART1 */
74 static unsigned int openrd_uart1_mpp_config[] __initdata = {
75 MPP13_UART1_TXD,
76 MPP14_UART1_RXD,
80 static struct i2c_board_info i2c_board_info[] __initdata = {
82 I2C_BOARD_INFO("cs42l51", 0x4a),
86 static struct platform_device openrd_client_audio_device = {
87 .name = "openrd-client-audio",
88 .id = -1,
91 static int __initdata uart1;
93 static int __init sd_uart_selection(char *str)
95 uart1 = -EINVAL;
97 /* Default is SD. Change if required, for UART */
98 if (!str)
99 return 0;
101 if (!strncmp(str, "232", 3)) {
102 uart1 = 232;
103 } else if (!strncmp(str, "485", 3)) {
104 /* OpenRD-Base doesn't have RS485. Treat is as an
105 * unknown argument & just have default setting -
106 * which is SD */
107 if (machine_is_openrd_base()) {
108 uart1 = -ENODEV;
109 return 1;
112 uart1 = 485;
114 return 1;
116 /* Parse boot_command_line string kw_openrd_init_uart1=232/485 */
117 __setup("kw_openrd_init_uart1=", sd_uart_selection);
119 static int __init uart1_mpp_config(void)
121 kirkwood_mpp_conf(openrd_uart1_mpp_config);
123 if (gpio_request(34, "SD_UART1_SEL")) {
124 printk(KERN_ERR "GPIO request failed for SD/UART1 selection"
125 ", gpio: 34\n");
126 return -EIO;
129 if (gpio_request(28, "RS232_RS485_SEL")) {
130 printk(KERN_ERR "GPIO request failed for RS232/RS485 selection"
131 ", gpio# 28\n");
132 gpio_free(34);
133 return -EIO;
136 /* Select UART1
137 * Pin # 34: 0 => UART1, 1 => SD */
138 gpio_direction_output(34, 0);
140 /* Select RS232 OR RS485
141 * Pin # 28: 0 => RS232, 1 => RS485 */
142 if (uart1 == 232)
143 gpio_direction_output(28, 0);
144 else
145 gpio_direction_output(28, 1);
147 gpio_free(34);
148 gpio_free(28);
150 return 0;
153 static void __init openrd_init(void)
156 * Basic setup. Needs to be called early.
158 kirkwood_init();
159 kirkwood_mpp_conf(openrd_mpp_config);
161 kirkwood_uart0_init();
162 kirkwood_nand_init(ARRAY_AND_SIZE(openrd_nand_parts), 25);
164 kirkwood_ehci_init();
166 if (machine_is_openrd_ultimate()) {
167 openrd_ge00_data.phy_addr = MV643XX_ETH_PHY_ADDR(0);
168 openrd_ge01_data.phy_addr = MV643XX_ETH_PHY_ADDR(1);
171 kirkwood_ge00_init(&openrd_ge00_data);
172 if (!machine_is_openrd_base())
173 kirkwood_ge01_init(&openrd_ge01_data);
175 kirkwood_sata_init(&openrd_sata_data);
177 kirkwood_i2c_init();
179 if (machine_is_openrd_client() || machine_is_openrd_ultimate()) {
180 platform_device_register(&openrd_client_audio_device);
181 i2c_register_board_info(0, i2c_board_info,
182 ARRAY_SIZE(i2c_board_info));
183 kirkwood_audio_init();
186 if (uart1 <= 0) {
187 if (uart1 < 0)
188 printk(KERN_ERR "Invalid kernel parameter to select "
189 "UART1. Defaulting to SD. ERROR CODE: %d\n",
190 uart1);
192 /* Select SD
193 * Pin # 34: 0 => UART1, 1 => SD */
194 if (gpio_request(34, "SD_UART1_SEL")) {
195 printk(KERN_ERR "GPIO request failed for SD/UART1 "
196 "selection, gpio: 34\n");
197 } else {
199 gpio_direction_output(34, 1);
200 gpio_free(34);
201 kirkwood_sdio_init(&openrd_mvsdio_data);
203 } else {
204 if (!uart1_mpp_config())
205 kirkwood_uart1_init();
209 static int __init openrd_pci_init(void)
211 if (machine_is_openrd_base() ||
212 machine_is_openrd_client() ||
213 machine_is_openrd_ultimate())
214 kirkwood_pcie_init(KW_PCIE0);
216 return 0;
218 subsys_initcall(openrd_pci_init);
220 #ifdef CONFIG_MACH_OPENRD_BASE
221 MACHINE_START(OPENRD_BASE, "Marvell OpenRD Base Board")
222 /* Maintainer: Dhaval Vasa <dhaval.vasa@einfochips.com> */
223 .atag_offset = 0x100,
224 .init_machine = openrd_init,
225 .map_io = kirkwood_map_io,
226 .init_early = kirkwood_init_early,
227 .init_irq = kirkwood_init_irq,
228 .timer = &kirkwood_timer,
229 .restart = kirkwood_restart,
230 MACHINE_END
231 #endif
233 #ifdef CONFIG_MACH_OPENRD_CLIENT
234 MACHINE_START(OPENRD_CLIENT, "Marvell OpenRD Client Board")
235 /* Maintainer: Dhaval Vasa <dhaval.vasa@einfochips.com> */
236 .atag_offset = 0x100,
237 .init_machine = openrd_init,
238 .map_io = kirkwood_map_io,
239 .init_early = kirkwood_init_early,
240 .init_irq = kirkwood_init_irq,
241 .timer = &kirkwood_timer,
242 .restart = kirkwood_restart,
243 MACHINE_END
244 #endif
246 #ifdef CONFIG_MACH_OPENRD_ULTIMATE
247 MACHINE_START(OPENRD_ULTIMATE, "Marvell OpenRD Ultimate Board")
248 /* Maintainer: Dhaval Vasa <dhaval.vasa@einfochips.com> */
249 .atag_offset = 0x100,
250 .init_machine = openrd_init,
251 .map_io = kirkwood_map_io,
252 .init_early = kirkwood_init_early,
253 .init_irq = kirkwood_init_irq,
254 .timer = &kirkwood_timer,
255 .restart = kirkwood_restart,
256 MACHINE_END
257 #endif