rk: restore file mode
[firefly-linux-kernel-4.4.55.git] / drivers / usb / dwc_otg_310 / dwc_otg_pcd_linux.c
index cc3afa20b6fea14161e54bbe559c535a8bbd32ec..e67384d733051ceb56d956311e2974bedfae87c7 100755 (executable)
@@ -1561,7 +1561,7 @@ static void id_status_change(dwc_otg_core_if_t *p, bool current_id)
                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.
@@ -1590,11 +1590,8 @@ static void check_id(struct work_struct *work)
                        pldata->phy_suspend(pldata, USB_PHY_ENABLED);
                }
 
-               if (!id) { /* Force Host */
-                       id_status_change(otg_dev->core_if, id);
-               } else { /* Force Device */
-                       id_status_change(otg_dev->core_if, id);
-               }
+               /* 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));
@@ -1637,7 +1634,7 @@ static void dwc_otg_pcd_check_vbus_work(struct work_struct *work)
                        _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;
                        }
@@ -1662,10 +1659,12 @@ static void dwc_otg_pcd_check_vbus_work(struct work_struct *work)
                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  */
@@ -1673,7 +1672,8 @@ static void dwc_otg_pcd_check_vbus_work(struct work_struct *work)
                        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:
@@ -1752,6 +1752,12 @@ static void dwc_otg_pcd_work_init(dwc_otg_pcd_t *pcd,
                pldata->dwc_otg_uart_mode(pldata, PHY_USB_MODE);
        }
        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 */