/* * Board support file for OMAP4430 based PandaBoard. * * Copyright (C) 2010 Texas Instruments * * Author: David Anders * * Based on mach-omap2/board-4430sdp.c * * Author: Santosh Shilimkar * * Based on mach-omap2/board-3430sdp.c * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "common.h" #include "soc.h" #include "mmc.h" #include "hsmmc.h" #include "control.h" #include "mux.h" #include "common-board-devices.h" #include "dss-common.h" #define GPIO_HUB_POWER 1 #define GPIO_HUB_NRESET 62 #define GPIO_WIFI_PMENA 43 #define GPIO_WIFI_IRQ 53 /* wl127x BT, FM, GPS connectivity chip */ static struct ti_st_plat_data wilink_platform_data = { .nshutdown_gpio = 46, .dev_name = "/dev/ttyO1", .flow_cntrl = 1, .baud_rate = 3000000, .chip_enable = NULL, .suspend = NULL, .resume = NULL, }; static struct platform_device wl1271_device = { .name = "kim", .id = -1, .dev = { .platform_data = &wilink_platform_data, }, }; static struct gpio_led gpio_leds[] = { { .name = "pandaboard::status1", .default_trigger = "heartbeat", .gpio = 7, }, { .name = "pandaboard::status2", .default_trigger = "mmc0", .gpio = 8, }, }; static struct gpio_led_platform_data gpio_led_info = { .leds = gpio_leds, .num_leds = ARRAY_SIZE(gpio_leds), }; static struct platform_device leds_gpio = { .name = "leds-gpio", .id = -1, .dev = { .platform_data = &gpio_led_info, }, }; static struct omap_abe_twl6040_data panda_abe_audio_data = { /* Audio out */ .has_hs = ABE_TWL6040_LEFT | ABE_TWL6040_RIGHT, /* HandsFree through expansion connector */ .has_hf = ABE_TWL6040_LEFT | ABE_TWL6040_RIGHT, /* PandaBoard: FM TX, PandaBoardES: can be connected to audio out */ .has_aux = ABE_TWL6040_LEFT | ABE_TWL6040_RIGHT, /* PandaBoard: FM RX, PandaBoardES: audio in */ .has_afm = ABE_TWL6040_LEFT | ABE_TWL6040_RIGHT, /* No jack detection. */ .jack_detection = 0, /* MCLK input is 38.4MHz */ .mclk_freq = 38400000, }; static struct platform_device panda_abe_audio = { .name = "omap-abe-twl6040", .id = -1, .dev = { .platform_data = &panda_abe_audio_data, }, }; static struct platform_device panda_hdmi_audio_codec = { .name = "hdmi-audio-codec", .id = -1, }; static struct platform_device btwilink_device = { .name = "btwilink", .id = -1, }; static struct platform_device *panda_devices[] __initdata = { &leds_gpio, &wl1271_device, &panda_abe_audio, &panda_hdmi_audio_codec, &btwilink_device, }; static const struct usbhs_omap_board_data usbhs_bdata __initconst = { .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, .port_mode[1] = OMAP_USBHS_PORT_MODE_UNUSED, .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED, .phy_reset = false, .reset_gpio_port[0] = -EINVAL, .reset_gpio_port[1] = -EINVAL, .reset_gpio_port[2] = -EINVAL }; static struct gpio panda_ehci_gpios[] __initdata = { { GPIO_HUB_POWER, GPIOF_OUT_INIT_LOW, "hub_power" }, { GPIO_HUB_NRESET, GPIOF_OUT_INIT_LOW, "hub_nreset" }, }; static void __init omap4_ehci_init(void) { int ret; struct clk *phy_ref_clk; /* FREF_CLK3 provides the 19.2 MHz reference clock to the PHY */ phy_ref_clk = clk_get(NULL, "auxclk3_ck"); if (IS_ERR(phy_ref_clk)) { pr_err("Cannot request auxclk3\n"); return; } clk_set_rate(phy_ref_clk, 19200000); clk_prepare_enable(phy_ref_clk); /* disable the power to the usb hub prior to init and reset phy+hub */ ret = gpio_request_array(panda_ehci_gpios, ARRAY_SIZE(panda_ehci_gpios)); if (ret) { pr_err("Unable to initialize EHCI power/reset\n"); return; } gpio_export(GPIO_HUB_POWER, 0); gpio_export(GPIO_HUB_NRESET, 0); gpio_set_value(GPIO_HUB_NRESET, 1); usbhs_init(&usbhs_bdata); /* enable power to hub */ gpio_set_value(GPIO_HUB_POWER, 1); } static struct omap_musb_board_data musb_board_data = { .interface_type = MUSB_INTERFACE_UTMI, .mode = MUSB_OTG, .power = 100, }; static struct omap2_hsmmc_info mmc[] = { { .mmc = 1, .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA, .gpio_wp = -EINVAL, .gpio_cd = -EINVAL, }, { .name = "wl1271", .mmc = 5, .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_POWER_OFF_CARD, .gpio_wp = -EINVAL, .gpio_cd = -EINVAL, .ocr_mask = MMC_VDD_165_195, .nonremovable = true, }, {} /* Terminator */ }; static struct regulator_consumer_supply omap4_panda_vmmc5_supply[] = { REGULATOR_SUPPLY("vmmc", "omap_hsmmc.4"), }; static struct regulator_init_data panda_vmmc5 = { .constraints = { .valid_ops_mask = REGULATOR_CHANGE_STATUS, }, .num_consumer_supplies = ARRAY_SIZE(omap4_panda_vmmc5_supply), .consumer_supplies = omap4_panda_vmmc5_supply, }; static struct fixed_voltage_config panda_vwlan = { .supply_name = "vwl1271", .microvolts = 1800000, /* 1.8V */ .gpio = GPIO_WIFI_PMENA, .startup_delay = 70000, /* 70msec */ .enable_high = 1, .enabled_at_boot = 0, .init_data = &panda_vmmc5, }; static struct platform_device omap_vwlan_device = { .name = "reg-fixed-voltage", .id = 1, .dev = { .platform_data = &panda_vwlan, }, }; static struct wl12xx_platform_data omap_panda_wlan_data __initdata = { .board_ref_clock = WL12XX_REFCLOCK_38, /* 38.4 MHz */ }; static struct twl6040_codec_data twl6040_codec = { /* single-step ramp for headset and handsfree */ .hs_left_step = 0x0f, .hs_right_step = 0x0f, .hf_left_step = 0x1d, .hf_right_step = 0x1d, }; static struct twl6040_platform_data twl6040_data = { .codec = &twl6040_codec, .audpwron_gpio = 127, }; static struct i2c_board_info __initdata panda_i2c_1_boardinfo[] = { { I2C_BOARD_INFO("twl6040", 0x4b), .irq = 119 + OMAP44XX_IRQ_GIC_START, .platform_data = &twl6040_data, }, }; /* Panda board uses the common PMIC configuration */ static struct twl4030_platform_data omap4_panda_twldata; /* * Display monitor features are burnt in their EEPROM as EDID data. The EEPROM * is connected as I2C slave device, and can be accessed at address 0x50 */ static struct i2c_board_info __initdata panda_i2c_eeprom[] = { { I2C_BOARD_INFO("eeprom", 0x50), }, }; static int __init omap4_panda_i2c_init(void) { omap4_pmic_get_config(&omap4_panda_twldata, TWL_COMMON_PDATA_USB, TWL_COMMON_REGULATOR_VDAC | TWL_COMMON_REGULATOR_VAUX2 | TWL_COMMON_REGULATOR_VAUX3 | TWL_COMMON_REGULATOR_VMMC | TWL_COMMON_REGULATOR_VPP | TWL_COMMON_REGULATOR_VANA | TWL_COMMON_REGULATOR_VCXIO | TWL_COMMON_REGULATOR_VUSB | TWL_COMMON_REGULATOR_CLK32KG | TWL_COMMON_REGULATOR_V1V8 | TWL_COMMON_REGULATOR_V2V1); omap4_pmic_init("twl6030", &omap4_panda_twldata, panda_i2c_1_boardinfo, ARRAY_SIZE(panda_i2c_1_boardinfo)); omap_register_i2c_bus(2, 400, NULL, 0); /* * Bus 3 is attached to the DVI port where devices like the pico DLP * projector don't work reliably with 400kHz */ omap_register_i2c_bus(3, 100, panda_i2c_eeprom, ARRAY_SIZE(panda_i2c_eeprom));