diff options
Diffstat (limited to 'arch/arm/mach-pxa/palmld.c')
-rw-r--r-- | arch/arm/mach-pxa/palmld.c | 292 |
1 files changed, 54 insertions, 238 deletions
diff --git a/arch/arm/mach-pxa/palmld.c b/arch/arm/mach-pxa/palmld.c index 1963819dba98..91038eeafe44 100644 --- a/arch/arm/mach-pxa/palmld.c +++ b/arch/arm/mach-pxa/palmld.c | |||
@@ -22,7 +22,7 @@ | |||
22 | #include <linux/pda_power.h> | 22 | #include <linux/pda_power.h> |
23 | #include <linux/pwm_backlight.h> | 23 | #include <linux/pwm_backlight.h> |
24 | #include <linux/gpio.h> | 24 | #include <linux/gpio.h> |
25 | #include <linux/wm97xx_batt.h> | 25 | #include <linux/wm97xx.h> |
26 | #include <linux/power_supply.h> | 26 | #include <linux/power_supply.h> |
27 | #include <linux/sysdev.h> | 27 | #include <linux/sysdev.h> |
28 | #include <linux/mtd/mtd.h> | 28 | #include <linux/mtd/mtd.h> |
@@ -41,6 +41,7 @@ | |||
41 | #include <mach/irda.h> | 41 | #include <mach/irda.h> |
42 | #include <mach/pxa27x_keypad.h> | 42 | #include <mach/pxa27x_keypad.h> |
43 | #include <mach/palmasoc.h> | 43 | #include <mach/palmasoc.h> |
44 | #include <mach/palm27x.h> | ||
44 | 45 | ||
45 | #include "generic.h" | 46 | #include "generic.h" |
46 | #include "devices.h" | 47 | #include "devices.h" |
@@ -127,6 +128,7 @@ static unsigned long palmld_pin_config[] __initdata = { | |||
127 | /****************************************************************************** | 128 | /****************************************************************************** |
128 | * NOR Flash | 129 | * NOR Flash |
129 | ******************************************************************************/ | 130 | ******************************************************************************/ |
131 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) | ||
130 | static struct mtd_partition palmld_partitions[] = { | 132 | static struct mtd_partition palmld_partitions[] = { |
131 | { | 133 | { |
132 | .name = "Flash", | 134 | .name = "Flash", |
@@ -160,20 +162,18 @@ static struct platform_device palmld_flash = { | |||
160 | }, | 162 | }, |
161 | }; | 163 | }; |
162 | 164 | ||
163 | /****************************************************************************** | 165 | static void __init palmld_nor_init(void) |
164 | * SD/MMC card controller | 166 | { |
165 | ******************************************************************************/ | 167 | platform_device_register(&palmld_flash); |
166 | static struct pxamci_platform_data palmld_mci_platform_data = { | 168 | } |
167 | .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, | 169 | #else |
168 | .gpio_card_detect = GPIO_NR_PALMLD_SD_DETECT_N, | 170 | static inline void palmld_nor_init(void) {} |
169 | .gpio_card_ro = GPIO_NR_PALMLD_SD_READONLY, | 171 | #endif |
170 | .gpio_power = GPIO_NR_PALMLD_SD_POWER, | ||
171 | .detect_delay_ms = 200, | ||
172 | }; | ||
173 | 172 | ||
174 | /****************************************************************************** | 173 | /****************************************************************************** |
175 | * GPIO keyboard | 174 | * GPIO keyboard |
176 | ******************************************************************************/ | 175 | ******************************************************************************/ |
176 | #if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULE) | ||
177 | static unsigned int palmld_matrix_keys[] = { | 177 | static unsigned int palmld_matrix_keys[] = { |
178 | KEY(0, 1, KEY_F2), | 178 | KEY(0, 1, KEY_F2), |
179 | KEY(0, 2, KEY_UP), | 179 | KEY(0, 2, KEY_UP), |
@@ -200,9 +200,18 @@ static struct pxa27x_keypad_platform_data palmld_keypad_platform_data = { | |||
200 | .debounce_interval = 30, | 200 | .debounce_interval = 30, |
201 | }; | 201 | }; |
202 | 202 | ||
203 | static void __init palmld_kpc_init(void) | ||
204 | { | ||
205 | pxa_set_keypad_info(&palmld_keypad_platform_data); | ||
206 | } | ||
207 | #else | ||
208 | static inline void palmld_kpc_init(void) {} | ||
209 | #endif | ||
210 | |||
203 | /****************************************************************************** | 211 | /****************************************************************************** |
204 | * GPIO keys | 212 | * GPIO keys |
205 | ******************************************************************************/ | 213 | ******************************************************************************/ |
214 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | ||
206 | static struct gpio_keys_button palmld_pxa_buttons[] = { | 215 | static struct gpio_keys_button palmld_pxa_buttons[] = { |
207 | {KEY_F8, GPIO_NR_PALMLD_HOTSYNC_BUTTON_N, 1, "HotSync Button" }, | 216 | {KEY_F8, GPIO_NR_PALMLD_HOTSYNC_BUTTON_N, 1, "HotSync Button" }, |
208 | {KEY_F9, GPIO_NR_PALMLD_LOCK_SWITCH, 0, "Lock Switch" }, | 217 | {KEY_F9, GPIO_NR_PALMLD_LOCK_SWITCH, 0, "Lock Switch" }, |
@@ -222,77 +231,18 @@ static struct platform_device palmld_pxa_keys = { | |||
222 | }, | 231 | }, |
223 | }; | 232 | }; |
224 | 233 | ||
225 | /****************************************************************************** | 234 | static void __init palmld_keys_init(void) |
226 | * Backlight | ||
227 | ******************************************************************************/ | ||
228 | static int palmld_backlight_init(struct device *dev) | ||
229 | { | ||
230 | int ret; | ||
231 | |||
232 | ret = gpio_request(GPIO_NR_PALMLD_BL_POWER, "BL POWER"); | ||
233 | if (ret) | ||
234 | goto err; | ||
235 | ret = gpio_direction_output(GPIO_NR_PALMLD_BL_POWER, 0); | ||
236 | if (ret) | ||
237 | goto err2; | ||
238 | ret = gpio_request(GPIO_NR_PALMLD_LCD_POWER, "LCD POWER"); | ||
239 | if (ret) | ||
240 | goto err2; | ||
241 | ret = gpio_direction_output(GPIO_NR_PALMLD_LCD_POWER, 0); | ||
242 | if (ret) | ||
243 | goto err3; | ||
244 | |||
245 | return 0; | ||
246 | err3: | ||
247 | gpio_free(GPIO_NR_PALMLD_LCD_POWER); | ||
248 | err2: | ||
249 | gpio_free(GPIO_NR_PALMLD_BL_POWER); | ||
250 | err: | ||
251 | return ret; | ||
252 | } | ||
253 | |||
254 | static int palmld_backlight_notify(struct device *dev, int brightness) | ||
255 | { | 235 | { |
256 | gpio_set_value(GPIO_NR_PALMLD_BL_POWER, brightness); | 236 | platform_device_register(&palmld_pxa_keys); |
257 | gpio_set_value(GPIO_NR_PALMLD_LCD_POWER, brightness); | ||
258 | return brightness; | ||
259 | } | 237 | } |
260 | 238 | #else | |
261 | static void palmld_backlight_exit(struct device *dev) | 239 | static inline void palmld_keys_init(void) {} |
262 | { | 240 | #endif |
263 | gpio_free(GPIO_NR_PALMLD_BL_POWER); | ||
264 | gpio_free(GPIO_NR_PALMLD_LCD_POWER); | ||
265 | } | ||
266 | |||
267 | static struct platform_pwm_backlight_data palmld_backlight_data = { | ||
268 | .pwm_id = 0, | ||
269 | .max_brightness = PALMLD_MAX_INTENSITY, | ||
270 | .dft_brightness = PALMLD_MAX_INTENSITY, | ||
271 | .pwm_period_ns = PALMLD_PERIOD_NS, | ||
272 | .init = palmld_backlight_init, | ||
273 | .notify = palmld_backlight_notify, | ||
274 | .exit = palmld_backlight_exit, | ||
275 | }; | ||
276 | |||
277 | static struct platform_device palmld_backlight = { | ||
278 | .name = "pwm-backlight", | ||
279 | .dev = { | ||
280 | .parent = &pxa27x_device_pwm0.dev, | ||
281 | .platform_data = &palmld_backlight_data, | ||
282 | }, | ||
283 | }; | ||
284 | |||
285 | /****************************************************************************** | ||
286 | * IrDA | ||
287 | ******************************************************************************/ | ||
288 | static struct pxaficp_platform_data palmld_ficp_platform_data = { | ||
289 | .gpio_pwdown = GPIO_NR_PALMLD_IR_DISABLE, | ||
290 | .transceiver_cap = IR_SIRMODE | IR_OFF, | ||
291 | }; | ||
292 | 241 | ||
293 | /****************************************************************************** | 242 | /****************************************************************************** |
294 | * LEDs | 243 | * LEDs |
295 | ******************************************************************************/ | 244 | ******************************************************************************/ |
245 | #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE) | ||
296 | struct gpio_led gpio_leds[] = { | 246 | struct gpio_led gpio_leds[] = { |
297 | { | 247 | { |
298 | .name = "palmld:green:led", | 248 | .name = "palmld:green:led", |
@@ -318,174 +268,34 @@ static struct platform_device palmld_leds = { | |||
318 | } | 268 | } |
319 | }; | 269 | }; |
320 | 270 | ||
321 | /****************************************************************************** | 271 | static void __init palmld_leds_init(void) |
322 | * Power supply | ||
323 | ******************************************************************************/ | ||
324 | static int power_supply_init(struct device *dev) | ||
325 | { | ||
326 | int ret; | ||
327 | |||
328 | ret = gpio_request(GPIO_NR_PALMLD_POWER_DETECT, "CABLE_STATE_AC"); | ||
329 | if (ret) | ||
330 | goto err1; | ||
331 | ret = gpio_direction_input(GPIO_NR_PALMLD_POWER_DETECT); | ||
332 | if (ret) | ||
333 | goto err2; | ||
334 | |||
335 | ret = gpio_request(GPIO_NR_PALMLD_USB_DETECT_N, "CABLE_STATE_USB"); | ||
336 | if (ret) | ||
337 | goto err2; | ||
338 | ret = gpio_direction_input(GPIO_NR_PALMLD_USB_DETECT_N); | ||
339 | if (ret) | ||
340 | goto err3; | ||
341 | |||
342 | return 0; | ||
343 | |||
344 | err3: | ||
345 | gpio_free(GPIO_NR_PALMLD_USB_DETECT_N); | ||
346 | err2: | ||
347 | gpio_free(GPIO_NR_PALMLD_POWER_DETECT); | ||
348 | err1: | ||
349 | return ret; | ||
350 | } | ||
351 | |||
352 | static int palmld_is_ac_online(void) | ||
353 | { | 272 | { |
354 | return gpio_get_value(GPIO_NR_PALMLD_POWER_DETECT); | 273 | platform_device_register(&palmld_leds); |
355 | } | 274 | } |
356 | 275 | #else | |
357 | static int palmld_is_usb_online(void) | 276 | static inline void palmld_leds_init(void) {} |
358 | { | 277 | #endif |
359 | return !gpio_get_value(GPIO_NR_PALMLD_USB_DETECT_N); | ||
360 | } | ||
361 | |||
362 | static void power_supply_exit(struct device *dev) | ||
363 | { | ||
364 | gpio_free(GPIO_NR_PALMLD_USB_DETECT_N); | ||
365 | gpio_free(GPIO_NR_PALMLD_POWER_DETECT); | ||
366 | } | ||
367 | |||
368 | static char *palmld_supplicants[] = { | ||
369 | "main-battery", | ||
370 | }; | ||
371 | |||
372 | static struct pda_power_pdata power_supply_info = { | ||
373 | .init = power_supply_init, | ||
374 | .is_ac_online = palmld_is_ac_online, | ||
375 | .is_usb_online = palmld_is_usb_online, | ||
376 | .exit = power_supply_exit, | ||
377 | .supplied_to = palmld_supplicants, | ||
378 | .num_supplicants = ARRAY_SIZE(palmld_supplicants), | ||
379 | }; | ||
380 | |||
381 | static struct platform_device power_supply = { | ||
382 | .name = "pda-power", | ||
383 | .id = -1, | ||
384 | .dev = { | ||
385 | .platform_data = &power_supply_info, | ||
386 | }, | ||
387 | }; | ||
388 | |||
389 | /****************************************************************************** | ||
390 | * WM97xx battery | ||
391 | ******************************************************************************/ | ||
392 | static struct wm97xx_batt_info wm97xx_batt_pdata = { | ||
393 | .batt_aux = WM97XX_AUX_ID3, | ||
394 | .temp_aux = WM97XX_AUX_ID2, | ||
395 | .charge_gpio = -1, | ||
396 | .max_voltage = PALMLD_BAT_MAX_VOLTAGE, | ||
397 | .min_voltage = PALMLD_BAT_MIN_VOLTAGE, | ||
398 | .batt_mult = 1000, | ||
399 | .batt_div = 414, | ||
400 | .temp_mult = 1, | ||
401 | .temp_div = 1, | ||
402 | .batt_tech = POWER_SUPPLY_TECHNOLOGY_LIPO, | ||
403 | .batt_name = "main-batt", | ||
404 | }; | ||
405 | |||
406 | /****************************************************************************** | ||
407 | * aSoC audio | ||
408 | ******************************************************************************/ | ||
409 | static struct palm27x_asoc_info palmld_asoc_pdata = { | ||
410 | .jack_gpio = GPIO_NR_PALMLD_EARPHONE_DETECT, | ||
411 | }; | ||
412 | |||
413 | static pxa2xx_audio_ops_t palmld_ac97_pdata = { | ||
414 | .reset_gpio = 95, | ||
415 | }; | ||
416 | |||
417 | static struct platform_device palmld_asoc = { | ||
418 | .name = "palm27x-asoc", | ||
419 | .id = -1, | ||
420 | .dev = { | ||
421 | .platform_data = &palmld_asoc_pdata, | ||
422 | }, | ||
423 | }; | ||
424 | 278 | ||
425 | /****************************************************************************** | 279 | /****************************************************************************** |
426 | * HDD | 280 | * HDD |
427 | ******************************************************************************/ | 281 | ******************************************************************************/ |
428 | static struct platform_device palmld_hdd = { | 282 | #if defined(CONFIG_PATA_PALMLD) || defined(CONFIG_PATA_PALMLD_MODULE) |
283 | static struct platform_device palmld_ide_device = { | ||
429 | .name = "pata_palmld", | 284 | .name = "pata_palmld", |
430 | .id = -1, | 285 | .id = -1, |
431 | }; | 286 | }; |
432 | 287 | ||
433 | /****************************************************************************** | 288 | static void __init palmld_ide_init(void) |
434 | * Framebuffer | ||
435 | ******************************************************************************/ | ||
436 | static struct pxafb_mode_info palmld_lcd_modes[] = { | ||
437 | { | ||
438 | .pixclock = 57692, | ||
439 | .xres = 320, | ||
440 | .yres = 480, | ||
441 | .bpp = 16, | ||
442 | |||
443 | .left_margin = 32, | ||
444 | .right_margin = 1, | ||
445 | .upper_margin = 7, | ||
446 | .lower_margin = 1, | ||
447 | |||
448 | .hsync_len = 4, | ||
449 | .vsync_len = 1, | ||
450 | }, | ||
451 | }; | ||
452 | |||
453 | static struct pxafb_mach_info palmld_lcd_screen = { | ||
454 | .modes = palmld_lcd_modes, | ||
455 | .num_modes = ARRAY_SIZE(palmld_lcd_modes), | ||
456 | .lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL, | ||
457 | }; | ||
458 | |||
459 | /****************************************************************************** | ||
460 | * Power management - standby | ||
461 | ******************************************************************************/ | ||
462 | static void __init palmld_pm_init(void) | ||
463 | { | 289 | { |
464 | static u32 resume[] = { | 290 | platform_device_register(&palmld_ide_device); |
465 | 0xe3a00101, /* mov r0, #0x40000000 */ | ||
466 | 0xe380060f, /* orr r0, r0, #0x00f00000 */ | ||
467 | 0xe590f008, /* ldr pc, [r0, #0x08] */ | ||
468 | }; | ||
469 | |||
470 | /* copy the bootloader */ | ||
471 | memcpy(phys_to_virt(PALMLD_STR_BASE), resume, sizeof(resume)); | ||
472 | } | 291 | } |
292 | #else | ||
293 | static inline void palmld_ide_init(void) {} | ||
294 | #endif | ||
473 | 295 | ||
474 | /****************************************************************************** | 296 | /****************************************************************************** |
475 | * Machine init | 297 | * Machine init |
476 | ******************************************************************************/ | 298 | ******************************************************************************/ |
477 | static struct platform_device *devices[] __initdata = { | ||
478 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | ||
479 | &palmld_pxa_keys, | ||
480 | #endif | ||
481 | &palmld_backlight, | ||
482 | &palmld_leds, | ||
483 | &power_supply, | ||
484 | &palmld_asoc, | ||
485 | &palmld_hdd, | ||
486 | &palmld_flash, | ||
487 | }; | ||
488 | |||
489 | static struct map_desc palmld_io_desc[] __initdata = { | 299 | static struct map_desc palmld_io_desc[] __initdata = { |
490 | { | 300 | { |
491 | .virtual = PALMLD_IDE_VIRT, | 301 | .virtual = PALMLD_IDE_VIRT, |
@@ -510,20 +320,26 @@ static void __init palmld_map_io(void) | |||
510 | static void __init palmld_init(void) | 320 | static void __init palmld_init(void) |
511 | { | 321 | { |
512 | pxa2xx_mfp_config(ARRAY_AND_SIZE(palmld_pin_config)); | 322 | pxa2xx_mfp_config(ARRAY_AND_SIZE(palmld_pin_config)); |
513 | |||
514 | pxa_set_ffuart_info(NULL); | 323 | pxa_set_ffuart_info(NULL); |
515 | pxa_set_btuart_info(NULL); | 324 | pxa_set_btuart_info(NULL); |
516 | pxa_set_stuart_info(NULL); | 325 | pxa_set_stuart_info(NULL); |
517 | 326 | ||
518 | palmld_pm_init(); | 327 | palm27x_mmc_init(GPIO_NR_PALMLD_SD_DETECT_N, GPIO_NR_PALMLD_SD_READONLY, |
519 | set_pxa_fb_info(&palmld_lcd_screen); | 328 | GPIO_NR_PALMLD_SD_POWER, 0); |
520 | pxa_set_mci_info(&palmld_mci_platform_data); | 329 | palm27x_pm_init(PALMLD_STR_BASE); |
521 | pxa_set_ac97_info(&palmld_ac97_pdata); | 330 | palm27x_lcd_init(-1, &palm_320x480_lcd_mode); |
522 | pxa_set_ficp_info(&palmld_ficp_platform_data); | 331 | palm27x_irda_init(GPIO_NR_PALMLD_IR_DISABLE); |
523 | pxa_set_keypad_info(&palmld_keypad_platform_data); | 332 | palm27x_ac97_init(PALMLD_BAT_MIN_VOLTAGE, PALMLD_BAT_MAX_VOLTAGE, |
524 | wm97xx_bat_set_pdata(&wm97xx_batt_pdata); | 333 | GPIO_NR_PALMLD_EARPHONE_DETECT, 95); |
525 | 334 | palm27x_pwm_init(GPIO_NR_PALMLD_BL_POWER, GPIO_NR_PALMLD_LCD_POWER); | |
526 | platform_add_devices(devices, ARRAY_SIZE(devices)); | 335 | palm27x_power_init(GPIO_NR_PALMLD_POWER_DETECT, |
336 | GPIO_NR_PALMLD_USB_DETECT_N); | ||
337 | palm27x_pmic_init(); | ||
338 | palmld_kpc_init(); | ||
339 | palmld_keys_init(); | ||
340 | palmld_nor_init(); | ||
341 | palmld_leds_init(); | ||
342 | palmld_ide_init(); | ||
527 | } | 343 | } |
528 | 344 | ||
529 | MACHINE_START(PALMLD, "Palm LifeDrive") | 345 | MACHINE_START(PALMLD, "Palm LifeDrive") |