Path: blob/master/arch/arm/mach-omap2/board-omap4panda.c
10817 views
/*1* Board support file for OMAP4430 based PandaBoard.2*3* Copyright (C) 2010 Texas Instruments4*5* Author: David Anders <[email protected]>6*7* Based on mach-omap2/board-4430sdp.c8*9* Author: Santosh Shilimkar <[email protected]>10*11* Based on mach-omap2/board-3430sdp.c12*13* This program is free software; you can redistribute it and/or modify14* it under the terms of the GNU General Public License version 2 as15* published by the Free Software Foundation.16*/1718#include <linux/kernel.h>19#include <linux/init.h>20#include <linux/platform_device.h>21#include <linux/clk.h>22#include <linux/io.h>23#include <linux/leds.h>24#include <linux/gpio.h>25#include <linux/usb/otg.h>26#include <linux/i2c/twl.h>27#include <linux/regulator/machine.h>28#include <linux/regulator/fixed.h>29#include <linux/wl12xx.h>3031#include <mach/hardware.h>32#include <mach/omap4-common.h>33#include <asm/mach-types.h>34#include <asm/mach/arch.h>35#include <asm/mach/map.h>36#include <video/omapdss.h>3738#include <plat/board.h>39#include <plat/common.h>40#include <plat/usb.h>41#include <plat/mmc.h>42#include <video/omap-panel-generic-dpi.h>43#include "timer-gp.h"4445#include "hsmmc.h"46#include "control.h"47#include "mux.h"48#include "common-board-devices.h"4950#define GPIO_HUB_POWER 151#define GPIO_HUB_NRESET 6252#define GPIO_WIFI_PMENA 4353#define GPIO_WIFI_IRQ 5354#define HDMI_GPIO_HPD 60 /* Hot plug pin for HDMI */55#define HDMI_GPIO_LS_OE 41 /* Level shifter for HDMI */5657/* wl127x BT, FM, GPS connectivity chip */58static int wl1271_gpios[] = {46, -1, -1};59static struct platform_device wl1271_device = {60.name = "kim",61.id = -1,62.dev = {63.platform_data = &wl1271_gpios,64},65};6667static struct gpio_led gpio_leds[] = {68{69.name = "pandaboard::status1",70.default_trigger = "heartbeat",71.gpio = 7,72},73{74.name = "pandaboard::status2",75.default_trigger = "mmc0",76.gpio = 8,77},78};7980static struct gpio_led_platform_data gpio_led_info = {81.leds = gpio_leds,82.num_leds = ARRAY_SIZE(gpio_leds),83};8485static struct platform_device leds_gpio = {86.name = "leds-gpio",87.id = -1,88.dev = {89.platform_data = &gpio_led_info,90},91};9293static struct platform_device *panda_devices[] __initdata = {94&leds_gpio,95&wl1271_device,96};9798static void __init omap4_panda_init_early(void)99{100omap2_init_common_infrastructure();101omap2_init_common_devices(NULL, NULL);102}103104static const struct usbhs_omap_board_data usbhs_bdata __initconst = {105.port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,106.port_mode[1] = OMAP_USBHS_PORT_MODE_UNUSED,107.port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED,108.phy_reset = false,109.reset_gpio_port[0] = -EINVAL,110.reset_gpio_port[1] = -EINVAL,111.reset_gpio_port[2] = -EINVAL112};113114static struct gpio panda_ehci_gpios[] __initdata = {115{ GPIO_HUB_POWER, GPIOF_OUT_INIT_LOW, "hub_power" },116{ GPIO_HUB_NRESET, GPIOF_OUT_INIT_LOW, "hub_nreset" },117};118119static void __init omap4_ehci_init(void)120{121int ret;122struct clk *phy_ref_clk;123124/* FREF_CLK3 provides the 19.2 MHz reference clock to the PHY */125phy_ref_clk = clk_get(NULL, "auxclk3_ck");126if (IS_ERR(phy_ref_clk)) {127pr_err("Cannot request auxclk3\n");128return;129}130clk_set_rate(phy_ref_clk, 19200000);131clk_enable(phy_ref_clk);132133/* disable the power to the usb hub prior to init and reset phy+hub */134ret = gpio_request_array(panda_ehci_gpios,135ARRAY_SIZE(panda_ehci_gpios));136if (ret) {137pr_err("Unable to initialize EHCI power/reset\n");138return;139}140141gpio_export(GPIO_HUB_POWER, 0);142gpio_export(GPIO_HUB_NRESET, 0);143gpio_set_value(GPIO_HUB_NRESET, 1);144145usbhs_init(&usbhs_bdata);146147/* enable power to hub */148gpio_set_value(GPIO_HUB_POWER, 1);149}150151static struct omap_musb_board_data musb_board_data = {152.interface_type = MUSB_INTERFACE_UTMI,153.mode = MUSB_OTG,154.power = 100,155};156157static struct twl4030_usb_data omap4_usbphy_data = {158.phy_init = omap4430_phy_init,159.phy_exit = omap4430_phy_exit,160.phy_power = omap4430_phy_power,161.phy_set_clock = omap4430_phy_set_clk,162.phy_suspend = omap4430_phy_suspend,163};164165static struct omap2_hsmmc_info mmc[] = {166{167.mmc = 1,168.caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,169.gpio_wp = -EINVAL,170.gpio_cd = -EINVAL,171},172{173.name = "wl1271",174.mmc = 5,175.caps = MMC_CAP_4_BIT_DATA | MMC_CAP_POWER_OFF_CARD,176.gpio_wp = -EINVAL,177.gpio_cd = -EINVAL,178.ocr_mask = MMC_VDD_165_195,179.nonremovable = true,180},181{} /* Terminator */182};183184static struct regulator_consumer_supply omap4_panda_vmmc_supply[] = {185{186.supply = "vmmc",187.dev_name = "omap_hsmmc.0",188},189};190191static struct regulator_consumer_supply omap4_panda_vmmc5_supply = {192.supply = "vmmc",193.dev_name = "omap_hsmmc.4",194};195196static struct regulator_init_data panda_vmmc5 = {197.constraints = {198.valid_ops_mask = REGULATOR_CHANGE_STATUS,199},200.num_consumer_supplies = 1,201.consumer_supplies = &omap4_panda_vmmc5_supply,202};203204static struct fixed_voltage_config panda_vwlan = {205.supply_name = "vwl1271",206.microvolts = 1800000, /* 1.8V */207.gpio = GPIO_WIFI_PMENA,208.startup_delay = 70000, /* 70msec */209.enable_high = 1,210.enabled_at_boot = 0,211.init_data = &panda_vmmc5,212};213214static struct platform_device omap_vwlan_device = {215.name = "reg-fixed-voltage",216.id = 1,217.dev = {218.platform_data = &panda_vwlan,219},220};221222struct wl12xx_platform_data omap_panda_wlan_data __initdata = {223.irq = OMAP_GPIO_IRQ(GPIO_WIFI_IRQ),224/* PANDA ref clock is 38.4 MHz */225.board_ref_clock = 2,226};227228static int omap4_twl6030_hsmmc_late_init(struct device *dev)229{230int ret = 0;231struct platform_device *pdev = container_of(dev,232struct platform_device, dev);233struct omap_mmc_platform_data *pdata = dev->platform_data;234235if (!pdata) {236dev_err(dev, "%s: NULL platform data\n", __func__);237return -EINVAL;238}239/* Setting MMC1 Card detect Irq */240if (pdev->id == 0) {241ret = twl6030_mmc_card_detect_config();242if (ret)243dev_err(dev, "%s: Error card detect config(%d)\n",244__func__, ret);245else246pdata->slots[0].card_detect = twl6030_mmc_card_detect;247}248return ret;249}250251static __init void omap4_twl6030_hsmmc_set_late_init(struct device *dev)252{253struct omap_mmc_platform_data *pdata;254255/* dev can be null if CONFIG_MMC_OMAP_HS is not set */256if (!dev) {257pr_err("Failed omap4_twl6030_hsmmc_set_late_init\n");258return;259}260pdata = dev->platform_data;261262pdata->init = omap4_twl6030_hsmmc_late_init;263}264265static int __init omap4_twl6030_hsmmc_init(struct omap2_hsmmc_info *controllers)266{267struct omap2_hsmmc_info *c;268269omap2_hsmmc_init(controllers);270for (c = controllers; c->mmc; c++)271omap4_twl6030_hsmmc_set_late_init(c->dev);272273return 0;274}275276static struct regulator_init_data omap4_panda_vaux2 = {277.constraints = {278.min_uV = 1200000,279.max_uV = 2800000,280.apply_uV = true,281.valid_modes_mask = REGULATOR_MODE_NORMAL282| REGULATOR_MODE_STANDBY,283.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE284| REGULATOR_CHANGE_MODE285| REGULATOR_CHANGE_STATUS,286},287};288289static struct regulator_init_data omap4_panda_vaux3 = {290.constraints = {291.min_uV = 1000000,292.max_uV = 3000000,293.apply_uV = true,294.valid_modes_mask = REGULATOR_MODE_NORMAL295| REGULATOR_MODE_STANDBY,296.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE297| REGULATOR_CHANGE_MODE298| REGULATOR_CHANGE_STATUS,299},300};301302/* VMMC1 for MMC1 card */303static struct regulator_init_data omap4_panda_vmmc = {304.constraints = {305.min_uV = 1200000,306.max_uV = 3000000,307.apply_uV = true,308.valid_modes_mask = REGULATOR_MODE_NORMAL309| REGULATOR_MODE_STANDBY,310.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE311| REGULATOR_CHANGE_MODE312| REGULATOR_CHANGE_STATUS,313},314.num_consumer_supplies = 1,315.consumer_supplies = omap4_panda_vmmc_supply,316};317318static struct regulator_init_data omap4_panda_vpp = {319.constraints = {320.min_uV = 1800000,321.max_uV = 2500000,322.apply_uV = true,323.valid_modes_mask = REGULATOR_MODE_NORMAL324| REGULATOR_MODE_STANDBY,325.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE326| REGULATOR_CHANGE_MODE327| REGULATOR_CHANGE_STATUS,328},329};330331static struct regulator_init_data omap4_panda_vana = {332.constraints = {333.min_uV = 2100000,334.max_uV = 2100000,335.valid_modes_mask = REGULATOR_MODE_NORMAL336| REGULATOR_MODE_STANDBY,337.valid_ops_mask = REGULATOR_CHANGE_MODE338| REGULATOR_CHANGE_STATUS,339},340};341342static struct regulator_init_data omap4_panda_vcxio = {343.constraints = {344.min_uV = 1800000,345.max_uV = 1800000,346.valid_modes_mask = REGULATOR_MODE_NORMAL347| REGULATOR_MODE_STANDBY,348.valid_ops_mask = REGULATOR_CHANGE_MODE349| REGULATOR_CHANGE_STATUS,350},351};352353static struct regulator_init_data omap4_panda_vdac = {354.constraints = {355.min_uV = 1800000,356.max_uV = 1800000,357.valid_modes_mask = REGULATOR_MODE_NORMAL358| REGULATOR_MODE_STANDBY,359.valid_ops_mask = REGULATOR_CHANGE_MODE360| REGULATOR_CHANGE_STATUS,361},362};363364static struct regulator_init_data omap4_panda_vusb = {365.constraints = {366.min_uV = 3300000,367.max_uV = 3300000,368.apply_uV = true,369.valid_modes_mask = REGULATOR_MODE_NORMAL370| REGULATOR_MODE_STANDBY,371.valid_ops_mask = REGULATOR_CHANGE_MODE372| REGULATOR_CHANGE_STATUS,373},374};375376static struct regulator_init_data omap4_panda_clk32kg = {377.constraints = {378.valid_ops_mask = REGULATOR_CHANGE_STATUS,379},380};381382static struct twl4030_platform_data omap4_panda_twldata = {383.irq_base = TWL6030_IRQ_BASE,384.irq_end = TWL6030_IRQ_END,385386/* Regulators */387.vmmc = &omap4_panda_vmmc,388.vpp = &omap4_panda_vpp,389.vana = &omap4_panda_vana,390.vcxio = &omap4_panda_vcxio,391.vdac = &omap4_panda_vdac,392.vusb = &omap4_panda_vusb,393.vaux2 = &omap4_panda_vaux2,394.vaux3 = &omap4_panda_vaux3,395.clk32kg = &omap4_panda_clk32kg,396.usb = &omap4_usbphy_data,397};398399/*400* Display monitor features are burnt in their EEPROM as EDID data. The EEPROM401* is connected as I2C slave device, and can be accessed at address 0x50402*/403static struct i2c_board_info __initdata panda_i2c_eeprom[] = {404{405I2C_BOARD_INFO("eeprom", 0x50),406},407};408409static int __init omap4_panda_i2c_init(void)410{411omap4_pmic_init("twl6030", &omap4_panda_twldata);412omap_register_i2c_bus(2, 400, NULL, 0);413/*414* Bus 3 is attached to the DVI port where devices like the pico DLP415* projector don't work reliably with 400kHz416*/417omap_register_i2c_bus(3, 100, panda_i2c_eeprom,418ARRAY_SIZE(panda_i2c_eeprom));419omap_register_i2c_bus(4, 400, NULL, 0);420return 0;421}422423#ifdef CONFIG_OMAP_MUX424static struct omap_board_mux board_mux[] __initdata = {425/* WLAN IRQ - GPIO 53 */426OMAP4_MUX(GPMC_NCS3, OMAP_MUX_MODE3 | OMAP_PIN_INPUT),427/* WLAN POWER ENABLE - GPIO 43 */428OMAP4_MUX(GPMC_A19, OMAP_MUX_MODE3 | OMAP_PIN_OUTPUT),429/* WLAN SDIO: MMC5 CMD */430OMAP4_MUX(SDMMC5_CMD, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP),431/* WLAN SDIO: MMC5 CLK */432OMAP4_MUX(SDMMC5_CLK, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP),433/* WLAN SDIO: MMC5 DAT[0-3] */434OMAP4_MUX(SDMMC5_DAT0, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP),435OMAP4_MUX(SDMMC5_DAT1, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP),436OMAP4_MUX(SDMMC5_DAT2, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP),437OMAP4_MUX(SDMMC5_DAT3, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP),438/* gpio 0 - TFP410 PD */439OMAP4_MUX(KPD_COL1, OMAP_PIN_OUTPUT | OMAP_MUX_MODE3),440/* dispc2_data23 */441OMAP4_MUX(USBB2_ULPITLL_STP, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),442/* dispc2_data22 */443OMAP4_MUX(USBB2_ULPITLL_DIR, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),444/* dispc2_data21 */445OMAP4_MUX(USBB2_ULPITLL_NXT, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),446/* dispc2_data20 */447OMAP4_MUX(USBB2_ULPITLL_DAT0, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),448/* dispc2_data19 */449OMAP4_MUX(USBB2_ULPITLL_DAT1, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),450/* dispc2_data18 */451OMAP4_MUX(USBB2_ULPITLL_DAT2, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),452/* dispc2_data15 */453OMAP4_MUX(USBB2_ULPITLL_DAT3, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),454/* dispc2_data14 */455OMAP4_MUX(USBB2_ULPITLL_DAT4, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),456/* dispc2_data13 */457OMAP4_MUX(USBB2_ULPITLL_DAT5, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),458/* dispc2_data12 */459OMAP4_MUX(USBB2_ULPITLL_DAT6, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),460/* dispc2_data11 */461OMAP4_MUX(USBB2_ULPITLL_DAT7, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),462/* dispc2_data10 */463OMAP4_MUX(DPM_EMU3, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),464/* dispc2_data9 */465OMAP4_MUX(DPM_EMU4, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),466/* dispc2_data16 */467OMAP4_MUX(DPM_EMU5, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),468/* dispc2_data17 */469OMAP4_MUX(DPM_EMU6, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),470/* dispc2_hsync */471OMAP4_MUX(DPM_EMU7, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),472/* dispc2_pclk */473OMAP4_MUX(DPM_EMU8, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),474/* dispc2_vsync */475OMAP4_MUX(DPM_EMU9, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),476/* dispc2_de */477OMAP4_MUX(DPM_EMU10, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),478/* dispc2_data8 */479OMAP4_MUX(DPM_EMU11, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),480/* dispc2_data7 */481OMAP4_MUX(DPM_EMU12, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),482/* dispc2_data6 */483OMAP4_MUX(DPM_EMU13, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),484/* dispc2_data5 */485OMAP4_MUX(DPM_EMU14, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),486/* dispc2_data4 */487OMAP4_MUX(DPM_EMU15, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),488/* dispc2_data3 */489OMAP4_MUX(DPM_EMU16, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),490/* dispc2_data2 */491OMAP4_MUX(DPM_EMU17, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),492/* dispc2_data1 */493OMAP4_MUX(DPM_EMU18, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),494/* dispc2_data0 */495OMAP4_MUX(DPM_EMU19, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),496{ .reg_offset = OMAP_MUX_TERMINATOR },497};498499static struct omap_device_pad serial2_pads[] __initdata = {500OMAP_MUX_STATIC("uart2_cts.uart2_cts",501OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0),502OMAP_MUX_STATIC("uart2_rts.uart2_rts",503OMAP_PIN_OUTPUT | OMAP_MUX_MODE0),504OMAP_MUX_STATIC("uart2_rx.uart2_rx",505OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0),506OMAP_MUX_STATIC("uart2_tx.uart2_tx",507OMAP_PIN_OUTPUT | OMAP_MUX_MODE0),508};509510static struct omap_device_pad serial3_pads[] __initdata = {511OMAP_MUX_STATIC("uart3_cts_rctx.uart3_cts_rctx",512OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0),513OMAP_MUX_STATIC("uart3_rts_sd.uart3_rts_sd",514OMAP_PIN_OUTPUT | OMAP_MUX_MODE0),515OMAP_MUX_STATIC("uart3_rx_irrx.uart3_rx_irrx",516OMAP_PIN_INPUT | OMAP_MUX_MODE0),517OMAP_MUX_STATIC("uart3_tx_irtx.uart3_tx_irtx",518OMAP_PIN_OUTPUT | OMAP_MUX_MODE0),519};520521static struct omap_device_pad serial4_pads[] __initdata = {522OMAP_MUX_STATIC("uart4_rx.uart4_rx",523OMAP_PIN_INPUT | OMAP_MUX_MODE0),524OMAP_MUX_STATIC("uart4_tx.uart4_tx",525OMAP_PIN_OUTPUT | OMAP_MUX_MODE0),526};527528static struct omap_board_data serial2_data __initdata = {529.id = 1,530.pads = serial2_pads,531.pads_cnt = ARRAY_SIZE(serial2_pads),532};533534static struct omap_board_data serial3_data __initdata = {535.id = 2,536.pads = serial3_pads,537.pads_cnt = ARRAY_SIZE(serial3_pads),538};539540static struct omap_board_data serial4_data __initdata = {541.id = 3,542.pads = serial4_pads,543.pads_cnt = ARRAY_SIZE(serial4_pads),544};545546static inline void board_serial_init(void)547{548struct omap_board_data bdata;549bdata.flags = 0;550bdata.pads = NULL;551bdata.pads_cnt = 0;552bdata.id = 0;553/* pass dummy data for UART1 */554omap_serial_init_port(&bdata);555556omap_serial_init_port(&serial2_data);557omap_serial_init_port(&serial3_data);558omap_serial_init_port(&serial4_data);559}560#else561#define board_mux NULL562563static inline void board_serial_init(void)564{565omap_serial_init();566}567#endif568569/* Display DVI */570#define PANDA_DVI_TFP410_POWER_DOWN_GPIO 0571572static int omap4_panda_enable_dvi(struct omap_dss_device *dssdev)573{574gpio_set_value(dssdev->reset_gpio, 1);575return 0;576}577578static void omap4_panda_disable_dvi(struct omap_dss_device *dssdev)579{580gpio_set_value(dssdev->reset_gpio, 0);581}582583/* Using generic display panel */584static struct panel_generic_dpi_data omap4_dvi_panel = {585.name = "generic",586.platform_enable = omap4_panda_enable_dvi,587.platform_disable = omap4_panda_disable_dvi,588};589590struct omap_dss_device omap4_panda_dvi_device = {591.type = OMAP_DISPLAY_TYPE_DPI,592.name = "dvi",593.driver_name = "generic_dpi_panel",594.data = &omap4_dvi_panel,595.phy.dpi.data_lines = 24,596.reset_gpio = PANDA_DVI_TFP410_POWER_DOWN_GPIO,597.channel = OMAP_DSS_CHANNEL_LCD2,598};599600int __init omap4_panda_dvi_init(void)601{602int r;603604/* Requesting TFP410 DVI GPIO and disabling it, at bootup */605r = gpio_request_one(omap4_panda_dvi_device.reset_gpio,606GPIOF_OUT_INIT_LOW, "DVI PD");607if (r)608pr_err("Failed to get DVI powerdown GPIO\n");609610return r;611}612613614static void omap4_panda_hdmi_mux_init(void)615{616/* PAD0_HDMI_HPD_PAD1_HDMI_CEC */617omap_mux_init_signal("hdmi_hpd",618OMAP_PIN_INPUT_PULLUP);619omap_mux_init_signal("hdmi_cec",620OMAP_PIN_INPUT_PULLUP);621/* PAD0_HDMI_DDC_SCL_PAD1_HDMI_DDC_SDA */622omap_mux_init_signal("hdmi_ddc_scl",623OMAP_PIN_INPUT_PULLUP);624omap_mux_init_signal("hdmi_ddc_sda",625OMAP_PIN_INPUT_PULLUP);626}627628static struct gpio panda_hdmi_gpios[] = {629{ HDMI_GPIO_HPD, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_hpd" },630{ HDMI_GPIO_LS_OE, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_ls_oe" },631};632633static int omap4_panda_panel_enable_hdmi(struct omap_dss_device *dssdev)634{635int status;636637status = gpio_request_array(panda_hdmi_gpios,638ARRAY_SIZE(panda_hdmi_gpios));639if (status)640pr_err("Cannot request HDMI GPIOs\n");641642return status;643}644645static void omap4_panda_panel_disable_hdmi(struct omap_dss_device *dssdev)646{647gpio_free(HDMI_GPIO_LS_OE);648gpio_free(HDMI_GPIO_HPD);649}650651static struct omap_dss_device omap4_panda_hdmi_device = {652.name = "hdmi",653.driver_name = "hdmi_panel",654.type = OMAP_DISPLAY_TYPE_HDMI,655.platform_enable = omap4_panda_panel_enable_hdmi,656.platform_disable = omap4_panda_panel_disable_hdmi,657.channel = OMAP_DSS_CHANNEL_DIGIT,658};659660static struct omap_dss_device *omap4_panda_dss_devices[] = {661&omap4_panda_dvi_device,662&omap4_panda_hdmi_device,663};664665static struct omap_dss_board_info omap4_panda_dss_data = {666.num_devices = ARRAY_SIZE(omap4_panda_dss_devices),667.devices = omap4_panda_dss_devices,668.default_device = &omap4_panda_dvi_device,669};670671void omap4_panda_display_init(void)672{673int r;674675r = omap4_panda_dvi_init();676if (r)677pr_err("error initializing panda DVI\n");678679omap4_panda_hdmi_mux_init();680omap_display_init(&omap4_panda_dss_data);681}682683static void __init omap4_panda_init(void)684{685int package = OMAP_PACKAGE_CBS;686687if (omap_rev() == OMAP4430_REV_ES1_0)688package = OMAP_PACKAGE_CBL;689omap4_mux_init(board_mux, NULL, package);690691if (wl12xx_set_platform_data(&omap_panda_wlan_data))692pr_err("error setting wl12xx data\n");693694omap4_panda_i2c_init();695platform_add_devices(panda_devices, ARRAY_SIZE(panda_devices));696platform_device_register(&omap_vwlan_device);697board_serial_init();698omap4_twl6030_hsmmc_init(mmc);699omap4_ehci_init();700usb_musb_init(&musb_board_data);701omap4_panda_display_init();702}703704static void __init omap4_panda_map_io(void)705{706omap2_set_globals_443x();707omap44xx_map_common_io();708}709710MACHINE_START(OMAP4_PANDA, "OMAP4 Panda board")711/* Maintainer: David Anders - Texas Instruments Inc */712.boot_params = 0x80000100,713.reserve = omap_reserve,714.map_io = omap4_panda_map_io,715.init_early = omap4_panda_init_early,716.init_irq = gic_init_irq,717.init_machine = omap4_panda_init,718.timer = &omap_timer,719MACHINE_END720721722