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 <[email protected]>
> Cc: Roger Quadros <[email protected]>
> Signed-off-by: Sebastian Andrzej Siewior <[email protected]>
> ---
>  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 [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to