On Wed, Dec 15, 2010 at 10:31:28PM -0200, Fabio Estevam wrote: > In order to read/write to the i.MX OTG viewport register it is necessary to setup > the PORTSCx register first. > > By default i.MX OTG port is configured for USB serial PHY. In order to use a ULPI PHY > the PORTSCx register needs to be configured properly. > > commit 724c852 (USB: ehci/mxc: compile fix) placed the PORTSC setup after the OTG > viewport is accessed and this causes ULPI read/write to fail. > > Revert the PORTSC setup order. > > Tested on a MX31PDK board with a ISP1504 transceiver: > > ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver > mxc-ehci mxc-ehci.0: initializing i.MX USB Controller > ULPI transceiver vendor/product ID 0x04cc/0x1504 > Found NXP ISP1504 ULPI transceiver. > ULPI integrity check: passed. > > Signed-off-by: Fabio Estevam <fabio.estevam@xxxxxxxxxxxxx> Tested this on my i.MX27/31/35 boards and on the babbage board in conjunction with Arnauds '[patch 1/5] ehci-mxc: Enable vbus later' patch, so: Tested-by: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> > --- > Changes since v3: > - Removed unused variables in ehci_mxc_setup > > Changes since v2: > - move portsc setup prior to mxc_initialize_usb_hw > > Changes since v1: > -removed second call to ehci = hcd_to_ehci(hcd); > > drivers/usb/host/ehci-mxc.c | 28 +++++++++++++++------------- > 1 files changed, 15 insertions(+), 13 deletions(-) > > diff --git a/drivers/usb/host/ehci-mxc.c b/drivers/usb/host/ehci-mxc.c > index bce8505..6c9c6d1 100644 > --- a/drivers/usb/host/ehci-mxc.c > +++ b/drivers/usb/host/ehci-mxc.c > @@ -36,14 +36,8 @@ struct ehci_mxc_priv { > static int ehci_mxc_setup(struct usb_hcd *hcd) > { > struct ehci_hcd *ehci = hcd_to_ehci(hcd); > - struct device *dev = hcd->self.controller; > - struct mxc_usbh_platform_data *pdata = dev_get_platdata(dev); > int retval; > > - /* EHCI registers start at offset 0x100 */ > - ehci->caps = hcd->regs + 0x100; > - ehci->regs = hcd->regs + 0x100 + > - HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase)); > dbg_hcs_params(ehci, "reset"); > dbg_hcc_params(ehci, "reset"); > > @@ -65,12 +59,6 @@ static int ehci_mxc_setup(struct usb_hcd *hcd) > > ehci_reset(ehci); > > - /* set up the PORTSCx register */ > - ehci_writel(ehci, pdata->portsc, &ehci->regs->port_status[0]); > - > - /* is this really needed? */ > - msleep(10); > - > ehci_port_power(ehci, 0); > return 0; > } > @@ -125,7 +113,8 @@ static int ehci_mxc_drv_probe(struct platform_device *pdev) > int irq, ret; > struct ehci_mxc_priv *priv; > struct device *dev = &pdev->dev; > - > + struct ehci_hcd *ehci; > + > dev_info(&pdev->dev, "initializing i.MX USB Controller\n"); > > if (!pdata) { > @@ -200,6 +189,19 @@ static int ehci_mxc_drv_probe(struct platform_device *pdev) > ret = mxc_initialize_usb_hw(pdev->id, pdata->flags); > if (ret < 0) > goto err_init; > + > + ehci = hcd_to_ehci(hcd); > + > + /* EHCI registers start at offset 0x100 */ > + ehci->caps = hcd->regs + 0x100; > + ehci->regs = hcd->regs + 0x100 + > + HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase)); > + > + /* set up the PORTSCx register */ > + ehci_writel(ehci, pdata->portsc, &ehci->regs->port_status[0]); > + > + /* is this really needed? */ > + msleep(10); > > /* Initialize the transceiver */ > if (pdata->otg) { > -- > 1.6.0.4 > > -- Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html