"1" represents that force otg to host only mode,
"2" represents that force otg to device only mode.
+Optional properties:
+ - rockchip,usb-pmic-vbus: If present, OTG VBUS 5V is supplied
+ from PMIC.
+
Example:
- RK3288
#define USB_MODE_FORCE_HOST (1)
#define USB_MODE_FORCE_DEVICE (2)
+ /* Indicate USB get VBUS 5V from PMIC(e.g. rk81x) */
+ bool pmic_vbus;
+
#ifdef DWC_DEV_SRPCAP
/* This timer is needed to power on the hibernated host core if SRP is not
* initiated on connected SRP capable device for limited period of time
void dwc_otg_force_host(dwc_otg_core_if_t *core_if)
{
dwc_otg_device_t *otg_dev = core_if->otg_dev;
+ struct dwc_otg_platform_data *pdata = otg_dev->pldata;
dctl_data_t dctl = {.d32 = 0 };
unsigned long flags;
if (core_if->op_state == A_HOST) {
- printk("dwc_otg_force_host,already in A_HOST mode,everest\n");
+ dev_info(pdata->dev,
+ "dwc_otg_force_host,already in A_HOST mode,everest\n");
+ return;
+ } else if (pdata->get_status(USB_STATUS_BVABLID) &&
+ core_if->pmic_vbus) {
+ dev_info(pdata->dev,
+ "Please disconnect the USB cable first, and try again!\n");
return;
}
+
core_if->op_state = A_HOST;
cancel_delayed_work(&otg_dev->pcd->check_vbus_work);
of_property_read_u32(node, "rockchip,usb-mode", &val);
dwc_otg_device->core_if->usb_mode = val;
+ /* Indicate usb vbus get from pmic (e.g. rk81x) */
+ dwc_otg_device->core_if->pmic_vbus = of_property_read_bool(node,
+ "rockchip,usb-pmic-vbus");
+
#ifndef DWC_HOST_ONLY
/*
* Initialize the PCD
static void usb20otg_power_enable(int enable)
{
if (0 == enable) {
- rk_battery_charger_detect_cb(USB_OTG_POWER_OFF);
/* disable otg_drv power */
if (gpio_is_valid(control_usb->otg_gpios->gpio))
gpio_set_value(control_usb->otg_gpios->gpio, 0);
+ else if (usb20otg_get_status(USB_STATUS_BVABLID))
+ rk_battery_charger_detect_cb(USB_OTG_POWER_OFF);
} else if (1 == enable) {
- rk_battery_charger_detect_cb(USB_OTG_POWER_ON);
/* enable otg_drv power */
if (gpio_is_valid(control_usb->otg_gpios->gpio))
gpio_set_value(control_usb->otg_gpios->gpio, 1);
+ else if (!usb20otg_get_status(USB_STATUS_BVABLID))
+ rk_battery_charger_detect_cb(USB_OTG_POWER_ON);
}
}
static void usb20otg_phy_power_down(int power_down)
static void usb20otg_power_enable(int enable)
{
if (0 == enable) {
- rk_battery_charger_detect_cb(USB_OTG_POWER_OFF);
/* disable otg_drv power */
if (gpio_is_valid(control_usb->otg_gpios->gpio))
gpio_set_value(control_usb->otg_gpios->gpio, 0);
+ else if (usb20otg_get_status(USB_STATUS_BVABLID))
+ rk_battery_charger_detect_cb(USB_OTG_POWER_OFF);
} else if (1 == enable) {
- rk_battery_charger_detect_cb(USB_OTG_POWER_ON);
/* enable otg_drv power */
if (gpio_is_valid(control_usb->otg_gpios->gpio))
gpio_set_value(control_usb->otg_gpios->gpio, 1);
+ else if (!usb20otg_get_status(USB_STATUS_BVABLID))
+ rk_battery_charger_detect_cb(USB_OTG_POWER_ON);
}
}
static void usb20otg_phy_power_down(int power_down)
static void usb20otg_power_enable(int enable)
{
if (0 == enable) {
- rk_battery_charger_detect_cb(USB_OTG_POWER_OFF);
/* disable otg_drv power */
if (gpio_is_valid(control_usb->otg_gpios->gpio))
gpio_set_value(control_usb->otg_gpios->gpio, 0);
+ else if (usb20otg_get_status(USB_STATUS_BVABLID))
+ rk_battery_charger_detect_cb(USB_OTG_POWER_OFF);
} else if (1 == enable) {
- rk_battery_charger_detect_cb(USB_OTG_POWER_ON);
/* enable otg_drv power */
if (gpio_is_valid(control_usb->otg_gpios->gpio))
gpio_set_value(control_usb->otg_gpios->gpio, 1);
+ else if (!usb20otg_get_status(USB_STATUS_BVABLID))
+ rk_battery_charger_detect_cb(USB_OTG_POWER_ON);
}
}
static void usb20otg_power_enable(int enable)
{
if (0 == enable) {
- rk_battery_charger_detect_cb(USB_OTG_POWER_OFF);
/* disable otg_drv power */
if (gpio_is_valid(control_usb->otg_gpios->gpio))
gpio_set_value(control_usb->otg_gpios->gpio, 0);
+ else if (usb20otg_get_status(USB_STATUS_BVABLID))
+ rk_battery_charger_detect_cb(USB_OTG_POWER_OFF);
} else if (1 == enable) {
- rk_battery_charger_detect_cb(USB_OTG_POWER_ON);
/* enable otg_drv power */
if (gpio_is_valid(control_usb->otg_gpios->gpio))
gpio_set_value(control_usb->otg_gpios->gpio, 1);
+ else if (!usb20otg_get_status(USB_STATUS_BVABLID))
+ rk_battery_charger_detect_cb(USB_OTG_POWER_ON);
}
}