Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 364343
b: refs/heads/master
c: 87425ad
h: refs/heads/master
i:
  364341: 8e36436
  364339: 5731f37
  364335: 86c871f
v: v3
  • Loading branch information
Roger Quadros authored and Greg Kroah-Hartman committed Mar 15, 2013
1 parent 0c1d023 commit ce824d8
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 63 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: dcd64063fd917b5c79f99cae218e1df3ed1b62a2
refs/heads/master: 87425ad36330e4ee2806f19c7d14524c43a02210
72 changes: 10 additions & 62 deletions trunk/drivers/usb/host/ehci-omap.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit ce824d8

Please sign in to comment.