mirror of
https://github.com/torvalds/linux.git
synced 2024-11-18 10:01:43 +00:00
USB: ehci-omap: Remove PHY reset handling code
Reset GPIO handling for the PHY must be done in the PHY driver. We use the PHY helpers instead to reset the PHY. Signed-off-by: Roger Quadros <rogerq@ti.com> Acked-by: Felipe Balbi <balbi@ti.com> Acked-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
dcd64063fd
commit
87425ad363
@ -86,79 +86,27 @@ static inline u32 ehci_read(void __iomem *base, u32 reg)
|
||||
return __raw_readl(base + reg);
|
||||
}
|
||||
|
||||
|
||||
static void omap_ehci_soft_phy_reset(struct usb_hcd *hcd, u8 port)
|
||||
{
|
||||
unsigned long timeout = jiffies + msecs_to_jiffies(1000);
|
||||
unsigned reg = 0;
|
||||
|
||||
reg = ULPI_FUNC_CTRL_RESET
|
||||
/* FUNCTION_CTRL_SET register */
|
||||
| (ULPI_SET(ULPI_FUNC_CTRL) << EHCI_INSNREG05_ULPI_REGADD_SHIFT)
|
||||
/* Write */
|
||||
| (2 << EHCI_INSNREG05_ULPI_OPSEL_SHIFT)
|
||||
/* PORTn */
|
||||
| ((port + 1) << EHCI_INSNREG05_ULPI_PORTSEL_SHIFT)
|
||||
/* start ULPI access*/
|
||||
| (1 << EHCI_INSNREG05_ULPI_CONTROL_SHIFT);
|
||||
|
||||
ehci_write(hcd->regs, EHCI_INSNREG05_ULPI, reg);
|
||||
|
||||
/* Wait for ULPI access completion */
|
||||
while ((ehci_read(hcd->regs, EHCI_INSNREG05_ULPI)
|
||||
& (1 << EHCI_INSNREG05_ULPI_CONTROL_SHIFT))) {
|
||||
cpu_relax();
|
||||
|
||||
if (time_after(jiffies, timeout)) {
|
||||
dev_dbg(hcd->self.controller,
|
||||
"phy reset operation timed out\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int omap_ehci_init(struct usb_hcd *hcd)
|
||||
{
|
||||
struct ehci_hcd *ehci = hcd_to_ehci(hcd);
|
||||
int rc;
|
||||
struct usbhs_omap_platform_data *pdata;
|
||||
|
||||
pdata = hcd->self.controller->platform_data;
|
||||
struct ehci_hcd *ehci = hcd_to_ehci(hcd);
|
||||
struct omap_hcd *omap = (struct omap_hcd *)ehci->priv;
|
||||
int rc, i;
|
||||
|
||||
/* Hold PHYs in reset while initializing EHCI controller */
|
||||
if (pdata->phy_reset) {
|
||||
if (gpio_is_valid(pdata->reset_gpio_port[0]))
|
||||
gpio_set_value_cansleep(pdata->reset_gpio_port[0], 0);
|
||||
|
||||
if (gpio_is_valid(pdata->reset_gpio_port[1]))
|
||||
gpio_set_value_cansleep(pdata->reset_gpio_port[1], 0);
|
||||
|
||||
/* Hold the PHY in RESET for enough time till DIR is high */
|
||||
udelay(10);
|
||||
for (i = 0; i < omap->nports; i++) {
|
||||
if (omap->phy[i])
|
||||
usb_phy_shutdown(omap->phy[i]);
|
||||
}
|
||||
|
||||
/* 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(hcd, 0);
|
||||
if (pdata->port_mode[1] == OMAP_EHCI_PORT_MODE_PHY)
|
||||
omap_ehci_soft_phy_reset(hcd, 1);
|
||||
|
||||
/* we know this is the memory we want, no need to ioremap again */
|
||||
ehci->caps = hcd->regs;
|
||||
|
||||
rc = ehci_setup(hcd);
|
||||
|
||||
if (pdata->phy_reset) {
|
||||
/* Hold the PHY in RESET for enough time till
|
||||
* PHY is settled and ready
|
||||
*/
|
||||
udelay(10);
|
||||
|
||||
if (gpio_is_valid(pdata->reset_gpio_port[0]))
|
||||
gpio_set_value_cansleep(pdata->reset_gpio_port[0], 1);
|
||||
|
||||
if (gpio_is_valid(pdata->reset_gpio_port[1]))
|
||||
gpio_set_value_cansleep(pdata->reset_gpio_port[1], 1);
|
||||
/* Bring PHYs out of reset */
|
||||
for (i = 0; i < omap->nports; i++) {
|
||||
if (omap->phy[i])
|
||||
usb_phy_init(omap->phy[i]);
|
||||
}
|
||||
|
||||
return rc;
|
||||
|
Loading…
Reference in New Issue
Block a user