summaryrefslogtreecommitdiff
path: root/drivers/usb
diff options
context:
space:
mode:
authorDavide Garberi <dade.garberi@gmail.com>2019-08-21 14:54:16 +0200
committerMichael Bestas <mkbestas@lineageos.org>2020-05-01 18:21:39 +0300
commit4251235731fc7c9c933c0329486293bbf529c0cd (patch)
treee26b5d313f8d5250637c37da3849d94c0335728f /drivers/usb
parent6862191ffd3fb19d43115b9ba7d34a8ff2b9df2f (diff)
usb: Import xiaomi longcheer changes
Change-Id: Ifcfd9b5fce256553f1356b074ae582658646d599 Signed-off-by: Isaac Chen <tingyi364@gmail.com>
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/dwc3/dwc3-msm.c19
-rw-r--r--drivers/usb/host/xhci-mem.c2
-rw-r--r--drivers/usb/pd/policy_engine.c86
3 files changed, 107 insertions, 0 deletions
diff --git a/drivers/usb/dwc3/dwc3-msm.c b/drivers/usb/dwc3/dwc3-msm.c
index b6b25c75b80c..569697e89365 100644
--- a/drivers/usb/dwc3/dwc3-msm.c
+++ b/drivers/usb/dwc3/dwc3-msm.c
@@ -55,7 +55,11 @@
#include "debug.h"
#include "xhci.h"
+#ifdef CONFIG_MACH_LONGCHEER
+#define SDP_CONNETION_CHECK_TIME 5000 /* in ms */
+#else
#define SDP_CONNETION_CHECK_TIME 10000 /* in ms */
+#endif
/* time out to wait for USB cable status notification (in ms)*/
#define SM_INIT_TIMEOUT 30000
@@ -2734,6 +2738,10 @@ static void check_for_sdp_connection(struct work_struct *w)
struct dwc3_msm *mdwc =
container_of(w, struct dwc3_msm, sdp_check.work);
struct dwc3 *dwc = platform_get_drvdata(mdwc->dwc3);
+#ifdef CONFIG_MACH_LONGCHEER
+ union power_supply_propval pval = {0};
+ int ret;
+#endif
if (!mdwc->vbus_active)
return;
@@ -2749,6 +2757,17 @@ static void check_for_sdp_connection(struct work_struct *w)
if (dwc->gadget.state < USB_STATE_DEFAULT &&
dwc3_gadget_get_link_state(dwc) != DWC3_LINK_STATE_CMPLY) {
mdwc->vbus_active = 0;
+#ifdef CONFIG_MACH_LONGCHEER
+ if (!mdwc->usb_psy)
+ mdwc->usb_psy = power_supply_get_by_name("usb");
+ if (mdwc->usb_psy) {
+ pval.intval = 1;
+ ret = power_supply_set_property(mdwc->usb_psy,
+ POWER_SUPPLY_PROP_RERUN_APSD, &pval);
+ if (ret)
+ dev_dbg(mdwc->dev, "error when set property\n");
+ }
+#endif
dbg_event(0xFF, "Q RW SPD CHK", mdwc->vbus_active);
queue_work(mdwc->dwc3_wq, &mdwc->resume_work);
}
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c
index cfd163c7e2ec..255e1fdf9b31 100644
--- a/drivers/usb/host/xhci-mem.c
+++ b/drivers/usb/host/xhci-mem.c
@@ -2310,11 +2310,13 @@ static void xhci_add_in_port(struct xhci_hcd *xhci, unsigned int num_ports,
xhci_dbg_trace(xhci, trace_xhci_dbg_init,
"xHCI 1.0: support USB2 software lpm");
xhci->sw_lpm_support = 1;
+#ifndef CONFIG_MACH_LONGCHEER
if (temp & XHCI_HLC) {
xhci_dbg_trace(xhci, trace_xhci_dbg_init,
"xHCI 1.0: support USB2 hardware lpm");
xhci->hw_lpm_support = 1;
}
+#endif
}
port_offset--;
diff --git a/drivers/usb/pd/policy_engine.c b/drivers/usb/pd/policy_engine.c
index 540498548978..2b68a2c50c4b 100644
--- a/drivers/usb/pd/policy_engine.c
+++ b/drivers/usb/pd/policy_engine.c
@@ -361,6 +361,9 @@ struct usbpd {
struct device dev;
struct workqueue_struct *wq;
struct work_struct sm_work;
+#ifdef CONFIG_MACH_LONGCHEER
+ struct delayed_work vbus_work;
+#endif
struct hrtimer timer;
bool sm_queued;
@@ -3724,6 +3727,79 @@ static ssize_t get_battery_status_show(struct device *dev,
}
static DEVICE_ATTR_RW(get_battery_status);
+#ifdef CONFIG_MACH_LONGCHEER
+struct usbpd *pd_lobal;
+unsigned int pd_vbus_ctrl = 0;
+
+module_param(pd_vbus_ctrl, uint, S_IRUGO | S_IWUSR);
+MODULE_PARM_DESC(pd_vbus_ctrl, "PD VBUS CONTROL");
+
+void pd_vbus_reset(struct usbpd *pd)
+{
+ if (!pd) {
+ pr_err("pd_vbus_reset, pd is null\n");
+ return;
+ }
+ if (pd->vbus_enabled) {
+ regulator_disable(pd->vbus);
+ pd->vbus_enabled = false;
+ if(0 == pd_vbus_ctrl) pd_vbus_ctrl = 500;
+ msleep(pd_vbus_ctrl);
+ enable_vbus(pd);
+ } else {
+ pr_err("pd_vbus is not enabled yet\n");
+ }
+}
+
+/* Handles VBUS off on */
+void usbpd_vbus_sm(struct work_struct *w)
+{
+ struct usbpd *pd = pd_lobal;
+
+ pr_err("usbpd_vbus_sm handle state %s, vbus %d\n",
+ usbpd_state_strings[pd->current_state],pd->vbus_enabled);
+
+ pd_vbus_reset(pd);
+
+}
+void kick_usbpd_vbus_sm(void)
+{
+ pm_stay_awake(&pd_lobal->dev);
+
+ pr_err("kick_usbpd_vbus_sm handle state %s, vbus %d\n",
+ usbpd_state_strings[pd_lobal->current_state],pd_lobal->vbus_enabled);
+ queue_delayed_work(pd_lobal->wq, &(pd_lobal->vbus_work), msecs_to_jiffies(400));
+}
+
+static ssize_t pd_vbus_show(struct device *dev, struct device_attribute *attr,
+ char *buf)
+{
+ struct usbpd *pd = dev_get_drvdata(dev);
+ pr_err("pd_vbus_show handle state %s, vbus %d\n",
+ usbpd_state_strings[pd_lobal->current_state],pd_lobal->vbus_enabled);
+ pd_vbus_reset(pd);
+
+ return 0;
+}
+
+static ssize_t pd_vbus_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t size)
+{
+ int val = 0;
+
+ if (sscanf(buf, "%d\n", &val) != 0)
+ {
+ pr_err("pd_vbus_store input err\n");
+ }
+ pr_err("pd_vbus_store handle state %s, vbus %d,val %d\n",
+ usbpd_state_strings[pd_lobal->current_state],pd_lobal->vbus_enabled,val);
+ kick_usbpd_vbus_sm();
+
+ return size;
+}
+static DEVICE_ATTR_RW(pd_vbus);
+#endif
+
static struct attribute *usbpd_attrs[] = {
&dev_attr_contract.attr,
&dev_attr_initial_pr.attr,
@@ -3748,6 +3824,9 @@ static struct attribute *usbpd_attrs[] = {
&dev_attr_rx_ado.attr,
&dev_attr_get_battery_cap.attr,
&dev_attr_get_battery_status.attr,
+#ifdef CONFIG_MACH_LONGCHEER
+ &dev_attr_pd_vbus.attr,
+#endif
NULL,
};
ATTRIBUTE_GROUPS(usbpd);
@@ -3862,6 +3941,9 @@ struct usbpd *usbpd_create(struct device *parent)
goto del_pd;
}
INIT_WORK(&pd->sm_work, usbpd_sm);
+#ifdef CONFIG_MACH_LONGCHEER
+ INIT_DELAYED_WORK(&pd->vbus_work,usbpd_vbus_sm);
+#endif
hrtimer_init(&pd->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
pd->timer.function = pd_timeout;
mutex_init(&pd->swap_lock);
@@ -3986,6 +4068,10 @@ struct usbpd *usbpd_create(struct device *parent)
/* force read initial power_supply values */
psy_changed(&pd->psy_nb, PSY_EVENT_PROP_CHANGED, pd->usb_psy);
+#ifdef CONFIG_MACH_LONGCHEER
+ pd_lobal = pd;
+#endif
+
return pd;
del_inst: