clk: keystone: sci-clk: split out the fw clock parsing to own function
authorTero Kristo <t-kristo@ti.com>
Tue, 28 May 2019 13:10:21 +0000 (16:10 +0300)
committerTero Kristo <t-kristo@ti.com>
Fri, 7 Jun 2019 09:11:41 +0000 (12:11 +0300)
This makes it both easier to see what the probe does, and also makes it
possible to add alternative implementations for the clock data source.

Acked-by: Santosh Shilimkar <ssantosh@kernel.org>
Signed-off-by: Tero Kristo <t-kristo@ti.com>
drivers/clk/keystone/sci-clk.c

index e737f24..1e465de 100644 (file)
@@ -403,22 +403,8 @@ static const struct of_device_id ti_sci_clk_of_match[] = {
 };
 MODULE_DEVICE_TABLE(of, ti_sci_clk_of_match);
 
-/**
- * ti_sci_clk_probe - Probe function for the TI SCI clock driver
- * @pdev: platform device pointer to be probed
- *
- * Probes the TI SCI clock device. Allocates a new clock provider
- * and registers this to the common clock framework. Also applies
- * any required flags to the identified clocks via clock lists
- * supplied from DT. Returns 0 for success, negative error value
- * for failure.
- */
-static int ti_sci_clk_probe(struct platform_device *pdev)
+static int ti_sci_scan_clocks_from_fw(struct sci_clk_provider *provider)
 {
-       struct device *dev = &pdev->dev;
-       struct device_node *np = dev->of_node;
-       struct sci_clk_provider *provider;
-       const struct ti_sci_handle *handle;
        int ret;
        int num_clks = 0;
        struct sci_clk **clks = NULL;
@@ -429,18 +415,7 @@ static int ti_sci_clk_probe(struct platform_device *pdev)
        int dev_id = 0;
        u8 num_parents;
        int gap_size = 0;
-
-       handle = devm_ti_sci_get_handle(dev);
-       if (IS_ERR(handle))
-               return PTR_ERR(handle);
-
-       provider = devm_kzalloc(dev, sizeof(*provider), GFP_KERNEL);
-       if (!provider)
-               return -ENOMEM;
-
-       provider->sci = handle;
-       provider->ops = &handle->ops.clk_ops;
-       provider->dev = dev;
+       struct device *dev = provider->dev;
 
        while (1) {
                ret = provider->ops->get_num_parents(provider->sci, dev_id,
@@ -501,6 +476,45 @@ static int ti_sci_clk_probe(struct platform_device *pdev)
 
        devm_kfree(dev, clks);
 
+       return 0;
+}
+
+/**
+ * ti_sci_clk_probe - Probe function for the TI SCI clock driver
+ * @pdev: platform device pointer to be probed
+ *
+ * Probes the TI SCI clock device. Allocates a new clock provider
+ * and registers this to the common clock framework. Also applies
+ * any required flags to the identified clocks via clock lists
+ * supplied from DT. Returns 0 for success, negative error value
+ * for failure.
+ */
+static int ti_sci_clk_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct device_node *np = dev->of_node;
+       struct sci_clk_provider *provider;
+       const struct ti_sci_handle *handle;
+       int ret;
+
+       handle = devm_ti_sci_get_handle(dev);
+       if (IS_ERR(handle))
+               return PTR_ERR(handle);
+
+       provider = devm_kzalloc(dev, sizeof(*provider), GFP_KERNEL);
+       if (!provider)
+               return -ENOMEM;
+
+       provider->sci = handle;
+       provider->ops = &handle->ops.clk_ops;
+       provider->dev = dev;
+
+       ret = ti_sci_scan_clocks_from_fw(provider);
+       if (ret) {
+               dev_err(dev, "scan clocks from FW failed: %d\n", ret);
+               return ret;
+       }
+
        ret = ti_sci_init_clocks(provider);
        if (ret) {
                pr_err("ti-sci-init-clocks failed.\n");