diff options
Diffstat (limited to 'arch/arm/mach-s5pv210/mach-aquila.c')
-rw-r--r-- | arch/arm/mach-s5pv210/mach-aquila.c | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/arch/arm/mach-s5pv210/mach-aquila.c b/arch/arm/mach-s5pv210/mach-aquila.c index 00883087363c..28677caf3613 100644 --- a/arch/arm/mach-s5pv210/mach-aquila.c +++ b/arch/arm/mach-s5pv210/mach-aquila.c | |||
@@ -16,6 +16,8 @@ | |||
16 | #include <linux/i2c.h> | 16 | #include <linux/i2c.h> |
17 | #include <linux/i2c-gpio.h> | 17 | #include <linux/i2c-gpio.h> |
18 | #include <linux/mfd/max8998.h> | 18 | #include <linux/mfd/max8998.h> |
19 | #include <linux/mfd/wm8994/pdata.h> | ||
20 | #include <linux/regulator/fixed.h> | ||
19 | #include <linux/gpio_keys.h> | 21 | #include <linux/gpio_keys.h> |
20 | #include <linux/input.h> | 22 | #include <linux/input.h> |
21 | #include <linux/gpio.h> | 23 | #include <linux/gpio.h> |
@@ -379,6 +381,119 @@ static struct max8998_platform_data aquila_max8998_pdata = { | |||
379 | }; | 381 | }; |
380 | #endif | 382 | #endif |
381 | 383 | ||
384 | static struct regulator_consumer_supply wm8994_fixed_voltage0_supplies[] = { | ||
385 | { | ||
386 | .dev_name = "5-001a", | ||
387 | .supply = "DBVDD", | ||
388 | }, { | ||
389 | .dev_name = "5-001a", | ||
390 | .supply = "AVDD2", | ||
391 | }, { | ||
392 | .dev_name = "5-001a", | ||
393 | .supply = "CPVDD", | ||
394 | }, | ||
395 | }; | ||
396 | |||
397 | static struct regulator_consumer_supply wm8994_fixed_voltage1_supplies[] = { | ||
398 | { | ||
399 | .dev_name = "5-001a", | ||
400 | .supply = "SPKVDD1", | ||
401 | }, { | ||
402 | .dev_name = "5-001a", | ||
403 | .supply = "SPKVDD2", | ||
404 | }, | ||
405 | }; | ||
406 | |||
407 | static struct regulator_init_data wm8994_fixed_voltage0_init_data = { | ||
408 | .constraints = { | ||
409 | .always_on = 1, | ||
410 | }, | ||
411 | .num_consumer_supplies = ARRAY_SIZE(wm8994_fixed_voltage0_supplies), | ||
412 | .consumer_supplies = wm8994_fixed_voltage0_supplies, | ||
413 | }; | ||
414 | |||
415 | static struct regulator_init_data wm8994_fixed_voltage1_init_data = { | ||
416 | .constraints = { | ||
417 | .always_on = 1, | ||
418 | }, | ||
419 | .num_consumer_supplies = ARRAY_SIZE(wm8994_fixed_voltage1_supplies), | ||
420 | .consumer_supplies = wm8994_fixed_voltage1_supplies, | ||
421 | }; | ||
422 | |||
423 | static struct fixed_voltage_config wm8994_fixed_voltage0_config = { | ||
424 | .supply_name = "VCC_1.8V_PDA", | ||
425 | .microvolts = 1800000, | ||
426 | .gpio = -EINVAL, | ||
427 | .init_data = &wm8994_fixed_voltage0_init_data, | ||
428 | }; | ||
429 | |||
430 | static struct fixed_voltage_config wm8994_fixed_voltage1_config = { | ||
431 | .supply_name = "V_BAT", | ||
432 | .microvolts = 3700000, | ||
433 | .gpio = -EINVAL, | ||
434 | .init_data = &wm8994_fixed_voltage1_init_data, | ||
435 | }; | ||
436 | |||
437 | static struct platform_device wm8994_fixed_voltage0 = { | ||
438 | .name = "reg-fixed-voltage", | ||
439 | .id = 0, | ||
440 | .dev = { | ||
441 | .platform_data = &wm8994_fixed_voltage0_config, | ||
442 | }, | ||
443 | }; | ||
444 | |||
445 | static struct platform_device wm8994_fixed_voltage1 = { | ||
446 | .name = "reg-fixed-voltage", | ||
447 | .id = 1, | ||
448 | .dev = { | ||
449 | .platform_data = &wm8994_fixed_voltage1_config, | ||
450 | }, | ||
451 | }; | ||
452 | |||
453 | static struct regulator_consumer_supply wm8994_avdd1_supply = { | ||
454 | .dev_name = "5-001a", | ||
455 | .supply = "AVDD1", | ||
456 | }; | ||
457 | |||
458 | static struct regulator_consumer_supply wm8994_dcvdd_supply = { | ||
459 | .dev_name = "5-001a", | ||
460 | .supply = "DCVDD", | ||
461 | }; | ||
462 | |||
463 | static struct regulator_init_data wm8994_ldo1_data = { | ||
464 | .constraints = { | ||
465 | .name = "AVDD1_3.0V", | ||
466 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | ||
467 | }, | ||
468 | .num_consumer_supplies = 1, | ||
469 | .consumer_supplies = &wm8994_avdd1_supply, | ||
470 | }; | ||
471 | |||
472 | static struct regulator_init_data wm8994_ldo2_data = { | ||
473 | .constraints = { | ||
474 | .name = "DCVDD_1.0V", | ||
475 | }, | ||
476 | .num_consumer_supplies = 1, | ||
477 | .consumer_supplies = &wm8994_dcvdd_supply, | ||
478 | }; | ||
479 | |||
480 | static struct wm8994_pdata wm8994_platform_data = { | ||
481 | /* configure gpio1 function: 0x0001(Logic level input/output) */ | ||
482 | .gpio_defaults[0] = 0x0001, | ||
483 | /* configure gpio3/4/5/7 function for AIF2 voice */ | ||
484 | .gpio_defaults[2] = 0x8100, | ||
485 | .gpio_defaults[3] = 0x8100, | ||
486 | .gpio_defaults[4] = 0x8100, | ||
487 | .gpio_defaults[6] = 0x0100, | ||
488 | /* configure gpio8/9/10/11 function for AIF3 BT */ | ||
489 | .gpio_defaults[7] = 0x8100, | ||
490 | .gpio_defaults[8] = 0x0100, | ||
491 | .gpio_defaults[9] = 0x0100, | ||
492 | .gpio_defaults[10] = 0x0100, | ||
493 | .ldo[0] = { S5PV210_MP03(6), NULL, &wm8994_ldo1_data }, /* XM0FRNB_2 */ | ||
494 | .ldo[1] = { 0, NULL, &wm8994_ldo2_data }, | ||
495 | }; | ||
496 | |||
382 | /* GPIO I2C PMIC */ | 497 | /* GPIO I2C PMIC */ |
383 | #define AP_I2C_GPIO_PMIC_BUS_4 4 | 498 | #define AP_I2C_GPIO_PMIC_BUS_4 4 |
384 | static struct i2c_gpio_platform_data aquila_i2c_gpio_pmic_data = { | 499 | static struct i2c_gpio_platform_data aquila_i2c_gpio_pmic_data = { |
@@ -404,6 +519,29 @@ static struct i2c_board_info i2c_gpio_pmic_devs[] __initdata = { | |||
404 | #endif | 519 | #endif |
405 | }; | 520 | }; |
406 | 521 | ||
522 | /* GPIO I2C AP 1.8V */ | ||
523 | #define AP_I2C_GPIO_BUS_5 5 | ||
524 | static struct i2c_gpio_platform_data aquila_i2c_gpio5_data = { | ||
525 | .sda_pin = S5PV210_MP05(3), /* XM0ADDR_11 */ | ||
526 | .scl_pin = S5PV210_MP05(2), /* XM0ADDR_10 */ | ||
527 | }; | ||
528 | |||
529 | static struct platform_device aquila_i2c_gpio5 = { | ||
530 | .name = "i2c-gpio", | ||
531 | .id = AP_I2C_GPIO_BUS_5, | ||
532 | .dev = { | ||
533 | .platform_data = &aquila_i2c_gpio5_data, | ||
534 | }, | ||
535 | }; | ||
536 | |||
537 | static struct i2c_board_info i2c_gpio5_devs[] __initdata = { | ||
538 | { | ||
539 | /* CS/ADDR = low 0x34 (FYI: high = 0x36) */ | ||
540 | I2C_BOARD_INFO("wm8994", 0x1a), | ||
541 | .platform_data = &wm8994_platform_data, | ||
542 | }, | ||
543 | }; | ||
544 | |||
407 | /* PMIC Power button */ | 545 | /* PMIC Power button */ |
408 | static struct gpio_keys_button aquila_gpio_keys_table[] = { | 546 | static struct gpio_keys_button aquila_gpio_keys_table[] = { |
409 | { | 547 | { |
@@ -475,6 +613,7 @@ static void aquila_setup_sdhci(void) | |||
475 | 613 | ||
476 | static struct platform_device *aquila_devices[] __initdata = { | 614 | static struct platform_device *aquila_devices[] __initdata = { |
477 | &aquila_i2c_gpio_pmic, | 615 | &aquila_i2c_gpio_pmic, |
616 | &aquila_i2c_gpio5, | ||
478 | &aquila_device_gpiokeys, | 617 | &aquila_device_gpiokeys, |
479 | &s3c_device_fb, | 618 | &s3c_device_fb, |
480 | &s5p_device_onenand, | 619 | &s5p_device_onenand, |
@@ -484,8 +623,33 @@ static struct platform_device *aquila_devices[] __initdata = { | |||
484 | &s5p_device_fimc0, | 623 | &s5p_device_fimc0, |
485 | &s5p_device_fimc1, | 624 | &s5p_device_fimc1, |
486 | &s5p_device_fimc2, | 625 | &s5p_device_fimc2, |
626 | &s5pv210_device_iis0, | ||
627 | &wm8994_fixed_voltage0, | ||
628 | &wm8994_fixed_voltage1, | ||
487 | }; | 629 | }; |
488 | 630 | ||
631 | static void __init aquila_sound_init(void) | ||
632 | { | ||
633 | unsigned int gpio; | ||
634 | |||
635 | /* CODEC_XTAL_EN | ||
636 | * | ||
637 | * The Aquila board have a oscillator which provide main clock | ||
638 | * to WM8994 codec. The oscillator provide 24MHz clock to WM8994 | ||
639 | * clock. Set gpio setting of "CODEC_XTAL_EN" to enable a oscillator. | ||
640 | * */ | ||
641 | gpio = S5PV210_GPH3(2); /* XEINT_26 */ | ||
642 | gpio_request(gpio, "CODEC_XTAL_EN"); | ||
643 | s3c_gpio_cfgpin(gpio, S3C_GPIO_OUTPUT); | ||
644 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | ||
645 | |||
646 | /* Ths main clock of WM8994 codec uses the output of CLKOUT pin. | ||
647 | * The CLKOUT[9:8] set to 0x3(XUSBXTI) of 0xE010E000(OTHERS) | ||
648 | * because it needs 24MHz clock to operate WM8994 codec. | ||
649 | */ | ||
650 | __raw_writel(__raw_readl(S5P_OTHERS) | (0x3 << 8), S5P_OTHERS); | ||
651 | } | ||
652 | |||
489 | static void __init aquila_map_io(void) | 653 | static void __init aquila_map_io(void) |
490 | { | 654 | { |
491 | s5p_init_io(NULL, 0, S5P_VA_CHIPID); | 655 | s5p_init_io(NULL, 0, S5P_VA_CHIPID); |
@@ -506,6 +670,11 @@ static void __init aquila_machine_init(void) | |||
506 | s3c_fimc_setname(1, "s5p-fimc"); | 670 | s3c_fimc_setname(1, "s5p-fimc"); |
507 | s3c_fimc_setname(2, "s5p-fimc"); | 671 | s3c_fimc_setname(2, "s5p-fimc"); |
508 | 672 | ||
673 | /* SOUND */ | ||
674 | aquila_sound_init(); | ||
675 | i2c_register_board_info(AP_I2C_GPIO_BUS_5, i2c_gpio5_devs, | ||
676 | ARRAY_SIZE(i2c_gpio5_devs)); | ||
677 | |||
509 | /* FB */ | 678 | /* FB */ |
510 | s3c_fb_set_platdata(&aquila_lcd_pdata); | 679 | s3c_fb_set_platdata(&aquila_lcd_pdata); |
511 | 680 | ||