diff options
author | Kalle Valo <kalle.valo@nokia.com> | 2009-11-18 21:41:06 -0500 |
---|---|---|
committer | Tony Lindgren <tony@atomide.com> | 2009-11-22 13:24:33 -0500 |
commit | a24e61a9ce6ac6b02356ee6678fa53c74c2fc080 (patch) | |
tree | 0a899e977ed55aae2183ea21626400915b2661a1 /arch/arm | |
parent | 2000655ee7b44ef2816d565c62ae03de74333204 (diff) |
omap3: rx51: Add wl1251 wlan driver support
wl1251 is connected to the SPI bus in rx51, add support for this.
Signed-off-by: Kalle Valo <kalle.valo@nokia.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
Diffstat (limited to 'arch/arm')
-rw-r--r-- | arch/arm/mach-omap2/board-rx51-peripherals.c | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/arch/arm/mach-omap2/board-rx51-peripherals.c b/arch/arm/mach-omap2/board-rx51-peripherals.c index fb5988c1a884..15ce6514c5fd 100644 --- a/arch/arm/mach-omap2/board-rx51-peripherals.c +++ b/arch/arm/mach-omap2/board-rx51-peripherals.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/input.h> | 14 | #include <linux/input.h> |
15 | #include <linux/input/matrix_keypad.h> | 15 | #include <linux/input/matrix_keypad.h> |
16 | #include <linux/spi/spi.h> | 16 | #include <linux/spi/spi.h> |
17 | #include <linux/spi/wl12xx.h> | ||
17 | #include <linux/i2c.h> | 18 | #include <linux/i2c.h> |
18 | #include <linux/i2c/twl4030.h> | 19 | #include <linux/i2c/twl4030.h> |
19 | #include <linux/clk.h> | 20 | #include <linux/clk.h> |
@@ -37,6 +38,33 @@ | |||
37 | #define SYSTEM_REV_B_USES_VAUX3 0x1699 | 38 | #define SYSTEM_REV_B_USES_VAUX3 0x1699 |
38 | #define SYSTEM_REV_S_USES_VAUX3 0x8 | 39 | #define SYSTEM_REV_S_USES_VAUX3 0x8 |
39 | 40 | ||
41 | #define RX51_WL1251_POWER_GPIO 87 | ||
42 | #define RX51_WL1251_IRQ_GPIO 42 | ||
43 | |||
44 | /* list all spi devices here */ | ||
45 | enum { | ||
46 | RX51_SPI_WL1251, | ||
47 | }; | ||
48 | |||
49 | static struct wl12xx_platform_data wl1251_pdata; | ||
50 | |||
51 | static struct omap2_mcspi_device_config wl1251_mcspi_config = { | ||
52 | .turbo_mode = 0, | ||
53 | .single_channel = 1, | ||
54 | }; | ||
55 | |||
56 | static struct spi_board_info rx51_peripherals_spi_board_info[] __initdata = { | ||
57 | [RX51_SPI_WL1251] = { | ||
58 | .modalias = "wl1251", | ||
59 | .bus_num = 4, | ||
60 | .chip_select = 0, | ||
61 | .max_speed_hz = 48000000, | ||
62 | .mode = SPI_MODE_2, | ||
63 | .controller_data = &wl1251_mcspi_config, | ||
64 | .platform_data = &wl1251_pdata, | ||
65 | }, | ||
66 | }; | ||
67 | |||
40 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | 68 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) |
41 | 69 | ||
42 | #define RX51_GPIO_CAMERA_LENS_COVER 110 | 70 | #define RX51_GPIO_CAMERA_LENS_COVER 110 |
@@ -617,11 +645,64 @@ static inline void board_smc91x_init(void) | |||
617 | 645 | ||
618 | #endif | 646 | #endif |
619 | 647 | ||
648 | static void rx51_wl1251_set_power(bool enable) | ||
649 | { | ||
650 | gpio_set_value(RX51_WL1251_POWER_GPIO, enable); | ||
651 | } | ||
652 | |||
653 | static void __init rx51_init_wl1251(void) | ||
654 | { | ||
655 | int irq, ret; | ||
656 | |||
657 | ret = gpio_request(RX51_WL1251_POWER_GPIO, "wl1251 power"); | ||
658 | if (ret < 0) | ||
659 | goto error; | ||
660 | |||
661 | ret = gpio_direction_output(RX51_WL1251_POWER_GPIO, 0); | ||
662 | if (ret < 0) | ||
663 | goto err_power; | ||
664 | |||
665 | ret = gpio_request(RX51_WL1251_IRQ_GPIO, "wl1251 irq"); | ||
666 | if (ret < 0) | ||
667 | goto err_power; | ||
668 | |||
669 | ret = gpio_direction_input(RX51_WL1251_IRQ_GPIO); | ||
670 | if (ret < 0) | ||
671 | goto err_irq; | ||
672 | |||
673 | irq = gpio_to_irq(RX51_WL1251_IRQ_GPIO); | ||
674 | if (irq < 0) | ||
675 | goto err_irq; | ||
676 | |||
677 | wl1251_pdata.set_power = rx51_wl1251_set_power; | ||
678 | rx51_peripherals_spi_board_info[RX51_SPI_WL1251].irq = irq; | ||
679 | |||
680 | return; | ||
681 | |||
682 | err_irq: | ||
683 | gpio_free(RX51_WL1251_IRQ_GPIO); | ||
684 | |||
685 | err_power: | ||
686 | gpio_free(RX51_WL1251_POWER_GPIO); | ||
687 | |||
688 | error: | ||
689 | printk(KERN_ERR "wl1251 board initialisation failed\n"); | ||
690 | wl1251_pdata.set_power = NULL; | ||
691 | |||
692 | /* | ||
693 | * Now rx51_peripherals_spi_board_info[1].irq is zero and | ||
694 | * set_power is null, and wl1251_probe() will fail. | ||
695 | */ | ||
696 | } | ||
697 | |||
620 | void __init rx51_peripherals_init(void) | 698 | void __init rx51_peripherals_init(void) |
621 | { | 699 | { |
622 | rx51_i2c_init(); | 700 | rx51_i2c_init(); |
623 | board_onenand_init(); | 701 | board_onenand_init(); |
624 | board_smc91x_init(); | 702 | board_smc91x_init(); |
625 | rx51_add_gpio_keys(); | 703 | rx51_add_gpio_keys(); |
704 | rx51_init_wl1251(); | ||
705 | spi_register_board_info(rx51_peripherals_spi_board_info, | ||
706 | ARRAY_SIZE(rx51_peripherals_spi_board_info)); | ||
626 | } | 707 | } |
627 | 708 | ||