Merge branch 'linux-5.6' of git://github.com/skeggsb/linux into drm-fixes
[linux-2.6-block.git] / drivers / nvmem / sprd-efuse.c
CommitLineData
096030e7
FL
1// SPDX-License-Identifier: GPL-2.0
2// Copyright (C) 2019 Spreadtrum Communications Inc.
3
4#include <linux/clk.h>
5#include <linux/delay.h>
6#include <linux/hwspinlock.h>
7#include <linux/io.h>
8#include <linux/module.h>
9#include <linux/nvmem-provider.h>
10#include <linux/of_device.h>
11#include <linux/platform_device.h>
12
13#define SPRD_EFUSE_ENABLE 0x20
14#define SPRD_EFUSE_ERR_FLAG 0x24
15#define SPRD_EFUSE_ERR_CLR 0x28
16#define SPRD_EFUSE_MAGIC_NUM 0x2c
17#define SPRD_EFUSE_FW_CFG 0x50
18#define SPRD_EFUSE_PW_SWT 0x54
19#define SPRD_EFUSE_MEM(val) (0x1000 + ((val) << 2))
20
21#define SPRD_EFUSE_VDD_EN BIT(0)
22#define SPRD_EFUSE_AUTO_CHECK_EN BIT(1)
23#define SPRD_EFUSE_DOUBLE_EN BIT(2)
24#define SPRD_EFUSE_MARGIN_RD_EN BIT(3)
25#define SPRD_EFUSE_LOCK_WR_EN BIT(4)
26
27#define SPRD_EFUSE_ERR_CLR_MASK GENMASK(13, 0)
28
29#define SPRD_EFUSE_ENK1_ON BIT(0)
30#define SPRD_EFUSE_ENK2_ON BIT(1)
31#define SPRD_EFUSE_PROG_EN BIT(2)
32
33#define SPRD_EFUSE_MAGIC_NUMBER 0x8810
34
35/* Block width (bytes) definitions */
36#define SPRD_EFUSE_BLOCK_WIDTH 4
37
38/*
39 * The Spreadtrum AP efuse contains 2 parts: normal efuse and secure efuse,
40 * and we can only access the normal efuse in kernel. So define the normal
41 * block offset index and normal block numbers.
42 */
43#define SPRD_EFUSE_NORMAL_BLOCK_NUMS 24
44#define SPRD_EFUSE_NORMAL_BLOCK_OFFSET 72
45
46/* Timeout (ms) for the trylock of hardware spinlocks */
47#define SPRD_EFUSE_HWLOCK_TIMEOUT 5000
48
49/*
50 * Since different Spreadtrum SoC chip can have different normal block numbers
51 * and offset. And some SoC can support block double feature, which means
52 * when reading or writing data to efuse memory, the controller can save double
53 * data in case one data become incorrect after a long period.
54 *
55 * Thus we should save them in the device data structure.
56 */
57struct sprd_efuse_variant_data {
58 u32 blk_nums;
59 u32 blk_offset;
60 bool blk_double;
61};
62
63struct sprd_efuse {
64 struct device *dev;
65 struct clk *clk;
66 struct hwspinlock *hwlock;
67 struct mutex mutex;
68 void __iomem *base;
69 const struct sprd_efuse_variant_data *data;
70};
71
72static const struct sprd_efuse_variant_data ums312_data = {
73 .blk_nums = SPRD_EFUSE_NORMAL_BLOCK_NUMS,
74 .blk_offset = SPRD_EFUSE_NORMAL_BLOCK_OFFSET,
75 .blk_double = false,
76};
77
78/*
79 * On Spreadtrum platform, we have multi-subsystems will access the unique
80 * efuse controller, so we need one hardware spinlock to synchronize between
81 * the multiple subsystems.
82 */
83static int sprd_efuse_lock(struct sprd_efuse *efuse)
84{
85 int ret;
86
87 mutex_lock(&efuse->mutex);
88
89 ret = hwspin_lock_timeout_raw(efuse->hwlock,
90 SPRD_EFUSE_HWLOCK_TIMEOUT);
91 if (ret) {
92 dev_err(efuse->dev, "timeout get the hwspinlock\n");
93 mutex_unlock(&efuse->mutex);
94 return ret;
95 }
96
97 return 0;
98}
99
100static void sprd_efuse_unlock(struct sprd_efuse *efuse)
101{
102 hwspin_unlock_raw(efuse->hwlock);
103 mutex_unlock(&efuse->mutex);
104}
105
106static void sprd_efuse_set_prog_power(struct sprd_efuse *efuse, bool en)
107{
108 u32 val = readl(efuse->base + SPRD_EFUSE_PW_SWT);
109
110 if (en)
111 val &= ~SPRD_EFUSE_ENK2_ON;
112 else
113 val &= ~SPRD_EFUSE_ENK1_ON;
114
115 writel(val, efuse->base + SPRD_EFUSE_PW_SWT);
116
117 /* Open or close efuse power need wait 1000us to make power stable. */
118 usleep_range(1000, 1200);
119
120 if (en)
121 val |= SPRD_EFUSE_ENK1_ON;
122 else
123 val |= SPRD_EFUSE_ENK2_ON;
124
125 writel(val, efuse->base + SPRD_EFUSE_PW_SWT);
126
127 /* Open or close efuse power need wait 1000us to make power stable. */
128 usleep_range(1000, 1200);
129}
130
131static void sprd_efuse_set_read_power(struct sprd_efuse *efuse, bool en)
132{
133 u32 val = readl(efuse->base + SPRD_EFUSE_ENABLE);
134
135 if (en)
136 val |= SPRD_EFUSE_VDD_EN;
137 else
138 val &= ~SPRD_EFUSE_VDD_EN;
139
140 writel(val, efuse->base + SPRD_EFUSE_ENABLE);
141
142 /* Open or close efuse power need wait 1000us to make power stable. */
143 usleep_range(1000, 1200);
144}
145
146static void sprd_efuse_set_prog_lock(struct sprd_efuse *efuse, bool en)
147{
148 u32 val = readl(efuse->base + SPRD_EFUSE_ENABLE);
149
150 if (en)
151 val |= SPRD_EFUSE_LOCK_WR_EN;
152 else
153 val &= ~SPRD_EFUSE_LOCK_WR_EN;
154
155 writel(val, efuse->base + SPRD_EFUSE_ENABLE);
156}
157
158static void sprd_efuse_set_auto_check(struct sprd_efuse *efuse, bool en)
159{
160 u32 val = readl(efuse->base + SPRD_EFUSE_ENABLE);
161
162 if (en)
163 val |= SPRD_EFUSE_AUTO_CHECK_EN;
164 else
165 val &= ~SPRD_EFUSE_AUTO_CHECK_EN;
166
167 writel(val, efuse->base + SPRD_EFUSE_ENABLE);
168}
169
170static void sprd_efuse_set_data_double(struct sprd_efuse *efuse, bool en)
171{
172 u32 val = readl(efuse->base + SPRD_EFUSE_ENABLE);
173
174 if (en)
175 val |= SPRD_EFUSE_DOUBLE_EN;
176 else
177 val &= ~SPRD_EFUSE_DOUBLE_EN;
178
179 writel(val, efuse->base + SPRD_EFUSE_ENABLE);
180}
181
182static void sprd_efuse_set_prog_en(struct sprd_efuse *efuse, bool en)
183{
184 u32 val = readl(efuse->base + SPRD_EFUSE_PW_SWT);
185
186 if (en)
187 val |= SPRD_EFUSE_PROG_EN;
188 else
189 val &= ~SPRD_EFUSE_PROG_EN;
190
191 writel(val, efuse->base + SPRD_EFUSE_PW_SWT);
192}
193
194static int sprd_efuse_raw_prog(struct sprd_efuse *efuse, u32 blk, bool doub,
195 bool lock, u32 *data)
196{
197 u32 status;
198 int ret = 0;
199
200 /*
201 * We need set the correct magic number before writing the efuse to
202 * allow programming, and block other programming until we clear the
203 * magic number.
204 */
205 writel(SPRD_EFUSE_MAGIC_NUMBER,
206 efuse->base + SPRD_EFUSE_MAGIC_NUM);
207
208 /*
209 * Power on the efuse, enable programme and enable double data
210 * if asked.
211 */
212 sprd_efuse_set_prog_power(efuse, true);
213 sprd_efuse_set_prog_en(efuse, true);
214 sprd_efuse_set_data_double(efuse, doub);
215
216 /*
217 * Enable the auto-check function to validate if the programming is
218 * successful.
219 */
220 sprd_efuse_set_auto_check(efuse, true);
221
222 writel(*data, efuse->base + SPRD_EFUSE_MEM(blk));
223
224 /* Disable auto-check and data double after programming */
225 sprd_efuse_set_auto_check(efuse, false);
226 sprd_efuse_set_data_double(efuse, false);
227
228 /*
229 * Check the efuse error status, if the programming is successful,
230 * we should lock this efuse block to avoid programming again.
231 */
232 status = readl(efuse->base + SPRD_EFUSE_ERR_FLAG);
233 if (status) {
234 dev_err(efuse->dev,
235 "write error status %d of block %d\n", ret, blk);
236
237 writel(SPRD_EFUSE_ERR_CLR_MASK,
238 efuse->base + SPRD_EFUSE_ERR_CLR);
239 ret = -EBUSY;
240 } else {
241 sprd_efuse_set_prog_lock(efuse, lock);
242 writel(*data, efuse->base + SPRD_EFUSE_MEM(blk));
243 sprd_efuse_set_prog_lock(efuse, false);
244 }
245
246 sprd_efuse_set_prog_power(efuse, false);
247 writel(0, efuse->base + SPRD_EFUSE_MAGIC_NUM);
248
249 return ret;
250}
251
252static int sprd_efuse_raw_read(struct sprd_efuse *efuse, int blk, u32 *val,
253 bool doub)
254{
255 u32 status;
256
257 /*
258 * Need power on the efuse before reading data from efuse, and will
259 * power off the efuse after reading process.
260 */
261 sprd_efuse_set_read_power(efuse, true);
262
263 /* Enable double data if asked */
264 sprd_efuse_set_data_double(efuse, doub);
265
266 /* Start to read data from efuse block */
267 *val = readl(efuse->base + SPRD_EFUSE_MEM(blk));
268
269 /* Disable double data */
270 sprd_efuse_set_data_double(efuse, false);
271
272 /* Power off the efuse */
273 sprd_efuse_set_read_power(efuse, false);
274
275 /*
276 * Check the efuse error status and clear them if there are some
277 * errors occurred.
278 */
279 status = readl(efuse->base + SPRD_EFUSE_ERR_FLAG);
280 if (status) {
281 dev_err(efuse->dev,
282 "read error status %d of block %d\n", status, blk);
283
284 writel(SPRD_EFUSE_ERR_CLR_MASK,
285 efuse->base + SPRD_EFUSE_ERR_CLR);
286 return -EBUSY;
287 }
288
289 return 0;
290}
291
292static int sprd_efuse_read(void *context, u32 offset, void *val, size_t bytes)
293{
294 struct sprd_efuse *efuse = context;
295 bool blk_double = efuse->data->blk_double;
296 u32 index = offset / SPRD_EFUSE_BLOCK_WIDTH + efuse->data->blk_offset;
297 u32 blk_offset = (offset % SPRD_EFUSE_BLOCK_WIDTH) * BITS_PER_BYTE;
298 u32 data;
299 int ret;
300
301 ret = sprd_efuse_lock(efuse);
302 if (ret)
303 return ret;
304
305 ret = clk_prepare_enable(efuse->clk);
306 if (ret)
307 goto unlock;
308
309 ret = sprd_efuse_raw_read(efuse, index, &data, blk_double);
310 if (!ret) {
311 data >>= blk_offset;
312 memcpy(val, &data, bytes);
313 }
314
315 clk_disable_unprepare(efuse->clk);
316
317unlock:
318 sprd_efuse_unlock(efuse);
319 return ret;
320}
321
322static int sprd_efuse_write(void *context, u32 offset, void *val, size_t bytes)
323{
324 struct sprd_efuse *efuse = context;
325 int ret;
326
327 ret = sprd_efuse_lock(efuse);
328 if (ret)
329 return ret;
330
331 ret = clk_prepare_enable(efuse->clk);
332 if (ret)
333 goto unlock;
334
335 ret = sprd_efuse_raw_prog(efuse, offset, false, false, val);
336
337 clk_disable_unprepare(efuse->clk);
338
339unlock:
340 sprd_efuse_unlock(efuse);
341 return ret;
342}
343
344static int sprd_efuse_probe(struct platform_device *pdev)
345{
346 struct device_node *np = pdev->dev.of_node;
347 struct nvmem_device *nvmem;
348 struct nvmem_config econfig = { };
349 struct sprd_efuse *efuse;
350 const struct sprd_efuse_variant_data *pdata;
351 int ret;
352
353 pdata = of_device_get_match_data(&pdev->dev);
354 if (!pdata) {
355 dev_err(&pdev->dev, "No matching driver data found\n");
356 return -EINVAL;
357 }
358
359 efuse = devm_kzalloc(&pdev->dev, sizeof(*efuse), GFP_KERNEL);
360 if (!efuse)
361 return -ENOMEM;
362
363 efuse->base = devm_platform_ioremap_resource(pdev, 0);
364 if (!efuse->base)
365 return -ENOMEM;
366
367 ret = of_hwspin_lock_get_id(np, 0);
368 if (ret < 0) {
369 dev_err(&pdev->dev, "failed to get hwlock id\n");
370 return ret;
371 }
372
373 efuse->hwlock = devm_hwspin_lock_request_specific(&pdev->dev, ret);
374 if (!efuse->hwlock) {
375 dev_err(&pdev->dev, "failed to request hwlock\n");
376 return -ENXIO;
377 }
378
379 efuse->clk = devm_clk_get(&pdev->dev, "enable");
380 if (IS_ERR(efuse->clk)) {
381 dev_err(&pdev->dev, "failed to get enable clock\n");
382 return PTR_ERR(efuse->clk);
383 }
384
385 mutex_init(&efuse->mutex);
386 efuse->dev = &pdev->dev;
387 efuse->data = pdata;
388
389 econfig.stride = 1;
390 econfig.word_size = 1;
391 econfig.read_only = false;
392 econfig.name = "sprd-efuse";
393 econfig.size = efuse->data->blk_nums * SPRD_EFUSE_BLOCK_WIDTH;
394 econfig.reg_read = sprd_efuse_read;
395 econfig.reg_write = sprd_efuse_write;
396 econfig.priv = efuse;
397 econfig.dev = &pdev->dev;
398 nvmem = devm_nvmem_register(&pdev->dev, &econfig);
399 if (IS_ERR(nvmem)) {
400 dev_err(&pdev->dev, "failed to register nvmem\n");
401 return PTR_ERR(nvmem);
402 }
403
404 return 0;
405}
406
407static const struct of_device_id sprd_efuse_of_match[] = {
408 { .compatible = "sprd,ums312-efuse", .data = &ums312_data },
409 { }
410};
411
412static struct platform_driver sprd_efuse_driver = {
413 .probe = sprd_efuse_probe,
414 .driver = {
415 .name = "sprd-efuse",
416 .of_match_table = sprd_efuse_of_match,
417 },
418};
419
420module_platform_driver(sprd_efuse_driver);
421
422MODULE_AUTHOR("Freeman Liu <freeman.liu@spreadtrum.com>");
423MODULE_DESCRIPTION("Spreadtrum AP efuse driver");
424MODULE_LICENSE("GPL v2");