diff options
| -rw-r--r-- | drivers/nvmem/meson-efuse.c | 25 |
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"); |
