aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Stultz <[email protected]>2020-02-25 17:53:03 +0000
committerFelipe Balbi <[email protected]>2020-03-15 11:30:51 +0200
commit0d3a97083e0c6cb70d8e02db342a36bb695d43ea (patch)
treef7133da24d629dea4e9839b407934c1b905c8d92
parentb1816afaf51641e20bcaad27e299d2c6030f9861 (diff)
usb: dwc3: Rework clock initialization to be more flexible
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 <[email protected]> as an alternative to creating multiple bindings for each variant of hardware. Cc: Greg Kroah-Hartman <[email protected]> Cc: Rob Herring <[email protected]> Cc: Mark Rutland <[email protected]> CC: ShuFan Lee <[email protected]> Cc: Heikki Krogerus <[email protected]> Cc: Suzuki K Poulose <[email protected]> Cc: Chunfeng Yun <[email protected]> Cc: Yu Chen <[email protected]> Cc: Felipe Balbi <[email protected]> Cc: Hans de Goede <[email protected]> Cc: Andy Shevchenko <[email protected]> Cc: Jun Li <[email protected]> Cc: Valentin Schneider <[email protected]> Cc: Guillaume Gardet <[email protected]> Cc: Jack Pham <[email protected]> Cc: [email protected] Cc: [email protected] Suggested-by: Rob Herring <[email protected]> Signed-off-by: John Stultz <[email protected]> Signed-off-by: Felipe Balbi <[email protected]>
-rw-r--r--drivers/usb/dwc3/core.c20
1 files changed, 5 insertions, 15 deletions
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index 43bd5b1ea9e2..874bc49d417f 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -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);