aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGirish K S <ks.giri@samsung.com>2012-10-08 14:06:33 +0900
committerSteve Capper <steve.capper@linaro.org>2013-09-19 09:25:03 +0100
commitbf05db324eea1701ca233ca9f9b54883a7771a17 (patch)
tree4b230dfa8ee84aff215970cc9d18e7e540025491
parent570cd87d80d251a9f66e7769a8bc34aff2a2be2a (diff)
downloadlinux-for-ard/v3.12-arndale.tar.gz
usb: ehci-s5p: add the HSIC port initializationfor-ard/v3.12-arndale
The hub-reset and hub-connect pins should be pulled low before phy init and need to be pulled high after completion of phy init. Signed-off-by: Girish K S <ks.giri@samsung.com> Signed-off-by: Yuvaraj Kumar C D <yuvaraj.cd@samsung.com> Signed-off-by: Tushar Behera <tushar.behera@linaro.org>
-rw-r--r--drivers/usb/host/ehci-s5p.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/drivers/usb/host/ehci-s5p.c b/drivers/usb/host/ehci-s5p.c
index 7c3de95c705..ebcf93cdcb3 100644
--- a/drivers/usb/host/ehci-s5p.c
+++ b/drivers/usb/host/ehci-s5p.c
@@ -54,6 +54,25 @@ static struct s5p_ehci_platdata empty_platdata;
#define to_s5p_ehci(hcd) (struct s5p_ehci_hcd *)(hcd_to_ehci(hcd)->priv)
+static void s5p_setup_hub_gpio(struct platform_device *pdev, const char *propname, int level)
+{
+ int err;
+ int gpio;
+
+ if (!pdev->dev.of_node)
+ return;
+
+ gpio = of_get_named_gpio(pdev->dev.of_node, propname, 0);
+ if (!gpio_is_valid(gpio))
+ return;
+ err = gpio_request_one(gpio, level, "ehci_vbus_gpio");
+
+ if (err)
+ dev_err(&pdev->dev, "can't request ehci hub-reset gpio %d", gpio);
+ else
+ gpio_free(gpio);
+}
+
static void s5p_setup_vbus_gpio(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
@@ -165,11 +184,18 @@ skip_phy:
if (s5p_ehci->otg)
s5p_ehci->otg->set_host(s5p_ehci->otg, &hcd->self);
+ s5p_setup_hub_gpio(pdev, "hub-reset", GPIOF_OUT_INIT_LOW);
+ s5p_setup_hub_gpio(pdev, "hub-connect", GPIOF_OUT_INIT_LOW);
+
if (s5p_ehci->phy)
usb_phy_init(s5p_ehci->phy);
else if (s5p_ehci->pdata->phy_init)
s5p_ehci->pdata->phy_init(pdev, USB_PHY_TYPE_HOST);
+ mdelay(1);
+ s5p_setup_hub_gpio(pdev, "hub-reset", GPIOF_OUT_INIT_HIGH);
+ s5p_setup_hub_gpio(pdev, "hub-connect", GPIOF_OUT_INIT_HIGH);
+
ehci = hcd_to_ehci(hcd);
ehci->caps = hcd->regs;