usb: dwc3: Rework clock initialization to be more flexible
authorJohn Stultz <john.stultz@linaro.org>
Tue, 25 Feb 2020 17:53:03 +0000 (17:53 +0000)
committerFelipe Balbi <balbi@kernel.org>
Sun, 15 Mar 2020 09:30:51 +0000 (11:30 +0200)
The dwc3 core binding specifies three clocks:
  ref, bus_early, and suspend

which are all controlled in the driver together.

However some variants of the hardware my not have all three
clks, or some may have more. Usually this was handled by using
the dwc3-of-simple glue driver, but that resulted in a
proliferation of bindings for for every variant, when the only
difference was the clocks and resets lists.

So this patch reworks the reading of the clks from the dts to
use devm_clk_bulk_get_all() will will fetch all the clocks
specified in the dts together.

This patch was recommended by Rob Herring <robh@kernel.org>
as an alternative to creating multiple bindings for each variant
of hardware.

Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Rob Herring <robh+dt@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
CC: ShuFan Lee <shufan_lee@richtek.com>
Cc: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Cc: Suzuki K Poulose <suzuki.poulose@arm.com>
Cc: Chunfeng Yun <chunfeng.yun@mediatek.com>
Cc: Yu Chen <chenyu56@huawei.com>
Cc: Felipe Balbi <balbi@kernel.org>
Cc: Hans de Goede <hdegoede@redhat.com>
Cc: Andy Shevchenko <andy.shevchenko@gmail.com>
Cc: Jun Li <lijun.kernel@gmail.com>
Cc: Valentin Schneider <valentin.schneider@arm.com>
Cc: Guillaume Gardet <Guillaume.Gardet@arm.com>
Cc: Jack Pham <jackp@codeaurora.org>
Cc: linux-usb@vger.kernel.org
Cc: devicetree@vger.kernel.org
Suggested-by: Rob Herring <robh@kernel.org>
Signed-off-by: John Stultz <john.stultz@linaro.org>
Signed-off-by: Felipe Balbi <balbi@kernel.org>
drivers/usb/dwc3/core.c

index 43bd5b1ea9e2c179ab26368fb9f9262a2c7394e6..874bc49d417f6fe50d5d5e35412169b4ebb26771 100644 (file)
@@ -289,12 +289,6 @@ done:
        return 0;
 }
 
-static const struct clk_bulk_data dwc3_core_clks[] = {
-       { .id = "ref" },
-       { .id = "bus_early" },
-       { .id = "suspend" },
-};
-
 /*
  * dwc3_frame_length_adjustment - Adjusts frame length if required
  * @dwc3: Pointer to our controller context structure
@@ -1446,11 +1440,6 @@ static int dwc3_probe(struct platform_device *pdev)
        if (!dwc)
                return -ENOMEM;
 
-       dwc->clks = devm_kmemdup(dev, dwc3_core_clks, sizeof(dwc3_core_clks),
-                                GFP_KERNEL);
-       if (!dwc->clks)
-               return -ENOMEM;
-
        dwc->dev = dev;
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -1486,17 +1475,18 @@ static int dwc3_probe(struct platform_device *pdev)
                return PTR_ERR(dwc->reset);
 
        if (dev->of_node) {
-               dwc->num_clks = ARRAY_SIZE(dwc3_core_clks);
-
-               ret = devm_clk_bulk_get(dev, dwc->num_clks, dwc->clks);
+               ret = devm_clk_bulk_get_all(dev, &dwc->clks);
                if (ret == -EPROBE_DEFER)
                        return ret;
                /*
                 * Clocks are optional, but new DT platforms should support all
                 * clocks as required by the DT-binding.
                 */
-               if (ret)
+               if (ret < 0)
                        dwc->num_clks = 0;
+               else
+                       dwc->num_clks = ret;
+
        }
 
        ret = reset_control_deassert(dwc->reset);