summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/nvmem/meson-efuse.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/drivers/nvmem/meson-efuse.c b/drivers/nvmem/meson-efuse.c
index 40b9df1d030d..99372768446b 100644
--- a/drivers/nvmem/meson-efuse.c
+++ b/drivers/nvmem/meson-efuse.c
@@ -14,6 +14,7 @@
14 * more details. 14 * more details.
15 */ 15 */
16 16
17#include <linux/clk.h>
17#include <linux/module.h> 18#include <linux/module.h>
18#include <linux/nvmem-provider.h> 19#include <linux/nvmem-provider.h>
19#include <linux/of.h> 20#include <linux/of.h>
@@ -46,7 +47,31 @@ static int meson_efuse_probe(struct platform_device *pdev)
46 struct device *dev = &pdev->dev; 47 struct device *dev = &pdev->dev;
47 struct nvmem_device *nvmem; 48 struct nvmem_device *nvmem;
48 struct nvmem_config *econfig; 49 struct nvmem_config *econfig;
50 struct clk *clk;
49 unsigned int size; 51 unsigned int size;
52 int ret;
53
54 clk = devm_clk_get(dev, NULL);
55 if (IS_ERR(clk)) {
56 ret = PTR_ERR(clk);
57 if (ret != -EPROBE_DEFER)
58 dev_err(dev, "failed to get efuse gate");
59 return ret;
60 }
61
62 ret = clk_prepare_enable(clk);
63 if (ret) {
64 dev_err(dev, "failed to enable gate");
65 return ret;
66 }
67
68 ret = devm_add_action_or_reset(dev,
69 (void(*)(void *))clk_disable_unprepare,
70 clk);
71 if (ret) {
72 dev_err(dev, "failed to add disable callback");
73 return ret;
74 }
50 75
51 if (meson_sm_call(SM_EFUSE_USER_MAX, &size, 0, 0, 0, 0, 0) < 0) { 76 if (meson_sm_call(SM_EFUSE_USER_MAX, &size, 0, 0, 0, 0, 0) < 0) {
52 dev_err(dev, "failed to get max user"); 77 dev_err(dev, "failed to get max user");