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 <linyyuan@codeaurora.org>
This commit is contained in:
Linyu Yuan 2020-12-09 14:29:25 +08:00 • committed by Gerrit - the friendly Code Review server
commit f32272fde3

View file

@ -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;
}