diff options
Diffstat (limited to 'arch/arm/mach-omap2/board-rx51-peripherals.c')
-rw-r--r-- | arch/arm/mach-omap2/board-rx51-peripherals.c | 179 |
1 files changed, 171 insertions, 8 deletions
diff --git a/arch/arm/mach-omap2/board-rx51-peripherals.c b/arch/arm/mach-omap2/board-rx51-peripherals.c index e34d96a825e3..15ce6514c5fd 100644 --- a/arch/arm/mach-omap2/board-rx51-peripherals.c +++ b/arch/arm/mach-omap2/board-rx51-peripherals.c | |||
@@ -14,28 +14,137 @@ | |||
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> |
20 | #include <linux/delay.h> | 21 | #include <linux/delay.h> |
21 | #include <linux/regulator/machine.h> | 22 | #include <linux/regulator/machine.h> |
22 | #include <linux/gpio.h> | 23 | #include <linux/gpio.h> |
24 | #include <linux/gpio_keys.h> | ||
23 | #include <linux/mmc/host.h> | 25 | #include <linux/mmc/host.h> |
24 | 26 | ||
25 | #include <mach/mcspi.h> | 27 | #include <plat/mcspi.h> |
26 | #include <mach/mux.h> | 28 | #include <plat/mux.h> |
27 | #include <mach/board.h> | 29 | #include <plat/board.h> |
28 | #include <mach/common.h> | 30 | #include <plat/common.h> |
29 | #include <mach/dma.h> | 31 | #include <plat/dma.h> |
30 | #include <mach/gpmc.h> | 32 | #include <plat/gpmc.h> |
31 | #include <mach/onenand.h> | 33 | #include <plat/onenand.h> |
32 | #include <mach/gpmc-smc91x.h> | 34 | #include <plat/gpmc-smc91x.h> |
33 | 35 | ||
34 | #include "mmc-twl4030.h" | 36 | #include "mmc-twl4030.h" |
35 | 37 | ||
36 | #define SYSTEM_REV_B_USES_VAUX3 0x1699 | 38 | #define SYSTEM_REV_B_USES_VAUX3 0x1699 |
37 | #define SYSTEM_REV_S_USES_VAUX3 0x8 | 39 | #define SYSTEM_REV_S_USES_VAUX3 0x8 |
38 | 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 | |||
68 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | ||
69 | |||
70 | #define RX51_GPIO_CAMERA_LENS_COVER 110 | ||
71 | #define RX51_GPIO_CAMERA_FOCUS 68 | ||
72 | #define RX51_GPIO_CAMERA_CAPTURE 69 | ||
73 | #define RX51_GPIO_KEYPAD_SLIDE 71 | ||
74 | #define RX51_GPIO_LOCK_BUTTON 113 | ||
75 | #define RX51_GPIO_PROXIMITY 89 | ||
76 | |||
77 | #define RX51_GPIO_DEBOUNCE_TIMEOUT 10 | ||
78 | |||
79 | static struct gpio_keys_button rx51_gpio_keys[] = { | ||
80 | { | ||
81 | .desc = "Camera Lens Cover", | ||
82 | .type = EV_SW, | ||
83 | .code = SW_CAMERA_LENS_COVER, | ||
84 | .gpio = RX51_GPIO_CAMERA_LENS_COVER, | ||
85 | .active_low = 1, | ||
86 | .debounce_interval = RX51_GPIO_DEBOUNCE_TIMEOUT, | ||
87 | }, { | ||
88 | .desc = "Camera Focus", | ||
89 | .type = EV_KEY, | ||
90 | .code = KEY_CAMERA_FOCUS, | ||
91 | .gpio = RX51_GPIO_CAMERA_FOCUS, | ||
92 | .active_low = 1, | ||
93 | .debounce_interval = RX51_GPIO_DEBOUNCE_TIMEOUT, | ||
94 | }, { | ||
95 | .desc = "Camera Capture", | ||
96 | .type = EV_KEY, | ||
97 | .code = KEY_CAMERA, | ||
98 | .gpio = RX51_GPIO_CAMERA_CAPTURE, | ||
99 | .active_low = 1, | ||
100 | .debounce_interval = RX51_GPIO_DEBOUNCE_TIMEOUT, | ||
101 | }, { | ||
102 | .desc = "Lock Button", | ||
103 | .type = EV_KEY, | ||
104 | .code = KEY_SCREENLOCK, | ||
105 | .gpio = RX51_GPIO_LOCK_BUTTON, | ||
106 | .active_low = 1, | ||
107 | .debounce_interval = RX51_GPIO_DEBOUNCE_TIMEOUT, | ||
108 | }, { | ||
109 | .desc = "Keypad Slide", | ||
110 | .type = EV_SW, | ||
111 | .code = SW_KEYPAD_SLIDE, | ||
112 | .gpio = RX51_GPIO_KEYPAD_SLIDE, | ||
113 | .active_low = 1, | ||
114 | .debounce_interval = RX51_GPIO_DEBOUNCE_TIMEOUT, | ||
115 | }, { | ||
116 | .desc = "Proximity Sensor", | ||
117 | .type = EV_SW, | ||
118 | .code = SW_FRONT_PROXIMITY, | ||
119 | .gpio = RX51_GPIO_PROXIMITY, | ||
120 | .active_low = 0, | ||
121 | .debounce_interval = RX51_GPIO_DEBOUNCE_TIMEOUT, | ||
122 | } | ||
123 | }; | ||
124 | |||
125 | static struct gpio_keys_platform_data rx51_gpio_keys_data = { | ||
126 | .buttons = rx51_gpio_keys, | ||
127 | .nbuttons = ARRAY_SIZE(rx51_gpio_keys), | ||
128 | }; | ||
129 | |||
130 | static struct platform_device rx51_gpio_keys_device = { | ||
131 | .name = "gpio-keys", | ||
132 | .id = -1, | ||
133 | .dev = { | ||
134 | .platform_data = &rx51_gpio_keys_data, | ||
135 | }, | ||
136 | }; | ||
137 | |||
138 | static void __init rx51_add_gpio_keys(void) | ||
139 | { | ||
140 | platform_device_register(&rx51_gpio_keys_device); | ||
141 | } | ||
142 | #else | ||
143 | static void __init rx51_add_gpio_keys(void) | ||
144 | { | ||
145 | } | ||
146 | #endif /* CONFIG_KEYBOARD_GPIO || CONFIG_KEYBOARD_GPIO_MODULE */ | ||
147 | |||
39 | static int board_keymap[] = { | 148 | static int board_keymap[] = { |
40 | KEY(0, 0, KEY_Q), | 149 | KEY(0, 0, KEY_Q), |
41 | KEY(0, 1, KEY_O), | 150 | KEY(0, 1, KEY_O), |
@@ -536,10 +645,64 @@ static inline void board_smc91x_init(void) | |||
536 | 645 | ||
537 | #endif | 646 | #endif |
538 | 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 | |||
539 | void __init rx51_peripherals_init(void) | 698 | void __init rx51_peripherals_init(void) |
540 | { | 699 | { |
541 | rx51_i2c_init(); | 700 | rx51_i2c_init(); |
542 | board_onenand_init(); | 701 | board_onenand_init(); |
543 | board_smc91x_init(); | 702 | board_smc91x_init(); |
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)); | ||
544 | } | 707 | } |
545 | 708 | ||