[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20250722-add-displayport-support-for-qcs615-platform-v2-10-42b4037171f8@oss.qualcomm.com>
Date: Tue, 22 Jul 2025 15:22:11 +0800
From: Xiangxu Yin <xiangxu.yin@....qualcomm.com>
To: Rob Clark <robin.clark@....qualcomm.com>,
Dmitry Baryshkov <lumag@...nel.org>,
Abhinav Kumar <abhinav.kumar@...ux.dev>,
Jessica Zhang <jessica.zhang@....qualcomm.com>,
Sean Paul <sean@...rly.run>,
Marijn Suijten <marijn.suijten@...ainline.org>,
Maarten Lankhorst <maarten.lankhorst@...ux.intel.com>,
Maxime Ripard <mripard@...nel.org>,
Thomas Zimmermann <tzimmermann@...e.de>,
David Airlie <airlied@...il.com>, Simona Vetter <simona@...ll.ch>,
Rob Herring <robh@...nel.org>,
Krzysztof Kozlowski <krzk+dt@...nel.org>,
Conor Dooley <conor+dt@...nel.org>,
Kuogee Hsieh <quic_khsieh@...cinc.com>, Vinod Koul <vkoul@...nel.org>,
Kishon Vijay Abraham I <kishon@...nel.org>
Cc: linux-arm-msm@...r.kernel.org, dri-devel@...ts.freedesktop.org,
freedreno@...ts.freedesktop.org, devicetree@...r.kernel.org,
linux-kernel@...r.kernel.org, linux-phy@...ts.infradead.org,
dmitry.baryshkov@....qualcomm.com, konrad.dybcio@....qualcomm.com,
fange.zhang@....qualcomm.com, quic_lliu6@...cinc.com,
quic_yongmou@...cinc.com, Xiangxu Yin <xiangxu.yin@....qualcomm.com>
Subject: [PATCH v2 10/13] phy: qcom: qmp-usbc: Track PHYs for standalone
DP/USB3.0 handling
Introduce a local list to track registered PHY instances, enabling
identification of standalone DP and USB3.0 PHYs that share the same TCSR
region.
This allows the driver to detect and manage mutually exclusive PHYs at
runtime, preventing configuration conflicts when both PHYs are present
on the same platform but operate independently.
Signed-off-by: Xiangxu Yin <xiangxu.yin@....qualcomm.com>
---
drivers/phy/qualcomm/phy-qcom-qmp-usbc.c | 51 ++++++++++++++++++++++++++++++--
1 file changed, 48 insertions(+), 3 deletions(-)
diff --git a/drivers/phy/qualcomm/phy-qcom-qmp-usbc.c b/drivers/phy/qualcomm/phy-qcom-qmp-usbc.c
index 6291298904de9717283e59f1ca2a845b46146d52..e97a206a10554b2d157d1fadd66d66386eec6c40 100644
--- a/drivers/phy/qualcomm/phy-qcom-qmp-usbc.c
+++ b/drivers/phy/qualcomm/phy-qcom-qmp-usbc.c
@@ -514,8 +514,13 @@ struct qmp_usbc {
u32 dp_phy_mode_reg;
struct typec_switch_dev *sw;
+
+ struct list_head list;
};
+static LIST_HEAD(phy_list);
+static DEFINE_MUTEX(phy_list_mutex);
+
static inline void qphy_setbits(void __iomem *base, u32 offset, u32 val)
{
u32 reg;
@@ -1107,6 +1112,25 @@ static int qmp_usbc_usb_power_off(struct phy *phy)
return 0;
}
+static int qmp_check_mutex_phy(struct qmp_usbc *qmp)
+{
+ struct qmp_usbc *mutex_qmp = NULL;
+
+ mutex_lock(&phy_list_mutex);
+ list_for_each_entry(mutex_qmp, &phy_list, list) {
+ if (qmp->type != mutex_qmp->type &&
+ mutex_qmp->dp_phy_mode_reg == qmp->dp_phy_mode_reg &&
+ mutex_qmp->init_count > 0) {
+ dev_info(qmp->dev, "Mutex phy busy!\n");
+ mutex_unlock(&phy_list_mutex);
+ return -EBUSY;
+ }
+ }
+ mutex_unlock(&phy_list_mutex);
+
+ return 0;
+}
+
static int qmp_usbc_usb_enable(struct phy *phy)
{
struct qmp_usbc *qmp = phy_get_drvdata(phy);
@@ -1114,6 +1138,10 @@ static int qmp_usbc_usb_enable(struct phy *phy)
mutex_lock(&qmp->phy_mutex);
+ ret = qmp_check_mutex_phy(qmp);
+ if (ret)
+ goto out_unlock;
+
ret = qmp_usbc_generic_init(phy);
if (ret)
goto out_unlock;
@@ -1166,6 +1194,10 @@ static int qmp_usbc_dp_enable(struct phy *phy)
mutex_lock(&qmp->phy_mutex);
+ ret = qmp_check_mutex_phy(qmp);
+ if (ret)
+ goto dp_init_unlock;
+
ret = qmp_usbc_generic_init(phy);
if (ret) {
dev_err(qmp->dev, "type(%d) com_init fail\n", qmp->type);
@@ -1772,15 +1804,16 @@ static int qmp_usbc_parse_usb_dt(struct qmp_usbc *qmp)
return 0;
}
-static int qmp_usbc_parse_vls_clamp(struct qmp_usbc *qmp)
+static int qmp_usbc_parse_usb_tcsr(struct qmp_usbc *qmp)
{
struct of_phandle_args tcsr_args;
struct device *dev = qmp->dev;
int ret;
- /* for backwards compatibility ignore if there is no property */
+ /* for backwards compatibility ignore if there is 1 or no property */
ret = of_parse_phandle_with_fixed_args(dev->of_node, "qcom,tcsr-reg", 1, 0,
&tcsr_args);
+
if (ret == -ENOENT)
return 0;
else if (ret < 0)
@@ -1793,6 +1826,13 @@ static int qmp_usbc_parse_vls_clamp(struct qmp_usbc *qmp)
qmp->vls_clamp_reg = tcsr_args.args[0];
+ ret = of_parse_phandle_with_fixed_args(dev->of_node, "qcom,tcsr-reg", 1, 1,
+ &tcsr_args);
+ if (ret == -ENOENT)
+ return 0;
+
+ qmp->dp_phy_mode_reg = tcsr_args.args[0];
+
return 0;
}
@@ -2051,6 +2091,7 @@ static int qmp_usbc_probe(struct platform_device *pdev)
return -EINVAL;
mutex_init(&qmp->phy_mutex);
+ INIT_LIST_HEAD(&qmp->list);
qmp->type = data_cfg->type;
qmp->cfg = data_cfg->cfg;
@@ -2064,7 +2105,7 @@ static int qmp_usbc_probe(struct platform_device *pdev)
if (!qmp->layout)
return -ENOMEM;
- ret = qmp_usbc_parse_vls_clamp(qmp);
+ ret = qmp_usbc_parse_usb_tcsr(qmp);
if (ret)
return ret;
@@ -2139,6 +2180,10 @@ static int qmp_usbc_probe(struct platform_device *pdev)
}
}
+ mutex_lock(&phy_list_mutex);
+ list_add_tail(&qmp->list, &phy_list);
+ mutex_unlock(&phy_list_mutex);
+
phy_set_drvdata(qmp->phy, qmp);
of_node_put(np);
--
2.34.1
Powered by blists - more mailing lists