diff options
Diffstat (limited to 'arch/arm/mach-pxa/mainstone.c')
-rw-r--r-- | arch/arm/mach-pxa/mainstone.c | 89 |
1 files changed, 32 insertions, 57 deletions
diff --git a/arch/arm/mach-pxa/mainstone.c b/arch/arm/mach-pxa/mainstone.c index 7399fb34da4e..851ec2d9b699 100644 --- a/arch/arm/mach-pxa/mainstone.c +++ b/arch/arm/mach-pxa/mainstone.c | |||
@@ -23,9 +23,10 @@ | |||
23 | #include <linux/ioport.h> | 23 | #include <linux/ioport.h> |
24 | #include <linux/mtd/mtd.h> | 24 | #include <linux/mtd/mtd.h> |
25 | #include <linux/mtd/partitions.h> | 25 | #include <linux/mtd/partitions.h> |
26 | #include <linux/backlight.h> | ||
27 | #include <linux/input.h> | 26 | #include <linux/input.h> |
28 | #include <linux/gpio_keys.h> | 27 | #include <linux/gpio_keys.h> |
28 | #include <linux/pwm_backlight.h> | ||
29 | #include <linux/smc91x.h> | ||
29 | 30 | ||
30 | #include <asm/types.h> | 31 | #include <asm/types.h> |
31 | #include <asm/setup.h> | 32 | #include <asm/setup.h> |
@@ -110,9 +111,9 @@ static unsigned long mainstone_pin_config[] = { | |||
110 | GPIO45_AC97_SYSCLK, | 111 | GPIO45_AC97_SYSCLK, |
111 | 112 | ||
112 | /* Keypad */ | 113 | /* Keypad */ |
113 | GPIO93_KP_DKIN_0 | WAKEUP_ON_LEVEL_HIGH, | 114 | GPIO93_KP_DKIN_0, |
114 | GPIO94_KP_DKIN_1 | WAKEUP_ON_LEVEL_HIGH, | 115 | GPIO94_KP_DKIN_1, |
115 | GPIO95_KP_DKIN_2 | WAKEUP_ON_LEVEL_HIGH, | 116 | GPIO95_KP_DKIN_2, |
116 | GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH, | 117 | GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH, |
117 | GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH, | 118 | GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH, |
118 | GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH, | 119 | GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH, |
@@ -240,11 +241,19 @@ static struct resource smc91x_resources[] = { | |||
240 | } | 241 | } |
241 | }; | 242 | }; |
242 | 243 | ||
244 | static struct smc91x_platdata mainstone_smc91x_info = { | ||
245 | .flags = SMC91X_USE_8BIT | SMC91X_USE_16BIT | SMC91X_USE_32BIT | | ||
246 | SMC91X_NOWAIT | SMC91X_USE_DMA, | ||
247 | }; | ||
248 | |||
243 | static struct platform_device smc91x_device = { | 249 | static struct platform_device smc91x_device = { |
244 | .name = "smc91x", | 250 | .name = "smc91x", |
245 | .id = 0, | 251 | .id = 0, |
246 | .num_resources = ARRAY_SIZE(smc91x_resources), | 252 | .num_resources = ARRAY_SIZE(smc91x_resources), |
247 | .resource = smc91x_resources, | 253 | .resource = smc91x_resources, |
254 | .dev = { | ||
255 | .platform_data = &mainstone_smc91x_info, | ||
256 | }, | ||
248 | }; | 257 | }; |
249 | 258 | ||
250 | static int mst_audio_startup(struct snd_pcm_substream *substream, void *priv) | 259 | static int mst_audio_startup(struct snd_pcm_substream *substream, void *priv) |
@@ -280,12 +289,6 @@ static pxa2xx_audio_ops_t mst_audio_ops = { | |||
280 | .resume = mst_audio_resume, | 289 | .resume = mst_audio_resume, |
281 | }; | 290 | }; |
282 | 291 | ||
283 | static struct platform_device mst_audio_device = { | ||
284 | .name = "pxa2xx-ac97", | ||
285 | .id = -1, | ||
286 | .dev = { .platform_data = &mst_audio_ops }, | ||
287 | }; | ||
288 | |||
289 | static struct resource flash_resources[] = { | 292 | static struct resource flash_resources[] = { |
290 | [0] = { | 293 | [0] = { |
291 | .start = PXA_CS0_PHYS, | 294 | .start = PXA_CS0_PHYS, |
@@ -349,56 +352,27 @@ static struct platform_device mst_flash_device[2] = { | |||
349 | }, | 352 | }, |
350 | }; | 353 | }; |
351 | 354 | ||
352 | #ifdef CONFIG_BACKLIGHT_CLASS_DEVICE | 355 | #if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE) |
353 | static int mainstone_backlight_update_status(struct backlight_device *bl) | 356 | static struct platform_pwm_backlight_data mainstone_backlight_data = { |
354 | { | 357 | .pwm_id = 0, |
355 | int brightness = bl->props.brightness; | 358 | .max_brightness = 1023, |
356 | 359 | .dft_brightness = 1023, | |
357 | if (bl->props.power != FB_BLANK_UNBLANK || | 360 | .pwm_period_ns = 78770, |
358 | bl->props.fb_blank != FB_BLANK_UNBLANK) | 361 | }; |
359 | brightness = 0; | ||
360 | |||
361 | if (brightness != 0) | ||
362 | pxa_set_cken(CKEN_PWM0, 1); | ||
363 | |||
364 | PWM_CTRL0 = 0; | ||
365 | PWM_PWDUTY0 = brightness; | ||
366 | PWM_PERVAL0 = bl->props.max_brightness; | ||
367 | |||
368 | if (brightness == 0) | ||
369 | pxa_set_cken(CKEN_PWM0, 0); | ||
370 | return 0; /* pointless return value */ | ||
371 | } | ||
372 | |||
373 | static int mainstone_backlight_get_brightness(struct backlight_device *bl) | ||
374 | { | ||
375 | return PWM_PWDUTY0; | ||
376 | } | ||
377 | 362 | ||
378 | static /*const*/ struct backlight_ops mainstone_backlight_ops = { | 363 | static struct platform_device mainstone_backlight_device = { |
379 | .update_status = mainstone_backlight_update_status, | 364 | .name = "pwm-backlight", |
380 | .get_brightness = mainstone_backlight_get_brightness, | 365 | .dev = { |
366 | .parent = &pxa27x_device_pwm0.dev, | ||
367 | .platform_data = &mainstone_backlight_data, | ||
368 | }, | ||
381 | }; | 369 | }; |
382 | 370 | ||
383 | static void __init mainstone_backlight_register(void) | 371 | static void __init mainstone_backlight_register(void) |
384 | { | 372 | { |
385 | struct backlight_device *bl; | 373 | int ret = platform_device_register(&mainstone_backlight_device); |
386 | 374 | if (ret) | |
387 | bl = backlight_device_register("mainstone-bl", &pxa_device_fb.dev, | 375 | printk(KERN_ERR "mainstone: failed to register backlight device: %d\n", ret); |
388 | NULL, &mainstone_backlight_ops); | ||
389 | if (IS_ERR(bl)) { | ||
390 | printk(KERN_ERR "mainstone: unable to register backlight: %ld\n", | ||
391 | PTR_ERR(bl)); | ||
392 | return; | ||
393 | } | ||
394 | |||
395 | /* | ||
396 | * broken design - register-then-setup interfaces are | ||
397 | * utterly broken by definition. | ||
398 | */ | ||
399 | bl->props.max_brightness = 1023; | ||
400 | bl->props.brightness = 1023; | ||
401 | backlight_update_status(bl); | ||
402 | } | 376 | } |
403 | #else | 377 | #else |
404 | #define mainstone_backlight_register() do { } while (0) | 378 | #define mainstone_backlight_register() do { } while (0) |
@@ -490,6 +464,7 @@ static void mainstone_irda_transceiver_mode(struct device *dev, int mode) | |||
490 | } else if (mode & IR_FIRMODE) { | 464 | } else if (mode & IR_FIRMODE) { |
491 | MST_MSCWR1 |= MST_MSCWR1_IRDA_FIR; | 465 | MST_MSCWR1 |= MST_MSCWR1_IRDA_FIR; |
492 | } | 466 | } |
467 | pxa2xx_transceiver_mode(dev, mode); | ||
493 | if (mode & IR_OFF) { | 468 | if (mode & IR_OFF) { |
494 | MST_MSCWR1 = (MST_MSCWR1 & ~MST_MSCWR1_IRDA_MASK) | MST_MSCWR1_IRDA_OFF; | 469 | MST_MSCWR1 = (MST_MSCWR1 & ~MST_MSCWR1_IRDA_MASK) | MST_MSCWR1_IRDA_OFF; |
495 | } else { | 470 | } else { |
@@ -528,7 +503,6 @@ static struct platform_device mst_gpio_keys_device = { | |||
528 | 503 | ||
529 | static struct platform_device *platform_devices[] __initdata = { | 504 | static struct platform_device *platform_devices[] __initdata = { |
530 | &smc91x_device, | 505 | &smc91x_device, |
531 | &mst_audio_device, | ||
532 | &mst_flash_device[0], | 506 | &mst_flash_device[0], |
533 | &mst_flash_device[1], | 507 | &mst_flash_device[1], |
534 | &mst_gpio_keys_device, | 508 | &mst_gpio_keys_device, |
@@ -549,7 +523,7 @@ static struct pxaohci_platform_data mainstone_ohci_platform_data = { | |||
549 | .init = mainstone_ohci_init, | 523 | .init = mainstone_ohci_init, |
550 | }; | 524 | }; |
551 | 525 | ||
552 | #if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULES) | 526 | #if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULE) |
553 | static unsigned int mainstone_matrix_keys[] = { | 527 | static unsigned int mainstone_matrix_keys[] = { |
554 | KEY(0, 0, KEY_A), KEY(1, 0, KEY_B), KEY(2, 0, KEY_C), | 528 | KEY(0, 0, KEY_A), KEY(1, 0, KEY_B), KEY(2, 0, KEY_C), |
555 | KEY(3, 0, KEY_D), KEY(4, 0, KEY_E), KEY(5, 0, KEY_F), | 529 | KEY(3, 0, KEY_D), KEY(4, 0, KEY_E), KEY(5, 0, KEY_F), |
@@ -638,6 +612,7 @@ static void __init mainstone_init(void) | |||
638 | pxa_set_ficp_info(&mainstone_ficp_platform_data); | 612 | pxa_set_ficp_info(&mainstone_ficp_platform_data); |
639 | pxa_set_ohci_info(&mainstone_ohci_platform_data); | 613 | pxa_set_ohci_info(&mainstone_ohci_platform_data); |
640 | pxa_set_i2c_info(NULL); | 614 | pxa_set_i2c_info(NULL); |
615 | pxa_set_ac97_info(&mst_audio_ops); | ||
641 | 616 | ||
642 | mainstone_init_keypad(); | 617 | mainstone_init_keypad(); |
643 | } | 618 | } |