From c9faa14df7a3e44eb93c13928cba0cec301213b6 Mon Sep 17 00:00:00 2001 From: William Wu Date: Mon, 14 Dec 2020 21:16:57 +0800 Subject: [PATCH] phy: rockchip: naneng-combphy: add new func for parse dt This patch adds a new function rockchip_combphy_parse_dt() to parse devicetree for combphy, and get reset properties for later reset control. Change-Id: I41821ec9c99a866b04c4514f0fbca55d118b7175 Signed-off-by: William Wu --- .../rockchip/phy-rockchip-naneng-combphy.c | 89 +++++++++++++------ 1 file changed, 63 insertions(+), 26 deletions(-) diff --git a/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c b/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c index a125535e6817..3f3913dce2f5 100644 --- a/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c +++ b/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c @@ -74,6 +74,8 @@ struct rockchip_combphy_priv { struct regmap *pipe_grf; struct regmap *phy_grf; struct phy *phy; + struct reset_control *apb_rst; + struct reset_control *phy_rst; const struct rockchip_combphy_cfg *cfg; }; @@ -222,12 +224,67 @@ static struct phy *rockchip_combphy_xlate(struct device *dev, return priv->phy; } +static int rockchip_combphy_parse_dt(struct device *dev, + struct rockchip_combphy_priv *priv) +{ + const struct rockchip_combphy_cfg *phy_cfg = priv->cfg; + int ret; + + ret = devm_clk_bulk_get(dev, priv->num_clks, priv->clks); + if (ret == -EPROBE_DEFER) + return -EPROBE_DEFER; + if (ret) + priv->num_clks = 0; + + priv->pipe_grf = syscon_regmap_lookup_by_phandle(dev->of_node, + "rockchip,pipe-grf"); + if (IS_ERR(priv->pipe_grf)) { + dev_err(dev, "failed to find peri_ctrl pipe-grf regmap\n"); + return PTR_ERR(priv->pipe_grf); + } + + priv->phy_grf = syscon_regmap_lookup_by_phandle(dev->of_node, + "rockchip,pipe-phy-grf"); + if (IS_ERR(priv->phy_grf)) { + dev_err(dev, "failed to find peri_ctrl pipe-phy-grf regmap\n"); + return PTR_ERR(priv->phy_grf); + } + + if (device_property_present(dev, "rockchip,dis-u3otg0-port")) + param_write(priv->pipe_grf, &phy_cfg->grfcfg->u3otg0_port_en, + false); + else if (device_property_present(dev, "rockchip,dis-u3otg1-port")) + param_write(priv->pipe_grf, &phy_cfg->grfcfg->u3otg1_port_en, + false); + + priv->apb_rst = devm_reset_control_get_optional(dev, "combphy-apb"); + if (IS_ERR(priv->apb_rst)) { + ret = PTR_ERR(priv->apb_rst); + + if (ret != -EPROBE_DEFER) + dev_warn(dev, "failed to get apb reset\n"); + + return ret; + } + + priv->phy_rst = devm_reset_control_get_optional(dev, "combphy"); + if (IS_ERR(priv->phy_rst)) { + ret = PTR_ERR(priv->phy_rst); + + if (ret != -EPROBE_DEFER) + dev_warn(dev, "failed to get phy reset\n"); + + return ret; + } + + return 0; +} + static int rockchip_combphy_probe(struct platform_device *pdev) { struct phy_provider *phy_provider; struct device *dev = &pdev->dev; struct rockchip_combphy_priv *priv; - struct device_node *np = dev->of_node; const struct rockchip_combphy_cfg *phy_cfg; struct resource *res; int ret; @@ -258,34 +315,14 @@ static int rockchip_combphy_probe(struct platform_device *pdev) if (!priv->clks) return -ENOMEM; - ret = devm_clk_bulk_get(dev, priv->num_clks, priv->clks); - if (ret == -EPROBE_DEFER) - return -EPROBE_DEFER; - if (ret) - priv->num_clks = 0; - - priv->pipe_grf = syscon_regmap_lookup_by_phandle(np, "rockchip,pipe-grf"); - if (IS_ERR(priv->pipe_grf)) { - dev_err(dev, "failed to find peri_ctrl pipe-grf regmap\n"); - return PTR_ERR(priv->pipe_grf); - } - - priv->phy_grf = syscon_regmap_lookup_by_phandle(np, "rockchip,pipe-phy-grf"); - if (IS_ERR(priv->phy_grf)) { - dev_err(dev, "failed to find peri_ctrl pipe-phy-grf regmap\n"); - return PTR_ERR(priv->phy_grf); - } - - if (device_property_present(dev, "rockchip,dis-u3otg0-port")) - param_write(priv->pipe_grf, &phy_cfg->grfcfg->u3otg0_port_en, - false); - else if (device_property_present(dev, "rockchip,dis-u3otg1-port")) - param_write(priv->pipe_grf, &phy_cfg->grfcfg->u3otg1_port_en, - false); - priv->dev = dev; priv->mode = PHY_NONE; priv->cfg = phy_cfg; + + ret = rockchip_combphy_parse_dt(dev, priv); + if (ret) + return ret; + priv->phy = devm_phy_create(dev, NULL, &rochchip_combphy_ops); if (IS_ERR(priv->phy)) { dev_err(dev, "failed to create combphy\n");