]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/mfd/madera-core.c
Merge tag 'linux-watchdog-5.5-rc1' of git://www.linux-watchdog.org/linux-watchdog
[linux.git] / drivers / mfd / madera-core.c
index 29540cbf75934030660483e99190db734b0ce62f..a8cfadc1fc01e2dbee766840540a5cad8d0da1ee 100644 (file)
@@ -450,6 +450,21 @@ int madera_dev_init(struct madera *madera)
                       sizeof(madera->pdata));
        }
 
+       madera->mclk[MADERA_MCLK1].id = "mclk1";
+       madera->mclk[MADERA_MCLK2].id = "mclk2";
+       madera->mclk[MADERA_MCLK3].id = "mclk3";
+
+       ret = devm_clk_bulk_get_optional(madera->dev, ARRAY_SIZE(madera->mclk),
+                                        madera->mclk);
+       if (ret) {
+               dev_err(madera->dev, "Failed to get clocks: %d\n", ret);
+               return ret;
+       }
+
+       /* Not using devm_clk_get to prevent breakage of existing DTs */
+       if (!madera->mclk[MADERA_MCLK2].clk)
+               dev_warn(madera->dev, "Missing MCLK2, requires 32kHz clock\n");
+
        ret = madera_get_reset_gpio(madera);
        if (ret)
                return ret;
@@ -660,13 +675,19 @@ int madera_dev_init(struct madera *madera)
        }
 
        /* Init 32k clock sourced from MCLK2 */
+       ret = clk_prepare_enable(madera->mclk[MADERA_MCLK2].clk);
+       if (ret) {
+               dev_err(madera->dev, "Failed to enable 32k clock: %d\n", ret);
+               goto err_reset;
+       }
+
        ret = regmap_update_bits(madera->regmap,
                        MADERA_CLOCK_32K_1,
                        MADERA_CLK_32K_ENA_MASK | MADERA_CLK_32K_SRC_MASK,
                        MADERA_CLK_32K_ENA | MADERA_32KZ_MCLK2);
        if (ret) {
                dev_err(madera->dev, "Failed to init 32k clock: %d\n", ret);
-               goto err_reset;
+               goto err_clock;
        }
 
        pm_runtime_set_active(madera->dev);
@@ -687,6 +708,8 @@ int madera_dev_init(struct madera *madera)
 
 err_pm_runtime:
        pm_runtime_disable(madera->dev);
+err_clock:
+       clk_disable_unprepare(madera->mclk[MADERA_MCLK2].clk);
 err_reset:
        madera_enable_hard_reset(madera);
        regulator_disable(madera->dcvdd);
@@ -713,6 +736,8 @@ int madera_dev_exit(struct madera *madera)
         */
        pm_runtime_disable(madera->dev);
 
+       clk_disable_unprepare(madera->mclk[MADERA_MCLK2].clk);
+
        regulator_disable(madera->dcvdd);
        regulator_put(madera->dcvdd);