if (!(temp & OTGSC_B_SESSION_VALID)) {
/* Set stopped before low power mode */
udc->vbus_active = false;
- imx_usb_vbus_disconnect(&udc->charger); /* charger disconnect */
udc->stopped = 1;
/* enable wake up */
dr_wake_up_enable(udc, true);
/* disable pulldown dp and dm */
dr_discharge_line(udc->pdata, false);
udc->vbus_active = true;
- imx_usb_vbus_connect(&udc->charger); /* charger detect */
+ /* notify vbus is connected */
+ imx_usb_vbus_connect(&udc->charger);
printk(KERN_DEBUG "%s: udc out low power mode\n", __func__);
}
pdata = udc->pdata;
+ /* notify vbus is disconnected */
+ imx_usb_vbus_disconnect(&udc->charger);
/* wait line to se0 */
dr_discharge_line(pdata, true);
-
/*
* Wait class drivers finish, an well-behaviour class driver should
* call ep_disable when it is notified to be disconnected.
udc->stopped = 0;
/* disable pulldown dp and dm */
dr_discharge_line(pdata, false);
- imx_usb_vbus_connect(&udc->charger); /* charger detect */
+ /* notify vbus is connected */
+ imx_usb_vbus_connect(&udc->charger);
printk(KERN_DEBUG "%s: udc out low power mode\n", __func__);
} else {
udc->vbus_active = false;
- imx_usb_vbus_disconnect(&udc->charger); /* charger disconnect */
+ fsl_pullup(&udc_controller->gadget, false); /* usbcmd.rs=0 */
/* here we need disable B_SESSION_IRQ, after
* schedule_work finished, it need to be enabled again.
* Doing like this can avoid conflicting between rapid
fsl_writel(tmp &
(~OTGSC_B_SESSION_VALID_IRQ_EN),
&dr_regs->otgsc);
-
/* update port status */
fsl_udc_speed_update(udc);
spin_unlock(&udc->lock);
return 1;
}
-void usb_charger_init(struct usb_charger *charger)
+static void usb_charger_init(struct usb_charger *charger)
{
charger->bc = BATTERY_CHARGING_SPEC_1_2;
charger->detect = usb_charger_detect;
*/
int imx_usb_vbus_disconnect(struct usb_charger *charger)
{
- if (charger->dp_pullup)
- charger->dp_pullup(false); /* usbcmd.rs = 0 */
-
if (!charger->enable)
return 0;
+ /* in case, the charger detect is doing or pending */
+ cancel_work_sync(&charger->work);
+
charger->online = 0;
charger->present = 0;
charger->max_current = 0;