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

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

 



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




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

  Powered by Linux