nvmem: meson-efuse: add peripheral clock
authorJerome Brunet <jbrunet@baylibre.com>
Fri, 30 Nov 2018 11:53:23 +0000 (11:53 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 6 Dec 2018 14:45:46 +0000 (15:45 +0100)
Get and enable the peripheral clock required by the efuse device.
The driver has been handle to work without it so far because the
clock was left enabled by default but it won't be the case soon.

Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/nvmem/meson-efuse.c

index 40b9df1d030d60d8d8a623c76757f74ee19c9d54..99372768446b7e066a4b89555f13d03a1be5a423 100644 (file)
@@ -14,6 +14,7 @@
  * more details.
  */
 
+#include <linux/clk.h>
 #include <linux/module.h>
 #include <linux/nvmem-provider.h>
 #include <linux/of.h>
@@ -46,7 +47,31 @@ static int meson_efuse_probe(struct platform_device *pdev)
        struct device *dev = &pdev->dev;
        struct nvmem_device *nvmem;
        struct nvmem_config *econfig;
+       struct clk *clk;
        unsigned int size;
+       int ret;
+
+       clk = devm_clk_get(dev, NULL);
+       if (IS_ERR(clk)) {
+               ret = PTR_ERR(clk);
+               if (ret != -EPROBE_DEFER)
+                       dev_err(dev, "failed to get efuse gate");
+               return ret;
+       }
+
+       ret = clk_prepare_enable(clk);
+       if (ret) {
+               dev_err(dev, "failed to enable gate");
+               return ret;
+       }
+
+       ret = devm_add_action_or_reset(dev,
+                                      (void(*)(void *))clk_disable_unprepare,
+                                      clk);
+       if (ret) {
+               dev_err(dev, "failed to add disable callback");
+               return ret;
+       }
 
        if (meson_sm_call(SM_EFUSE_USER_MAX, &size, 0, 0, 0, 0, 0) < 0) {
                dev_err(dev, "failed to get max user");