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.kandagatla@xxxxxxxxxx> > --- > 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