Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 364342
b: refs/heads/master
c: dcd6406
h: refs/heads/master
v: v3
  • Loading branch information
Roger Quadros authored and Greg Kroah-Hartman committed Mar 15, 2013
1 parent 8e36436 commit 0c1d023
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 15 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: 18c2bb1b8c1571f4c1fa33cc1f4525b282059455
refs/heads/master: dcd64063fd917b5c79f99cae218e1df3ed1b62a2
76 changes: 62 additions & 14 deletions trunk/drivers/usb/host/ehci-omap.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@
* Bus Glue for the EHCI controllers in OMAP3/4
* Tested on several OMAP3 boards, and OMAP4 Pandaboard
*
* Copyright (C) 2007-2011 Texas Instruments, Inc.
* Copyright (C) 2007-2013 Texas Instruments, Inc.
* Author: Vikram Pandita <vikram.pandita@ti.com>
* Author: Anand Gadiyar <gadiyar@ti.com>
* Author: Keshava Munegowda <keshava_mgowda@ti.com>
* Author: Roger Quadros <rogerq@ti.com>
*
* Copyright (C) 2009 Nokia Corporation
* Contact: Felipe Balbi <felipe.balbi@nokia.com>
Expand Down Expand Up @@ -70,6 +71,10 @@ static const char hcd_name[] = "ehci-omap";

/*-------------------------------------------------------------------------*/

struct omap_hcd {
struct usb_phy *phy[OMAP3_HS_USB_PORTS]; /* one PHY for each port */
int nports;
};

static inline void ehci_write(void __iomem *base, u32 reg, u32 val)
{
Expand Down Expand Up @@ -178,7 +183,8 @@ static void disable_put_regulator(
static struct hc_driver __read_mostly ehci_omap_hc_driver;

static const struct ehci_driver_overrides ehci_omap_overrides __initdata = {
.reset = omap_ehci_init,
.reset = omap_ehci_init,
.extra_priv_size = sizeof(struct omap_hcd),
};

/**
Expand All @@ -190,15 +196,16 @@ static const struct ehci_driver_overrides ehci_omap_overrides __initdata = {
*/
static int ehci_hcd_omap_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct usbhs_omap_platform_data *pdata = dev->platform_data;
struct resource *res;
struct usb_hcd *hcd;
void __iomem *regs;
int ret = -ENODEV;
int irq;
int i;
char supply[7];
struct device *dev = &pdev->dev;
struct usbhs_omap_platform_data *pdata = dev->platform_data;
struct resource *res;
struct usb_hcd *hcd;
void __iomem *regs;
int ret = -ENODEV;
int irq;
int i;
char supply[7];
struct omap_hcd *omap;

if (usb_disabled())
return -ENODEV;
Expand Down Expand Up @@ -231,6 +238,33 @@ static int ehci_hcd_omap_probe(struct platform_device *pdev)
hcd->rsrc_len = resource_size(res);
hcd->regs = regs;

omap = (struct omap_hcd *)hcd_to_ehci(hcd)->priv;
omap->nports = pdata->nports;

platform_set_drvdata(pdev, hcd);

/* get the PHY devices if needed */
for (i = 0 ; i < omap->nports ; i++) {
struct usb_phy *phy;

if (pdata->port_mode[i] != OMAP_EHCI_PORT_MODE_PHY)
continue;

/* get the PHY device */
phy = devm_usb_get_phy_dev(dev, i);
if (IS_ERR(phy) || !phy) {
ret = IS_ERR(phy) ? PTR_ERR(phy) : -ENODEV;
dev_err(dev, "Can't get PHY device for port %d: %d\n",
i, ret);
goto err_phy;
}

omap->phy[i] = phy;
usb_phy_init(omap->phy[i]);
/* bring PHY out of suspend */
usb_phy_set_suspend(omap->phy[i], 0);
}

/* get ehci regulator and enable */
for (i = 0 ; i < OMAP3_HS_USB_PORTS ; i++) {
if (pdata->port_mode[i] != OMAP_EHCI_PORT_MODE_PHY) {
Expand Down Expand Up @@ -275,6 +309,13 @@ static int ehci_hcd_omap_probe(struct platform_device *pdev)
err_pm_runtime:
disable_put_regulator(pdata);
pm_runtime_put_sync(dev);

err_phy:
for (i = 0; i < omap->nports; i++) {
if (omap->phy[i])
usb_phy_shutdown(omap->phy[i]);
}

usb_put_hcd(hcd);

return ret;
Expand All @@ -291,13 +332,20 @@ static int ehci_hcd_omap_probe(struct platform_device *pdev)
*/
static int ehci_hcd_omap_remove(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct usb_hcd *hcd = dev_get_drvdata(dev);
struct device *dev = &pdev->dev;
struct usb_hcd *hcd = dev_get_drvdata(dev);
struct omap_hcd *omap = (struct omap_hcd *)hcd_to_ehci(hcd)->priv;
int i;

usb_remove_hcd(hcd);
disable_put_regulator(dev->platform_data);
usb_put_hcd(hcd);

for (i = 0; i < omap->nports; i++) {
if (omap->phy[i])
usb_phy_shutdown(omap->phy[i]);
}

usb_put_hcd(hcd);
pm_runtime_put_sync(dev);
pm_runtime_disable(dev);

Expand Down

0 comments on commit 0c1d023

Please sign in to comment.