[PATCH v6 7/9] phy: rockchip-samsung-dcphy: Support the new phy-type and direction binding
Jason Yang
jason98166 at gmail.com
Tue Nov 10 00:18:10 PST 2026
The binding now selects the PHY with the cell and the mode of the block
with the phy-type property of the provider. Read phy-type in probe,
D-PHY by default.
of_xlate() returns the transmitter for PHY_DIRECTION_TX. The deprecated
PHY_TYPE_DPHY and PHY_TYPE_CPHY select the transmitter as today, so
existing DTs are unaffected.
A phy-type other than D-PHY or C-PHY fails probe. A deprecated cell
value that does not match phy-type gets a warning, and the transmitter
then refuses to power on, as in C-PHY mode today.
Signed-off-by: Jason Yang <jason98166 at gmail.com>
---
drivers/phy/rockchip/phy-rockchip-samsung-dcphy.c | 32 ++++++++++++++++++-----
1 file changed, 25 insertions(+), 7 deletions(-)
diff --git a/drivers/phy/rockchip/phy-rockchip-samsung-dcphy.c b/drivers/phy/rockchip/phy-rockchip-samsung-dcphy.c
index c40c84791eca..e8e229fc4856 100644
--- a/drivers/phy/rockchip/phy-rockchip-samsung-dcphy.c
+++ b/drivers/phy/rockchip/phy-rockchip-samsung-dcphy.c
@@ -297,6 +297,7 @@ struct samsung_mipi_dcphy {
struct reset_control *grf_apb_rst;
struct samsung_mipi_phy tx;
u8 type;
+ bool legacy_mismatch;
const struct samsung_mipi_dcphy_plat_data *pdata;
struct {
@@ -1376,6 +1377,9 @@ static int samsung_mipi_dcphy_tx_power_on(struct phy *phy)
{
struct samsung_mipi_dcphy *samsung = phy_get_drvdata(phy);
+ if (samsung->legacy_mismatch)
+ return -EOPNOTSUPP;
+
switch (samsung->type) {
case PHY_TYPE_DPHY:
return samsung_mipi_dphy_tx_power_on(samsung);
@@ -1549,13 +1553,21 @@ static struct phy *samsung_mipi_dcphy_xlate(struct device *dev,
return ERR_PTR(-EINVAL);
}
- if (samsung->type != PHY_NONE && samsung->type != args->args[0])
- dev_warn(dev, "phy type select %d overwriting type %d\n",
- args->args[0], samsung->type);
-
- samsung->type = args->args[0];
-
- return samsung->tx.phy;
+ switch (args->args[0]) {
+ case PHY_DIRECTION_TX:
+ return samsung->tx.phy;
+ case PHY_TYPE_DPHY:
+ case PHY_TYPE_CPHY:
+ if (args->args[0] != samsung->type) {
+ dev_warn(dev, "unsupported phy cell %u with phy-type %u\n",
+ args->args[0], samsung->type);
+ samsung->legacy_mismatch = true;
+ }
+ return samsung->tx.phy;
+ default:
+ dev_err(dev, "invalid phy cell %u\n", args->args[0]);
+ return ERR_PTR(-EINVAL);
+ }
}
static int samsung_mipi_dcphy_probe(struct platform_device *pdev)
@@ -1566,6 +1578,7 @@ static int samsung_mipi_dcphy_probe(struct platform_device *pdev)
struct phy_provider *phy_provider;
struct resource *res;
void __iomem *regs;
+ u32 type = PHY_TYPE_DPHY;
int ret;
samsung = devm_kzalloc(dev, sizeof(*samsung), GFP_KERNEL);
@@ -1620,6 +1633,11 @@ static int samsung_mipi_dcphy_probe(struct platform_device *pdev)
return dev_err_probe(dev, PTR_ERR(samsung->grf_apb_rst),
"Failed to get system grf_apb_rst control\n");
+ of_property_read_u32(np, "phy-type", &type);
+ if (type != PHY_TYPE_DPHY && type != PHY_TYPE_CPHY)
+ return dev_err_probe(dev, -EINVAL, "unsupported phy-type %u\n", type);
+ samsung->type = type;
+
ret = devm_pm_runtime_enable(dev);
if (ret)
return dev_err_probe(dev, ret, "Failed to enable runtime PM\n");
--
2.43.0
More information about the Linux-rockchip
mailing list