Lines Matching +full:rk3288 +full:- +full:efuse

2  * eFuse driver for Rockchip devices
5 * Written by Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
7 * SPDX-License-Identifier: GPL-2.0+
15 #include <linux/arm-smccc.h>
92 u32 ctrl; /* 0x00 efuse control register */
93 u32 dout; /* 0x04 efuse data out register */
94 u32 rf; /* 0x08 efuse redundancy bit used register */
98 /* 0x14 efuse strobe finish control register */
120 /* setup efuse timing */ in rk1808_efuse_timing_init()
139 struct rockchip_efuse_regs *efuse = in rockchip_rk1808_efuse_read() local
140 (struct rockchip_efuse_regs *)plat->base; in rockchip_rk1808_efuse_read()
146 rk1808_efuse_timing_init(plat->base); in rockchip_rk1808_efuse_read()
151 addr_len = addr_end - addr_start; in rockchip_rk1808_efuse_read()
155 return -ENOMEM; in rockchip_rk1808_efuse_read()
157 while (addr_len--) { in rockchip_rk1808_efuse_read()
160 &efuse->auto_ctrl); in rockchip_rk1808_efuse_read()
162 status = readl(&efuse->int_status); in rockchip_rk1808_efuse_read()
164 ret = -EIO; in rockchip_rk1808_efuse_read()
167 out_value = readl(&efuse->dout2); in rockchip_rk1808_efuse_read()
168 writel(RK1808_INT_FINISH, &efuse->int_status); in rockchip_rk1808_efuse_read()
185 struct rockchip_efuse_regs *efuse = in rockchip_rk3368_efuse_read() local
186 (struct rockchip_efuse_regs *)plat->base; in rockchip_rk3368_efuse_read()
191 sip_smc_secure_reg_write((ulong)&efuse->ctrl, in rockchip_rk3368_efuse_read()
194 while (size--) { in rockchip_rk3368_efuse_read()
195 res = sip_smc_secure_reg_read((ulong)&efuse->ctrl); in rockchip_rk3368_efuse_read()
196 sip_smc_secure_reg_write((ulong)&efuse->ctrl, res.a1 & in rockchip_rk3368_efuse_read()
199 res = sip_smc_secure_reg_read((ulong)&efuse->ctrl); in rockchip_rk3368_efuse_read()
200 sip_smc_secure_reg_write((ulong)&efuse->ctrl, res.a1 | in rockchip_rk3368_efuse_read()
205 res = sip_smc_secure_reg_read((ulong)&efuse->ctrl); in rockchip_rk3368_efuse_read()
206 sip_smc_secure_reg_write((ulong)&efuse->ctrl, in rockchip_rk3368_efuse_read()
210 res = sip_smc_secure_reg_read((ulong)&efuse->dout); in rockchip_rk3368_efuse_read()
213 res = sip_smc_secure_reg_read((ulong)&efuse->ctrl); in rockchip_rk3368_efuse_read()
214 sip_smc_secure_reg_write((ulong)&efuse->ctrl, in rockchip_rk3368_efuse_read()
220 sip_smc_secure_reg_write((ulong)&efuse->ctrl, in rockchip_rk3368_efuse_read()
231 struct rockchip_efuse_regs *efuse = in rockchip_rk3399_efuse_read() local
232 (struct rockchip_efuse_regs *)plat->base; in rockchip_rk3399_efuse_read()
244 /* cap to the size of the efuse block */ in rockchip_rk3399_efuse_read()
249 &efuse->ctrl); in rockchip_rk3399_efuse_read()
252 setbits_le32(&efuse->ctrl, in rockchip_rk3399_efuse_read()
255 out_value = readl(&efuse->dout); in rockchip_rk3399_efuse_read()
256 clrbits_le32(&efuse->ctrl, RK3399_STROBE); in rockchip_rk3399_efuse_read()
264 writel(RK3399_PD | RK3399_CSB, &efuse->ctrl); in rockchip_rk3399_efuse_read()
275 struct rockchip_efuse_regs *efuse = in rockchip_rk3288_efuse_read() local
276 (struct rockchip_efuse_regs *)plat->base; in rockchip_rk3288_efuse_read()
280 if (size > (max_size - offset)) in rockchip_rk3288_efuse_read()
281 size = max_size - offset; in rockchip_rk3288_efuse_read()
284 writel(RK3288_LOAD | RK3288_PGENB, &efuse->ctrl); in rockchip_rk3288_efuse_read()
287 while (size--) { in rockchip_rk3288_efuse_read()
288 writel(readl(&efuse->ctrl) & in rockchip_rk3288_efuse_read()
290 &efuse->ctrl); in rockchip_rk3288_efuse_read()
292 writel(readl(&efuse->ctrl) | in rockchip_rk3288_efuse_read()
294 &efuse->ctrl); in rockchip_rk3288_efuse_read()
297 writel(readl(&efuse->ctrl) | in rockchip_rk3288_efuse_read()
298 RK3288_STROBE, &efuse->ctrl); in rockchip_rk3288_efuse_read()
301 *buffer++ = readl(&efuse->dout); in rockchip_rk3288_efuse_read()
303 writel(readl(&efuse->ctrl) & in rockchip_rk3288_efuse_read()
304 (~RK3288_STROBE), &efuse->ctrl); in rockchip_rk3288_efuse_read()
309 writel(RK3288_PGENB | RK3288_CSB, &efuse->ctrl); in rockchip_rk3288_efuse_read()
319 struct rockchip_efuse_regs *efuse = in rockchip_rk3288_efuse_secure_read() local
320 (struct rockchip_efuse_regs *)plat->base; in rockchip_rk3288_efuse_secure_read()
325 if (size > (max_size - offset)) in rockchip_rk3288_efuse_secure_read()
326 size = max_size - offset; in rockchip_rk3288_efuse_secure_read()
329 sip_smc_secure_reg_write((ulong)&efuse->ctrl, in rockchip_rk3288_efuse_secure_read()
332 while (size--) { in rockchip_rk3288_efuse_secure_read()
333 res = sip_smc_secure_reg_read((ulong)&efuse->ctrl); in rockchip_rk3288_efuse_secure_read()
334 sip_smc_secure_reg_write((ulong)&efuse->ctrl, res.a1 & in rockchip_rk3288_efuse_secure_read()
337 res = sip_smc_secure_reg_read((ulong)&efuse->ctrl); in rockchip_rk3288_efuse_secure_read()
338 sip_smc_secure_reg_write((ulong)&efuse->ctrl, res.a1 | in rockchip_rk3288_efuse_secure_read()
343 res = sip_smc_secure_reg_read((ulong)&efuse->ctrl); in rockchip_rk3288_efuse_secure_read()
344 sip_smc_secure_reg_write((ulong)&efuse->ctrl, in rockchip_rk3288_efuse_secure_read()
348 res = sip_smc_secure_reg_read((ulong)&efuse->dout); in rockchip_rk3288_efuse_secure_read()
351 res = sip_smc_secure_reg_read((ulong)&efuse->ctrl); in rockchip_rk3288_efuse_secure_read()
352 sip_smc_secure_reg_write((ulong)&efuse->ctrl, in rockchip_rk3288_efuse_secure_read()
358 sip_smc_secure_reg_write((ulong)&efuse->ctrl, in rockchip_rk3288_efuse_secure_read()
369 struct rockchip_efuse_regs *efuse = in rockchip_rk3328_efuse_read() local
370 (struct rockchip_efuse_regs *)plat->base; in rockchip_rk3328_efuse_read()
376 /* Max non-secure Byte */ in rockchip_rk3328_efuse_read()
380 /* 128 Byte efuse, 96 Byte for secure, 32 Byte for non-secure */ in rockchip_rk3328_efuse_read()
387 addr_len = addr_end - addr_start; in rockchip_rk3328_efuse_read()
391 return -ENOMEM; in rockchip_rk3328_efuse_read()
396 &efuse->auto_ctrl); in rockchip_rk3328_efuse_read()
398 status = readl(&efuse->int_status); in rockchip_rk3328_efuse_read()
400 ret = -EIO; in rockchip_rk3328_efuse_read()
403 out_value = readl(&efuse->dout2); in rockchip_rk3328_efuse_read()
404 writel(RK3328_INT_FINISH, &efuse->int_status); in rockchip_rk3328_efuse_read()
423 return -ENOSYS; in rockchip_efuse_read()
430 *buf = device_is_compatible(dev, "rockchip,rk3288-secure-efuse") ? in rockchip_efuse_capatiblity()
439 int ret = -EINVAL; in rockchip_efuse_ioctl()
459 plat->base = dev_read_addr_ptr(dev); in rockchip_efuse_ofdata_to_platdata()
465 .compatible = "rockchip,rk1808-efuse",
470 .compatible = "rockchip,rk3288-secure-efuse",
475 .compatible = "rockchip,rk3066a-efuse",
479 .compatible = "rockchip,rk3188-efuse",
483 .compatible = "rockchip,rk322x-efuse",
487 .compatible = "rockchip,rk3328-efuse",
492 .compatible = "rockchip,rk3368-efuse",
497 .compatible = "rockchip,rk3399-efuse",