Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/linux...
[pandora-kernel.git] / arch / arm / mach-pxa / palmte2.c
1 /*
2  * Hardware definitions for Palm Tungsten|E2
3  *
4  * Author:
5  *      Carlos Eduardo Medaglia Dyonisio <cadu@nerdfeliz.com>
6  *
7  * Rewrite for mainline:
8  *      Marek Vasut <marek.vasut@gmail.com>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License version 2 as
12  * published by the Free Software Foundation.
13  *
14  * (find more info at www.hackndev.com)
15  *
16  */
17
18 #include <linux/platform_device.h>
19 #include <linux/delay.h>
20 #include <linux/irq.h>
21 #include <linux/gpio_keys.h>
22 #include <linux/input.h>
23 #include <linux/pda_power.h>
24 #include <linux/pwm_backlight.h>
25 #include <linux/gpio.h>
26 #include <linux/wm97xx.h>
27 #include <linux/power_supply.h>
28 #include <linux/usb/gpio_vbus.h>
29
30 #include <asm/mach-types.h>
31 #include <asm/mach/arch.h>
32 #include <asm/mach/map.h>
33
34 #include <mach/pxa25x.h>
35 #include <mach/audio.h>
36 #include <mach/palmte2.h>
37 #include <mach/mmc.h>
38 #include <mach/pxafb.h>
39 #include <mach/irda.h>
40 #include <mach/udc.h>
41 #include <mach/palmasoc.h>
42
43 #include "generic.h"
44 #include "devices.h"
45
46 /******************************************************************************
47  * Pin configuration
48  ******************************************************************************/
49 static unsigned long palmte2_pin_config[] __initdata = {
50         /* MMC */
51         GPIO6_MMC_CLK,
52         GPIO8_MMC_CS0,
53         GPIO10_GPIO,    /* SD detect */
54         GPIO55_GPIO,    /* SD power */
55         GPIO51_GPIO,    /* SD r/o switch */
56
57         /* AC97 */
58         GPIO28_AC97_BITCLK,
59         GPIO29_AC97_SDATA_IN_0,
60         GPIO30_AC97_SDATA_OUT,
61         GPIO31_AC97_SYNC,
62
63         /* PWM */
64         GPIO16_PWM0_OUT,
65
66         /* USB */
67         GPIO15_GPIO,    /* usb detect */
68         GPIO53_GPIO,    /* usb power */
69
70         /* IrDA */
71         GPIO48_GPIO,    /* ir disable */
72         GPIO46_FICP_RXD,
73         GPIO47_FICP_TXD,
74
75         /* LCD */
76         GPIOxx_LCD_TFT_16BPP,
77
78         /* GPIO KEYS */
79         GPIO5_GPIO,     /* notes */
80         GPIO7_GPIO,     /* tasks */
81         GPIO11_GPIO,    /* calendar */
82         GPIO13_GPIO,    /* contacts */
83         GPIO14_GPIO,    /* center */
84         GPIO19_GPIO,    /* left */
85         GPIO20_GPIO,    /* right */
86         GPIO21_GPIO,    /* down */
87         GPIO22_GPIO,    /* up */
88
89         /* MISC */
90         GPIO1_RST,      /* reset */
91         GPIO4_GPIO,     /* Hotsync button */
92         GPIO9_GPIO,     /* power detect */
93         GPIO15_GPIO,    /* earphone detect */
94         GPIO37_GPIO,    /* LCD power */
95         GPIO56_GPIO,    /* Backlight power */
96 };
97
98 /******************************************************************************
99  * SD/MMC card controller
100  ******************************************************************************/
101 static struct pxamci_platform_data palmte2_mci_platform_data = {
102         .ocr_mask               = MMC_VDD_32_33 | MMC_VDD_33_34,
103         .gpio_card_detect       = GPIO_NR_PALMTE2_SD_DETECT_N,
104         .gpio_card_ro           = GPIO_NR_PALMTE2_SD_READONLY,
105         .gpio_power             = GPIO_NR_PALMTE2_SD_POWER,
106 };
107
108 /******************************************************************************
109  * GPIO keys
110  ******************************************************************************/
111 static struct gpio_keys_button palmte2_pxa_buttons[] = {
112         {KEY_F1,        GPIO_NR_PALMTE2_KEY_CONTACTS,   1, "Contacts" },
113         {KEY_F2,        GPIO_NR_PALMTE2_KEY_CALENDAR,   1, "Calendar" },
114         {KEY_F3,        GPIO_NR_PALMTE2_KEY_TASKS,      1, "Tasks" },
115         {KEY_F4,        GPIO_NR_PALMTE2_KEY_NOTES,      1, "Notes" },
116         {KEY_ENTER,     GPIO_NR_PALMTE2_KEY_CENTER,     1, "Center" },
117         {KEY_LEFT,      GPIO_NR_PALMTE2_KEY_LEFT,       1, "Left" },
118         {KEY_RIGHT,     GPIO_NR_PALMTE2_KEY_RIGHT,      1, "Right" },
119         {KEY_DOWN,      GPIO_NR_PALMTE2_KEY_DOWN,       1, "Down" },
120         {KEY_UP,        GPIO_NR_PALMTE2_KEY_UP,         1, "Up" },
121 };
122
123 static struct gpio_keys_platform_data palmte2_pxa_keys_data = {
124         .buttons        = palmte2_pxa_buttons,
125         .nbuttons       = ARRAY_SIZE(palmte2_pxa_buttons),
126 };
127
128 static struct platform_device palmte2_pxa_keys = {
129         .name   = "gpio-keys",
130         .id     = -1,
131         .dev    = {
132                 .platform_data = &palmte2_pxa_keys_data,
133         },
134 };
135
136 /******************************************************************************
137  * Backlight
138  ******************************************************************************/
139 static struct gpio palmte_bl_gpios[] = {
140         { GPIO_NR_PALMTE2_BL_POWER, GPIOF_INIT_LOW, "Backlight power" },
141         { GPIO_NR_PALMTE2_LCD_POWER, GPIOF_INIT_LOW, "LCD power" },
142 };
143
144 static int palmte2_backlight_init(struct device *dev)
145 {
146         return gpio_request_array(ARRAY_AND_SIZE(palmte_bl_gpios));
147 }
148
149 static int palmte2_backlight_notify(struct device *dev, int brightness)
150 {
151         gpio_set_value(GPIO_NR_PALMTE2_BL_POWER, brightness);
152         gpio_set_value(GPIO_NR_PALMTE2_LCD_POWER, brightness);
153         return brightness;
154 }
155
156 static void palmte2_backlight_exit(struct device *dev)
157 {
158         gpio_free_array(ARRAY_AND_SIZE(palmte_bl_gpios));
159 }
160
161 static struct platform_pwm_backlight_data palmte2_backlight_data = {
162         .pwm_id         = 0,
163         .max_brightness = PALMTE2_MAX_INTENSITY,
164         .dft_brightness = PALMTE2_MAX_INTENSITY,
165         .pwm_period_ns  = PALMTE2_PERIOD_NS,
166         .init           = palmte2_backlight_init,
167         .notify         = palmte2_backlight_notify,
168         .exit           = palmte2_backlight_exit,
169 };
170
171 static struct platform_device palmte2_backlight = {
172         .name   = "pwm-backlight",
173         .dev    = {
174                 .parent         = &pxa25x_device_pwm0.dev,
175                 .platform_data  = &palmte2_backlight_data,
176         },
177 };
178
179 /******************************************************************************
180  * IrDA
181  ******************************************************************************/
182 static struct pxaficp_platform_data palmte2_ficp_platform_data = {
183         .gpio_pwdown            = GPIO_NR_PALMTE2_IR_DISABLE,
184         .transceiver_cap        = IR_SIRMODE | IR_OFF,
185 };
186
187 /******************************************************************************
188  * UDC
189  ******************************************************************************/
190 static struct gpio_vbus_mach_info palmte2_udc_info = {
191         .gpio_vbus              = GPIO_NR_PALMTE2_USB_DETECT_N,
192         .gpio_vbus_inverted     = 1,
193         .gpio_pullup            = GPIO_NR_PALMTE2_USB_PULLUP,
194 };
195
196 static struct platform_device palmte2_gpio_vbus = {
197         .name   = "gpio-vbus",
198         .id     = -1,
199         .dev    = {
200                 .platform_data  = &palmte2_udc_info,
201         },
202 };
203
204 /******************************************************************************
205  * Power supply
206  ******************************************************************************/
207 static int power_supply_init(struct device *dev)
208 {
209         int ret;
210
211         ret = gpio_request(GPIO_NR_PALMTE2_POWER_DETECT, "CABLE_STATE_AC");
212         if (ret)
213                 goto err1;
214         ret = gpio_direction_input(GPIO_NR_PALMTE2_POWER_DETECT);
215         if (ret)
216                 goto err2;
217
218         return 0;
219
220 err2:
221         gpio_free(GPIO_NR_PALMTE2_POWER_DETECT);
222 err1:
223         return ret;
224 }
225
226 static int palmte2_is_ac_online(void)
227 {
228         return gpio_get_value(GPIO_NR_PALMTE2_POWER_DETECT);
229 }
230
231 static void power_supply_exit(struct device *dev)
232 {
233         gpio_free(GPIO_NR_PALMTE2_POWER_DETECT);
234 }
235
236 static char *palmte2_supplicants[] = {
237         "main-battery",
238 };
239
240 static struct pda_power_pdata power_supply_info = {
241         .init            = power_supply_init,
242         .is_ac_online    = palmte2_is_ac_online,
243         .exit            = power_supply_exit,
244         .supplied_to     = palmte2_supplicants,
245         .num_supplicants = ARRAY_SIZE(palmte2_supplicants),
246 };
247
248 static struct platform_device power_supply = {
249         .name = "pda-power",
250         .id   = -1,
251         .dev  = {
252                 .platform_data = &power_supply_info,
253         },
254 };
255
256 /******************************************************************************
257  * WM97xx audio, battery
258  ******************************************************************************/
259 static struct wm97xx_batt_pdata palmte2_batt_pdata = {
260         .batt_aux       = WM97XX_AUX_ID3,
261         .temp_aux       = WM97XX_AUX_ID2,
262         .charge_gpio    = -1,
263         .max_voltage    = PALMTE2_BAT_MAX_VOLTAGE,
264         .min_voltage    = PALMTE2_BAT_MIN_VOLTAGE,
265         .batt_mult      = 1000,
266         .batt_div       = 414,
267         .temp_mult      = 1,
268         .temp_div       = 1,
269         .batt_tech      = POWER_SUPPLY_TECHNOLOGY_LIPO,
270         .batt_name      = "main-batt",
271 };
272
273 static struct wm97xx_pdata palmte2_wm97xx_pdata = {
274         .batt_pdata     = &palmte2_batt_pdata,
275 };
276
277 static pxa2xx_audio_ops_t palmte2_ac97_pdata = {
278         .codec_pdata    = { &palmte2_wm97xx_pdata, },
279 };
280
281 static struct palm27x_asoc_info palmte2_asoc_pdata = {
282         .jack_gpio      = GPIO_NR_PALMTE2_EARPHONE_DETECT,
283 };
284
285 static struct platform_device palmte2_asoc = {
286         .name = "palm27x-asoc",
287         .id   = -1,
288         .dev  = {
289                 .platform_data = &palmte2_asoc_pdata,
290         },
291 };
292
293 /******************************************************************************
294  * Framebuffer
295  ******************************************************************************/
296 static struct pxafb_mode_info palmte2_lcd_modes[] = {
297 {
298         .pixclock       = 77757,
299         .xres           = 320,
300         .yres           = 320,
301         .bpp            = 16,
302
303         .left_margin    = 28,
304         .right_margin   = 7,
305         .upper_margin   = 7,
306         .lower_margin   = 5,
307
308         .hsync_len      = 4,
309         .vsync_len      = 1,
310 },
311 };
312
313 static struct pxafb_mach_info palmte2_lcd_screen = {
314         .modes          = palmte2_lcd_modes,
315         .num_modes      = ARRAY_SIZE(palmte2_lcd_modes),
316         .lcd_conn       = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
317 };
318
319 /******************************************************************************
320  * Machine init
321  ******************************************************************************/
322 static struct platform_device *devices[] __initdata = {
323 #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
324         &palmte2_pxa_keys,
325 #endif
326         &palmte2_backlight,
327         &power_supply,
328         &palmte2_asoc,
329         &palmte2_gpio_vbus,
330 };
331
332 /* setup udc GPIOs initial state */
333 static void __init palmte2_udc_init(void)
334 {
335         if (!gpio_request(GPIO_NR_PALMTE2_USB_PULLUP, "UDC Vbus")) {
336                 gpio_direction_output(GPIO_NR_PALMTE2_USB_PULLUP, 1);
337                 gpio_free(GPIO_NR_PALMTE2_USB_PULLUP);
338         }
339 }
340
341 static void __init palmte2_init(void)
342 {
343         pxa2xx_mfp_config(ARRAY_AND_SIZE(palmte2_pin_config));
344
345         pxa_set_ffuart_info(NULL);
346         pxa_set_btuart_info(NULL);
347         pxa_set_stuart_info(NULL);
348
349         pxa_set_fb_info(NULL, &palmte2_lcd_screen);
350         pxa_set_mci_info(&palmte2_mci_platform_data);
351         palmte2_udc_init();
352         pxa_set_ac97_info(&palmte2_ac97_pdata);
353         pxa_set_ficp_info(&palmte2_ficp_platform_data);
354
355         platform_add_devices(devices, ARRAY_SIZE(devices));
356 }
357
358 MACHINE_START(PALMTE2, "Palm Tungsten|E2")
359         .boot_params    = 0xa0000100,
360         .map_io         = pxa25x_map_io,
361         .init_irq       = pxa25x_init_irq,
362         .handle_irq     = pxa25x_handle_irq,
363         .timer          = &pxa_timer,
364         .init_machine   = palmte2_init
365 MACHINE_END