From f32272fde30fce509363a87fc40a65d046cd2b01 Mon Sep 17 00:00:00 2001 From: Linyu Yuan Date: Wed, 9 Dec 2020 14:29:25 +0800 Subject: [PATCH] usb: dwc3: allow get orientation from redriver call redriver_orientation_get() to get orientation if redriver present. Change-Id: I1ed69fece1f7577e2c478631920fb1bb3fe93cd1 Signed-off-by: Linyu Yuan --- drivers/usb/dwc3/dwc3-msm.c | 72 +++++++++++++++++++++++-------------- 1 file changed, 45 insertions(+), 27 deletions(-) diff --git a/drivers/usb/dwc3/dwc3-msm.c b/drivers/usb/dwc3/dwc3-msm.c index 11af30370cb9..d2a344ccfd45 100644 --- a/drivers/usb/dwc3/dwc3-msm.c +++ b/drivers/usb/dwc3/dwc3-msm.c @@ -287,13 +287,6 @@ enum dwc3_id_state { DWC3_ID_FLOAT, }; -/* for type c cable */ -enum plug_orientation { - ORIENTATION_NONE, - ORIENTATION_CC1, - ORIENTATION_CC2, -}; - enum msm_usb_irq { HS_PHY_IRQ, PWR_EVNT_IRQ, @@ -476,7 +469,6 @@ struct dwc3_msm { atomic_t in_p3; unsigned int lpm_to_suspend_delay; - enum plug_orientation typec_orientation; u32 num_gsi_event_buffers; struct dwc3_event_buffer **gsi_ev_buff; int pm_qos_latency; @@ -2668,6 +2660,45 @@ static void dwc3_set_phy_speed_flags(struct dwc3_msm *mdwc) } } +static void dwc3_set_ssphy_orientation_flag(struct dwc3_msm *mdwc) +{ + struct dwc3 *dwc = platform_get_drvdata(mdwc->dwc3); + union extcon_property_value val; + struct extcon_dev *edev = NULL; + unsigned int extcon_id; + int ret; + + mdwc->ss_phy->flags &= ~(PHY_LANE_A | PHY_LANE_B); + + if (mdwc->orientation_override) { + mdwc->ss_phy->flags |= mdwc->orientation_override; + } else if (mdwc->ss_redriver_node) { + ret = redriver_orientation_get(mdwc->ss_redriver_node); + if (ret == 0) + mdwc->ss_phy->flags |= PHY_LANE_A; + else + mdwc->ss_phy->flags |= PHY_LANE_B; + } else { + if (mdwc->extcon && mdwc->vbus_active && !mdwc->in_restart) { + extcon_id = EXTCON_USB; + edev = mdwc->extcon[mdwc->ext_idx].edev; + } else if (mdwc->extcon && mdwc->id_state == DWC3_ID_GROUND) { + extcon_id = EXTCON_USB_HOST; + edev = mdwc->extcon[mdwc->ext_idx].edev; + } + + if (edev && extcon_get_state(edev, extcon_id)) { + ret = extcon_get_property(edev, extcon_id, + EXTCON_PROP_USB_TYPEC_POLARITY, &val); + if (ret == 0) + mdwc->ss_phy->flags |= val.intval ? + PHY_LANE_B : PHY_LANE_A; + } + } + + dbg_event(0xFF, "ss_flag", mdwc->ss_phy->flags); +} + static void msm_dwc3_perf_vote_update(struct dwc3_msm *mdwc, bool perf_mode); @@ -3079,13 +3110,7 @@ static int dwc3_msm_resume(struct dwc3_msm *mdwc) /* Resume SS PHY */ if (dwc->maximum_speed >= USB_SPEED_SUPER && mdwc->lpm_flags & MDWC3_SS_PHY_SUSPEND) { - mdwc->ss_phy->flags &= ~(PHY_LANE_A | PHY_LANE_B); - if (mdwc->orientation_override) - mdwc->ss_phy->flags |= mdwc->orientation_override; - else if (mdwc->typec_orientation == ORIENTATION_CC1) - mdwc->ss_phy->flags |= PHY_LANE_A; - else if (mdwc->typec_orientation == ORIENTATION_CC2) - mdwc->ss_phy->flags |= PHY_LANE_B; + dwc3_set_ssphy_orientation_flag(mdwc); usb_phy_set_suspend(mdwc->ss_phy, 0); mdwc->ss_phy->flags &= ~DEVICE_IN_SS_MODE; mdwc->lpm_flags &= ~MDWC3_SS_PHY_SUSPEND; @@ -3269,25 +3294,18 @@ static void dwc3_resume_work(struct work_struct *w) } dwc->maximum_speed = dwc->max_hw_supp_speed; - /* Check speed and Type-C polarity values in order to configure PHY */ + if (edev && extcon_get_state(edev, extcon_id)) { ret = extcon_get_property(edev, extcon_id, EXTCON_PROP_USB_SS, &val); if (!ret && val.intval == 0) dwc->maximum_speed = USB_SPEED_HIGH; - - ret = extcon_get_property(edev, extcon_id, - EXTCON_PROP_USB_TYPEC_POLARITY, &val); - if (ret) - mdwc->typec_orientation = ORIENTATION_NONE; - else - mdwc->typec_orientation = val.intval ? - ORIENTATION_CC2 : ORIENTATION_CC1; - - dbg_event(0xFF, "cc_state", mdwc->typec_orientation); } + if (dwc->maximum_speed >= USB_SPEED_SUPER) + dwc3_set_ssphy_orientation_flag(mdwc); + skip_update: dbg_log_string("max_speed:%d hw_supp_speed:%d override_speed:%d", dwc->maximum_speed, dwc->max_hw_supp_speed, @@ -3805,7 +3823,7 @@ static ssize_t orientation_store(struct device *dev, else if (sysfs_streq(buf, "B")) mdwc->orientation_override = PHY_LANE_B; else - mdwc->orientation_override = ORIENTATION_NONE; + mdwc->orientation_override = 0; return count; }