staging: clocking-wizard: Remove the hardcoding of the clock outputs
authorShubhrajyoti Datta <shubhrajyoti.datta@xilinx.com>
Wed, 24 Feb 2021 13:10:39 +0000 (18:40 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 10 Mar 2021 08:25:30 +0000 (09:25 +0100)
The number of output clocks are configurable in the hardware.
Currently the driver registers the maximum number of outputs.
Fix the same by registering only the outputs that are there.

Signed-off-by: Shubhrajyoti Datta <shubhrajyoti.datta@xilinx.com>
Link: https://lore.kernel.org/r/1614172241-17326-8-git-send-email-shubhrajyoti.datta@xilinx.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/clocking-wizard/clk-xlnx-clock-wizard.c

index fe869ce79c3911d35635b25b98bcd1a7b4aa0b39..39367712ef540ab62ff6c21329a2cd7f111e32b3 100644 (file)
@@ -517,16 +517,15 @@ static int clk_wzrd_probe(struct platform_device *pdev)
        }
 
        /* register div per output */
-       for (i = WZRD_NUM_OUTPUTS - 1; i >= 0 ; i--) {
+       for (i = nr_outputs - 1; i >= 0 ; i--) {
                const char *clkout_name;
 
-               if (of_property_read_string_index(np, "clock-output-names", i,
-                                                 &clkout_name)) {
-                       dev_err(&pdev->dev,
-                               "clock output name not specified\n");
-                       ret = -EINVAL;
-                       goto err_rm_int_clks;
+               clkout_name = kasprintf(GFP_KERNEL, "%s_out%d", dev_name(&pdev->dev), i);
+               if (!clkout_name) {
+                       ret = -ENOMEM;
+                       goto err_rm_int_clk;
                }
+
                if (!i)
                        clk_wzrd->clkout[i] = clk_wzrd_register_divf
                                (&pdev->dev, clkout_name,
@@ -548,7 +547,7 @@ static int clk_wzrd_probe(struct platform_device *pdev)
                if (IS_ERR(clk_wzrd->clkout[i])) {
                        int j;
 
-                       for (j = i + 1; j < WZRD_NUM_OUTPUTS; j++)
+                       for (j = i + 1; j < nr_outputs; j++)
                                clk_unregister(clk_wzrd->clkout[j]);
                        dev_err(&pdev->dev,
                                "unable to register divider clock\n");