diff options
author | Davide Garberi <dade.garberi@gmail.com> | 2019-08-21 14:54:16 +0200 |
---|---|---|
committer | Michael Bestas <mkbestas@lineageos.org> | 2020-05-01 18:21:39 +0300 |
commit | 4251235731fc7c9c933c0329486293bbf529c0cd (patch) | |
tree | e26b5d313f8d5250637c37da3849d94c0335728f /drivers/usb | |
parent | 6862191ffd3fb19d43115b9ba7d34a8ff2b9df2f (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.c | 19 | ||||
-rw-r--r-- | drivers/usb/host/xhci-mem.c | 2 | ||||
-rw-r--r-- | drivers/usb/pd/policy_engine.c | 86 |
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: |