]> www.infradead.org Git - linux.git/commitdiff
clk: samsung: Extract parent clock enabling to common function
authorSam Protsenko <semen.protsenko@linaro.org>
Tue, 7 Mar 2023 00:24:22 +0000 (18:24 -0600)
committerKrzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Tue, 7 Mar 2023 07:38:54 +0000 (08:38 +0100)
Extract parent clock enabling from exynos_arm64_register_cmu() to
dedicated function.

Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: Sam Protsenko <semen.protsenko@linaro.org>
Link: https://lore.kernel.org/r/20230307002423.24454-3-semen.protsenko@linaro.org
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
drivers/clk/samsung/clk-exynos-arm64.c

index b921b9a1134aaeda864491a8569d082fca920779..60fd820c14aa925434d00713c953822cbb08014a 100644 (file)
@@ -56,6 +56,37 @@ static void __init exynos_arm64_init_clocks(struct device_node *np,
        iounmap(reg_base);
 }
 
+/**
+ * exynos_arm64_enable_bus_clk - Enable parent clock of specified CMU
+ *
+ * @dev:       Device object; may be NULL if this function is not being
+ *             called from platform driver probe function
+ * @np:                CMU device tree node
+ * @cmu:       CMU data
+ *
+ * Keep CMU parent clock running (needed for CMU registers access).
+ *
+ * Return: 0 on success or a negative error code on failure.
+ */
+static int __init exynos_arm64_enable_bus_clk(struct device *dev,
+               struct device_node *np, const struct samsung_cmu_info *cmu)
+{
+       struct clk *parent_clk;
+
+       if (!cmu->clk_name)
+               return 0;
+
+       if (dev)
+               parent_clk = clk_get(dev, cmu->clk_name);
+       else
+               parent_clk = of_clk_get_by_name(np, cmu->clk_name);
+
+       if (IS_ERR(parent_clk))
+               return PTR_ERR(parent_clk);
+
+       return clk_prepare_enable(parent_clk);
+}
+
 /**
  * exynos_arm64_register_cmu - Register specified Exynos CMU domain
  * @dev:       Device object; may be NULL if this function is not being
@@ -72,22 +103,16 @@ static void __init exynos_arm64_init_clocks(struct device_node *np,
 void __init exynos_arm64_register_cmu(struct device *dev,
                struct device_node *np, const struct samsung_cmu_info *cmu)
 {
-       /* Keep CMU parent clock running (needed for CMU registers access) */
-       if (cmu->clk_name) {
-               struct clk *parent_clk;
-
-               if (dev)
-                       parent_clk = clk_get(dev, cmu->clk_name);
-               else
-                       parent_clk = of_clk_get_by_name(np, cmu->clk_name);
-
-               if (IS_ERR(parent_clk)) {
-                       pr_err("%s: could not find bus clock %s; err = %ld\n",
-                              __func__, cmu->clk_name, PTR_ERR(parent_clk));
-               } else {
-                       clk_prepare_enable(parent_clk);
-               }
-       }
+       int err;
+
+       /*
+        * Try to boot even if the parent clock enablement fails, as it might be
+        * already enabled by bootloader.
+        */
+       err = exynos_arm64_enable_bus_clk(dev, np, cmu);
+       if (err)
+               pr_err("%s: could not enable bus clock %s; err = %d\n",
+                      __func__, cmu->clk_name, err);
 
        exynos_arm64_init_clocks(np, cmu->clk_regs, cmu->nr_clk_regs);
        samsung_cmu_register_one(np, cmu);