Hi Sebastian, On 08/16/2013 08:04 PM, Sebastian Andrzej Siewior wrote: > This is based on George Cherian's patch which added power & wakeup > support to am335x and does no longer apply since I took some if the code > apart in favor of the multi instance support. > This compiles and I boots and later it detects a device after I plug it in :) > Could somebody please test it so it does what it should? > > Cc: George Cherian <george.cherian@xxxxxx> > Cc: Roger Quadros <rogerq@xxxxxx> > Signed-off-by: Sebastian Andrzej Siewior <bigeasy@xxxxxxxxxxxxx> > --- > drivers/usb/phy/phy-am335x-control.c | 42 ++++++++++++++++++++++++++++++++++++ > drivers/usb/phy/phy-am335x.c | 35 ++++++++++++++++++++++++++++++ > 2 files changed, 77 insertions(+) > > diff --git a/drivers/usb/phy/phy-am335x-control.c b/drivers/usb/phy/phy-am335x-control.c > index 22cf07d..0fac976 100644 > --- a/drivers/usb/phy/phy-am335x-control.c > +++ b/drivers/usb/phy/phy-am335x-control.c > @@ -26,6 +26,41 @@ struct am335x_control_usb { > #define USBPHY_OTGVDET_EN (1 << 19) > #define USBPHY_OTGSESSEND_EN (1 << 20) > > +#define AM335X_PHY0_WK_EN (1 << 0) > +#define AM335X_PHY1_WK_EN (1 << 8) > + > +static void am335x_phy_wkup(struct phy_control *phy_ctrl, u32 id, bool on) > +{ > + struct am335x_control_usb *usb_ctrl; > + u32 val; > + u32 reg; > + > + usb_ctrl = container_of(phy_ctrl, struct am335x_control_usb, phy_ctrl); > + > + switch (id) { > + case 0: > + reg = AM335X_PHY0_WK_EN; > + break; > + case 1: > + reg = AM335X_PHY1_WK_EN; > + break; > + default: > + WARN_ON(1); > + return; > + } > + > + spin_lock(&usb_ctrl->lock); > + val = readl(usb_ctrl->wkup); > + > + if (on) > + val |= reg; > + else > + val &= ~reg; > + > + writel(val, usb_ctrl->wkup); > + spin_unlock(&usb_ctrl->lock); > +} > + > static void am335x_phy_power(struct phy_control *phy_ctrl, u32 id, bool on) > { > struct am335x_control_usb *usb_ctrl; > @@ -59,6 +94,7 @@ static void am335x_phy_power(struct phy_control *phy_ctrl, u32 id, bool on) > > static const struct phy_control ctrl_am335x = { > .phy_power = am335x_phy_power, > + .phy_wkup = am335x_phy_wkup, > }; > > static const struct of_device_id omap_control_usb_id_table[] = { > @@ -117,6 +153,12 @@ static int am335x_control_usb_probe(struct platform_device *pdev) > ctrl_usb->phy_reg = devm_ioremap_resource(&pdev->dev, res); > if (IS_ERR(ctrl_usb->phy_reg)) > return PTR_ERR(ctrl_usb->phy_reg); > + > + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "wakeup"); > + ctrl_usb->wkup = devm_ioremap_resource(&pdev->dev, res); > + if (IS_ERR(ctrl_usb->wkup)) > + return PTR_ERR(ctrl_usb->wkup); > + > spin_lock_init(&ctrl_usb->lock); > ctrl_usb->phy_ctrl = *phy_ctrl; > > diff --git a/drivers/usb/phy/phy-am335x.c b/drivers/usb/phy/phy-am335x.c > index c4d614d..1d0cd96 100644 > --- a/drivers/usb/phy/phy-am335x.c > +++ b/drivers/usb/phy/phy-am335x.c > @@ -79,6 +79,40 @@ static int am335x_phy_remove(struct platform_device *pdev) > return 0; > } > > +#ifdef CONFIG_PM_RUNTIME > + > +static int am335x_phy_runtime_suspend(struct device *dev) > +{ > + struct platform_device *pdev = to_platform_device(dev); > + struct am335x_phy *am_phy = platform_get_drvdata(pdev); > + > + phy_ctrl_power(am_phy->phy_ctrl, am_phy->id, false); > + if (device_may_wakeup(dev)) > + phy_ctrl_wkup(am_phy->phy_ctrl, am_phy->id, true); Is it OK to configure the wakeup after the PHY is powered down? Maybe it is OK, but just doesn't sound logical ;). > + return 0; > +} ... cheers, -roger -- 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