aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-omap2/board-omap4panda.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-omap2/board-omap4panda.c')
-rw-r--r--arch/arm/mach-omap2/board-omap4panda.c210
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 */
54static int wl1271_gpios[] = {46, -1, -1}; 58static int wl1271_gpios[] = {46, -1, -1};
@@ -407,6 +411,12 @@ static struct regulator_init_data omap4_panda_vusb = {
407 }, 411 },
408}; 412};
409 413
414static struct regulator_init_data omap4_panda_clk32kg = {
415 .constraints = {
416 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
417 },
418};
419
410static struct twl4030_platform_data omap4_panda_twldata = { 420static 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 */
452static struct i2c_board_info __initdata panda_i2c_eeprom[] = {
453 {
454 I2C_BOARD_INFO("eeprom", 0x50),
455 },
456};
457
436static int __init omap4_panda_i2c_init(void) 458static 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
626static int omap4_panda_enable_dvi(struct omap_dss_device *dssdev)
627{
628 gpio_set_value(dssdev->reset_gpio, 1);
629 return 0;
630}
631
632static 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 */
638static 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
644struct 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
654int __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
668static 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
682static 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
701error1:
702 gpio_free(HDMI_GPIO_HPD);
703
704 return status;
705}
706
707static 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
713static 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
722static struct omap_dss_device *omap4_panda_dss_devices[] = {
723 &omap4_panda_dvi_device,
724 &omap4_panda_hdmi_device,
725};
726
727static 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
733void 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
538static void __init omap4_panda_init(void) 745static 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
558static void __init omap4_panda_map_io(void) 766static void __init omap4_panda_map_io(void)