exynos: usb: Switch USB VBUS GPIOs to be device tree configured
authorJulius Werner <jwerner@chromium.org>
Sat, 14 Sep 2013 08:32:52 +0000 (14:02 +0530)
committerMarek Vasut <marex@denx.de>
Sun, 20 Oct 2013 21:42:38 +0000 (23:42 +0200)
Some Exynos boards, such as the SMDK5250, control USB port power through
a GPIO pin. For now this had been hardcoded in the exynos5-dt board
file, but not all boards use the same pin, requiring local changes to
support different boards.

This patch moves the GPIO initialization into the USB host controller
drivers which they belong to, and uses the samsung,vbus-gpio parameter
in the device tree to configure it.

Signed-off-by: Julius Werner <jwerner@chromium.org>
Signed-off-by: Vivek Gautam <gautam.vivek@samsung.com>
Cc: Simon Glass <sjg@chromium.org>
Cc: Minkyu Kang <mk7.kang@samsung.com>
Cc: Marek Vasut <marex@denx.de>
board/samsung/smdk5250/exynos5-dt.c
drivers/usb/host/ehci-exynos.c
drivers/usb/host/xhci-exynos5.c

index bb4a82f4490076fbd756f694dd3bb7fc56343b3a..6bcc883b100c5212ee40e932eb0d656fd0dec718 100644 (file)
@@ -61,22 +61,6 @@ struct local_info {
 
 static struct local_info local;
 
-#ifdef CONFIG_USB_EHCI_EXYNOS
-int board_usb_vbus_init(void)
-{
-       struct exynos5_gpio_part1 *gpio1 = (struct exynos5_gpio_part1 *)
-                                               samsung_get_base_gpio_part1();
-
-       /* Enable VBUS power switch */
-       s5p_gpio_direction_output(&gpio1->x2, 6, 1);
-
-       /* VBUS turn ON time */
-       mdelay(3);
-
-       return 0;
-}
-#endif
-
 #ifdef CONFIG_SOUND_MAX98095
 static void  board_enable_audio_codec(void)
 {
@@ -122,9 +106,6 @@ int board_init(void)
        if (board_init_cros_ec_devices(gd->fdt_blob))
                return -1;
 
-#ifdef CONFIG_USB_EHCI_EXYNOS
-       board_usb_vbus_init();
-#endif
 #ifdef CONFIG_SOUND_MAX98095
        board_enable_audio_codec();
 #endif
index 155677e0d948f642313899c35804621b18fc49ac..15926c43365f3d0a7f9e4da2eecef959c253a82f 100644 (file)
@@ -16,6 +16,7 @@
 #include <asm/arch/ehci.h>
 #include <asm/arch/system.h>
 #include <asm/arch/power.h>
+#include <asm/gpio.h>
 #include <asm-generic/errno.h>
 #include <linux/compat.h>
 #include "ehci.h"
@@ -30,6 +31,7 @@ DECLARE_GLOBAL_DATA_PTR;
 struct exynos_ehci {
        struct exynos_usb_phy *usb;
        struct ehci_hccr *hcd;
+       struct fdt_gpio_state vbus_gpio;
 };
 
 static struct exynos_ehci exynos;
@@ -58,6 +60,9 @@ static int exynos_usb_parse_dt(const void *blob, struct exynos_ehci *exynos)
 
        exynos->hcd = (struct ehci_hccr *)addr;
 
+       /* Vbus gpio */
+       fdtdec_decode_gpio(blob, node, "samsung,vbus-gpio", &exynos->vbus_gpio);
+
        depth = 0;
        node = fdtdec_next_compatible_subnode(blob, node,
                                        COMPAT_SAMSUNG_EXYNOS_USB_PHY, &depth);
@@ -150,6 +155,12 @@ int ehci_hcd_init(int index, struct ehci_hccr **hccr, struct ehci_hcor **hcor)
        ctx->hcd = (struct ehci_hccr *)samsung_get_base_usb_ehci();
 #endif
 
+#ifdef CONFIG_OF_CONTROL
+       /* setup the Vbus gpio here */
+       if (!fdtdec_setup_gpio(&ctx->vbus_gpio))
+               gpio_direction_output(ctx->vbus_gpio.gpio, 1);
+#endif
+
        setup_usb_phy(ctx->usb);
 
        *hccr = ctx->hcd;
index eb0ef6c57d23ba35289fef903ad9a317ac8005d0..1146d101de40901d5789c342c3716a2f2a1b7aaf 100644 (file)
@@ -22,6 +22,7 @@
 #include <asm/arch/cpu.h>
 #include <asm/arch/power.h>
 #include <asm/arch/xhci-exynos.h>
+#include <asm/gpio.h>
 #include <asm-generic/errno.h>
 #include <linux/compat.h>
 #include <linux/usb/dwc3.h>
@@ -39,6 +40,7 @@ struct exynos_xhci {
        struct exynos_usb3_phy *usb3_phy;
        struct xhci_hccr *hcd;
        struct dwc3 *dwc3_reg;
+       struct fdt_gpio_state vbus_gpio;
 };
 
 static struct exynos_xhci exynos;
@@ -66,6 +68,9 @@ static int exynos_usb3_parse_dt(const void *blob, struct exynos_xhci *exynos)
        }
        exynos->hcd = (struct xhci_hccr *)addr;
 
+       /* Vbus gpio */
+       fdtdec_decode_gpio(blob, node, "samsung,vbus-gpio", &exynos->vbus_gpio);
+
        depth = 0;
        node = fdtdec_next_compatible_subnode(blob, node,
                                COMPAT_SAMSUNG_EXYNOS5_USB3_PHY, &depth);
@@ -291,6 +296,12 @@ int xhci_hcd_init(int index, struct xhci_hccr **hccr, struct xhci_hcor **hcor)
 
        ctx->dwc3_reg = (struct dwc3 *)((char *)(ctx->hcd) + DWC3_REG_OFFSET);
 
+#ifdef CONFIG_OF_CONTROL
+       /* setup the Vbus gpio here */
+       if (!fdtdec_setup_gpio(&ctx->vbus_gpio))
+               gpio_direction_output(ctx->vbus_gpio.gpio, 1);
+#endif
+
        ret = exynos_xhci_core_init(ctx);
        if (ret) {
                puts("XHCI: failed to initialize controller\n");