200 lines
5.6 KiB
Diff
200 lines
5.6 KiB
Diff
From git@z Thu Jan 1 00:00:00 1970
|
|
Subject: [PATCH v13 17/35] phy: rockchip: usbdp: Drop DP HPD handling
|
|
From: Sebastian Reichel <sebastian.reichel@collabora.com>
|
|
Date: Tue, 14 Jul 2026 21:26:18 +0200
|
|
Message-Id: <20260714-rockchip-usbdp-cleanup-v13-17-6cb3e769d4c5@collabora.com>
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset="utf-8"
|
|
Content-Transfer-Encoding: 7bit
|
|
|
|
Drop the HPD handling logic from the USBDP PHY. The registers involved
|
|
require the display controller power domain being enabled and thus the
|
|
HPD signal should be handled by the displayport controller itself.
|
|
Apart from that the HPD handling as it is done here is incorrect and
|
|
misses hotplug events happening after the USB-C connector (e.g. when
|
|
a USB-C to HDMI adapter is involved and the HDMI cable is replugged).
|
|
|
|
Proper USB-C DP HPD support requires some restructuring of the DP
|
|
controller driver, which will happen independent of this patch. The
|
|
mainline kernel does not yet support USB-C DP AltMode on RK3588 and
|
|
RK3576, so it is fine to drop this code without adding the counterpart
|
|
in the DRM in an atomic change.
|
|
|
|
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
|
|
---
|
|
drivers/phy/rockchip/phy-rockchip-usbdp.c | 85 ++++---------------------------
|
|
1 file changed, 9 insertions(+), 76 deletions(-)
|
|
|
|
--- a/drivers/phy/rockchip/phy-rockchip-usbdp.c
|
|
+++ b/drivers/phy/rockchip/phy-rockchip-usbdp.c
|
|
@@ -128,7 +128,6 @@ struct rk_udphy_grf_cfg {
|
|
|
|
struct rk_udphy_vogrf_cfg {
|
|
/* vo-grf */
|
|
- struct rk_udphy_grf_reg hpd_trigger;
|
|
u32 dp_lane_reg;
|
|
};
|
|
|
|
@@ -186,14 +185,11 @@ struct rk_udphy {
|
|
u32 dp_lane_sel[4];
|
|
u32 dp_aux_dout_sel;
|
|
u32 dp_aux_din_sel;
|
|
- bool dp_sink_hpd_sel;
|
|
- bool dp_sink_hpd_cfg;
|
|
unsigned int link_rate;
|
|
unsigned int lanes;
|
|
u8 bw;
|
|
int id;
|
|
|
|
- bool dp_in_use;
|
|
int dp_lanes;
|
|
|
|
/* PHY const config */
|
|
@@ -577,19 +573,6 @@ static void rk_udphy_dp_lane_enable(stru
|
|
CMN_DP_CMN_RSTN, FIELD_PREP(CMN_DP_CMN_RSTN, 0x0));
|
|
}
|
|
|
|
-static void rk_udphy_dp_hpd_event_trigger(struct rk_udphy *udphy, bool hpd)
|
|
-{
|
|
- const struct rk_udphy_cfg *cfg = udphy->cfgs;
|
|
-
|
|
- udphy->dp_sink_hpd_sel = true;
|
|
- udphy->dp_sink_hpd_cfg = hpd;
|
|
-
|
|
- if (!udphy->dp_in_use)
|
|
- return;
|
|
-
|
|
- rk_udphy_grfreg_write(udphy->vogrf, &cfg->vogrfcfg[udphy->id].hpd_trigger, hpd);
|
|
-}
|
|
-
|
|
static void rk_udphy_mode_set(struct rk_udphy *udphy, u8 mode)
|
|
{
|
|
if (udphy->mode == mode)
|
|
@@ -1000,29 +983,6 @@ static void rk_udphy_power_off(struct rk
|
|
rk_udphy_disable(udphy);
|
|
}
|
|
|
|
-static int rk_udphy_dp_phy_init(struct phy *phy)
|
|
-{
|
|
- struct rk_udphy *udphy = phy_get_drvdata(phy);
|
|
-
|
|
- mutex_lock(&udphy->mutex);
|
|
-
|
|
- udphy->dp_in_use = true;
|
|
-
|
|
- mutex_unlock(&udphy->mutex);
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int rk_udphy_dp_phy_exit(struct phy *phy)
|
|
-{
|
|
- struct rk_udphy *udphy = phy_get_drvdata(phy);
|
|
-
|
|
- mutex_lock(&udphy->mutex);
|
|
- udphy->dp_in_use = false;
|
|
- mutex_unlock(&udphy->mutex);
|
|
- return 0;
|
|
-}
|
|
-
|
|
static int rk_udphy_dp_phy_power_on(struct phy *phy)
|
|
{
|
|
struct rk_udphy *udphy = phy_get_drvdata(phy);
|
|
@@ -1254,8 +1214,6 @@ static int rk_udphy_dp_phy_configure(str
|
|
}
|
|
|
|
static const struct phy_ops rk_udphy_dp_phy_ops = {
|
|
- .init = rk_udphy_dp_phy_init,
|
|
- .exit = rk_udphy_dp_phy_exit,
|
|
.power_on = rk_udphy_dp_phy_power_on,
|
|
.power_off = rk_udphy_dp_phy_power_off,
|
|
.configure = rk_udphy_dp_phy_configure,
|
|
@@ -1309,6 +1267,14 @@ static int rk_udphy_typec_mux_set(struct
|
|
struct rk_udphy *udphy = typec_mux_get_drvdata(mux);
|
|
u8 mode;
|
|
|
|
+ /*
|
|
+ * Ignore mux events not involving DP AltMode, because
|
|
+ * the mode field is being reused, e.g. state->mode == 4
|
|
+ * could be either TYPEC_MODE_USB4 or TYPEC_DP_STATE_C.
|
|
+ */
|
|
+ if (!state->alt || state->alt->svid != USB_TYPEC_DP_SID)
|
|
+ return 0;
|
|
+
|
|
mutex_lock(&udphy->mutex);
|
|
|
|
switch (state->mode) {
|
|
@@ -1340,22 +1306,7 @@ static int rk_udphy_typec_mux_set(struct
|
|
break;
|
|
}
|
|
|
|
- if (state->alt && state->alt->svid == USB_TYPEC_DP_SID) {
|
|
- struct typec_displayport_data *data = state->data;
|
|
-
|
|
- if (!data) {
|
|
- rk_udphy_dp_hpd_event_trigger(udphy, false);
|
|
- } else if (data->status & DP_STATUS_IRQ_HPD) {
|
|
- rk_udphy_dp_hpd_event_trigger(udphy, false);
|
|
- usleep_range(750, 800);
|
|
- rk_udphy_dp_hpd_event_trigger(udphy, true);
|
|
- } else if (data->status & DP_STATUS_HPD_STATE) {
|
|
- rk_udphy_mode_set(udphy, mode);
|
|
- rk_udphy_dp_hpd_event_trigger(udphy, true);
|
|
- } else {
|
|
- rk_udphy_dp_hpd_event_trigger(udphy, false);
|
|
- }
|
|
- }
|
|
+ rk_udphy_mode_set(udphy, mode);
|
|
|
|
mutex_unlock(&udphy->mutex);
|
|
return 0;
|
|
@@ -1510,20 +1461,6 @@ static int rk_udphy_probe(struct platfor
|
|
return 0;
|
|
}
|
|
|
|
-static int __maybe_unused rk_udphy_resume(struct device *dev)
|
|
-{
|
|
- struct rk_udphy *udphy = dev_get_drvdata(dev);
|
|
-
|
|
- if (udphy->dp_sink_hpd_sel)
|
|
- rk_udphy_dp_hpd_event_trigger(udphy, udphy->dp_sink_hpd_cfg);
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static const struct dev_pm_ops rk_udphy_pm_ops = {
|
|
- SET_LATE_SYSTEM_SLEEP_PM_OPS(NULL, rk_udphy_resume)
|
|
-};
|
|
-
|
|
static const char * const rk_udphy_rst_list[] = {
|
|
"init", "cmn", "lane", "pcs_apb", "pma_apb"
|
|
};
|
|
@@ -1547,7 +1484,6 @@ static const struct rk_udphy_cfg rk3576_
|
|
},
|
|
.vogrfcfg = {
|
|
{
|
|
- .hpd_trigger = RK_UDPHY_GEN_GRF_REG(0x0000, 11, 10, 1, 3),
|
|
.dp_lane_reg = 0x0000,
|
|
},
|
|
},
|
|
@@ -1588,11 +1524,9 @@ static const struct rk_udphy_cfg rk3588_
|
|
},
|
|
.vogrfcfg = {
|
|
{
|
|
- .hpd_trigger = RK_UDPHY_GEN_GRF_REG(0x0000, 11, 10, 1, 3),
|
|
.dp_lane_reg = 0x0000,
|
|
},
|
|
{
|
|
- .hpd_trigger = RK_UDPHY_GEN_GRF_REG(0x0008, 11, 10, 1, 3),
|
|
.dp_lane_reg = 0x0008,
|
|
},
|
|
},
|
|
@@ -1628,7 +1562,6 @@ static struct platform_driver rk_udphy_d
|
|
.driver = {
|
|
.name = "rockchip-usbdp-phy",
|
|
.of_match_table = rk_udphy_dt_match,
|
|
- .pm = &rk_udphy_pm_ops,
|
|
},
|
|
};
|
|
module_platform_driver(rk_udphy_driver);
|