diff options
author | Valentin Longchamp <valentin.longchamp@epfl.ch> | 2010-01-20 13:43:23 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-03-02 17:53:05 -0500 |
commit | 2f0e40aba1cafe3a834bfcbac8f1e704d496dab9 (patch) | |
tree | a59d03a1311fb20bef9950962f5e8f6c61ef97fe /drivers/usb/host/ehci-mxc.c | |
parent | cabe6cc2be287d0020d70944e8d0d0304e484a6c (diff) |
USB: fix occasional ULPI timeouts with ehci-mxc
On various mxc boards, the intial ULPI reads resulted in a timeout
which prevented the transceiver to be identified and thus the ehci
device to be probed.
Initializing the hardware lines connected to the transceiver (through
pdata->init call) before actually enabling clocks and configuring
registers in the devices fixes this problem.
Signed-off-by: Valentin Longchamp <valentin.longchamp@epfl.ch>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/host/ehci-mxc.c')
-rw-r--r-- | drivers/usb/host/ehci-mxc.c | 23 |
1 files changed, 11 insertions, 12 deletions
diff --git a/drivers/usb/host/ehci-mxc.c b/drivers/usb/host/ehci-mxc.c index 35c56f40bdbb..23cd917088b4 100644 --- a/drivers/usb/host/ehci-mxc.c +++ b/drivers/usb/host/ehci-mxc.c | |||
@@ -162,6 +162,17 @@ static int ehci_mxc_drv_probe(struct platform_device *pdev) | |||
162 | goto err_ioremap; | 162 | goto err_ioremap; |
163 | } | 163 | } |
164 | 164 | ||
165 | /* call platform specific init function */ | ||
166 | if (pdata->init) { | ||
167 | ret = pdata->init(pdev); | ||
168 | if (ret) { | ||
169 | dev_err(dev, "platform init failed\n"); | ||
170 | goto err_init; | ||
171 | } | ||
172 | /* platforms need some time to settle changed IO settings */ | ||
173 | mdelay(10); | ||
174 | } | ||
175 | |||
165 | /* enable clocks */ | 176 | /* enable clocks */ |
166 | priv->usbclk = clk_get(dev, "usb"); | 177 | priv->usbclk = clk_get(dev, "usb"); |
167 | if (IS_ERR(priv->usbclk)) { | 178 | if (IS_ERR(priv->usbclk)) { |
@@ -192,18 +203,6 @@ static int ehci_mxc_drv_probe(struct platform_device *pdev) | |||
192 | if (ret < 0) | 203 | if (ret < 0) |
193 | goto err_init; | 204 | goto err_init; |
194 | 205 | ||
195 | /* call platform specific init function */ | ||
196 | if (pdata->init) { | ||
197 | ret = pdata->init(pdev); | ||
198 | if (ret) { | ||
199 | dev_err(dev, "platform init failed\n"); | ||
200 | goto err_init; | ||
201 | } | ||
202 | } | ||
203 | |||
204 | /* most platforms need some time to settle changed IO settings */ | ||
205 | mdelay(10); | ||
206 | |||
207 | /* Initialize the transceiver */ | 206 | /* Initialize the transceiver */ |
208 | if (pdata->otg) { | 207 | if (pdata->otg) { |
209 | pdata->otg->io_priv = hcd->regs + ULPI_VIEWPORT_OFFSET; | 208 | pdata->otg->io_priv = hcd->regs + ULPI_VIEWPORT_OFFSET; |