From 9e49bf5c8cec5cd71e3d256229d638703e1eced9 Mon Sep 17 00:00:00 2001 From: Ye Li Date: Thu, 16 Mar 2017 17:00:59 +0800 Subject: [PATCH] MLK-14445-5 ehci-mx6: Add OTG ID detecting by GPIO The i.MX7ulp EVK board uses GPIO to detect ID for USB OTG0, but when using DM USB driver, it is hard coded to use OTG ID pin. Add a board override function that when extcon property is provided, the function can check the GPIO to get ID. Signed-off-by: Ye Li (cherry picked from commit 8382781a59fbae1d8ab797d64761136277e291d1) (cherry picked from commit 2afd266e19b78952d5ea402b7457a47210b7670d) --- drivers/usb/host/ehci-mx6.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/drivers/usb/host/ehci-mx6.c b/drivers/usb/host/ehci-mx6.c index 0fef2276ee..bb0d5313a1 100644 --- a/drivers/usb/host/ehci-mx6.c +++ b/drivers/usb/host/ehci-mx6.c @@ -485,6 +485,25 @@ static const struct ehci_ops mx6_ehci_ops = { .init_after_reset = mx6_init_after_reset }; +/** + * board_ehci_usb_phy_mode - override usb phy mode + * @port: usb host/otg port + * + * Target board specific, override usb_phy_mode. + * When usb-otg is used as usb host port, iomux pad usb_otg_id can be + * left disconnected in this case usb_phy_mode will not be able to identify + * the phy mode that usb port is used. + * Machine file overrides board_usb_phy_mode. + * When the extcon property is set in DTB, machine must provide this function, otherwise + * it will default return HOST. + * + * Return: USB_INIT_DEVICE or USB_INIT_HOST + */ +int __weak board_ehci_usb_phy_mode(struct udevice *dev) +{ + return USB_INIT_HOST; +} + static int ehci_usb_phy_mode(struct udevice *dev) { struct usb_platdata *plat = dev_get_platdata(dev); @@ -537,6 +556,7 @@ static int ehci_usb_ofdata_to_platdata(struct udevice *dev) { struct usb_platdata *plat = dev_get_platdata(dev); const char *mode; + const struct fdt_property *extcon; mode = fdt_getprop(gd->fdt_blob, dev_of_offset(dev), "dr_mode", NULL); if (mode) { @@ -550,6 +570,13 @@ static int ehci_usb_ofdata_to_platdata(struct udevice *dev) return -EINVAL; return 0; + } else { + extcon = fdt_get_property(gd->fdt_blob, dev_of_offset(dev), + "extcon", NULL); + if (extcon) { + plat->init_type = board_ehci_usb_phy_mode(dev); + return 0; + } } return ehci_usb_phy_mode(dev); -- 2.17.1