phy: cadence-torrent: Group reset APIs and clock APIs
authorKishon Vijay Abraham I <kishon@ti.com>
Tue, 30 Mar 2021 11:01:35 +0000 (16:31 +0530)
committerVinod Koul <vkoul@kernel.org>
Wed, 31 Mar 2021 11:15:47 +0000 (16:45 +0530)
No functional change intended. Group reset APIs and clock APIs in
preparation for adding support to skip configuration if the SERDES
is already configured by bootloader.

Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
Reviewed-by: Swapnil Jakhade <sjakhade@cadence.com>
Link: https://lore.kernel.org/r/20210330110138.24356-3-kishon@ti.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/phy/cadence/phy-cadence-torrent.c

index 3fdab0d..ab51c4b 100644 (file)
@@ -2249,6 +2249,54 @@ static int cdns_torrent_clk_register(struct cdns_torrent_phy *cdns_phy)
        return 0;
 }
 
+static int cdns_torrent_reset(struct cdns_torrent_phy *cdns_phy)
+{
+       struct device *dev = cdns_phy->dev;
+
+       cdns_phy->phy_rst = devm_reset_control_get_exclusive_by_index(dev, 0);
+       if (IS_ERR(cdns_phy->phy_rst)) {
+               dev_err(dev, "%s: failed to get reset\n",
+                       dev->of_node->full_name);
+               return PTR_ERR(cdns_phy->phy_rst);
+       }
+
+       cdns_phy->apb_rst = devm_reset_control_get_optional(dev, "torrent_apb");
+       if (IS_ERR(cdns_phy->apb_rst)) {
+               dev_err(dev, "%s: failed to get apb reset\n",
+                       dev->of_node->full_name);
+               return PTR_ERR(cdns_phy->apb_rst);
+       }
+
+       return 0;
+}
+
+static int cdns_torrent_clk(struct cdns_torrent_phy *cdns_phy)
+{
+       struct device *dev = cdns_phy->dev;
+       int ret;
+
+       cdns_phy->clk = devm_clk_get(dev, "refclk");
+       if (IS_ERR(cdns_phy->clk)) {
+               dev_err(dev, "phy ref clock not found\n");
+               return PTR_ERR(cdns_phy->clk);
+       }
+
+       ret = clk_prepare_enable(cdns_phy->clk);
+       if (ret) {
+               dev_err(cdns_phy->dev, "Failed to prepare ref clock\n");
+               return ret;
+       }
+
+       cdns_phy->ref_clk_rate = clk_get_rate(cdns_phy->clk);
+       if (!(cdns_phy->ref_clk_rate)) {
+               dev_err(cdns_phy->dev, "Failed to get ref clock rate\n");
+               clk_disable_unprepare(cdns_phy->clk);
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
 static int cdns_torrent_phy_probe(struct platform_device *pdev)
 {
        struct cdns_torrent_phy *cdns_phy;
@@ -2274,26 +2322,6 @@ static int cdns_torrent_phy_probe(struct platform_device *pdev)
        cdns_phy->dev = dev;
        cdns_phy->init_data = data;
 
-       cdns_phy->phy_rst = devm_reset_control_get_exclusive_by_index(dev, 0);
-       if (IS_ERR(cdns_phy->phy_rst)) {
-               dev_err(dev, "%s: failed to get reset\n",
-                       dev->of_node->full_name);
-               return PTR_ERR(cdns_phy->phy_rst);
-       }
-
-       cdns_phy->apb_rst = devm_reset_control_get_optional(dev, "torrent_apb");
-       if (IS_ERR(cdns_phy->apb_rst)) {
-               dev_err(dev, "%s: failed to get apb reset\n",
-                       dev->of_node->full_name);
-               return PTR_ERR(cdns_phy->apb_rst);
-       }
-
-       cdns_phy->clk = devm_clk_get(dev, "refclk");
-       if (IS_ERR(cdns_phy->clk)) {
-               dev_err(dev, "phy ref clock not found\n");
-               return PTR_ERR(cdns_phy->clk);
-       }
-
        cdns_phy->sd_base = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(cdns_phy->sd_base))
                return PTR_ERR(cdns_phy->sd_base);
@@ -2316,18 +2344,13 @@ static int cdns_torrent_phy_probe(struct platform_device *pdev)
        if (ret)
                return ret;
 
-       ret = clk_prepare_enable(cdns_phy->clk);
-       if (ret) {
-               dev_err(cdns_phy->dev, "Failed to prepare ref clock\n");
+       ret = cdns_torrent_reset(cdns_phy);
+       if (ret)
                goto clk_cleanup;
-       }
 
-       cdns_phy->ref_clk_rate = clk_get_rate(cdns_phy->clk);
-       if (!(cdns_phy->ref_clk_rate)) {
-               dev_err(cdns_phy->dev, "Failed to get ref clock rate\n");
-               ret = -EINVAL;
-               goto clk_disable;
-       }
+       ret = cdns_torrent_clk(cdns_phy);
+       if (ret)
+               goto clk_cleanup;
 
        /* Enable APB */
        reset_control_deassert(cdns_phy->apb_rst);
@@ -2505,7 +2528,6 @@ put_lnk_rst:
                reset_control_put(cdns_phy->phys[i].lnk_rst);
        of_node_put(child);
        reset_control_assert(cdns_phy->apb_rst);
-clk_disable:
        clk_disable_unprepare(cdns_phy->clk);
 clk_cleanup:
        cdns_torrent_clk_cleanup(cdns_phy);