高通平台Android手机驱动层添加usb otg功能
.../arch/arm/boot/dts/qcom/msm8916-qrd-skui.dts | 11 ++++++++-
.../android/kernel/drivers/usb/phy/phy-msm-usb.c | 24 ++++++++++++++++----
2 files changed, 29 insertions(+), 6 deletions(-)
mode change 100644 => 100755 src/LINUX/android/kernel/drivers/usb/phy/phy-msm-usb.c
diff --git a/src/LINUX/android/kernel/arch/arm/boot/dts/qcom/msm8916-qrd-skui.dts b/src/LINUX/android/kernel/arch/arm/boot/dts/qcom/msm8916-qrd-skui.dts
index 076bfef..c6e8158 100755
--- a/src/LINUX/android/kernel/arch/arm/boot/dts/qcom/msm8916-qrd-skui.dts
+++ b/src/LINUX/android/kernel/arch/arm/boot/dts/qcom/msm8916-qrd-skui.dts
@@ -38,7 +38,7 @@
&pm8916_chg {
status = "ok";
//qcom,use-external-charger;
- qcom,charging-disabled;
+ //qcom,charging-disabled;
};
&pm8916_bms {
@@ -46,3 +46,12 @@
//qcom,disable-bms;
};
+
+&usb_otg {
+ qcom,hsusb-otg-mode = <3>;
+ qcom,usbid-gpio = <&msm_gpio 110 0>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&usbid_default>;
+ qcom,hsusb-otg-otg-control = <3>;
+ qcom,hsusb-otg-default-mode = <1>;
+};
No newline at end of file
diff --git a/src/LINUX/android/kernel/drivers/usb/phy/phy-msm-usb.c b/src/LINUX/android/kernel/drivers/usb/phy/phy-msm-usb.c
old mode 100644
new mode 100755
index a18e4df..2fead87
--- a/src/LINUX/android/kernel/drivers/usb/phy/phy-msm-usb.c
+++ b/src/LINUX/android/kernel/drivers/usb/phy/phy-msm-usb.c
@@ -105,7 +105,7 @@ static bool mhl_det_in_progress;
static struct regulator *hsusb_3p3;
static struct regulator *hsusb_1p8;
static struct regulator *hsusb_vdd;
-static struct regulator *vbus_otg;
+//static struct regulator *vbus_otg; //del by Beyond for 5V vbus
static struct regulator *mhl_usb_hs_switch;
static struct power_supply *psy;
@@ -1628,12 +1628,13 @@ out:
static void msm_hsusb_vbus_power(struct msm_otg *motg, bool on)
{
- int ret;
+ //int ret; //del by Beyond for 5V vbus start
static bool vbus_is_on;
if (vbus_is_on == on)
return;
+/* //del by Beyond for 5V vbus start
if (motg->pdata->vbus_power) {
ret = motg->pdata->vbus_power(on);
if (!ret)
@@ -1645,7 +1646,7 @@ static void msm_hsusb_vbus_power(struct msm_otg *motg, bool on)
pr_err("vbus_otg is NULL.");
return;
}
-
+*/ //del by Beyond for 5V vbus end
/*
* if entering host mode tell the charger to not draw any current
* from usb before turning on the boost.
@@ -1654,18 +1655,26 @@ static void msm_hsusb_vbus_power(struct msm_otg *motg, bool on)
*/
if (on) {
msm_otg_notify_host_mode(motg, on);
+
+/* //del by Beyond start
ret = regulator_enable(vbus_otg);
if (ret) {
pr_err("unable to enable vbus_otgn");
return;
}
+*/ //del by Beyond end
+
vbus_is_on = true;
} else {
+
+/* //del by Beyond start
ret = regulator_disable(vbus_otg);
if (ret) {
pr_err("unable to disable vbus_otgn");
return;
}
+*/ //del by Beyond end
+
msm_otg_notify_host_mode(motg, on);
vbus_is_on = false;
}
@@ -1684,7 +1693,7 @@ static int msm_otg_set_host(struct usb_otg *otg, struct usb_bus *host)
dev_info(otg->phy->dev, "Host mode is not supportedn");
return -ENODEV;
}
-
+/* //del by Beyond start for 5V vbus
if (!motg->pdata->vbus_power && host) {
vbus_otg = devm_regulator_get(motg->phy.dev, "vbus_otg");
if (IS_ERR(vbus_otg)) {
@@ -1692,7 +1701,7 @@ static int msm_otg_set_host(struct usb_otg *otg, struct usb_bus *host)
return PTR_ERR(vbus_otg);
}
}
-
+*/ //del by Beyond end for 5V vbus
if (!host) {
if (otg->phy->state == OTG_STATE_A_HOST) {
pm_runtime_get_sync(otg->phy->dev);
@@ -2603,6 +2612,11 @@ static void msm_otg_init_sm(struct msm_otg *motg)
set_bit(ID, &motg->inputs);
else
clear_bit(ID, &motg->inputs);
+ } else if (motg->ext_id_irq) {
+ if (gpio_get_value(pdata->usb_id_gpio))
+ set_bit(ID, &motg->inputs);
+ else
+ clear_bit(ID, &motg->inputs);
}
/*
* VBUS initial state is reported after PMIC
--
插USB时自动切换otg模式和充电模式:
修改如下:
b/src/LINUX/android/kernel/arch/arm/boot/dts/qcom/msm8916-qrd-skui.dts
&usb_otg {
qcom,hsusb-otg-mode = <3>;
qcom,usbid-gpio = <&msm_gpio 110 0>;
pinctrl-names = "default";
pinctrl-0 = <&usbid_default>;
qcom,hsusb-otg-otg-control = <2>;
};