
On 2023/2/16 07:48, Jonas Karlman wrote:
Add support for rk3328 compatible.
Signed-off-by: Jonas Karlman jonas@kwiboo.se
drivers/misc/rockchip-efuse.c | 45 +++++++++++++++++++++++++++++++++++
Reviewed-by: Kever Yang kever.yang@rock-chips.com
Thanks, - Kever
1 file changed, 45 insertions(+)
diff --git a/drivers/misc/rockchip-efuse.c b/drivers/misc/rockchip-efuse.c index 808246e92230..7aa3dc1b3868 100644 --- a/drivers/misc/rockchip-efuse.c +++ b/drivers/misc/rockchip-efuse.c @@ -13,6 +13,7 @@ #include <dm.h> #include <linux/bitops.h> #include <linux/delay.h> +#include <linux/iopoll.h> #include <malloc.h> #include <misc.h>
@@ -31,6 +32,12 @@ #define EFUSE_STROBE BIT(1) #define EFUSE_CSB BIT(0) #define EFUSE_DOUT 0x0004 +#define RK3328_INT_STATUS 0x0018 +#define RK3328_INT_FINISH BIT(0) +#define RK3328_DOUT 0x0020 +#define RK3328_AUTO_CTRL 0x0024 +#define RK3328_AUTO_RD BIT(1) +#define RK3328_AUTO_ENB BIT(0)
struct rockchip_efuse_plat { void __iomem *base; @@ -38,6 +45,7 @@ struct rockchip_efuse_plat {
struct rockchip_efuse_data { int (*read)(struct udevice *dev, int offset, void *buf, int size);
- int offset; int size; int block_size; };
@@ -103,6 +111,30 @@ static int rockchip_rk3288_efuse_read(struct udevice *dev, int offset, return 0; }
+static int rockchip_rk3328_efuse_read(struct udevice *dev, int offset,
void *buf, int size)
+{
- struct rockchip_efuse_plat *efuse = dev_get_plat(dev);
- u32 status, *buffer = buf;
- int ret;
- while (size--) {
writel(RK3328_AUTO_RD | RK3328_AUTO_ENB | RK3399_ADDR(offset++),
efuse->base + RK3328_AUTO_CTRL);
udelay(1);
ret = readl_poll_sleep_timeout(efuse->base + RK3328_INT_STATUS,
status, (status & RK3328_INT_FINISH), 1, 50);
if (ret)
return ret;
*buffer++ = readl(efuse->base + RK3328_DOUT);
writel(RK3328_INT_FINISH, efuse->base + RK3328_INT_STATUS);
- }
- return 0;
+}
- static int rockchip_rk3399_efuse_read(struct udevice *dev, int offset, void *buf, int size) {
@@ -144,6 +176,8 @@ static int rockchip_efuse_read(struct udevice *dev, int offset, if (!data->read) return -ENOSYS;
- offset += data->offset;
- if (data->block_size <= 1) return data->read(dev, offset, buf, size);
@@ -182,6 +216,13 @@ static const struct rockchip_efuse_data rk3288_data = { .size = 0x20, };
+static const struct rockchip_efuse_data rk3328_data = {
- .read = rockchip_rk3328_efuse_read,
- .offset = 0x60,
- .size = 0x20,
- .block_size = 4,
+};
- static const struct rockchip_efuse_data rk3399_data = { .read = rockchip_rk3399_efuse_read, .size = 0x80,
@@ -205,6 +246,10 @@ static const struct udevice_id rockchip_efuse_ids[] = { .compatible = "rockchip,rk3288-efuse", .data = (ulong)&rk3288_data, },
- {
.compatible = "rockchip,rk3328-efuse",
.data = (ulong)&rk3328_data,
- }, { .compatible = "rockchip,rk3399-efuse", .data = (ulong)&rk3399_data,