mirror of
https://github.com/armbian/build
synced 2025-09-24 19:47:06 +07:00
Rockchip RK3588: Adjust mainlined patch
This commit is contained in:
@@ -1,136 +1,3 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Heiko Stuebner <heiko.stuebner@cherry.de>
|
||||
Date: Fri, 6 Dec 2024 11:34:01 +0100
|
||||
Subject: phy: phy-rockchip-samsung-hdptx: Don't use dt aliases to determine
|
||||
phy-id
|
||||
|
||||
The phy needs to know its identity in the system (phy0 or phy1 on rk3588)
|
||||
for some actions and the driver currently contains code abusing of_alias
|
||||
for that.
|
||||
|
||||
Devicetree aliases are always optional and should not be used for core
|
||||
device functionality, so instead keep a list of phys on a soc in the
|
||||
of_device_data and find the phy-id by comparing against the mapped
|
||||
register-base.
|
||||
|
||||
Fixes: c4b09c562086 ("phy: phy-rockchip-samsung-hdptx: Add clock provider support")
|
||||
Signed-off-by: Heiko Stuebner <heiko.stuebner@cherry.de>
|
||||
Reviewed-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
|
||||
Link: https://lore.kernel.org/r/20241206103401.1780416-3-heiko@sntech.de
|
||||
Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
|
||||
---
|
||||
drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c | 50 ++++++++--
|
||||
1 file changed, 44 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c b/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c
|
||||
index 111111111111..222222222222 100644
|
||||
--- a/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c
|
||||
+++ b/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c
|
||||
@@ -263,11 +263,22 @@ enum rk_hdptx_reset {
|
||||
RST_MAX
|
||||
};
|
||||
|
||||
+#define MAX_HDPTX_PHY_NUM 2
|
||||
+
|
||||
+struct rk_hdptx_phy_cfg {
|
||||
+ unsigned int num_phys;
|
||||
+ unsigned int phy_ids[MAX_HDPTX_PHY_NUM];
|
||||
+};
|
||||
+
|
||||
struct rk_hdptx_phy {
|
||||
struct device *dev;
|
||||
struct regmap *regmap;
|
||||
struct regmap *grf;
|
||||
|
||||
+ /* PHY const config */
|
||||
+ const struct rk_hdptx_phy_cfg *cfgs;
|
||||
+ int phy_id;
|
||||
+
|
||||
struct phy *phy;
|
||||
struct phy_config *phy_cfg;
|
||||
struct clk_bulk_data *clks;
|
||||
@@ -1007,15 +1018,14 @@ static int rk_hdptx_phy_clk_register(struct rk_hdptx_phy *hdptx)
|
||||
struct device *dev = hdptx->dev;
|
||||
const char *name, *pname;
|
||||
struct clk *refclk;
|
||||
- int ret, id;
|
||||
+ int ret;
|
||||
|
||||
refclk = devm_clk_get(dev, "ref");
|
||||
if (IS_ERR(refclk))
|
||||
return dev_err_probe(dev, PTR_ERR(refclk),
|
||||
"Failed to get ref clock\n");
|
||||
|
||||
- id = of_alias_get_id(dev->of_node, "hdptxphy");
|
||||
- name = id > 0 ? "clk_hdmiphy_pixel1" : "clk_hdmiphy_pixel0";
|
||||
+ name = hdptx->phy_id > 0 ? "clk_hdmiphy_pixel1" : "clk_hdmiphy_pixel0";
|
||||
pname = __clk_get_name(refclk);
|
||||
|
||||
hdptx->hw.init = CLK_HW_INIT(name, pname, &hdptx_phy_clk_ops,
|
||||
@@ -1058,8 +1068,9 @@ static int rk_hdptx_phy_probe(struct platform_device *pdev)
|
||||
struct phy_provider *phy_provider;
|
||||
struct device *dev = &pdev->dev;
|
||||
struct rk_hdptx_phy *hdptx;
|
||||
+ struct resource *res;
|
||||
void __iomem *regs;
|
||||
- int ret;
|
||||
+ int ret, id;
|
||||
|
||||
hdptx = devm_kzalloc(dev, sizeof(*hdptx), GFP_KERNEL);
|
||||
if (!hdptx)
|
||||
@@ -1067,11 +1078,27 @@ static int rk_hdptx_phy_probe(struct platform_device *pdev)
|
||||
|
||||
hdptx->dev = dev;
|
||||
|
||||
- regs = devm_platform_ioremap_resource(pdev, 0);
|
||||
+ regs = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
|
||||
if (IS_ERR(regs))
|
||||
return dev_err_probe(dev, PTR_ERR(regs),
|
||||
"Failed to ioremap resource\n");
|
||||
|
||||
+ hdptx->cfgs = device_get_match_data(dev);
|
||||
+ if (!hdptx->cfgs)
|
||||
+ return dev_err_probe(dev, -EINVAL, "missing match data\n");
|
||||
+
|
||||
+ /* find the phy-id from the io address */
|
||||
+ hdptx->phy_id = -ENODEV;
|
||||
+ for (id = 0; id < hdptx->cfgs->num_phys; id++) {
|
||||
+ if (res->start == hdptx->cfgs->phy_ids[id]) {
|
||||
+ hdptx->phy_id = id;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (hdptx->phy_id < 0)
|
||||
+ return dev_err_probe(dev, -ENODEV, "no matching device found\n");
|
||||
+
|
||||
ret = devm_clk_bulk_get_all(dev, &hdptx->clks);
|
||||
if (ret < 0)
|
||||
return dev_err_probe(dev, ret, "Failed to get clocks\n");
|
||||
@@ -1132,8 +1159,19 @@ static const struct dev_pm_ops rk_hdptx_phy_pm_ops = {
|
||||
rk_hdptx_phy_runtime_resume, NULL)
|
||||
};
|
||||
|
||||
+static const struct rk_hdptx_phy_cfg rk3588_hdptx_phy_cfgs = {
|
||||
+ .num_phys = 2,
|
||||
+ .phy_ids = {
|
||||
+ 0xfed60000,
|
||||
+ 0xfed70000,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
static const struct of_device_id rk_hdptx_phy_of_match[] = {
|
||||
- { .compatible = "rockchip,rk3588-hdptx-phy", },
|
||||
+ {
|
||||
+ .compatible = "rockchip,rk3588-hdptx-phy",
|
||||
+ .data = &rk3588_hdptx_phy_cfgs
|
||||
+ },
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, rk_hdptx_phy_of_match);
|
||||
--
|
||||
Armbian
|
||||
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
|
||||
Date: Sat, 7 Dec 2024 21:45:12 +0200
|
||||
|
||||
Reference in New Issue
Block a user