From 163554e4c721ca4b28c16633df4b9b65e9cd220c Mon Sep 17 00:00:00 2001 From: Linyu Yuan Date: Mon, 16 Nov 2020 18:42:26 +0800 Subject: [PATCH] usb: dwc3: add DWC3_CONTROLLER_PULLUP event when gadget pullup, add this event allow redriver do some operation according to the pullup state. Change-Id: I9cbd3f9e95aae327e1f872aff7ebff7a8926e5a5 Signed-off-by: Linyu Yuan --- drivers/usb/dwc3/core.h | 1 + drivers/usb/dwc3/dwc3-msm.c | 15 +++++++++++---- drivers/usb/dwc3/gadget.c | 2 ++ 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h index 88fe72f4612f..53b13d9e55fb 100644 --- a/drivers/usb/dwc3/core.h +++ b/drivers/usb/dwc3/core.h @@ -1694,6 +1694,7 @@ enum dwc3_notify_event { DWC3_CONTROLLER_NOTIFY_OTG_EVENT, DWC3_CONTROLLER_SET_CURRENT_DRAW_EVENT, DWC3_CONTROLLER_NOTIFY_DISABLE_UPDXFER, + DWC3_CONTROLLER_PULLUP, /* USB GSI event buffer related notification */ DWC3_GSI_EVT_BUF_ALLOC, diff --git a/drivers/usb/dwc3/dwc3-msm.c b/drivers/usb/dwc3/dwc3-msm.c index 5476b4c096d5..6944bfad19b9 100644 --- a/drivers/usb/dwc3/dwc3-msm.c +++ b/drivers/usb/dwc3/dwc3-msm.c @@ -498,6 +498,8 @@ struct dwc3_msm { struct usb_role_switch *role_switch; bool ss_release_called; int orientation_override; + + struct device_node *ss_redriver_node; }; #define USB_HSPHY_3P3_VOL_MIN 3050000 /* uV */ @@ -2381,6 +2383,10 @@ static void dwc3_msm_notify_event(struct dwc3 *dwc, dev_dbg(mdwc->dev, "DWC3_CONTROLLER_SET_CURRENT_DRAW_EVENT received\n"); schedule_work(&mdwc->vbus_draw_work); break; + case DWC3_CONTROLLER_PULLUP: + dev_dbg(mdwc->dev, "DWC3_CONTROLLER_PULLUP received\n"); + redriver_gadget_pullup(mdwc->ss_redriver_node, value); + break; case DWC3_GSI_EVT_BUF_ALLOC: dev_dbg(mdwc->dev, "DWC3_GSI_EVT_BUF_ALLOC\n"); dwc3_gsi_event_buf_alloc(dwc); @@ -4108,7 +4114,6 @@ int dwc3_msm_release_ss_lane(struct device *dev) { struct dwc3_msm *mdwc = dev_get_drvdata(dev); struct dwc3 *dwc = NULL; - struct device_node *ssusb_redriver_node; if (mdwc == NULL) { dev_err(dev, "dwc3-msm is not initialized yet.\n"); @@ -4126,9 +4131,7 @@ int dwc3_msm_release_ss_lane(struct device *dev) flush_work(&mdwc->resume_work); drain_workqueue(mdwc->sm_usb_wq); - ssusb_redriver_node = - of_parse_phandle(mdwc->dev->of_node, "ssusb_redriver", 0); - redriver_release_usb_lanes(ssusb_redriver_node); + redriver_release_usb_lanes(mdwc->ss_redriver_node); mdwc->ss_release_called = true; if (mdwc->id_state == DWC3_ID_GROUND) { @@ -4444,6 +4447,8 @@ static int dwc3_msm_probe(struct platform_device *pdev) mutex_init(&mdwc->suspend_resume_mutex); + mdwc->ss_redriver_node = of_parse_phandle(node, "ssusb_redriver", 0); + if (of_property_read_bool(node, "usb-role-switch")) { role_desc.fwnode = dev_fwnode(&pdev->dev); mdwc->role_switch = usb_role_switch_register(mdwc->dev, @@ -4527,6 +4532,7 @@ static int dwc3_msm_probe(struct platform_device *pdev) put_dwc3: usb_role_switch_unregister(mdwc->role_switch); + of_node_put(mdwc->ss_redriver_node); platform_device_put(mdwc->dwc3); for (i = 0; i < ARRAY_SIZE(mdwc->icc_paths); i++) icc_put(mdwc->icc_paths[i]); @@ -4545,6 +4551,7 @@ static int dwc3_msm_remove(struct platform_device *pdev) int i, ret_pm; usb_role_switch_unregister(mdwc->role_switch); + of_node_put(mdwc->ss_redriver_node); device_remove_file(&pdev->dev, &dev_attr_mode); device_remove_file(&pdev->dev, &dev_attr_speed); device_remove_file(&pdev->dev, &dev_attr_bus_vote); diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index e663c40ff002..d080b5dc3358 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -2232,6 +2232,8 @@ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on) if (is_on) dwc3_device_core_soft_reset(dwc); + dwc3_notify_event(dwc, DWC3_CONTROLLER_PULLUP, is_on); + spin_lock_irqsave(&dwc->lock, flags); if (dwc->ep0state != EP0_SETUP_PHASE) dbg_event(0xFF, "EP0 is not in SETUP phase\n", dwc->ep0state);