Message ID | 20250225184519.3586926-2-heiko@sntech.de (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | phy: rockchip: usbdp: improve typec orientation handling | expand |
Le 25/02/2025 à 19:45, Heiko Stuebner a écrit : > From: Heiko Stuebner <heiko.stuebner@cherry.de> > > Move the typec-orientation-switch functionality further down, next to > the typec-mux code. Not only brings this the typec-related functionality > closer together, but also the following change needs access to other > driver functions, that are below the current position. > > No functional change. > > Signed-off-by: Heiko Stuebner <heiko.stuebner@cherry.de> > --- > drivers/phy/rockchip/phy-rockchip-usbdp.c | 166 +++++++++++----------- > 1 file changed, 83 insertions(+), 83 deletions(-) > > diff --git a/drivers/phy/rockchip/phy-rockchip-usbdp.c b/drivers/phy/rockchip/phy-rockchip-usbdp.c > index 5b1e8a3806ed..7b17c82ebcfc 100644 > --- a/drivers/phy/rockchip/phy-rockchip-usbdp.c > +++ b/drivers/phy/rockchip/phy-rockchip-usbdp.c > @@ -616,89 +616,6 @@ static void rk_udphy_dp_hpd_event_trigger(struct rk_udphy *udphy, bool hpd) > rk_udphy_grfreg_write(udphy->vogrf, &cfg->vogrfcfg[udphy->id].hpd_trigger, hpd); > } > > -static void rk_udphy_set_typec_default_mapping(struct rk_udphy *udphy) > -{ > - if (udphy->flip) { > - udphy->dp_lane_sel[0] = 0; > - udphy->dp_lane_sel[1] = 1; > - udphy->dp_lane_sel[2] = 3; > - udphy->dp_lane_sel[3] = 2; > - udphy->lane_mux_sel[0] = PHY_LANE_MUX_DP; > - udphy->lane_mux_sel[1] = PHY_LANE_MUX_DP; > - udphy->lane_mux_sel[2] = PHY_LANE_MUX_USB; > - udphy->lane_mux_sel[3] = PHY_LANE_MUX_USB; > - udphy->dp_aux_dout_sel = PHY_AUX_DP_DATA_POL_INVERT; > - udphy->dp_aux_din_sel = PHY_AUX_DP_DATA_POL_INVERT; > - gpiod_set_value_cansleep(udphy->sbu1_dc_gpio, 1); > - gpiod_set_value_cansleep(udphy->sbu2_dc_gpio, 0); > - } else { > - udphy->dp_lane_sel[0] = 2; > - udphy->dp_lane_sel[1] = 3; > - udphy->dp_lane_sel[2] = 1; > - udphy->dp_lane_sel[3] = 0; > - udphy->lane_mux_sel[0] = PHY_LANE_MUX_USB; > - udphy->lane_mux_sel[1] = PHY_LANE_MUX_USB; > - udphy->lane_mux_sel[2] = PHY_LANE_MUX_DP; > - udphy->lane_mux_sel[3] = PHY_LANE_MUX_DP; > - udphy->dp_aux_dout_sel = PHY_AUX_DP_DATA_POL_NORMAL; > - udphy->dp_aux_din_sel = PHY_AUX_DP_DATA_POL_NORMAL; > - gpiod_set_value_cansleep(udphy->sbu1_dc_gpio, 0); > - gpiod_set_value_cansleep(udphy->sbu2_dc_gpio, 1); > - } > - > - udphy->mode = UDPHY_MODE_DP_USB; > -} > - > -static int rk_udphy_orien_sw_set(struct typec_switch_dev *sw, > - enum typec_orientation orien) > -{ > - struct rk_udphy *udphy = typec_switch_get_drvdata(sw); > - > - mutex_lock(&udphy->mutex); > - > - if (orien == TYPEC_ORIENTATION_NONE) { > - gpiod_set_value_cansleep(udphy->sbu1_dc_gpio, 0); > - gpiod_set_value_cansleep(udphy->sbu2_dc_gpio, 0); > - /* unattached */ > - rk_udphy_usb_bvalid_enable(udphy, false); > - goto unlock_ret; > - } > - > - udphy->flip = (orien == TYPEC_ORIENTATION_REVERSE) ? true : false; > - rk_udphy_set_typec_default_mapping(udphy); > - rk_udphy_usb_bvalid_enable(udphy, true); > - > -unlock_ret: > - mutex_unlock(&udphy->mutex); > - return 0; > -} > - > -static void rk_udphy_orien_switch_unregister(void *data) > -{ > - struct rk_udphy *udphy = data; > - > - typec_switch_unregister(udphy->sw); > -} > - > -static int rk_udphy_setup_orien_switch(struct rk_udphy *udphy) > -{ > - struct typec_switch_desc sw_desc = { }; > - > - sw_desc.drvdata = udphy; > - sw_desc.fwnode = dev_fwnode(udphy->dev); > - sw_desc.set = rk_udphy_orien_sw_set; > - > - udphy->sw = typec_switch_register(udphy->dev, &sw_desc); > - if (IS_ERR(udphy->sw)) { > - dev_err(udphy->dev, "Error register typec orientation switch: %ld\n", > - PTR_ERR(udphy->sw)); > - return PTR_ERR(udphy->sw); > - } > - > - return devm_add_action_or_reset(udphy->dev, > - rk_udphy_orien_switch_unregister, udphy); > -} > - > static int rk_udphy_refclk_set(struct rk_udphy *udphy) > { > unsigned long rate; > @@ -1323,6 +1240,89 @@ static const struct phy_ops rk_udphy_usb3_phy_ops = { > .owner = THIS_MODULE, > }; > > +static void rk_udphy_set_typec_default_mapping(struct rk_udphy *udphy) > +{ > + if (udphy->flip) { > + udphy->dp_lane_sel[0] = 0; > + udphy->dp_lane_sel[1] = 1; > + udphy->dp_lane_sel[2] = 3; > + udphy->dp_lane_sel[3] = 2; > + udphy->lane_mux_sel[0] = PHY_LANE_MUX_DP; > + udphy->lane_mux_sel[1] = PHY_LANE_MUX_DP; > + udphy->lane_mux_sel[2] = PHY_LANE_MUX_USB; > + udphy->lane_mux_sel[3] = PHY_LANE_MUX_USB; > + udphy->dp_aux_dout_sel = PHY_AUX_DP_DATA_POL_INVERT; > + udphy->dp_aux_din_sel = PHY_AUX_DP_DATA_POL_INVERT; > + gpiod_set_value_cansleep(udphy->sbu1_dc_gpio, 1); > + gpiod_set_value_cansleep(udphy->sbu2_dc_gpio, 0); > + } else { > + udphy->dp_lane_sel[0] = 2; > + udphy->dp_lane_sel[1] = 3; > + udphy->dp_lane_sel[2] = 1; > + udphy->dp_lane_sel[3] = 0; > + udphy->lane_mux_sel[0] = PHY_LANE_MUX_USB; > + udphy->lane_mux_sel[1] = PHY_LANE_MUX_USB; > + udphy->lane_mux_sel[2] = PHY_LANE_MUX_DP; > + udphy->lane_mux_sel[3] = PHY_LANE_MUX_DP; > + udphy->dp_aux_dout_sel = PHY_AUX_DP_DATA_POL_NORMAL; > + udphy->dp_aux_din_sel = PHY_AUX_DP_DATA_POL_NORMAL; > + gpiod_set_value_cansleep(udphy->sbu1_dc_gpio, 0); > + gpiod_set_value_cansleep(udphy->sbu2_dc_gpio, 1); > + } > + > + udphy->mode = UDPHY_MODE_DP_USB; > +} > + > +static int rk_udphy_orien_sw_set(struct typec_switch_dev *sw, > + enum typec_orientation orien) > +{ > + struct rk_udphy *udphy = typec_switch_get_drvdata(sw); > + > + mutex_lock(&udphy->mutex); > + > + if (orien == TYPEC_ORIENTATION_NONE) { > + gpiod_set_value_cansleep(udphy->sbu1_dc_gpio, 0); > + gpiod_set_value_cansleep(udphy->sbu2_dc_gpio, 0); > + /* unattached */ > + rk_udphy_usb_bvalid_enable(udphy, false); > + goto unlock_ret; > + } > + > + udphy->flip = (orien == TYPEC_ORIENTATION_REVERSE) ? true : false; > + rk_udphy_set_typec_default_mapping(udphy); > + rk_udphy_usb_bvalid_enable(udphy, true); > + > +unlock_ret: > + mutex_unlock(&udphy->mutex); > + return ret; This will break built. It was return 0 preivously. This change should be aprt of 2/2 where "int ret;" is introduced. CJ > +} > + > +static void rk_udphy_orien_switch_unregister(void *data) > +{ > + struct rk_udphy *udphy = data; > + > + typec_switch_unregister(udphy->sw); > +} > + > +static int rk_udphy_setup_orien_switch(struct rk_udphy *udphy) > +{ > + struct typec_switch_desc sw_desc = { }; > + > + sw_desc.drvdata = udphy; > + sw_desc.fwnode = dev_fwnode(udphy->dev); > + sw_desc.set = rk_udphy_orien_sw_set; > + > + udphy->sw = typec_switch_register(udphy->dev, &sw_desc); > + if (IS_ERR(udphy->sw)) { > + dev_err(udphy->dev, "Error register typec orientation switch: %ld\n", > + PTR_ERR(udphy->sw)); > + return PTR_ERR(udphy->sw); > + } > + > + return devm_add_action_or_reset(udphy->dev, > + rk_udphy_orien_switch_unregister, udphy); > +} > + > static int rk_udphy_typec_mux_set(struct typec_mux_dev *mux, > struct typec_mux_state *state) > {
Am Dienstag, 25. Februar 2025, 23:16:21 MEZ schrieb Christophe JAILLET: > Le 25/02/2025 à 19:45, Heiko Stuebner a écrit : > > From: Heiko Stuebner <heiko.stuebner@cherry.de> > > > > Move the typec-orientation-switch functionality further down, next to > > the typec-mux code. Not only brings this the typec-related functionality > > closer together, but also the following change needs access to other > > driver functions, that are below the current position. > > > > No functional change. > > > > Signed-off-by: Heiko Stuebner <heiko.stuebner@cherry.de> > > --- > > drivers/phy/rockchip/phy-rockchip-usbdp.c | 166 +++++++++++----------- > > 1 file changed, 83 insertions(+), 83 deletions(-) > > > > diff --git a/drivers/phy/rockchip/phy-rockchip-usbdp.c b/drivers/phy/rockchip/phy-rockchip-usbdp.c > > index 5b1e8a3806ed..7b17c82ebcfc 100644 > > --- a/drivers/phy/rockchip/phy-rockchip-usbdp.c > > +++ b/drivers/phy/rockchip/phy-rockchip-usbdp.c > > @@ -616,89 +616,6 @@ static void rk_udphy_dp_hpd_event_trigger(struct rk_udphy *udphy, bool hpd) > > rk_udphy_grfreg_write(udphy->vogrf, &cfg->vogrfcfg[udphy->id].hpd_trigger, hpd); > > } > > > > -static void rk_udphy_set_typec_default_mapping(struct rk_udphy *udphy) > > -{ > > - if (udphy->flip) { > > - udphy->dp_lane_sel[0] = 0; > > - udphy->dp_lane_sel[1] = 1; > > - udphy->dp_lane_sel[2] = 3; > > - udphy->dp_lane_sel[3] = 2; > > - udphy->lane_mux_sel[0] = PHY_LANE_MUX_DP; > > - udphy->lane_mux_sel[1] = PHY_LANE_MUX_DP; > > - udphy->lane_mux_sel[2] = PHY_LANE_MUX_USB; > > - udphy->lane_mux_sel[3] = PHY_LANE_MUX_USB; > > - udphy->dp_aux_dout_sel = PHY_AUX_DP_DATA_POL_INVERT; > > - udphy->dp_aux_din_sel = PHY_AUX_DP_DATA_POL_INVERT; > > - gpiod_set_value_cansleep(udphy->sbu1_dc_gpio, 1); > > - gpiod_set_value_cansleep(udphy->sbu2_dc_gpio, 0); > > - } else { > > - udphy->dp_lane_sel[0] = 2; > > - udphy->dp_lane_sel[1] = 3; > > - udphy->dp_lane_sel[2] = 1; > > - udphy->dp_lane_sel[3] = 0; > > - udphy->lane_mux_sel[0] = PHY_LANE_MUX_USB; > > - udphy->lane_mux_sel[1] = PHY_LANE_MUX_USB; > > - udphy->lane_mux_sel[2] = PHY_LANE_MUX_DP; > > - udphy->lane_mux_sel[3] = PHY_LANE_MUX_DP; > > - udphy->dp_aux_dout_sel = PHY_AUX_DP_DATA_POL_NORMAL; > > - udphy->dp_aux_din_sel = PHY_AUX_DP_DATA_POL_NORMAL; > > - gpiod_set_value_cansleep(udphy->sbu1_dc_gpio, 0); > > - gpiod_set_value_cansleep(udphy->sbu2_dc_gpio, 1); > > - } > > - > > - udphy->mode = UDPHY_MODE_DP_USB; > > -} > > - > > -static int rk_udphy_orien_sw_set(struct typec_switch_dev *sw, > > - enum typec_orientation orien) > > -{ > > - struct rk_udphy *udphy = typec_switch_get_drvdata(sw); > > - > > - mutex_lock(&udphy->mutex); > > - > > - if (orien == TYPEC_ORIENTATION_NONE) { > > - gpiod_set_value_cansleep(udphy->sbu1_dc_gpio, 0); > > - gpiod_set_value_cansleep(udphy->sbu2_dc_gpio, 0); > > - /* unattached */ > > - rk_udphy_usb_bvalid_enable(udphy, false); > > - goto unlock_ret; > > - } > > - > > - udphy->flip = (orien == TYPEC_ORIENTATION_REVERSE) ? true : false; > > - rk_udphy_set_typec_default_mapping(udphy); > > - rk_udphy_usb_bvalid_enable(udphy, true); > > - > > -unlock_ret: > > - mutex_unlock(&udphy->mutex); > > - return 0; > > -} > > - > > -static void rk_udphy_orien_switch_unregister(void *data) > > -{ > > - struct rk_udphy *udphy = data; > > - > > - typec_switch_unregister(udphy->sw); > > -} > > - > > -static int rk_udphy_setup_orien_switch(struct rk_udphy *udphy) > > -{ > > - struct typec_switch_desc sw_desc = { }; > > - > > - sw_desc.drvdata = udphy; > > - sw_desc.fwnode = dev_fwnode(udphy->dev); > > - sw_desc.set = rk_udphy_orien_sw_set; > > - > > - udphy->sw = typec_switch_register(udphy->dev, &sw_desc); > > - if (IS_ERR(udphy->sw)) { > > - dev_err(udphy->dev, "Error register typec orientation switch: %ld\n", > > - PTR_ERR(udphy->sw)); > > - return PTR_ERR(udphy->sw); > > - } > > - > > - return devm_add_action_or_reset(udphy->dev, > > - rk_udphy_orien_switch_unregister, udphy); > > -} > > - > > static int rk_udphy_refclk_set(struct rk_udphy *udphy) > > { > > unsigned long rate; > > @@ -1323,6 +1240,89 @@ static const struct phy_ops rk_udphy_usb3_phy_ops = { > > .owner = THIS_MODULE, > > }; > > > > +static void rk_udphy_set_typec_default_mapping(struct rk_udphy *udphy) > > +{ > > + if (udphy->flip) { > > + udphy->dp_lane_sel[0] = 0; > > + udphy->dp_lane_sel[1] = 1; > > + udphy->dp_lane_sel[2] = 3; > > + udphy->dp_lane_sel[3] = 2; > > + udphy->lane_mux_sel[0] = PHY_LANE_MUX_DP; > > + udphy->lane_mux_sel[1] = PHY_LANE_MUX_DP; > > + udphy->lane_mux_sel[2] = PHY_LANE_MUX_USB; > > + udphy->lane_mux_sel[3] = PHY_LANE_MUX_USB; > > + udphy->dp_aux_dout_sel = PHY_AUX_DP_DATA_POL_INVERT; > > + udphy->dp_aux_din_sel = PHY_AUX_DP_DATA_POL_INVERT; > > + gpiod_set_value_cansleep(udphy->sbu1_dc_gpio, 1); > > + gpiod_set_value_cansleep(udphy->sbu2_dc_gpio, 0); > > + } else { > > + udphy->dp_lane_sel[0] = 2; > > + udphy->dp_lane_sel[1] = 3; > > + udphy->dp_lane_sel[2] = 1; > > + udphy->dp_lane_sel[3] = 0; > > + udphy->lane_mux_sel[0] = PHY_LANE_MUX_USB; > > + udphy->lane_mux_sel[1] = PHY_LANE_MUX_USB; > > + udphy->lane_mux_sel[2] = PHY_LANE_MUX_DP; > > + udphy->lane_mux_sel[3] = PHY_LANE_MUX_DP; > > + udphy->dp_aux_dout_sel = PHY_AUX_DP_DATA_POL_NORMAL; > > + udphy->dp_aux_din_sel = PHY_AUX_DP_DATA_POL_NORMAL; > > + gpiod_set_value_cansleep(udphy->sbu1_dc_gpio, 0); > > + gpiod_set_value_cansleep(udphy->sbu2_dc_gpio, 1); > > + } > > + > > + udphy->mode = UDPHY_MODE_DP_USB; > > +} > > + > > +static int rk_udphy_orien_sw_set(struct typec_switch_dev *sw, > > + enum typec_orientation orien) > > +{ > > + struct rk_udphy *udphy = typec_switch_get_drvdata(sw); > > + > > + mutex_lock(&udphy->mutex); > > + > > + if (orien == TYPEC_ORIENTATION_NONE) { > > + gpiod_set_value_cansleep(udphy->sbu1_dc_gpio, 0); > > + gpiod_set_value_cansleep(udphy->sbu2_dc_gpio, 0); > > + /* unattached */ > > + rk_udphy_usb_bvalid_enable(udphy, false); > > + goto unlock_ret; > > + } > > + > > + udphy->flip = (orien == TYPEC_ORIENTATION_REVERSE) ? true : false; > > + rk_udphy_set_typec_default_mapping(udphy); > > + rk_udphy_usb_bvalid_enable(udphy, true); > > + > > +unlock_ret: > > + mutex_unlock(&udphy->mutex); > > + return ret; > > This will break built. > > It was return 0 preivously. > This change should be aprt of 2/2 where "int ret;" is introduced. Thanks for noticing that mishap, will fix that in v2. Heiko
diff --git a/drivers/phy/rockchip/phy-rockchip-usbdp.c b/drivers/phy/rockchip/phy-rockchip-usbdp.c index 5b1e8a3806ed..7b17c82ebcfc 100644 --- a/drivers/phy/rockchip/phy-rockchip-usbdp.c +++ b/drivers/phy/rockchip/phy-rockchip-usbdp.c @@ -616,89 +616,6 @@ static void rk_udphy_dp_hpd_event_trigger(struct rk_udphy *udphy, bool hpd) rk_udphy_grfreg_write(udphy->vogrf, &cfg->vogrfcfg[udphy->id].hpd_trigger, hpd); } -static void rk_udphy_set_typec_default_mapping(struct rk_udphy *udphy) -{ - if (udphy->flip) { - udphy->dp_lane_sel[0] = 0; - udphy->dp_lane_sel[1] = 1; - udphy->dp_lane_sel[2] = 3; - udphy->dp_lane_sel[3] = 2; - udphy->lane_mux_sel[0] = PHY_LANE_MUX_DP; - udphy->lane_mux_sel[1] = PHY_LANE_MUX_DP; - udphy->lane_mux_sel[2] = PHY_LANE_MUX_USB; - udphy->lane_mux_sel[3] = PHY_LANE_MUX_USB; - udphy->dp_aux_dout_sel = PHY_AUX_DP_DATA_POL_INVERT; - udphy->dp_aux_din_sel = PHY_AUX_DP_DATA_POL_INVERT; - gpiod_set_value_cansleep(udphy->sbu1_dc_gpio, 1); - gpiod_set_value_cansleep(udphy->sbu2_dc_gpio, 0); - } else { - udphy->dp_lane_sel[0] = 2; - udphy->dp_lane_sel[1] = 3; - udphy->dp_lane_sel[2] = 1; - udphy->dp_lane_sel[3] = 0; - udphy->lane_mux_sel[0] = PHY_LANE_MUX_USB; - udphy->lane_mux_sel[1] = PHY_LANE_MUX_USB; - udphy->lane_mux_sel[2] = PHY_LANE_MUX_DP; - udphy->lane_mux_sel[3] = PHY_LANE_MUX_DP; - udphy->dp_aux_dout_sel = PHY_AUX_DP_DATA_POL_NORMAL; - udphy->dp_aux_din_sel = PHY_AUX_DP_DATA_POL_NORMAL; - gpiod_set_value_cansleep(udphy->sbu1_dc_gpio, 0); - gpiod_set_value_cansleep(udphy->sbu2_dc_gpio, 1); - } - - udphy->mode = UDPHY_MODE_DP_USB; -} - -static int rk_udphy_orien_sw_set(struct typec_switch_dev *sw, - enum typec_orientation orien) -{ - struct rk_udphy *udphy = typec_switch_get_drvdata(sw); - - mutex_lock(&udphy->mutex); - - if (orien == TYPEC_ORIENTATION_NONE) { - gpiod_set_value_cansleep(udphy->sbu1_dc_gpio, 0); - gpiod_set_value_cansleep(udphy->sbu2_dc_gpio, 0); - /* unattached */ - rk_udphy_usb_bvalid_enable(udphy, false); - goto unlock_ret; - } - - udphy->flip = (orien == TYPEC_ORIENTATION_REVERSE) ? true : false; - rk_udphy_set_typec_default_mapping(udphy); - rk_udphy_usb_bvalid_enable(udphy, true); - -unlock_ret: - mutex_unlock(&udphy->mutex); - return 0; -} - -static void rk_udphy_orien_switch_unregister(void *data) -{ - struct rk_udphy *udphy = data; - - typec_switch_unregister(udphy->sw); -} - -static int rk_udphy_setup_orien_switch(struct rk_udphy *udphy) -{ - struct typec_switch_desc sw_desc = { }; - - sw_desc.drvdata = udphy; - sw_desc.fwnode = dev_fwnode(udphy->dev); - sw_desc.set = rk_udphy_orien_sw_set; - - udphy->sw = typec_switch_register(udphy->dev, &sw_desc); - if (IS_ERR(udphy->sw)) { - dev_err(udphy->dev, "Error register typec orientation switch: %ld\n", - PTR_ERR(udphy->sw)); - return PTR_ERR(udphy->sw); - } - - return devm_add_action_or_reset(udphy->dev, - rk_udphy_orien_switch_unregister, udphy); -} - static int rk_udphy_refclk_set(struct rk_udphy *udphy) { unsigned long rate; @@ -1323,6 +1240,89 @@ static const struct phy_ops rk_udphy_usb3_phy_ops = { .owner = THIS_MODULE, }; +static void rk_udphy_set_typec_default_mapping(struct rk_udphy *udphy) +{ + if (udphy->flip) { + udphy->dp_lane_sel[0] = 0; + udphy->dp_lane_sel[1] = 1; + udphy->dp_lane_sel[2] = 3; + udphy->dp_lane_sel[3] = 2; + udphy->lane_mux_sel[0] = PHY_LANE_MUX_DP; + udphy->lane_mux_sel[1] = PHY_LANE_MUX_DP; + udphy->lane_mux_sel[2] = PHY_LANE_MUX_USB; + udphy->lane_mux_sel[3] = PHY_LANE_MUX_USB; + udphy->dp_aux_dout_sel = PHY_AUX_DP_DATA_POL_INVERT; + udphy->dp_aux_din_sel = PHY_AUX_DP_DATA_POL_INVERT; + gpiod_set_value_cansleep(udphy->sbu1_dc_gpio, 1); + gpiod_set_value_cansleep(udphy->sbu2_dc_gpio, 0); + } else { + udphy->dp_lane_sel[0] = 2; + udphy->dp_lane_sel[1] = 3; + udphy->dp_lane_sel[2] = 1; + udphy->dp_lane_sel[3] = 0; + udphy->lane_mux_sel[0] = PHY_LANE_MUX_USB; + udphy->lane_mux_sel[1] = PHY_LANE_MUX_USB; + udphy->lane_mux_sel[2] = PHY_LANE_MUX_DP; + udphy->lane_mux_sel[3] = PHY_LANE_MUX_DP; + udphy->dp_aux_dout_sel = PHY_AUX_DP_DATA_POL_NORMAL; + udphy->dp_aux_din_sel = PHY_AUX_DP_DATA_POL_NORMAL; + gpiod_set_value_cansleep(udphy->sbu1_dc_gpio, 0); + gpiod_set_value_cansleep(udphy->sbu2_dc_gpio, 1); + } + + udphy->mode = UDPHY_MODE_DP_USB; +} + +static int rk_udphy_orien_sw_set(struct typec_switch_dev *sw, + enum typec_orientation orien) +{ + struct rk_udphy *udphy = typec_switch_get_drvdata(sw); + + mutex_lock(&udphy->mutex); + + if (orien == TYPEC_ORIENTATION_NONE) { + gpiod_set_value_cansleep(udphy->sbu1_dc_gpio, 0); + gpiod_set_value_cansleep(udphy->sbu2_dc_gpio, 0); + /* unattached */ + rk_udphy_usb_bvalid_enable(udphy, false); + goto unlock_ret; + } + + udphy->flip = (orien == TYPEC_ORIENTATION_REVERSE) ? true : false; + rk_udphy_set_typec_default_mapping(udphy); + rk_udphy_usb_bvalid_enable(udphy, true); + +unlock_ret: + mutex_unlock(&udphy->mutex); + return ret; +} + +static void rk_udphy_orien_switch_unregister(void *data) +{ + struct rk_udphy *udphy = data; + + typec_switch_unregister(udphy->sw); +} + +static int rk_udphy_setup_orien_switch(struct rk_udphy *udphy) +{ + struct typec_switch_desc sw_desc = { }; + + sw_desc.drvdata = udphy; + sw_desc.fwnode = dev_fwnode(udphy->dev); + sw_desc.set = rk_udphy_orien_sw_set; + + udphy->sw = typec_switch_register(udphy->dev, &sw_desc); + if (IS_ERR(udphy->sw)) { + dev_err(udphy->dev, "Error register typec orientation switch: %ld\n", + PTR_ERR(udphy->sw)); + return PTR_ERR(udphy->sw); + } + + return devm_add_action_or_reset(udphy->dev, + rk_udphy_orien_switch_unregister, udphy); +} + static int rk_udphy_typec_mux_set(struct typec_mux_dev *mux, struct typec_mux_state *state) {