aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-omap2/board-igep0020.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2010-10-25 16:46:56 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2010-10-25 16:46:56 -0400
commit7b6181e06841f5ad15c4ff708b967b4db65a64de (patch)
treebdfcf5b74b692f76581156e452d268b64c795200 /arch/arm/mach-omap2/board-igep0020.c
parent72e58063d63c5f0a7bf65312f1e3a5ed9bb5c2ff (diff)
parentbc487fb341af05120bccb9f59ce76302391dcc77 (diff)
Merge branch 'omap-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap-2.6
* 'omap-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap-2.6: (163 commits) omap: complete removal of machine_desc.io_pg_offst and .phys_io omap: UART: fix wakeup registers for OMAP24xx UART2 omap: Fix spotty MMC voltages ASoC: OMAP4: MCPDM: Remove unnecessary include of plat/control.h serial: omap-serial: fix signess error OMAP3: DMA: Errata i541: sDMA FIFO draining does not finish omap: dma: Fix buffering disable bit setting for omap24xx omap: serial: Fix the boot-up crash/reboot without CONFIG_PM OMAP3: PM: fix scratchpad memory accesses for off-mode omap4: pandaboard: enable the ehci port on pandaboard omap4: pandaboard: Fix the init if CONFIG_MMC_OMAP_HS is not set omap4: pandaboard: remove unused hsmmc definition OMAP: McBSP: Remove null omap44xx ops comment OMAP: McBSP: Swap CLKS source definition OMAP: McBSP: Fix CLKR and FSR signal muxing OMAP2+: clock: reduce the amount of standard debugging while disabling unused clocks OMAP: control: move plat-omap/control.h to mach-omap2/control.h OMAP: split plat-omap/common.c OMAP: McBSP: implement functional clock switching via clock framework OMAP: McBSP: implement McBSP CLKR and FSR signal muxing via mach-omap2/mcbsp.c ... Fixed up trivial conflicts in arch/arm/mach-omap2/ {board-zoom-peripherals.c,devices.c} as per Tony
Diffstat (limited to 'arch/arm/mach-omap2/board-igep0020.c')
-rw-r--r--arch/arm/mach-omap2/board-igep0020.c369
1 files changed, 244 insertions, 125 deletions
diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c
index b62a68ba069b..5e035a58b809 100644
--- a/arch/arm/mach-omap2/board-igep0020.c
+++ b/arch/arm/mach-omap2/board-igep0020.c
@@ -20,6 +20,7 @@
20 20
21#include <linux/regulator/machine.h> 21#include <linux/regulator/machine.h>
22#include <linux/i2c/twl.h> 22#include <linux/i2c/twl.h>
23#include <linux/mmc/host.h>
23 24
24#include <asm/mach-types.h> 25#include <asm/mach-types.h>
25#include <asm/mach/arch.h> 26#include <asm/mach/arch.h>
@@ -38,12 +39,61 @@
38#define IGEP2_SMSC911X_CS 5 39#define IGEP2_SMSC911X_CS 5
39#define IGEP2_SMSC911X_GPIO 176 40#define IGEP2_SMSC911X_GPIO 176
40#define IGEP2_GPIO_USBH_NRESET 24 41#define IGEP2_GPIO_USBH_NRESET 24
41#define IGEP2_GPIO_LED0_GREEN 26 42#define IGEP2_GPIO_LED0_GREEN 26
42#define IGEP2_GPIO_LED0_RED 27 43#define IGEP2_GPIO_LED0_RED 27
43#define IGEP2_GPIO_LED1_RED 28 44#define IGEP2_GPIO_LED1_RED 28
44#define IGEP2_GPIO_DVI_PUP 170 45#define IGEP2_GPIO_DVI_PUP 170
45#define IGEP2_GPIO_WIFI_NPD 94 46
46#define IGEP2_GPIO_WIFI_NRESET 95 47#define IGEP2_RB_GPIO_WIFI_NPD 94
48#define IGEP2_RB_GPIO_WIFI_NRESET 95
49#define IGEP2_RB_GPIO_BT_NRESET 137
50#define IGEP2_RC_GPIO_WIFI_NPD 138
51#define IGEP2_RC_GPIO_WIFI_NRESET 139
52#define IGEP2_RC_GPIO_BT_NRESET 137
53
54/*
55 * IGEP2 Hardware Revision Table
56 *
57 * --------------------------------------------------------------------------
58 * | Id. | Hw Rev. | HW0 (28) | WIFI_NPD | WIFI_NRESET | BT_NRESET |
59 * --------------------------------------------------------------------------
60 * | 0 | B | high | gpio94 | gpio95 | - |
61 * | 0 | B/C (B-compatible) | high | gpio94 | gpio95 | gpio137 |
62 * | 1 | C | low | gpio138 | gpio139 | gpio137 |
63 * --------------------------------------------------------------------------
64 */
65
66#define IGEP2_BOARD_HWREV_B 0
67#define IGEP2_BOARD_HWREV_C 1
68
69static u8 hwrev;
70
71static void __init igep2_get_revision(void)
72{
73 u8 ret;
74
75 omap_mux_init_gpio(IGEP2_GPIO_LED1_RED, OMAP_PIN_INPUT);
76
77 if ((gpio_request(IGEP2_GPIO_LED1_RED, "GPIO_HW0_REV") == 0) &&
78 (gpio_direction_input(IGEP2_GPIO_LED1_RED) == 0)) {
79 ret = gpio_get_value(IGEP2_GPIO_LED1_RED);
80 if (ret == 0) {
81 pr_info("IGEP2: Hardware Revision C (B-NON compatible)\n");
82 hwrev = IGEP2_BOARD_HWREV_C;
83 } else if (ret == 1) {
84 pr_info("IGEP2: Hardware Revision B/C (B compatible)\n");
85 hwrev = IGEP2_BOARD_HWREV_B;
86 } else {
87 pr_err("IGEP2: Unknown Hardware Revision\n");
88 hwrev = -1;
89 }
90 } else {
91 pr_warning("IGEP2: Could not obtain gpio GPIO_HW0_REV\n");
92 pr_err("IGEP2: Unknown Hardware Revision\n");
93 }
94
95 gpio_free(IGEP2_GPIO_LED1_RED);
96}
47 97
48#if defined(CONFIG_MTD_ONENAND_OMAP2) || \ 98#if defined(CONFIG_MTD_ONENAND_OMAP2) || \
49 defined(CONFIG_MTD_ONENAND_OMAP2_MODULE) 99 defined(CONFIG_MTD_ONENAND_OMAP2_MODULE)
@@ -107,7 +157,7 @@ static struct platform_device igep2_onenand_device = {
107 }, 157 },
108}; 158};
109 159
110void __init igep2_flash_init(void) 160static void __init igep2_flash_init(void)
111{ 161{
112 u8 cs = 0; 162 u8 cs = 0;
113 u8 onenandcs = GPMC_CS_NUM + 1; 163 u8 onenandcs = GPMC_CS_NUM + 1;
@@ -141,7 +191,7 @@ void __init igep2_flash_init(void)
141} 191}
142 192
143#else 193#else
144void __init igep2_flash_init(void) {} 194static void __init igep2_flash_init(void) {}
145#endif 195#endif
146 196
147#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE) 197#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
@@ -211,10 +261,6 @@ static struct regulator_consumer_supply igep2_vmmc1_supply = {
211 .supply = "vmmc", 261 .supply = "vmmc",
212}; 262};
213 263
214static struct regulator_consumer_supply igep2_vmmc2_supply = {
215 .supply = "vmmc",
216};
217
218/* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */ 264/* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */
219static struct regulator_init_data igep2_vmmc1 = { 265static struct regulator_init_data igep2_vmmc1 = {
220 .constraints = { 266 .constraints = {
@@ -230,37 +276,95 @@ static struct regulator_init_data igep2_vmmc1 = {
230 .consumer_supplies = &igep2_vmmc1_supply, 276 .consumer_supplies = &igep2_vmmc1_supply,
231}; 277};
232 278
233/* VMMC2 for OMAP VDD_MMC2 (i/o) and MMC2 WIFI */
234static struct regulator_init_data igep2_vmmc2 = {
235 .constraints = {
236 .min_uV = 1850000,
237 .max_uV = 3150000,
238 .valid_modes_mask = REGULATOR_MODE_NORMAL
239 | REGULATOR_MODE_STANDBY,
240 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
241 | REGULATOR_CHANGE_MODE
242 | REGULATOR_CHANGE_STATUS,
243 },
244 .num_consumer_supplies = 1,
245 .consumer_supplies = &igep2_vmmc2_supply,
246};
247
248static struct omap2_hsmmc_info mmc[] = { 279static struct omap2_hsmmc_info mmc[] = {
249 { 280 {
250 .mmc = 1, 281 .mmc = 1,
251 .wires = 4, 282 .caps = MMC_CAP_4_BIT_DATA,
252 .gpio_cd = -EINVAL, 283 .gpio_cd = -EINVAL,
253 .gpio_wp = -EINVAL, 284 .gpio_wp = -EINVAL,
254 }, 285 },
286#if defined(CONFIG_LIBERTAS_SDIO) || defined(CONFIG_LIBERTAS_SDIO_MODULE)
255 { 287 {
256 .mmc = 2, 288 .mmc = 2,
257 .wires = 4, 289 .caps = MMC_CAP_4_BIT_DATA,
258 .gpio_cd = -EINVAL, 290 .gpio_cd = -EINVAL,
259 .gpio_wp = -EINVAL, 291 .gpio_wp = -EINVAL,
260 }, 292 },
293#endif
261 {} /* Terminator */ 294 {} /* Terminator */
262}; 295};
263 296
297#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
298#include <linux/leds.h>
299
300static struct gpio_led igep2_gpio_leds[] = {
301 [0] = {
302 .name = "gpio-led:red:d0",
303 .gpio = IGEP2_GPIO_LED0_RED,
304 .default_trigger = "default-off"
305 },
306 [1] = {
307 .name = "gpio-led:green:d0",
308 .gpio = IGEP2_GPIO_LED0_GREEN,
309 .default_trigger = "default-off",
310 },
311 [2] = {
312 .name = "gpio-led:red:d1",
313 .gpio = IGEP2_GPIO_LED1_RED,
314 .default_trigger = "default-off",
315 },
316 [3] = {
317 .name = "gpio-led:green:d1",
318 .default_trigger = "heartbeat",
319 .gpio = -EINVAL, /* gets replaced */
320 },
321};
322
323static struct gpio_led_platform_data igep2_led_pdata = {
324 .leds = igep2_gpio_leds,
325 .num_leds = ARRAY_SIZE(igep2_gpio_leds),
326};
327
328static struct platform_device igep2_led_device = {
329 .name = "leds-gpio",
330 .id = -1,
331 .dev = {
332 .platform_data = &igep2_led_pdata,
333 },
334};
335
336static void __init igep2_leds_init(void)
337{
338 platform_device_register(&igep2_led_device);
339}
340
341#else
342static inline void igep2_leds_init(void)
343{
344 if ((gpio_request(IGEP2_GPIO_LED0_RED, "gpio-led:red:d0") == 0) &&
345 (gpio_direction_output(IGEP2_GPIO_LED0_RED, 1) == 0)) {
346 gpio_export(IGEP2_GPIO_LED0_RED, 0);
347 gpio_set_value(IGEP2_GPIO_LED0_RED, 0);
348 } else
349 pr_warning("IGEP v2: Could not obtain gpio GPIO_LED0_RED\n");
350
351 if ((gpio_request(IGEP2_GPIO_LED0_GREEN, "gpio-led:green:d0") == 0) &&
352 (gpio_direction_output(IGEP2_GPIO_LED0_GREEN, 1) == 0)) {
353 gpio_export(IGEP2_GPIO_LED0_GREEN, 0);
354 gpio_set_value(IGEP2_GPIO_LED0_GREEN, 0);
355 } else
356 pr_warning("IGEP v2: Could not obtain gpio GPIO_LED0_GREEN\n");
357
358 if ((gpio_request(IGEP2_GPIO_LED1_RED, "gpio-led:red:d1") == 0) &&
359 (gpio_direction_output(IGEP2_GPIO_LED1_RED, 1) == 0)) {
360 gpio_export(IGEP2_GPIO_LED1_RED, 0);
361 gpio_set_value(IGEP2_GPIO_LED1_RED, 0);
362 } else
363 pr_warning("IGEP v2: Could not obtain gpio GPIO_LED1_RED\n");
364
365}
366#endif
367
264static int igep2_twl_gpio_setup(struct device *dev, 368static int igep2_twl_gpio_setup(struct device *dev,
265 unsigned gpio, unsigned ngpio) 369 unsigned gpio, unsigned ngpio)
266{ 370{
@@ -268,20 +372,48 @@ static int igep2_twl_gpio_setup(struct device *dev,
268 mmc[0].gpio_cd = gpio + 0; 372 mmc[0].gpio_cd = gpio + 0;
269 omap2_hsmmc_init(mmc); 373 omap2_hsmmc_init(mmc);
270 374
271 /* link regulators to MMC adapters ... we "know" the 375 /*
376 * link regulators to MMC adapters ... we "know" the
272 * regulators will be set up only *after* we return. 377 * regulators will be set up only *after* we return.
273 */ 378 */
274 igep2_vmmc1_supply.dev = mmc[0].dev; 379 igep2_vmmc1_supply.dev = mmc[0].dev;
275 igep2_vmmc2_supply.dev = mmc[1].dev; 380
381 /*
382 * REVISIT: need ehci-omap hooks for external VBUS
383 * power switch and overcurrent detect
384 */
385 if ((gpio_request(gpio + 1, "GPIO_EHCI_NOC") < 0) ||
386 (gpio_direction_input(gpio + 1) < 0))
387 pr_err("IGEP2: Could not obtain gpio for EHCI NOC");
388
389 /*
390 * TWL4030_GPIO_MAX + 0 == ledA, GPIO_USBH_CPEN
391 * (out, active low)
392 */
393 if ((gpio_request(gpio + TWL4030_GPIO_MAX, "GPIO_USBH_CPEN") < 0) ||
394 (gpio_direction_output(gpio + TWL4030_GPIO_MAX, 0) < 0))
395 pr_err("IGEP2: Could not obtain gpio for USBH_CPEN");
396
397 /* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */
398#if !defined(CONFIG_LEDS_GPIO) && !defined(CONFIG_LEDS_GPIO_MODULE)
399 if ((gpio_request(gpio+TWL4030_GPIO_MAX+1, "gpio-led:green:d1") == 0)
400 && (gpio_direction_output(gpio + TWL4030_GPIO_MAX + 1, 1) == 0)) {
401 gpio_export(gpio + TWL4030_GPIO_MAX + 1, 0);
402 gpio_set_value(gpio + TWL4030_GPIO_MAX + 1, 0);
403 } else
404 pr_warning("IGEP v2: Could not obtain gpio GPIO_LED1_GREEN\n");
405#else
406 igep2_gpio_leds[3].gpio = gpio + TWL4030_GPIO_MAX + 1;
407#endif
276 408
277 return 0; 409 return 0;
278}; 410};
279 411
280static struct twl4030_gpio_platform_data igep2_gpio_data = { 412static struct twl4030_gpio_platform_data igep2_twl4030_gpio_pdata = {
281 .gpio_base = OMAP_MAX_GPIO_LINES, 413 .gpio_base = OMAP_MAX_GPIO_LINES,
282 .irq_base = TWL4030_GPIO_IRQ_BASE, 414 .irq_base = TWL4030_GPIO_IRQ_BASE,
283 .irq_end = TWL4030_GPIO_IRQ_END, 415 .irq_end = TWL4030_GPIO_IRQ_END,
284 .use_leds = false, 416 .use_leds = true,
285 .setup = igep2_twl_gpio_setup, 417 .setup = igep2_twl_gpio_setup,
286}; 418};
287 419
@@ -355,47 +487,6 @@ static void __init igep2_display_init(void)
355 pr_err("IGEP v2: Could not obtain gpio GPIO_DVI_PUP\n"); 487 pr_err("IGEP v2: Could not obtain gpio GPIO_DVI_PUP\n");
356} 488}
357 489
358#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
359#include <linux/leds.h>
360
361static struct gpio_led igep2_gpio_leds[] = {
362 {
363 .name = "led0:red",
364 .gpio = IGEP2_GPIO_LED0_RED,
365 },
366 {
367 .name = "led0:green",
368 .default_trigger = "heartbeat",
369 .gpio = IGEP2_GPIO_LED0_GREEN,
370 },
371 {
372 .name = "led1:red",
373 .gpio = IGEP2_GPIO_LED1_RED,
374 },
375};
376
377static struct gpio_led_platform_data igep2_led_pdata = {
378 .leds = igep2_gpio_leds,
379 .num_leds = ARRAY_SIZE(igep2_gpio_leds),
380};
381
382static struct platform_device igep2_led_device = {
383 .name = "leds-gpio",
384 .id = -1,
385 .dev = {
386 .platform_data = &igep2_led_pdata,
387 },
388};
389
390static void __init igep2_init_led(void)
391{
392 platform_device_register(&igep2_led_device);
393}
394
395#else
396static inline void igep2_init_led(void) {}
397#endif
398
399static struct platform_device *igep2_devices[] __initdata = { 490static struct platform_device *igep2_devices[] __initdata = {
400 &igep2_dss_device, 491 &igep2_dss_device,
401}; 492};
@@ -425,14 +516,13 @@ static struct twl4030_platform_data igep2_twldata = {
425 /* platform_data for children goes here */ 516 /* platform_data for children goes here */
426 .usb = &igep2_usb_data, 517 .usb = &igep2_usb_data,
427 .codec = &igep2_codec_data, 518 .codec = &igep2_codec_data,
428 .gpio = &igep2_gpio_data, 519 .gpio = &igep2_twl4030_gpio_pdata,
429 .vmmc1 = &igep2_vmmc1, 520 .vmmc1 = &igep2_vmmc1,
430 .vmmc2 = &igep2_vmmc2,
431 .vpll2 = &igep2_vpll2, 521 .vpll2 = &igep2_vpll2,
432 522
433}; 523};
434 524
435static struct i2c_board_info __initdata igep2_i2c_boardinfo[] = { 525static struct i2c_board_info __initdata igep2_i2c1_boardinfo[] = {
436 { 526 {
437 I2C_BOARD_INFO("twl4030", 0x48), 527 I2C_BOARD_INFO("twl4030", 0x48),
438 .flags = I2C_CLIENT_WAKE, 528 .flags = I2C_CLIENT_WAKE,
@@ -441,14 +531,29 @@ static struct i2c_board_info __initdata igep2_i2c_boardinfo[] = {
441 }, 531 },
442}; 532};
443 533
444static int __init igep2_i2c_init(void) 534static struct i2c_board_info __initdata igep2_i2c3_boardinfo[] = {
535 {
536 I2C_BOARD_INFO("eeprom", 0x50),
537 },
538};
539
540static void __init igep2_i2c_init(void)
445{ 541{
446 omap_register_i2c_bus(1, 2600, igep2_i2c_boardinfo, 542 int ret;
447 ARRAY_SIZE(igep2_i2c_boardinfo)); 543
448 /* Bus 3 is attached to the DVI port where devices like the pico DLP 544 ret = omap_register_i2c_bus(1, 2600, igep2_i2c1_boardinfo,
449 * projector don't work reliably with 400kHz */ 545 ARRAY_SIZE(igep2_i2c1_boardinfo));
450 omap_register_i2c_bus(3, 100, NULL, 0); 546 if (ret)
451 return 0; 547 pr_warning("IGEP2: Could not register I2C1 bus (%d)\n", ret);
548
549 /*
550 * Bus 3 is attached to the DVI port where devices like the pico DLP
551 * projector don't work reliably with 400kHz
552 */
553 ret = omap_register_i2c_bus(3, 100, igep2_i2c3_boardinfo,
554 ARRAY_SIZE(igep2_i2c3_boardinfo));
555 if (ret)
556 pr_warning("IGEP2: Could not register I2C3 bus (%d)\n", ret);
452} 557}
453 558
454static struct omap_musb_board_data musb_board_data = { 559static struct omap_musb_board_data musb_board_data = {
@@ -476,9 +581,57 @@ static struct omap_board_mux board_mux[] __initdata = {
476#define board_mux NULL 581#define board_mux NULL
477#endif 582#endif
478 583
584#if defined(CONFIG_LIBERTAS_SDIO) || defined(CONFIG_LIBERTAS_SDIO_MODULE)
585
586static void __init igep2_wlan_bt_init(void)
587{
588 unsigned npd, wreset, btreset;
589
590 /* GPIO's for WLAN-BT combo depends on hardware revision */
591 if (hwrev == IGEP2_BOARD_HWREV_B) {
592 npd = IGEP2_RB_GPIO_WIFI_NPD;
593 wreset = IGEP2_RB_GPIO_WIFI_NRESET;
594 btreset = IGEP2_RB_GPIO_BT_NRESET;
595 } else if (hwrev == IGEP2_BOARD_HWREV_C) {
596 npd = IGEP2_RC_GPIO_WIFI_NPD;
597 wreset = IGEP2_RC_GPIO_WIFI_NRESET;
598 btreset = IGEP2_RC_GPIO_BT_NRESET;
599 } else
600 return;
601
602 /* Set GPIO's for WLAN-BT combo module */
603 if ((gpio_request(npd, "GPIO_WIFI_NPD") == 0) &&
604 (gpio_direction_output(npd, 1) == 0)) {
605 gpio_export(npd, 0);
606 } else
607 pr_warning("IGEP2: Could not obtain gpio GPIO_WIFI_NPD\n");
608
609 if ((gpio_request(wreset, "GPIO_WIFI_NRESET") == 0) &&
610 (gpio_direction_output(wreset, 1) == 0)) {
611 gpio_export(wreset, 0);
612 gpio_set_value(wreset, 0);
613 udelay(10);
614 gpio_set_value(wreset, 1);
615 } else
616 pr_warning("IGEP2: Could not obtain gpio GPIO_WIFI_NRESET\n");
617
618 if ((gpio_request(btreset, "GPIO_BT_NRESET") == 0) &&
619 (gpio_direction_output(btreset, 1) == 0)) {
620 gpio_export(btreset, 0);
621 } else
622 pr_warning("IGEP2: Could not obtain gpio GPIO_BT_NRESET\n");
623}
624#else
625static inline void __init igep2_wlan_bt_init(void) { }
626#endif
627
479static void __init igep2_init(void) 628static void __init igep2_init(void)
480{ 629{
481 omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); 630 omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
631
632 /* Get IGEP2 hardware revision */
633 igep2_get_revision();
634 /* Register I2C busses and drivers */
482 igep2_i2c_init(); 635 igep2_i2c_init();
483 platform_add_devices(igep2_devices, ARRAY_SIZE(igep2_devices)); 636 platform_add_devices(igep2_devices, ARRAY_SIZE(igep2_devices));
484 omap_serial_init(); 637 omap_serial_init();
@@ -486,50 +639,16 @@ static void __init igep2_init(void)
486 usb_ehci_init(&ehci_pdata); 639 usb_ehci_init(&ehci_pdata);
487 640
488 igep2_flash_init(); 641 igep2_flash_init();
489 igep2_init_led(); 642 igep2_leds_init();
490 igep2_display_init(); 643 igep2_display_init();
491 igep2_init_smsc911x(); 644 igep2_init_smsc911x();
492 645
493 /* GPIO userspace leds */ 646 /*
494#if !defined(CONFIG_LEDS_GPIO) && !defined(CONFIG_LEDS_GPIO_MODULE) 647 * WLAN-BT combo module from MuRata wich has a Marvell WLAN
495 if ((gpio_request(IGEP2_GPIO_LED0_RED, "led0:red") == 0) && 648 * (88W8686) + CSR Bluetooth chipset. Uses SDIO interface.
496 (gpio_direction_output(IGEP2_GPIO_LED0_RED, 1) == 0)) { 649 */
497 gpio_export(IGEP2_GPIO_LED0_RED, 0); 650 igep2_wlan_bt_init();
498 gpio_set_value(IGEP2_GPIO_LED0_RED, 0);
499 } else
500 pr_warning("IGEP v2: Could not obtain gpio GPIO_LED0_RED\n");
501
502 if ((gpio_request(IGEP2_GPIO_LED0_GREEN, "led0:green") == 0) &&
503 (gpio_direction_output(IGEP2_GPIO_LED0_GREEN, 1) == 0)) {
504 gpio_export(IGEP2_GPIO_LED0_GREEN, 0);
505 gpio_set_value(IGEP2_GPIO_LED0_GREEN, 0);
506 } else
507 pr_warning("IGEP v2: Could not obtain gpio GPIO_LED0_GREEN\n");
508
509 if ((gpio_request(IGEP2_GPIO_LED1_RED, "led1:red") == 0) &&
510 (gpio_direction_output(IGEP2_GPIO_LED1_RED, 1) == 0)) {
511 gpio_export(IGEP2_GPIO_LED1_RED, 0);
512 gpio_set_value(IGEP2_GPIO_LED1_RED, 0);
513 } else
514 pr_warning("IGEP v2: Could not obtain gpio GPIO_LED1_RED\n");
515#endif
516
517 /* GPIO W-LAN + Bluetooth combo module */
518 if ((gpio_request(IGEP2_GPIO_WIFI_NPD, "GPIO_WIFI_NPD") == 0) &&
519 (gpio_direction_output(IGEP2_GPIO_WIFI_NPD, 1) == 0)) {
520 gpio_export(IGEP2_GPIO_WIFI_NPD, 0);
521/* gpio_set_value(IGEP2_GPIO_WIFI_NPD, 0); */
522 } else
523 pr_warning("IGEP v2: Could not obtain gpio GPIO_WIFI_NPD\n");
524 651
525 if ((gpio_request(IGEP2_GPIO_WIFI_NRESET, "GPIO_WIFI_NRESET") == 0) &&
526 (gpio_direction_output(IGEP2_GPIO_WIFI_NRESET, 1) == 0)) {
527 gpio_export(IGEP2_GPIO_WIFI_NRESET, 0);
528 gpio_set_value(IGEP2_GPIO_WIFI_NRESET, 0);
529 udelay(10);
530 gpio_set_value(IGEP2_GPIO_WIFI_NRESET, 1);
531 } else
532 pr_warning("IGEP v2: Could not obtain gpio GPIO_WIFI_NRESET\n");
533} 652}
534 653
535MACHINE_START(IGEP0020, "IGEP v2 board") 654MACHINE_START(IGEP0020, "IGEP v2 board")