diff options
Diffstat (limited to 'arch/arm/mach-omap2/board-omap4panda.c')
-rw-r--r-- | arch/arm/mach-omap2/board-omap4panda.c | 210 |
1 files changed, 209 insertions, 1 deletions
diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c index 0f4d8a762a70..c936c6d7ded0 100644 --- a/arch/arm/mach-omap2/board-omap4panda.c +++ b/arch/arm/mach-omap2/board-omap4panda.c | |||
@@ -34,11 +34,13 @@ | |||
34 | #include <asm/mach-types.h> | 34 | #include <asm/mach-types.h> |
35 | #include <asm/mach/arch.h> | 35 | #include <asm/mach/arch.h> |
36 | #include <asm/mach/map.h> | 36 | #include <asm/mach/map.h> |
37 | #include <plat/display.h> | ||
37 | 38 | ||
38 | #include <plat/board.h> | 39 | #include <plat/board.h> |
39 | #include <plat/common.h> | 40 | #include <plat/common.h> |
40 | #include <plat/usb.h> | 41 | #include <plat/usb.h> |
41 | #include <plat/mmc.h> | 42 | #include <plat/mmc.h> |
43 | #include <plat/panel-generic-dpi.h> | ||
42 | #include "timer-gp.h" | 44 | #include "timer-gp.h" |
43 | 45 | ||
44 | #include "hsmmc.h" | 46 | #include "hsmmc.h" |
@@ -49,6 +51,8 @@ | |||
49 | #define GPIO_HUB_NRESET 62 | 51 | #define GPIO_HUB_NRESET 62 |
50 | #define GPIO_WIFI_PMENA 43 | 52 | #define GPIO_WIFI_PMENA 43 |
51 | #define GPIO_WIFI_IRQ 53 | 53 | #define GPIO_WIFI_IRQ 53 |
54 | #define HDMI_GPIO_HPD 60 /* Hot plug pin for HDMI */ | ||
55 | #define HDMI_GPIO_LS_OE 41 /* Level shifter for HDMI */ | ||
52 | 56 | ||
53 | /* wl127x BT, FM, GPS connectivity chip */ | 57 | /* wl127x BT, FM, GPS connectivity chip */ |
54 | static int wl1271_gpios[] = {46, -1, -1}; | 58 | static int wl1271_gpios[] = {46, -1, -1}; |
@@ -407,6 +411,12 @@ static struct regulator_init_data omap4_panda_vusb = { | |||
407 | }, | 411 | }, |
408 | }; | 412 | }; |
409 | 413 | ||
414 | static struct regulator_init_data omap4_panda_clk32kg = { | ||
415 | .constraints = { | ||
416 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | ||
417 | }, | ||
418 | }; | ||
419 | |||
410 | static struct twl4030_platform_data omap4_panda_twldata = { | 420 | static struct twl4030_platform_data omap4_panda_twldata = { |
411 | .irq_base = TWL6030_IRQ_BASE, | 421 | .irq_base = TWL6030_IRQ_BASE, |
412 | .irq_end = TWL6030_IRQ_END, | 422 | .irq_end = TWL6030_IRQ_END, |
@@ -422,6 +432,7 @@ static struct twl4030_platform_data omap4_panda_twldata = { | |||
422 | .vaux1 = &omap4_panda_vaux1, | 432 | .vaux1 = &omap4_panda_vaux1, |
423 | .vaux2 = &omap4_panda_vaux2, | 433 | .vaux2 = &omap4_panda_vaux2, |
424 | .vaux3 = &omap4_panda_vaux3, | 434 | .vaux3 = &omap4_panda_vaux3, |
435 | .clk32kg = &omap4_panda_clk32kg, | ||
425 | .usb = &omap4_usbphy_data, | 436 | .usb = &omap4_usbphy_data, |
426 | }; | 437 | }; |
427 | 438 | ||
@@ -433,6 +444,17 @@ static struct i2c_board_info __initdata omap4_panda_i2c_boardinfo[] = { | |||
433 | .platform_data = &omap4_panda_twldata, | 444 | .platform_data = &omap4_panda_twldata, |
434 | }, | 445 | }, |
435 | }; | 446 | }; |
447 | |||
448 | /* | ||
449 | * Display monitor features are burnt in their EEPROM as EDID data. The EEPROM | ||
450 | * is connected as I2C slave device, and can be accessed at address 0x50 | ||
451 | */ | ||
452 | static struct i2c_board_info __initdata panda_i2c_eeprom[] = { | ||
453 | { | ||
454 | I2C_BOARD_INFO("eeprom", 0x50), | ||
455 | }, | ||
456 | }; | ||
457 | |||
436 | static int __init omap4_panda_i2c_init(void) | 458 | static int __init omap4_panda_i2c_init(void) |
437 | { | 459 | { |
438 | /* | 460 | /* |
@@ -442,7 +464,12 @@ static int __init omap4_panda_i2c_init(void) | |||
442 | omap_register_i2c_bus(1, 400, omap4_panda_i2c_boardinfo, | 464 | omap_register_i2c_bus(1, 400, omap4_panda_i2c_boardinfo, |
443 | ARRAY_SIZE(omap4_panda_i2c_boardinfo)); | 465 | ARRAY_SIZE(omap4_panda_i2c_boardinfo)); |
444 | omap_register_i2c_bus(2, 400, NULL, 0); | 466 | omap_register_i2c_bus(2, 400, NULL, 0); |
445 | omap_register_i2c_bus(3, 400, NULL, 0); | 467 | /* |
468 | * Bus 3 is attached to the DVI port where devices like the pico DLP | ||
469 | * projector don't work reliably with 400kHz | ||
470 | */ | ||
471 | omap_register_i2c_bus(3, 100, panda_i2c_eeprom, | ||
472 | ARRAY_SIZE(panda_i2c_eeprom)); | ||
446 | omap_register_i2c_bus(4, 400, NULL, 0); | 473 | omap_register_i2c_bus(4, 400, NULL, 0); |
447 | return 0; | 474 | return 0; |
448 | } | 475 | } |
@@ -462,6 +489,64 @@ static struct omap_board_mux board_mux[] __initdata = { | |||
462 | OMAP4_MUX(SDMMC5_DAT1, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP), | 489 | OMAP4_MUX(SDMMC5_DAT1, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP), |
463 | OMAP4_MUX(SDMMC5_DAT2, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP), | 490 | OMAP4_MUX(SDMMC5_DAT2, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP), |
464 | OMAP4_MUX(SDMMC5_DAT3, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP), | 491 | OMAP4_MUX(SDMMC5_DAT3, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP), |
492 | /* gpio 0 - TFP410 PD */ | ||
493 | OMAP4_MUX(KPD_COL1, OMAP_PIN_OUTPUT | OMAP_MUX_MODE3), | ||
494 | /* dispc2_data23 */ | ||
495 | OMAP4_MUX(USBB2_ULPITLL_STP, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), | ||
496 | /* dispc2_data22 */ | ||
497 | OMAP4_MUX(USBB2_ULPITLL_DIR, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), | ||
498 | /* dispc2_data21 */ | ||
499 | OMAP4_MUX(USBB2_ULPITLL_NXT, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), | ||
500 | /* dispc2_data20 */ | ||
501 | OMAP4_MUX(USBB2_ULPITLL_DAT0, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), | ||
502 | /* dispc2_data19 */ | ||
503 | OMAP4_MUX(USBB2_ULPITLL_DAT1, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), | ||
504 | /* dispc2_data18 */ | ||
505 | OMAP4_MUX(USBB2_ULPITLL_DAT2, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), | ||
506 | /* dispc2_data15 */ | ||
507 | OMAP4_MUX(USBB2_ULPITLL_DAT3, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), | ||
508 | /* dispc2_data14 */ | ||
509 | OMAP4_MUX(USBB2_ULPITLL_DAT4, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), | ||
510 | /* dispc2_data13 */ | ||
511 | OMAP4_MUX(USBB2_ULPITLL_DAT5, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), | ||
512 | /* dispc2_data12 */ | ||
513 | OMAP4_MUX(USBB2_ULPITLL_DAT6, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), | ||
514 | /* dispc2_data11 */ | ||
515 | OMAP4_MUX(USBB2_ULPITLL_DAT7, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), | ||
516 | /* dispc2_data10 */ | ||
517 | OMAP4_MUX(DPM_EMU3, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), | ||
518 | /* dispc2_data9 */ | ||
519 | OMAP4_MUX(DPM_EMU4, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), | ||
520 | /* dispc2_data16 */ | ||
521 | OMAP4_MUX(DPM_EMU5, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), | ||
522 | /* dispc2_data17 */ | ||
523 | OMAP4_MUX(DPM_EMU6, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), | ||
524 | /* dispc2_hsync */ | ||
525 | OMAP4_MUX(DPM_EMU7, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), | ||
526 | /* dispc2_pclk */ | ||
527 | OMAP4_MUX(DPM_EMU8, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), | ||
528 | /* dispc2_vsync */ | ||
529 | OMAP4_MUX(DPM_EMU9, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), | ||
530 | /* dispc2_de */ | ||
531 | OMAP4_MUX(DPM_EMU10, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), | ||
532 | /* dispc2_data8 */ | ||
533 | OMAP4_MUX(DPM_EMU11, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), | ||
534 | /* dispc2_data7 */ | ||
535 | OMAP4_MUX(DPM_EMU12, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), | ||
536 | /* dispc2_data6 */ | ||
537 | OMAP4_MUX(DPM_EMU13, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), | ||
538 | /* dispc2_data5 */ | ||
539 | OMAP4_MUX(DPM_EMU14, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), | ||
540 | /* dispc2_data4 */ | ||
541 | OMAP4_MUX(DPM_EMU15, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), | ||
542 | /* dispc2_data3 */ | ||
543 | OMAP4_MUX(DPM_EMU16, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), | ||
544 | /* dispc2_data2 */ | ||
545 | OMAP4_MUX(DPM_EMU17, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), | ||
546 | /* dispc2_data1 */ | ||
547 | OMAP4_MUX(DPM_EMU18, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), | ||
548 | /* dispc2_data0 */ | ||
549 | OMAP4_MUX(DPM_EMU19, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5), | ||
465 | { .reg_offset = OMAP_MUX_TERMINATOR }, | 550 | { .reg_offset = OMAP_MUX_TERMINATOR }, |
466 | }; | 551 | }; |
467 | 552 | ||
@@ -535,6 +620,128 @@ static inline void board_serial_init(void) | |||
535 | } | 620 | } |
536 | #endif | 621 | #endif |
537 | 622 | ||
623 | /* Display DVI */ | ||
624 | #define PANDA_DVI_TFP410_POWER_DOWN_GPIO 0 | ||
625 | |||
626 | static int omap4_panda_enable_dvi(struct omap_dss_device *dssdev) | ||
627 | { | ||
628 | gpio_set_value(dssdev->reset_gpio, 1); | ||
629 | return 0; | ||
630 | } | ||
631 | |||
632 | static void omap4_panda_disable_dvi(struct omap_dss_device *dssdev) | ||
633 | { | ||
634 | gpio_set_value(dssdev->reset_gpio, 0); | ||
635 | } | ||
636 | |||
637 | /* Using generic display panel */ | ||
638 | static struct panel_generic_dpi_data omap4_dvi_panel = { | ||
639 | .name = "generic", | ||
640 | .platform_enable = omap4_panda_enable_dvi, | ||
641 | .platform_disable = omap4_panda_disable_dvi, | ||
642 | }; | ||
643 | |||
644 | struct omap_dss_device omap4_panda_dvi_device = { | ||
645 | .type = OMAP_DISPLAY_TYPE_DPI, | ||
646 | .name = "dvi", | ||
647 | .driver_name = "generic_dpi_panel", | ||
648 | .data = &omap4_dvi_panel, | ||
649 | .phy.dpi.data_lines = 24, | ||
650 | .reset_gpio = PANDA_DVI_TFP410_POWER_DOWN_GPIO, | ||
651 | .channel = OMAP_DSS_CHANNEL_LCD2, | ||
652 | }; | ||
653 | |||
654 | int __init omap4_panda_dvi_init(void) | ||
655 | { | ||
656 | int r; | ||
657 | |||
658 | /* Requesting TFP410 DVI GPIO and disabling it, at bootup */ | ||
659 | r = gpio_request_one(omap4_panda_dvi_device.reset_gpio, | ||
660 | GPIOF_OUT_INIT_LOW, "DVI PD"); | ||
661 | if (r) | ||
662 | pr_err("Failed to get DVI powerdown GPIO\n"); | ||
663 | |||
664 | return r; | ||
665 | } | ||
666 | |||
667 | |||
668 | static void omap4_panda_hdmi_mux_init(void) | ||
669 | { | ||
670 | /* PAD0_HDMI_HPD_PAD1_HDMI_CEC */ | ||
671 | omap_mux_init_signal("hdmi_hpd", | ||
672 | OMAP_PIN_INPUT_PULLUP); | ||
673 | omap_mux_init_signal("hdmi_cec", | ||
674 | OMAP_PIN_INPUT_PULLUP); | ||
675 | /* PAD0_HDMI_DDC_SCL_PAD1_HDMI_DDC_SDA */ | ||
676 | omap_mux_init_signal("hdmi_ddc_scl", | ||
677 | OMAP_PIN_INPUT_PULLUP); | ||
678 | omap_mux_init_signal("hdmi_ddc_sda", | ||
679 | OMAP_PIN_INPUT_PULLUP); | ||
680 | } | ||
681 | |||
682 | static int omap4_panda_panel_enable_hdmi(struct omap_dss_device *dssdev) | ||
683 | { | ||
684 | int status; | ||
685 | |||
686 | status = gpio_request_one(HDMI_GPIO_HPD, GPIOF_OUT_INIT_HIGH, | ||
687 | "hdmi_gpio_hpd"); | ||
688 | if (status) { | ||
689 | pr_err("Cannot request GPIO %d\n", HDMI_GPIO_HPD); | ||
690 | return status; | ||
691 | } | ||
692 | status = gpio_request_one(HDMI_GPIO_LS_OE, GPIOF_OUT_INIT_HIGH, | ||
693 | "hdmi_gpio_ls_oe"); | ||
694 | if (status) { | ||
695 | pr_err("Cannot request GPIO %d\n", HDMI_GPIO_LS_OE); | ||
696 | goto error1; | ||
697 | } | ||
698 | |||
699 | return 0; | ||
700 | |||
701 | error1: | ||
702 | gpio_free(HDMI_GPIO_HPD); | ||
703 | |||
704 | return status; | ||
705 | } | ||
706 | |||
707 | static void omap4_panda_panel_disable_hdmi(struct omap_dss_device *dssdev) | ||
708 | { | ||
709 | gpio_free(HDMI_GPIO_LS_OE); | ||
710 | gpio_free(HDMI_GPIO_HPD); | ||
711 | } | ||
712 | |||
713 | static struct omap_dss_device omap4_panda_hdmi_device = { | ||
714 | .name = "hdmi", | ||
715 | .driver_name = "hdmi_panel", | ||
716 | .type = OMAP_DISPLAY_TYPE_HDMI, | ||
717 | .platform_enable = omap4_panda_panel_enable_hdmi, | ||
718 | .platform_disable = omap4_panda_panel_disable_hdmi, | ||
719 | .channel = OMAP_DSS_CHANNEL_DIGIT, | ||
720 | }; | ||
721 | |||
722 | static struct omap_dss_device *omap4_panda_dss_devices[] = { | ||
723 | &omap4_panda_dvi_device, | ||
724 | &omap4_panda_hdmi_device, | ||
725 | }; | ||
726 | |||
727 | static struct omap_dss_board_info omap4_panda_dss_data = { | ||
728 | .num_devices = ARRAY_SIZE(omap4_panda_dss_devices), | ||
729 | .devices = omap4_panda_dss_devices, | ||
730 | .default_device = &omap4_panda_dvi_device, | ||
731 | }; | ||
732 | |||
733 | void omap4_panda_display_init(void) | ||
734 | { | ||
735 | int r; | ||
736 | |||
737 | r = omap4_panda_dvi_init(); | ||
738 | if (r) | ||
739 | pr_err("error initializing panda DVI\n"); | ||
740 | |||
741 | omap4_panda_hdmi_mux_init(); | ||
742 | omap_display_init(&omap4_panda_dss_data); | ||
743 | } | ||
744 | |||
538 | static void __init omap4_panda_init(void) | 745 | static void __init omap4_panda_init(void) |
539 | { | 746 | { |
540 | int package = OMAP_PACKAGE_CBS; | 747 | int package = OMAP_PACKAGE_CBS; |
@@ -553,6 +760,7 @@ static void __init omap4_panda_init(void) | |||
553 | omap4_twl6030_hsmmc_init(mmc); | 760 | omap4_twl6030_hsmmc_init(mmc); |
554 | omap4_ehci_init(); | 761 | omap4_ehci_init(); |
555 | usb_musb_init(&musb_board_data); | 762 | usb_musb_init(&musb_board_data); |
763 | omap4_panda_display_init(); | ||
556 | } | 764 | } |
557 | 765 | ||
558 | static void __init omap4_panda_map_io(void) | 766 | static void __init omap4_panda_map_io(void) |