Merge branch 'next' into for-linus
[pandora-kernel.git] / arch / arm / mach-omap2 / board-igep0030.c
1 /*
2  * Copyright (C) 2010 - ISEE 2007 SL
3  *
4  * Modified from mach-omap2/board-generic.c
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  */
10
11 #include <linux/kernel.h>
12 #include <linux/init.h>
13 #include <linux/platform_device.h>
14 #include <linux/delay.h>
15 #include <linux/err.h>
16 #include <linux/clk.h>
17 #include <linux/io.h>
18 #include <linux/gpio.h>
19 #include <linux/interrupt.h>
20
21 #include <linux/regulator/machine.h>
22 #include <linux/regulator/fixed.h>
23 #include <linux/i2c/twl.h>
24 #include <linux/mmc/host.h>
25
26 #include <asm/mach-types.h>
27 #include <asm/mach/arch.h>
28
29 #include <plat/board.h>
30 #include <plat/common.h>
31 #include <plat/gpmc.h>
32 #include <plat/usb.h>
33 #include <plat/onenand.h>
34
35 #include "mux.h"
36 #include "hsmmc.h"
37 #include "sdram-numonyx-m65kxxxxam.h"
38
39 #define IGEP3_GPIO_LED0_GREEN   54
40 #define IGEP3_GPIO_LED0_RED     53
41 #define IGEP3_GPIO_LED1_RED     16
42
43 #define IGEP3_GPIO_WIFI_NPD     138
44 #define IGEP3_GPIO_WIFI_NRESET  139
45 #define IGEP3_GPIO_BT_NRESET    137
46
47 #define IGEP3_GPIO_USBH_NRESET  183
48
49
50 #if defined(CONFIG_MTD_ONENAND_OMAP2) || \
51         defined(CONFIG_MTD_ONENAND_OMAP2_MODULE)
52
53 #define ONENAND_MAP             0x20000000
54
55 /*
56  * x2 Flash built-in COMBO POP MEMORY
57  * Since the device is equipped with two DataRAMs, and two-plane NAND
58  * Flash memory array, these two component enables simultaneous program
59  * of 4KiB. Plane1 has only even blocks such as block0, block2, block4
60  * while Plane2 has only odd blocks such as block1, block3, block5.
61  * So MTD regards it as 4KiB page size and 256KiB block size 64*(2*2048)
62  */
63
64 static struct mtd_partition igep3_onenand_partitions[] = {
65         {
66                 .name           = "X-Loader",
67                 .offset         = 0,
68                 .size           = 2 * (64*(2*2048))
69         },
70         {
71                 .name           = "U-Boot",
72                 .offset         = MTDPART_OFS_APPEND,
73                 .size           = 6 * (64*(2*2048)),
74         },
75         {
76                 .name           = "Environment",
77                 .offset         = MTDPART_OFS_APPEND,
78                 .size           = 2 * (64*(2*2048)),
79         },
80         {
81                 .name           = "Kernel",
82                 .offset         = MTDPART_OFS_APPEND,
83                 .size           = 12 * (64*(2*2048)),
84         },
85         {
86                 .name           = "File System",
87                 .offset         = MTDPART_OFS_APPEND,
88                 .size           = MTDPART_SIZ_FULL,
89         },
90 };
91
92 static struct omap_onenand_platform_data igep3_onenand_pdata = {
93         .parts = igep3_onenand_partitions,
94         .nr_parts = ARRAY_SIZE(igep3_onenand_partitions),
95         .onenand_setup = NULL,
96         .dma_channel    = -1,   /* disable DMA in OMAP OneNAND driver */
97 };
98
99 static struct platform_device igep3_onenand_device = {
100         .name           = "omap2-onenand",
101         .id             = -1,
102         .dev = {
103                 .platform_data = &igep3_onenand_pdata,
104         },
105 };
106
107 static void __init igep3_flash_init(void)
108 {
109         u8 cs = 0;
110         u8 onenandcs = GPMC_CS_NUM + 1;
111
112         for (cs = 0; cs < GPMC_CS_NUM; cs++) {
113                 u32 ret;
114                 ret = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG1);
115
116                 /* Check if NAND/oneNAND is configured */
117                 if ((ret & 0xC00) == 0x800)
118                         /* NAND found */
119                         pr_err("IGEP3: Unsupported NAND found\n");
120                 else {
121                         ret = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG7);
122
123                         if ((ret & 0x3F) == (ONENAND_MAP >> 24))
124                                 /* OneNAND found */
125                                 onenandcs = cs;
126                 }
127         }
128
129         if (onenandcs > GPMC_CS_NUM) {
130                 pr_err("IGEP3: Unable to find configuration in GPMC\n");
131                 return;
132         }
133
134         igep3_onenand_pdata.cs = onenandcs;
135
136         if (platform_device_register(&igep3_onenand_device) < 0)
137                 pr_err("IGEP3: Unable to register OneNAND device\n");
138 }
139
140 #else
141 static void __init igep3_flash_init(void) {}
142 #endif
143
144 static struct regulator_consumer_supply igep3_vmmc1_supply =
145         REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0");
146
147 /* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */
148 static struct regulator_init_data igep3_vmmc1 = {
149         .constraints = {
150                 .min_uV                 = 1850000,
151                 .max_uV                 = 3150000,
152                 .valid_modes_mask       = REGULATOR_MODE_NORMAL
153                                         | REGULATOR_MODE_STANDBY,
154                 .valid_ops_mask         = REGULATOR_CHANGE_VOLTAGE
155                                         | REGULATOR_CHANGE_MODE
156                                         | REGULATOR_CHANGE_STATUS,
157         },
158         .num_consumer_supplies  = 1,
159         .consumer_supplies      = &igep3_vmmc1_supply,
160 };
161
162 static struct regulator_consumer_supply igep3_vio_supply =
163         REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.1");
164
165 static struct regulator_init_data igep3_vio = {
166         .constraints = {
167                 .min_uV                 = 1800000,
168                 .max_uV                 = 1800000,
169                 .apply_uV               = 1,
170                 .valid_modes_mask       = REGULATOR_MODE_NORMAL
171                                         | REGULATOR_MODE_STANDBY,
172                 .valid_ops_mask         = REGULATOR_CHANGE_VOLTAGE
173                                         | REGULATOR_CHANGE_MODE
174                                         | REGULATOR_CHANGE_STATUS,
175         },
176         .num_consumer_supplies  = 1,
177         .consumer_supplies      = &igep3_vio_supply,
178 };
179
180 static struct regulator_consumer_supply igep3_vmmc2_supply =
181         REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1");
182
183 static struct regulator_init_data igep3_vmmc2 = {
184         .constraints    = {
185                 .valid_modes_mask       = REGULATOR_MODE_NORMAL,
186                 .always_on              = 1,
187         },
188         .num_consumer_supplies  = 1,
189         .consumer_supplies      = &igep3_vmmc2_supply,
190 };
191
192 static struct fixed_voltage_config igep3_vwlan = {
193         .supply_name            = "vwlan",
194         .microvolts             = 3300000,
195         .gpio                   = -EINVAL,
196         .enabled_at_boot        = 1,
197         .init_data              = &igep3_vmmc2,
198 };
199
200 static struct platform_device igep3_vwlan_device = {
201         .name   = "reg-fixed-voltage",
202         .id     = 0,
203         .dev    = {
204                 .platform_data = &igep3_vwlan,
205         },
206 };
207
208 static struct omap2_hsmmc_info mmc[] = {
209         [0] = {
210                 .mmc            = 1,
211                 .caps           = MMC_CAP_4_BIT_DATA,
212                 .gpio_cd        = -EINVAL,
213                 .gpio_wp        = -EINVAL,
214         },
215 #if defined(CONFIG_LIBERTAS_SDIO) || defined(CONFIG_LIBERTAS_SDIO_MODULE)
216         [1] = {
217                 .mmc            = 2,
218                 .caps           = MMC_CAP_4_BIT_DATA,
219                 .gpio_cd        = -EINVAL,
220                 .gpio_wp        = -EINVAL,
221         },
222 #endif
223         {}      /* Terminator */
224 };
225
226 #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
227 #include <linux/leds.h>
228
229 static struct gpio_led igep3_gpio_leds[] = {
230         [0] = {
231                 .name                   = "gpio-led:red:d0",
232                 .gpio                   = IGEP3_GPIO_LED0_RED,
233                 .default_trigger        = "default-off"
234         },
235         [1] = {
236                 .name                   = "gpio-led:green:d0",
237                 .gpio                   = IGEP3_GPIO_LED0_GREEN,
238                 .default_trigger        = "default-off",
239         },
240         [2] = {
241                 .name                   = "gpio-led:red:d1",
242                 .gpio                   = IGEP3_GPIO_LED1_RED,
243                 .default_trigger        = "default-off",
244         },
245         [3] = {
246                 .name                   = "gpio-led:green:d1",
247                 .default_trigger        = "heartbeat",
248                 .gpio                   = -EINVAL, /* gets replaced */
249         },
250 };
251
252 static struct gpio_led_platform_data igep3_led_pdata = {
253         .leds           = igep3_gpio_leds,
254         .num_leds       = ARRAY_SIZE(igep3_gpio_leds),
255 };
256
257 static struct platform_device igep3_led_device = {
258          .name   = "leds-gpio",
259          .id     = -1,
260          .dev    = {
261                  .platform_data = &igep3_led_pdata,
262         },
263 };
264
265 static void __init igep3_leds_init(void)
266 {
267         platform_device_register(&igep3_led_device);
268 }
269
270 #else
271 static inline void igep3_leds_init(void)
272 {
273         if ((gpio_request(IGEP3_GPIO_LED0_RED, "gpio-led:red:d0") == 0) &&
274             (gpio_direction_output(IGEP3_GPIO_LED0_RED, 1) == 0)) {
275                 gpio_export(IGEP3_GPIO_LED0_RED, 0);
276                 gpio_set_value(IGEP3_GPIO_LED0_RED, 1);
277         } else
278                 pr_warning("IGEP3: Could not obtain gpio GPIO_LED0_RED\n");
279
280         if ((gpio_request(IGEP3_GPIO_LED0_GREEN, "gpio-led:green:d0") == 0) &&
281             (gpio_direction_output(IGEP3_GPIO_LED0_GREEN, 1) == 0)) {
282                 gpio_export(IGEP3_GPIO_LED0_GREEN, 0);
283                 gpio_set_value(IGEP3_GPIO_LED0_GREEN, 1);
284         } else
285                 pr_warning("IGEP3: Could not obtain gpio GPIO_LED0_GREEN\n");
286
287         if ((gpio_request(IGEP3_GPIO_LED1_RED, "gpio-led:red:d1") == 0) &&
288                 (gpio_direction_output(IGEP3_GPIO_LED1_RED, 1) == 0)) {
289                 gpio_export(IGEP3_GPIO_LED1_RED, 0);
290                 gpio_set_value(IGEP3_GPIO_LED1_RED, 1);
291         } else
292                 pr_warning("IGEP3: Could not obtain gpio GPIO_LED1_RED\n");
293 }
294 #endif
295
296 static int igep3_twl4030_gpio_setup(struct device *dev,
297                 unsigned gpio, unsigned ngpio)
298 {
299         /* gpio + 0 is "mmc0_cd" (input/IRQ) */
300         mmc[0].gpio_cd = gpio + 0;
301         omap2_hsmmc_init(mmc);
302
303         /* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */
304 #if !defined(CONFIG_LEDS_GPIO) && !defined(CONFIG_LEDS_GPIO_MODULE)
305         if ((gpio_request(gpio+TWL4030_GPIO_MAX+1, "gpio-led:green:d1") == 0)
306             && (gpio_direction_output(gpio + TWL4030_GPIO_MAX + 1, 1) == 0)) {
307                 gpio_export(gpio + TWL4030_GPIO_MAX + 1, 0);
308                 gpio_set_value(gpio + TWL4030_GPIO_MAX + 1, 0);
309         } else
310                 pr_warning("IGEP3: Could not obtain gpio GPIO_LED1_GREEN\n");
311 #else
312         igep3_gpio_leds[3].gpio = gpio + TWL4030_GPIO_MAX + 1;
313 #endif
314
315         return 0;
316 };
317
318 static struct twl4030_gpio_platform_data igep3_twl4030_gpio_pdata = {
319         .gpio_base      = OMAP_MAX_GPIO_LINES,
320         .irq_base       = TWL4030_GPIO_IRQ_BASE,
321         .irq_end        = TWL4030_GPIO_IRQ_END,
322         .use_leds       = true,
323         .setup          = igep3_twl4030_gpio_setup,
324 };
325
326 static struct twl4030_usb_data igep3_twl4030_usb_data = {
327         .usb_mode       = T2_USB_MODE_ULPI,
328 };
329
330 static struct platform_device *igep3_devices[] __initdata = {
331         &igep3_vwlan_device,
332 };
333
334 static void __init igep3_init_early(void)
335 {
336         omap2_init_common_infrastructure();
337         omap2_init_common_devices(m65kxxxxam_sdrc_params,
338                                   m65kxxxxam_sdrc_params);
339 }
340
341 static struct twl4030_platform_data igep3_twl4030_pdata = {
342         .irq_base       = TWL4030_IRQ_BASE,
343         .irq_end        = TWL4030_IRQ_END,
344
345         /* platform_data for children goes here */
346         .usb            = &igep3_twl4030_usb_data,
347         .gpio           = &igep3_twl4030_gpio_pdata,
348         .vmmc1          = &igep3_vmmc1,
349         .vio            = &igep3_vio,
350 };
351
352 static struct i2c_board_info __initdata igep3_i2c_boardinfo[] = {
353         {
354                 I2C_BOARD_INFO("twl4030", 0x48),
355                 .flags          = I2C_CLIENT_WAKE,
356                 .irq            = INT_34XX_SYS_NIRQ,
357                 .platform_data  = &igep3_twl4030_pdata,
358         },
359 };
360
361 static int __init igep3_i2c_init(void)
362 {
363         omap_register_i2c_bus(1, 2600, igep3_i2c_boardinfo,
364                         ARRAY_SIZE(igep3_i2c_boardinfo));
365
366         return 0;
367 }
368
369 static struct omap_musb_board_data musb_board_data = {
370         .interface_type = MUSB_INTERFACE_ULPI,
371         .mode           = MUSB_OTG,
372         .power          = 100,
373 };
374
375 #if defined(CONFIG_LIBERTAS_SDIO) || defined(CONFIG_LIBERTAS_SDIO_MODULE)
376
377 static void __init igep3_wifi_bt_init(void)
378 {
379         /* Configure MUX values for W-LAN + Bluetooth GPIO's */
380         omap_mux_init_gpio(IGEP3_GPIO_WIFI_NPD, OMAP_PIN_OUTPUT);
381         omap_mux_init_gpio(IGEP3_GPIO_WIFI_NRESET, OMAP_PIN_OUTPUT);
382         omap_mux_init_gpio(IGEP3_GPIO_BT_NRESET, OMAP_PIN_OUTPUT);
383
384         /* Set GPIO's for  W-LAN + Bluetooth combo module */
385         if ((gpio_request(IGEP3_GPIO_WIFI_NPD, "GPIO_WIFI_NPD") == 0) &&
386             (gpio_direction_output(IGEP3_GPIO_WIFI_NPD, 1) == 0)) {
387                 gpio_export(IGEP3_GPIO_WIFI_NPD, 0);
388         } else
389                 pr_warning("IGEP3: Could not obtain gpio GPIO_WIFI_NPD\n");
390
391         if ((gpio_request(IGEP3_GPIO_WIFI_NRESET, "GPIO_WIFI_NRESET") == 0) &&
392             (gpio_direction_output(IGEP3_GPIO_WIFI_NRESET, 1) == 0)) {
393                 gpio_export(IGEP3_GPIO_WIFI_NRESET, 0);
394                 gpio_set_value(IGEP3_GPIO_WIFI_NRESET, 0);
395                 udelay(10);
396                 gpio_set_value(IGEP3_GPIO_WIFI_NRESET, 1);
397         } else
398                 pr_warning("IGEP3: Could not obtain gpio GPIO_WIFI_NRESET\n");
399
400         if ((gpio_request(IGEP3_GPIO_BT_NRESET, "GPIO_BT_NRESET") == 0) &&
401             (gpio_direction_output(IGEP3_GPIO_BT_NRESET, 1) == 0)) {
402                 gpio_export(IGEP3_GPIO_BT_NRESET, 0);
403         } else
404                 pr_warning("IGEP3: Could not obtain gpio GPIO_BT_NRESET\n");
405 }
406 #else
407 void __init igep3_wifi_bt_init(void) {}
408 #endif
409
410 static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
411         .port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED,
412         .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY,
413         .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED,
414
415         .phy_reset = true,
416         .reset_gpio_port[0] = -EINVAL,
417         .reset_gpio_port[1] = IGEP3_GPIO_USBH_NRESET,
418         .reset_gpio_port[2] = -EINVAL,
419 };
420
421 #ifdef CONFIG_OMAP_MUX
422 static struct omap_board_mux board_mux[] __initdata = {
423         OMAP3_MUX(I2C2_SDA, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT),
424         { .reg_offset = OMAP_MUX_TERMINATOR },
425 };
426 #endif
427
428 static void __init igep3_init(void)
429 {
430         omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
431
432         /* Register I2C busses and drivers */
433         igep3_i2c_init();
434         platform_add_devices(igep3_devices, ARRAY_SIZE(igep3_devices));
435         omap_serial_init();
436         usb_musb_init(&musb_board_data);
437         usbhs_init(&usbhs_bdata);
438
439         igep3_flash_init();
440         igep3_leds_init();
441
442         /*
443          * WLAN-BT combo module from MuRata which has a Marvell WLAN
444          * (88W8686) + CSR Bluetooth chipset. Uses SDIO interface.
445          */
446         igep3_wifi_bt_init();
447
448 }
449
450 MACHINE_START(IGEP0030, "IGEP OMAP3 module")
451         .boot_params    = 0x80000100,
452         .reserve        = omap_reserve,
453         .map_io         = omap3_map_io,
454         .init_early     = igep3_init_early,
455         .init_irq       = omap_init_irq,
456         .init_machine   = igep3_init,
457         .timer          = &omap_timer,
458 MACHINE_END