hc
2024-05-14 bedbef8ad3e75a304af6361af235302bcc61d06b
kernel/drivers/nvmem/meson-efuse.c
....@@ -1,19 +1,12 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Amlogic Meson GX eFuse Driver
34 *
45 * Copyright (c) 2016 Endless Computers, Inc.
56 * Author: Carlo Caione <carlo@endlessm.com>
6
- *
7
- * This program is free software; you can redistribute it and/or modify it
8
- * under the terms of version 2 of the GNU General Public License as
9
- * published by the Free Software Foundation.
10
- *
11
- * This program is distributed in the hope that it will be useful, but WITHOUT
12
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14
- * more details.
157 */
168
9
+#include <linux/clk.h>
1710 #include <linux/module.h>
1811 #include <linux/nvmem-provider.h>
1912 #include <linux/of.h>
....@@ -24,14 +17,18 @@
2417 static int meson_efuse_read(void *context, unsigned int offset,
2518 void *val, size_t bytes)
2619 {
27
- return meson_sm_call_read((u8 *)val, bytes, SM_EFUSE_READ, offset,
20
+ struct meson_sm_firmware *fw = context;
21
+
22
+ return meson_sm_call_read(fw, (u8 *)val, bytes, SM_EFUSE_READ, offset,
2823 bytes, 0, 0, 0);
2924 }
3025
3126 static int meson_efuse_write(void *context, unsigned int offset,
3227 void *val, size_t bytes)
3328 {
34
- return meson_sm_call_write((u8 *)val, bytes, SM_EFUSE_WRITE, offset,
29
+ struct meson_sm_firmware *fw = context;
30
+
31
+ return meson_sm_call_write(fw, (u8 *)val, bytes, SM_EFUSE_WRITE, offset,
3532 bytes, 0, 0, 0);
3633 }
3734
....@@ -44,12 +41,51 @@
4441 static int meson_efuse_probe(struct platform_device *pdev)
4542 {
4643 struct device *dev = &pdev->dev;
44
+ struct meson_sm_firmware *fw;
45
+ struct device_node *sm_np;
4746 struct nvmem_device *nvmem;
4847 struct nvmem_config *econfig;
48
+ struct clk *clk;
4949 unsigned int size;
50
+ int ret;
5051
51
- if (meson_sm_call(SM_EFUSE_USER_MAX, &size, 0, 0, 0, 0, 0) < 0)
52
+ sm_np = of_parse_phandle(pdev->dev.of_node, "secure-monitor", 0);
53
+ if (!sm_np) {
54
+ dev_err(&pdev->dev, "no secure-monitor node\n");
55
+ return -ENODEV;
56
+ }
57
+
58
+ fw = meson_sm_get(sm_np);
59
+ of_node_put(sm_np);
60
+ if (!fw)
61
+ return -EPROBE_DEFER;
62
+
63
+ clk = devm_clk_get(dev, NULL);
64
+ if (IS_ERR(clk)) {
65
+ ret = PTR_ERR(clk);
66
+ if (ret != -EPROBE_DEFER)
67
+ dev_err(dev, "failed to get efuse gate");
68
+ return ret;
69
+ }
70
+
71
+ ret = clk_prepare_enable(clk);
72
+ if (ret) {
73
+ dev_err(dev, "failed to enable gate");
74
+ return ret;
75
+ }
76
+
77
+ ret = devm_add_action_or_reset(dev,
78
+ (void(*)(void *))clk_disable_unprepare,
79
+ clk);
80
+ if (ret) {
81
+ dev_err(dev, "failed to add disable callback");
82
+ return ret;
83
+ }
84
+
85
+ if (meson_sm_call(fw, SM_EFUSE_USER_MAX, &size, 0, 0, 0, 0, 0) < 0) {
86
+ dev_err(dev, "failed to get max user");
5287 return -EINVAL;
88
+ }
5389
5490 econfig = devm_kzalloc(dev, sizeof(*econfig), GFP_KERNEL);
5591 if (!econfig)
....@@ -62,6 +98,7 @@
6298 econfig->reg_read = meson_efuse_read;
6399 econfig->reg_write = meson_efuse_write;
64100 econfig->size = size;
101
+ econfig->priv = fw;
65102
66103 nvmem = devm_nvmem_register(&pdev->dev, econfig);
67104