Hi,

On Wed, Jun 18, 2014 at 06:01:08PM +0100, Srinivas Kandagatla wrote:
> Use case is when the phy is configured in host mode and a usb device is
> attached to board before bootup. On bootup, with the existing code and
> runtime pm enabled, the driver would decrement the pm usage count
> without checking the current state of the phy. This pm usage count
> decrement would trigger the runtime pm which than would abort the
> usb enumeration which was in progress. In my case a usb stick gets
> detected and then immediatly the driver goes to low power mode which is
> not correct.
> 
> log:
> [    1.631412] msm_hsusb_host 12520000.usb: EHCI Host Controller
> [    1.636556] msm_hsusb_host 12520000.usb: new USB bus registered, assigned 
> bus number 1
> [    1.642563] msm_hsusb_host 12520000.usb: irq 220, io mem 0x12520000
> [    1.658197] msm_hsusb_host 12520000.usb: USB 2.0 started, EHCI 1.00
> [    1.659473] hub 1-0:1.0: USB hub found
> [    1.663415] hub 1-0:1.0: 1 port detected
> ...
> [    1.973352] usb 1-1: new high-speed USB device number 2 using 
> msm_hsusb_host
> [    2.107707] usb-storage 1-1:1.0: USB Mass Storage device detected
> [    2.108993] scsi0 : usb-storage 1-1:1.0
> [    2.678341] msm_otg 12520000.phy: USB in low power mode
> [    3.168977] usb 1-1: USB disconnect, device number 2
> 
> This issue was detected on IFC6410 board.
> 
> This patch fixes the intial runtime pm trigger by checking the phy
> state and decrementing the pm use count only when the phy state is IDLE.
> 
> Signed-off-by: Srinivas Kandagatla <srinivas.kandaga...@linaro.org>
> ---
>  drivers/usb/phy/phy-msm-usb.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/usb/phy/phy-msm-usb.c b/drivers/usb/phy/phy-msm-usb.c
> index 3bb559d..78cc870 100644
> --- a/drivers/usb/phy/phy-msm-usb.c
> +++ b/drivers/usb/phy/phy-msm-usb.c
> @@ -1229,7 +1229,9 @@ static void msm_otg_sm_work(struct work_struct *w)
>                       motg->chg_state = USB_CHG_STATE_UNDEFINED;
>                       motg->chg_type = USB_INVALID_CHARGER;
>               }
> -             pm_runtime_put_sync(otg->phy->dev);
> +
> +             if (otg->phy->state == OTG_STATE_B_IDLE)
> +                     pm_runtime_put_sync(otg->phy->dev);

instead, you might as well just use autosuspend.

-- 
balbi

Attachment: signature.asc
Description: Digital signature

Reply via email to