On Wed, 27 Jun 2012, Keshava Munegowda wrote:

> Its observed that in Beagle XM , during suspend/resume the OMAP
> EHCI controller losing the register contents. this is causing the
> hub disconnect after the resume, this is causing failure of
> device detection after the resume.
> to avoid the hub disconnect , The ehci config flag register is
> configured again , reset the phy and issue the port powers during
> resume.

The idea is good, but the implementation is wrong.

> +static int omap_ehci_bus_resume(struct usb_hcd *hcd)
> +{
> +
> +     struct device                           *dev = hcd->self.controller;
> +     struct ehci_hcd_omap_platform_data      *pdata = dev->platform_data;
> +     struct resource                         *regs = hcd->regs;
> +
> +     /* In case , ports are not powered and config flag not set */
> +     if (~(ehci_read(regs, EHCI_CONFIGFLAG) & 0x01)) {
> +             ehci_write(regs, EHCI_CONFIGFLAG, 0x1);
> +
> +             /*
> +              * An undocumented "feature" in the OMAP3 EHCI controller,
> +              * causes suspended ports to be taken out of suspend when
> +              * the USBCMD.Run/Stop bit is cleared (for example when
> +              * we do ehci_bus_suspend).
> +              * This breaks suspend-resume if the root-hub is allowed
> +              * to suspend. Writing 1 to this undocumented register bit
> +              * disables this feature and restores normal behavior.
> +              */
> +             ehci_write(regs, EHCI_INSNREG04,
> +                        EHCI_INSNREG04_DISABLE_UNSUSPEND);
> +
> +             /* Soft reset the PHY using PHY reset command over ULPI */
> +             if (pdata->port_mode[0] == OMAP_EHCI_PORT_MODE_PHY)
> +                     omap_ehci_soft_phy_reset(dev, 0);
> +             if (pdata->port_mode[1] == OMAP_EHCI_PORT_MODE_PHY)
> +                     omap_ehci_soft_phy_reset(dev, 1);
> +
> +             /* root ports should always stay powered */
> +             ehci_port_power(hcd_to_ehci(hcd), 1);
> +     }

This needs to be done in the resume routine, not the bus_resume 
routine.  Since ehci-omap doesn't have any suspend or resume routines, 
it's not surprising that the controller doesn't work correctly after 
the system is resumed.

In a couple of days I will submit a patch that will make it a lot
easier to add suspend and resume routines for EHCI platform drivers.  
Maybe you'd prefer to wait until then to fix this issue.

Alan Stern

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to