ARM: Tegra: Seaboard: Add USB devices
authorStephen Warren <swarren@nvidia.com>
Mon, 8 Aug 2011 20:35:15 +0000 (14:35 -0600)
committerOlof Johansson <olof@lixom.net>
Tue, 9 Aug 2011 19:07:33 +0000 (12:07 -0700)
Seaboard has a couple of external USB ports. Add the platform devices and
GPIO infra-structure to enable these.

I tested both ports with a mouse on Seaboard non-clamshell.

This change is extracted from code in the ChromeOS 2.6.38 kernel.

Signed-off-by: Stephen Warren <swarren@nvidia.com>
Signed-off-by: Olof Johansson <olof@lixom.net>
arch/arm/mach-tegra/board-seaboard-pinmux.c
arch/arm/mach-tegra/board-seaboard.c

index 78797507e301ff12b325b3b9dbec8dceb93d12a3..74f78b7e3f19cdf7c943ba7a843cea492b82fa84 100644 (file)
@@ -168,6 +168,7 @@ static struct tegra_gpio_table gpio_table[] = {
        { .gpio = TEGRA_GPIO_POWERKEY,          .enable = true },
        { .gpio = TEGRA_GPIO_ISL29018_IRQ,      .enable = true },
        { .gpio = TEGRA_GPIO_CDC_IRQ,           .enable = true },
+       { .gpio = TEGRA_GPIO_USB1,              .enable = true },
 };
 
 void __init seaboard_pinmux_init(void)
index 07cd8e4885c952476791f0c94a7903ffbc1c3fc1..237a94a1f44a86df088ec46663af119f79da18f9 100644 (file)
@@ -69,6 +69,8 @@ static __initdata struct tegra_clk_init_table seaboard_clk_init_table[] = {
        { "pll_a_out0", "pll_a",        11289600,       true },
        { "cdev1",      NULL,           0,              true },
        { "i2s1",       "pll_a_out0",   11289600,       false},
+       { "usbd",       "clk_m",        12000000,       true},
+       { "usb3",       "clk_m",        12000000,       true},
        { NULL,         NULL,           0,              0},
 };
 
@@ -182,6 +184,29 @@ static struct i2c_board_info __initdata wm8903_device = {
        .irq = TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_CDC_IRQ),
 };
 
+static int seaboard_ehci_init(void)
+{
+       int gpio_status;
+
+       gpio_status = gpio_request(TEGRA_GPIO_USB1, "VBUS_USB1");
+       if (gpio_status < 0) {
+               pr_err("VBUS_USB1 request GPIO FAILED\n");
+               WARN_ON(1);
+       }
+
+       gpio_status = gpio_direction_output(TEGRA_GPIO_USB1, 1);
+       if (gpio_status < 0) {
+               pr_err("VBUS_USB1 request GPIO DIRECTION FAILED\n");
+               WARN_ON(1);
+       }
+       gpio_set_value(TEGRA_GPIO_USB1, 1);
+
+       platform_device_register(&tegra_ehci1_device);
+       platform_device_register(&tegra_ehci3_device);
+
+       return 0;
+}
+
 static void __init seaboard_i2c_init(void)
 {
        gpio_request(TEGRA_GPIO_ISL29018_IRQ, "isl29018");
@@ -209,6 +234,8 @@ static void __init seaboard_common_init(void)
        tegra_sdhci_device4.dev.platform_data = &sdhci_pdata4;
 
        platform_add_devices(seaboard_devices, ARRAY_SIZE(seaboard_devices));
+
+       seaboard_ehci_init();
 }
 
 static void __init tegra_seaboard_init(void)