phy: cadence: Sierra: Use clk_parent_data to provide parent information
authorLars-Peter Clausen <lars@metafoo.de>
Sun, 26 Mar 2023 01:14:16 +0000 (18:14 -0700)
committerVinod Koul <vkoul@kernel.org>
Fri, 31 Mar 2023 13:46:05 +0000 (19:16 +0530)
Rather than requesting the parent reference clocks for the sierra PHY PLLs
and then assigning the parents as a struct clk. Use the clk_parent_data
feature for the clock framework and only specify the firmware names of the
parent clocks.

The clock framework internally will then translate this to the actual
clocks. This allows to remove a bit of boilerplate code.

It also allows to only specify a single reference clock for both PLLs,
which is a valid use case. The clock framework can handle the case where
not all inputs for a clock mux are connected, while the custom
implementation in the driver could not.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Link: https://lore.kernel.org/r/20230326011416.363318-2-lars@metafoo.de
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/phy/cadence/phy-cadence-sierra.c

index 05abce477ce5c56177549f61c20485ad67116349..ab0a37618ef37966651087145d1d2788b8561c30 100644 (file)
 #define PLL_LOCK_TIME                                  100000
 
 #define CDNS_SIERRA_OUTPUT_CLOCKS                      3
-#define CDNS_SIERRA_INPUT_CLOCKS                       5
+#define CDNS_SIERRA_INPUT_CLOCKS                       3
 enum cdns_sierra_clock_input {
        PHY_CLK,
        CMN_REFCLK_DIG_DIV,
        CMN_REFCLK1_DIG_DIV,
-       PLL0_REFCLK,
-       PLL1_REFCLK,
 };
 
 #define SIERRA_NUM_CMN_PLLC                            2
@@ -274,9 +272,18 @@ struct cdns_sierra_pll_mux {
 #define to_cdns_sierra_pll_mux(_hw)    \
                        container_of(_hw, struct cdns_sierra_pll_mux, hw)
 
-static const int pll_mux_parent_index[][SIERRA_NUM_CMN_PLLC_PARENTS] = {
-       [CMN_PLLLC] = { PLL0_REFCLK, PLL1_REFCLK },
-       [CMN_PLLLC1] = { PLL1_REFCLK, PLL0_REFCLK },
+#define PLL0_REFCLK_NAME "pll0_refclk"
+#define PLL1_REFCLK_NAME "pll1_refclk"
+
+static const struct clk_parent_data pll_mux_parent_data[][SIERRA_NUM_CMN_PLLC_PARENTS] = {
+       [CMN_PLLLC] = {
+               { .fw_name = PLL0_REFCLK_NAME },
+               { .fw_name = PLL1_REFCLK_NAME }
+       },
+       [CMN_PLLLC1] = {
+               { .fw_name = PLL1_REFCLK_NAME },
+               { .fw_name = PLL0_REFCLK_NAME }
+       },
 };
 
 static u32 cdns_sierra_pll_mux_table[][SIERRA_NUM_CMN_PLLC_PARENTS] = {
@@ -722,39 +729,21 @@ static int cdns_sierra_pll_mux_register(struct cdns_sierra_phy *sp,
        struct cdns_sierra_pll_mux *mux;
        struct device *dev = sp->dev;
        struct clk_init_data *init;
-       const char **parent_names;
-       unsigned int num_parents;
        char clk_name[100];
-       struct clk *clk;
        int ret;
-       int i;
 
        mux = devm_kzalloc(dev, sizeof(*mux), GFP_KERNEL);
        if (!mux)
                return -ENOMEM;
 
-       num_parents = SIERRA_NUM_CMN_PLLC_PARENTS;
-       parent_names = devm_kzalloc(dev, (sizeof(char *) * num_parents), GFP_KERNEL);
-       if (!parent_names)
-               return -ENOMEM;
-
-       for (i = 0; i < num_parents; i++) {
-               clk = sp->input_clks[pll_mux_parent_index[clk_index][i]];
-               if (IS_ERR_OR_NULL(clk)) {
-                       dev_err(dev, "No parent clock for PLL mux clocks\n");
-                       return IS_ERR(clk) ? PTR_ERR(clk) : -ENOENT;
-               }
-               parent_names[i] = __clk_get_name(clk);
-       }
-
        snprintf(clk_name, sizeof(clk_name), "%s_%s", dev_name(dev), clk_names[clk_index]);
 
        init = &mux->clk_data;
 
        init->ops = &cdns_sierra_pll_mux_ops;
        init->flags = CLK_SET_RATE_NO_REPARENT;
-       init->parent_names = parent_names;
-       init->num_parents = num_parents;
+       init->parent_data = pll_mux_parent_data[clk_index];
+       init->num_parents = SIERRA_NUM_CMN_PLLC_PARENTS;
        init->name = clk_name;
 
        mux->pfdclk_sel_preg = pfdclk1_sel_field;
@@ -1151,22 +1140,6 @@ static int cdns_sierra_phy_get_clocks(struct cdns_sierra_phy *sp,
        }
        sp->input_clks[CMN_REFCLK1_DIG_DIV] = clk;
 
-       clk = devm_clk_get_optional(dev, "pll0_refclk");
-       if (IS_ERR(clk)) {
-               dev_err(dev, "pll0_refclk clock not found\n");
-               ret = PTR_ERR(clk);
-               return ret;
-       }
-       sp->input_clks[PLL0_REFCLK] = clk;
-
-       clk = devm_clk_get_optional(dev, "pll1_refclk");
-       if (IS_ERR(clk)) {
-               dev_err(dev, "pll1_refclk clock not found\n");
-               ret = PTR_ERR(clk);
-               return ret;
-       }
-       sp->input_clks[PLL1_REFCLK] = clk;
-
        return 0;
 }