Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 163554e4 authored by Linyu Yuan's avatar Linyu Yuan Committed by Gerrit - the friendly Code Review server
Browse files

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: default avatarLinyu Yuan <linyyuan@codeaurora.org>
parent f3872ee3
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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,
+11 −4
Original line number Diff line number Diff line
@@ -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);
+2 −0
Original line number Diff line number Diff line
@@ -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);