Re: [PATCH v2] usb: phy: am335x: add wakeup support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Sebastian,

On 08/19/2013 01:12 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>
> ---
> v1…v2:
> - first set the wakeup bit then poweroff the phy.
> 
>  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..0639061 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);
> +
> +	if (device_may_wakeup(dev))
> +		phy_ctrl_wkup(am_phy->phy_ctrl, am_phy->id, true);
> +	phy_ctrl_power(am_phy->phy_ctrl, am_phy->id, false);
> +	return 0;
> +}
> +
> +static int am335x_phy_runtime_resume(struct device *dev)
> +{
> +	struct platform_device	*pdev = to_platform_device(dev);
> +	struct am335x_phy	*am_phy = platform_get_drvdata(pdev);
> +
> +	if (device_may_wakeup(dev))
> +		phy_ctrl_wkup(am_phy->phy_ctrl, am_phy->id, false);
> +	phy_ctrl_power(am_phy->phy_ctrl, am_phy->id, true);

You should have kept the resume side as it was earlier.
i.e.
1) power up the phy.
2) configure the wakeup.

For any generic device, it must be powered before any setting is changed.

> +	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




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux