usb: phy: ab8500-usb: call phy_dis_work only when necessary

Modify ab8500_usb_set_peripheral() and ab8500_usb_set_host() code to
schedule phy_dis_work only when necessary in order to prevent regulator
count mismatch during reboot/shutdown.

Signed-off-by: Sakethram Bommisetti <sakethram.bommisetti@stericsson.com>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Fabio Baltieri <fabio.baltieri@linaro.org>
Signed-off-by: Felipe Balbi <balbi@ti.com>
This commit is contained in:
Sakethram Bommisetti 2013-04-03 10:45:13 +02:00 committed by Felipe Balbi
parent 8db12231bc
commit 5882337338
1 changed files with 8 additions and 9 deletions

View File

@ -614,17 +614,16 @@ static int ab8500_usb_set_peripheral(struct usb_otg *otg,
ab = phy_to_ab(otg->phy); ab = phy_to_ab(otg->phy);
ab->phy.otg->gadget = gadget;
/* Some drivers call this function in atomic context. /* Some drivers call this function in atomic context.
* Do not update ab8500 registers directly till this * Do not update ab8500 registers directly till this
* is fixed. * is fixed.
*/ */
if (!gadget) { if ((ab->mode != USB_IDLE) && (!gadget)) {
otg->gadget = NULL; ab->mode = USB_IDLE;
schedule_work(&ab->phy_dis_work); schedule_work(&ab->phy_dis_work);
} else {
otg->gadget = gadget;
otg->phy->state = OTG_STATE_B_IDLE;
} }
return 0; return 0;
@ -639,16 +638,16 @@ static int ab8500_usb_set_host(struct usb_otg *otg, struct usb_bus *host)
ab = phy_to_ab(otg->phy); ab = phy_to_ab(otg->phy);
ab->phy.otg->host = host;
/* Some drivers call this function in atomic context. /* Some drivers call this function in atomic context.
* Do not update ab8500 registers directly till this * Do not update ab8500 registers directly till this
* is fixed. * is fixed.
*/ */
if (!host) { if ((ab->mode != USB_IDLE) && (!host)) {
otg->host = NULL; ab->mode = USB_IDLE;
schedule_work(&ab->phy_dis_work); schedule_work(&ab->phy_dis_work);
} else {
otg->host = host;
} }
return 0; return 0;