pcd->conn_status = 0;
} else {
dwc_otg_pcd_pullup_disable(pcd);
- pcd->conn_status = 2;
+ pcd->conn_en = 0;
}
return 0;
core_if->op_state = A_HOST;
dwc_otg_set_force_mode(core_if, USB_MODE_FORCE_HOST);
- cancel_delayed_work(&pcd->check_vbus_work);
+ cancel_delayed_work_sync(&pcd->check_vbus_work);
/*
* Initialize the Core for Host mode.
if (last_id != id) {
pr_info("[otg id chg] last id %d current id %d\n", last_id, id);
- if (!id) { /* Force Host */
- if (pldata->phy_status == USB_PHY_SUSPEND) {
- pldata->clock_enable(pldata, 1);
- pldata->phy_suspend(pldata, USB_PHY_ENABLED);
- }
- id_status_change(otg_dev->core_if, id);
- } else { /* Force Device */
- id_status_change(otg_dev->core_if, id);
+
+ if (pldata->phy_status == USB_PHY_SUSPEND) {
+ pldata->clock_enable(pldata, 1);
+ pldata->phy_suspend(pldata, USB_PHY_ENABLED);
}
+
+ /* Force Device or Host by id */
+ id_status_change(otg_dev->core_if, id);
}
last_id = id;
schedule_delayed_work(&_pcd->check_id_work, (HZ));
struct dwc_otg_device *otg_dev = _pcd->otg_dev;
struct dwc_otg_platform_data *pldata = otg_dev->pldata;
- if (pldata->get_status(USB_STATUS_BVABLID)) {
+ if (pldata->get_status(USB_STATUS_BVABLID) &&
+ pldata->get_status(USB_STATUS_ID)) {
/* if usb not connect before ,then start connect */
if (_pcd->vbus_status == USB_BC_TYPE_DISCNT) {
printk("***************vbus detect*****************\n");
_pcd->conn_status++;
if (pldata->bc_detect_cb != NULL) {
pldata->bc_detect_cb(_pcd->vbus_status =
- USB_BC_TYPE_DCP);
+ usb_battery_charger_detect(1));
} else {
_pcd->vbus_status = USB_BC_TYPE_DCP;
}
if (pldata->phy_status == USB_PHY_ENABLED) {
/* release wake lock */
dwc_otg_msc_unlock(_pcd);
- /* no vbus detect here , close usb phy */
- pldata->phy_suspend(pldata, USB_PHY_SUSPEND);
- udelay(3);
- pldata->clock_enable(pldata, 0);
+ if (pldata->get_status(USB_STATUS_ID)) {
+ /* no vbus detect here , close usb phy */
+ pldata->phy_suspend(pldata, USB_PHY_SUSPEND);
+ udelay(3);
+ pldata->clock_enable(pldata, 0);
+ }
}
/* usb phy bypass to uart mode */
pldata->dwc_otg_uart_mode(pldata, PHY_UART_MODE);
}
- schedule_delayed_work(&_pcd->check_vbus_work, HZ);
+ if (pldata->get_status(USB_STATUS_ID))
+ schedule_delayed_work(&_pcd->check_vbus_work, HZ);
return;
connect:
/* host mode,enter usb phy mode */
pldata->dwc_otg_uart_mode(pldata, PHY_USB_MODE);
}
- schedule_delayed_work(&pcd->check_id_work, HZ);
+ schedule_delayed_work(&pcd->check_id_work, 8 * HZ);
+ if (otg_dev->core_if->usb_mode == USB_MODE_FORCE_DEVICE) {
+ pcd->vbus_status = 0;
+ dwc_otg_core_init(otg_dev->core_if);
+ cil_pcd_start(otg_dev->core_if);
+ dwc_otg_pcd_start_check_vbus_work(pcd);
+ }
}
#endif /* DWC_HOST_ONLY */