summaryrefslogtreecommitdiff
path: root/drivers/usb/host/xhci-exynos5.c
diff options
context:
space:
mode:
authorJulius Werner <jwerner@chromium.org>2013-09-14 14:02:52 +0530
committerMarek Vasut <marex@denx.de>2013-10-20 23:42:38 +0200
commit4a271cb1b4ffdf33073c0dc8ee1e185c037275f4 (patch)
tree9e4cb7ba9e1464c094e65236b0a0e2920d89417e /drivers/usb/host/xhci-exynos5.c
parent8f999f0cbcd4802095d7f812871661a3e7f479d7 (diff)
downloadu-boot-imx-4a271cb1b4ffdf33073c0dc8ee1e185c037275f4.zip
u-boot-imx-4a271cb1b4ffdf33073c0dc8ee1e185c037275f4.tar.gz
u-boot-imx-4a271cb1b4ffdf33073c0dc8ee1e185c037275f4.tar.bz2
exynos: usb: Switch USB VBUS GPIOs to be device tree configured
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>
Diffstat (limited to 'drivers/usb/host/xhci-exynos5.c')
-rw-r--r--drivers/usb/host/xhci-exynos5.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/usb/host/xhci-exynos5.c b/drivers/usb/host/xhci-exynos5.c
index eb0ef6c..1146d10 100644
--- a/drivers/usb/host/xhci-exynos5.c
+++ b/drivers/usb/host/xhci-exynos5.c
@@ -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");