]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - arch/arm/mach-omap2/board-omap4panda.c
Merge branch 'control_mcbsp_fix_2.6.37' of git://git.pwsan.com/linux-2.6 into omap...
[mv-sheeva.git] / arch / arm / mach-omap2 / board-omap4panda.c
index 992a03e248c5bb04ab3646e12f74fddb133b0698..a9d8a19ada7e6ad6355cab1455d4c95b481fb61a 100644 (file)
@@ -41,6 +41,9 @@
 #include "hsmmc.h"
 #include "control.h"
 
+#define GPIO_HUB_POWER         1
+#define GPIO_HUB_NRESET                62
+
 static struct gpio_led gpio_leds[] = {
        {
                .name                   = "pandaboard::status1",
@@ -78,6 +81,56 @@ static void __init omap4_panda_init_irq(void)
        omap_gpio_init();
 }
 
+static const struct ehci_hcd_omap_platform_data ehci_pdata __initconst = {
+       .port_mode[0] = EHCI_HCD_OMAP_MODE_PHY,
+       .port_mode[1] = EHCI_HCD_OMAP_MODE_UNKNOWN,
+       .port_mode[2] = EHCI_HCD_OMAP_MODE_UNKNOWN,
+       .phy_reset  = false,
+       .reset_gpio_port[0]  = -EINVAL,
+       .reset_gpio_port[1]  = -EINVAL,
+       .reset_gpio_port[2]  = -EINVAL
+};
+
+static void __init omap4_ehci_init(void)
+{
+       int ret;
+
+
+       /* disable the power to the usb hub prior to init */
+       ret = gpio_request(GPIO_HUB_POWER, "hub_power");
+       if (ret) {
+               pr_err("Cannot request GPIO %d\n", GPIO_HUB_POWER);
+               goto error1;
+       }
+       gpio_export(GPIO_HUB_POWER, 0);
+       gpio_direction_output(GPIO_HUB_POWER, 0);
+       gpio_set_value(GPIO_HUB_POWER, 0);
+
+       /* reset phy+hub */
+       ret = gpio_request(GPIO_HUB_NRESET, "hub_nreset");
+       if (ret) {
+               pr_err("Cannot request GPIO %d\n", GPIO_HUB_NRESET);
+               goto error2;
+       }
+       gpio_export(GPIO_HUB_NRESET, 0);
+       gpio_direction_output(GPIO_HUB_NRESET, 0);
+       gpio_set_value(GPIO_HUB_NRESET, 0);
+       gpio_set_value(GPIO_HUB_NRESET, 1);
+
+       usb_ehci_init(&ehci_pdata);
+
+       /* enable power to hub */
+       gpio_set_value(GPIO_HUB_POWER, 1);
+       return;
+
+error2:
+       gpio_free(GPIO_HUB_POWER);
+error1:
+       pr_err("Unable to initialize EHCI power/reset\n");
+       return;
+
+}
+
 static struct omap_musb_board_data musb_board_data = {
        .interface_type         = MUSB_INTERFACE_UTMI,
        .mode                   = MUSB_PERIPHERAL,
@@ -98,10 +151,6 @@ static struct regulator_consumer_supply omap4_panda_vmmc_supply[] = {
                .supply = "vmmc",
                .dev_name = "mmci-omap-hs.0",
        },
-       {
-               .supply = "vmmc",
-               .dev_name = "mmci-omap-hs.1",
-       },
 };
 
 static int omap4_twl6030_hsmmc_late_init(struct device *dev)
@@ -120,7 +169,14 @@ static int omap4_twl6030_hsmmc_late_init(struct device *dev)
 
 static __init void omap4_twl6030_hsmmc_set_late_init(struct device *dev)
 {
-       struct omap_mmc_platform_data *pdata = dev->platform_data;
+       struct omap_mmc_platform_data *pdata;
+
+       /* dev can be null if CONFIG_MMC_OMAP_HS is not set */
+       if (!dev) {
+               pr_err("Failed omap4_twl6030_hsmmc_set_late_init\n");
+               return;
+       }
+       pdata = dev->platform_data;
 
        pdata->init =   omap4_twl6030_hsmmc_late_init;
 }
@@ -187,7 +243,7 @@ static struct regulator_init_data omap4_panda_vmmc = {
                                        | REGULATOR_CHANGE_MODE
                                        | REGULATOR_CHANGE_STATUS,
        },
-       .num_consumer_supplies  = 2,
+       .num_consumer_supplies  = 1,
        .consumer_supplies      = omap4_panda_vmmc_supply,
 };
 
@@ -311,6 +367,7 @@ static void __init omap4_panda_init(void)
        omap4_twl6030_hsmmc_init(mmc);
        /* OMAP4 Panda uses internal transceiver so register nop transceiver */
        usb_nop_xceiv_register();
+       omap4_ehci_init();
        /* FIXME: allow multi-omap to boot until musb is updated for omap4 */
        if (!cpu_is_omap44xx())
                usb_musb_init(&musb_board_data);