Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
openrd-setup.c
Go to the documentation of this file.
1 /*
2  * arch/arm/mach-kirkwood/openrd-setup.c
3  *
4  * Marvell OpenRD (Base|Client|Ultimate) Board Setup
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/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>
24 #include "common.h"
25 #include "mpp.h"
26 
27 static struct mtd_partition openrd_nand_parts[] = {
28  {
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
41  },
42 };
43 
44 static struct mv643xx_eth_platform_data openrd_ge00_data = {
45  .phy_addr = MV643XX_ETH_PHY_ADDR(8),
46 };
47 
48 static struct mv643xx_eth_platform_data openrd_ge01_data = {
49  .phy_addr = MV643XX_ETH_PHY_ADDR(24),
50 };
51 
52 static struct mv_sata_platform_data openrd_sata_data = {
53  .n_ports = 2,
54 };
55 
56 static struct mvsdio_platform_data openrd_mvsdio_data = {
57  .gpio_card_detect = 29, /* MPP29 used as SD card detect */
58 };
59 
60 static unsigned int openrd_mpp_config[] __initdata = {
67  MPP28_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 = {
77  0
78 };
79 
80 static struct i2c_board_info i2c_board_info[] __initdata = {
81  {
82  I2C_BOARD_INFO("cs42l51", 0x4a),
83  },
84 };
85 
86 static struct platform_device openrd_client_audio_device = {
87  .name = "openrd-client-audio",
88  .id = -1,
89 };
90 
91 static int __initdata uart1;
92 
93 static int __init sd_uart_selection(char *str)
94 {
95  uart1 = -EINVAL;
96 
97  /* Default is SD. Change if required, for UART */
98  if (!str)
99  return 0;
100 
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;
110  }
111 
112  uart1 = 485;
113  }
114  return 1;
115 }
116 /* Parse boot_command_line string kw_openrd_init_uart1=232/485 */
117 __setup("kw_openrd_init_uart1=", sd_uart_selection);
118 
119 static int __init uart1_mpp_config(void)
120 {
121  kirkwood_mpp_conf(openrd_uart1_mpp_config);
122 
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;
127  }
128 
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;
134  }
135 
136  /* Select UART1
137  * Pin # 34: 0 => UART1, 1 => SD */
138  gpio_direction_output(34, 0);
139 
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);
146 
147  gpio_free(34);
148  gpio_free(28);
149 
150  return 0;
151 }
152 
153 static void __init openrd_init(void)
154 {
155  /*
156  * Basic setup. Needs to be called early.
157  */
158  kirkwood_init();
159  kirkwood_mpp_conf(openrd_mpp_config);
160 
162  kirkwood_nand_init(ARRAY_AND_SIZE(openrd_nand_parts), 25);
163 
165 
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);
169  }
170 
171  kirkwood_ge00_init(&openrd_ge00_data);
172  if (!machine_is_openrd_base())
173  kirkwood_ge01_init(&openrd_ge01_data);
174 
175  kirkwood_sata_init(&openrd_sata_data);
176 
178 
179  if (machine_is_openrd_client() || machine_is_openrd_ultimate()) {
180  platform_device_register(&openrd_client_audio_device);
184  }
185 
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);
191 
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 {
198 
199  gpio_direction_output(34, 1);
200  gpio_free(34);
201  kirkwood_sdio_init(&openrd_mvsdio_data);
202  }
203  } else {
204  if (!uart1_mpp_config())
206  }
207 }
208 
209 static int __init openrd_pci_init(void)
210 {
211  if (machine_is_openrd_base() ||
212  machine_is_openrd_client() ||
213  machine_is_openrd_ultimate())
215 
216  return 0;
217 }
218 subsys_initcall(openrd_pci_init);
219 
220 #ifdef CONFIG_MACH_OPENRD_BASE
221 MACHINE_START(OPENRD_BASE, "Marvell OpenRD Base Board")
222  /* Maintainer: Dhaval Vasa <[email protected]> */
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,
231 #endif
232 
233 #ifdef CONFIG_MACH_OPENRD_CLIENT
234 MACHINE_START(OPENRD_CLIENT, "Marvell OpenRD Client Board")
235  /* Maintainer: Dhaval Vasa <[email protected]> */
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,
244 #endif
245 
246 #ifdef CONFIG_MACH_OPENRD_ULTIMATE
247 MACHINE_START(OPENRD_ULTIMATE, "Marvell OpenRD Ultimate Board")
248  /* Maintainer: Dhaval Vasa <[email protected]> */
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,
257 #endif