2 * Copyright (C) 2016 Broadcom
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation version 2.
8 * This program is distributed "as is" WITHOUT ANY WARRANTY of any
9 * kind, whether express or implied; without even the implied warranty
10 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
14 #include <linux/delay.h>
15 #include <linux/device.h>
17 #include <linux/module.h>
18 #include <linux/nvmem-provider.h>
20 #include <linux/of_address.h>
21 #include <linux/platform_device.h>
24 * # of tries for OTP Status. The time to execute a command varies. The slowest
25 * commands are writes which also vary based on the # of bits turned on. Writing
26 * 0xffffffff takes ~3800 us.
28 #define OTPC_RETRIES 5000
30 /* Sequence to enable OTP program */
31 #define OTPC_PROG_EN_SEQ { 0xf, 0x4, 0x8, 0xd }
34 #define OTPC_CMD_READ 0x0
35 #define OTPC_CMD_OTP_PROG_ENABLE 0x2
36 #define OTPC_CMD_OTP_PROG_DISABLE 0x3
37 #define OTPC_CMD_PROGRAM 0x8
39 /* OTPC Status Bits */
40 #define OTPC_STAT_CMD_DONE BIT(1)
41 #define OTPC_STAT_PROG_OK BIT(2)
43 /* OTPC register definition */
44 #define OTPC_MODE_REG_OFFSET 0x0
45 #define OTPC_MODE_REG_OTPC_MODE 0
46 #define OTPC_COMMAND_OFFSET 0x4
47 #define OTPC_COMMAND_COMMAND_WIDTH 6
48 #define OTPC_CMD_START_OFFSET 0x8
49 #define OTPC_CMD_START_START 0
50 #define OTPC_CPU_STATUS_OFFSET 0xc
51 #define OTPC_CPUADDR_REG_OFFSET 0x28
52 #define OTPC_CPUADDR_REG_OTPC_CPU_ADDRESS_WIDTH 16
53 #define OTPC_CPU_WRITE_REG_OFFSET 0x2c
55 #define OTPC_CMD_MASK (BIT(OTPC_COMMAND_COMMAND_WIDTH) - 1)
56 #define OTPC_ADDR_MASK (BIT(OTPC_CPUADDR_REG_OTPC_CPU_ADDRESS_WIDTH) - 1)
62 /* 128 bit row / 4 words support. */
64 /* 128 bit row / 4 words support. */
68 static struct otpc_map otp_map
= {
70 .data_r_offset
= {0x10},
71 .data_w_offset
= {0x2c},
74 static struct otpc_map otp_map_v2
= {
76 .data_r_offset
= {0x10, 0x5c},
77 .data_w_offset
= {0x2c, 0x64},
84 struct nvmem_config
*config
;
87 static inline void set_command(void __iomem
*base
, u32 command
)
89 writel(command
& OTPC_CMD_MASK
, base
+ OTPC_COMMAND_OFFSET
);
92 static inline void set_cpu_address(void __iomem
*base
, u32 addr
)
94 writel(addr
& OTPC_ADDR_MASK
, base
+ OTPC_CPUADDR_REG_OFFSET
);
97 static inline void set_start_bit(void __iomem
*base
)
99 writel(1 << OTPC_CMD_START_START
, base
+ OTPC_CMD_START_OFFSET
);
102 static inline void reset_start_bit(void __iomem
*base
)
104 writel(0, base
+ OTPC_CMD_START_OFFSET
);
107 static inline void write_cpu_data(void __iomem
*base
, u32 value
)
109 writel(value
, base
+ OTPC_CPU_WRITE_REG_OFFSET
);
112 static int poll_cpu_status(void __iomem
*base
, u32 value
)
117 for (retries
= 0; retries
< OTPC_RETRIES
; retries
++) {
118 status
= readl(base
+ OTPC_CPU_STATUS_OFFSET
);
123 if (retries
== OTPC_RETRIES
)
129 static int enable_ocotp_program(void __iomem
*base
)
131 static const u32 vals
[] = OTPC_PROG_EN_SEQ
;
135 /* Write the magic sequence to enable programming */
136 set_command(base
, OTPC_CMD_OTP_PROG_ENABLE
);
137 for (i
= 0; i
< ARRAY_SIZE(vals
); i
++) {
138 write_cpu_data(base
, vals
[i
]);
140 ret
= poll_cpu_status(base
, OTPC_STAT_CMD_DONE
);
141 reset_start_bit(base
);
146 return poll_cpu_status(base
, OTPC_STAT_PROG_OK
);
149 static int disable_ocotp_program(void __iomem
*base
)
153 set_command(base
, OTPC_CMD_OTP_PROG_DISABLE
);
155 ret
= poll_cpu_status(base
, OTPC_STAT_PROG_OK
);
156 reset_start_bit(base
);
161 static int bcm_otpc_read(void *context
, unsigned int offset
, void *val
,
164 struct otpc_priv
*priv
= context
;
167 u32 address
= offset
/ priv
->config
->word_size
;
170 for (bytes_read
= 0; bytes_read
< bytes
;) {
171 set_command(priv
->base
, OTPC_CMD_READ
);
172 set_cpu_address(priv
->base
, address
++);
173 set_start_bit(priv
->base
);
174 ret
= poll_cpu_status(priv
->base
, OTPC_STAT_CMD_DONE
);
176 dev_err(priv
->dev
, "otp read error: 0x%x", ret
);
180 for (i
= 0; i
< priv
->map
->otpc_row_size
; i
++) {
181 *buf
++ = readl(priv
->base
+
182 priv
->map
->data_r_offset
[i
]);
183 bytes_read
+= sizeof(*buf
);
186 reset_start_bit(priv
->base
);
192 static int bcm_otpc_write(void *context
, unsigned int offset
, void *val
,
195 struct otpc_priv
*priv
= context
;
198 u32 address
= offset
/ priv
->config
->word_size
;
201 if (offset
% priv
->config
->word_size
)
204 ret
= enable_ocotp_program(priv
->base
);
208 for (bytes_written
= 0; bytes_written
< bytes
;) {
209 set_command(priv
->base
, OTPC_CMD_PROGRAM
);
210 set_cpu_address(priv
->base
, address
++);
211 for (i
= 0; i
< priv
->map
->otpc_row_size
; i
++) {
212 writel(*buf
, priv
->base
+ priv
->map
->data_w_offset
[i
]);
214 bytes_written
+= sizeof(*buf
);
216 set_start_bit(priv
->base
);
217 ret
= poll_cpu_status(priv
->base
, OTPC_STAT_CMD_DONE
);
218 reset_start_bit(priv
->base
);
220 dev_err(priv
->dev
, "otp write error: 0x%x", ret
);
225 disable_ocotp_program(priv
->base
);
230 static struct nvmem_config bcm_otpc_nvmem_config
= {
235 .owner
= THIS_MODULE
,
236 .reg_read
= bcm_otpc_read
,
237 .reg_write
= bcm_otpc_write
,
240 static const struct of_device_id bcm_otpc_dt_ids
[] = {
241 { .compatible
= "brcm,ocotp" },
242 { .compatible
= "brcm,ocotp-v2" },
245 MODULE_DEVICE_TABLE(of
, bcm_otpc_dt_ids
);
247 static int bcm_otpc_probe(struct platform_device
*pdev
)
249 struct device
*dev
= &pdev
->dev
;
250 struct device_node
*dn
= dev
->of_node
;
251 struct resource
*res
;
252 struct otpc_priv
*priv
;
253 struct nvmem_device
*nvmem
;
257 priv
= devm_kzalloc(dev
, sizeof(*priv
), GFP_KERNEL
);
261 if (of_device_is_compatible(dev
->of_node
, "brcm,ocotp"))
262 priv
->map
= &otp_map
;
263 else if (of_device_is_compatible(dev
->of_node
, "brcm,ocotp-v2"))
264 priv
->map
= &otp_map_v2
;
267 "%s otpc config map not defined\n", __func__
);
271 /* Get OTP base address register. */
272 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
273 priv
->base
= devm_ioremap_resource(dev
, res
);
274 if (IS_ERR(priv
->base
)) {
275 dev_err(dev
, "unable to map I/O memory\n");
276 return PTR_ERR(priv
->base
);
279 /* Enable CPU access to OTPC. */
280 writel(readl(priv
->base
+ OTPC_MODE_REG_OFFSET
) |
281 BIT(OTPC_MODE_REG_OTPC_MODE
),
282 priv
->base
+ OTPC_MODE_REG_OFFSET
);
283 reset_start_bit(priv
->base
);
285 /* Read size of memory in words. */
286 err
= of_property_read_u32(dn
, "brcm,ocotp-size", &num_words
);
288 dev_err(dev
, "size parameter not specified\n");
290 } else if (num_words
== 0) {
291 dev_err(dev
, "size must be > 0\n");
295 bcm_otpc_nvmem_config
.size
= 4 * num_words
;
296 bcm_otpc_nvmem_config
.dev
= dev
;
297 bcm_otpc_nvmem_config
.priv
= priv
;
299 if (of_device_is_compatible(dev
->of_node
, "brcm,ocotp-v2")) {
300 bcm_otpc_nvmem_config
.word_size
= 8;
301 bcm_otpc_nvmem_config
.stride
= 8;
304 priv
->config
= &bcm_otpc_nvmem_config
;
306 nvmem
= nvmem_register(&bcm_otpc_nvmem_config
);
308 dev_err(dev
, "error registering nvmem config\n");
309 return PTR_ERR(nvmem
);
312 platform_set_drvdata(pdev
, nvmem
);
317 static int bcm_otpc_remove(struct platform_device
*pdev
)
319 struct nvmem_device
*nvmem
= platform_get_drvdata(pdev
);
321 return nvmem_unregister(nvmem
);
324 static struct platform_driver bcm_otpc_driver
= {
325 .probe
= bcm_otpc_probe
,
326 .remove
= bcm_otpc_remove
,
329 .of_match_table
= bcm_otpc_dt_ids
,
332 module_platform_driver(bcm_otpc_driver
);
334 MODULE_DESCRIPTION("Broadcom OTPC driver");
335 MODULE_LICENSE("GPL v2");