diff options
author | Jonas Karlman <jonas@kwiboo.se> | 2023-02-22 22:44:40 +0000 |
---|---|---|
committer | Kever Yang <kever.yang@rock-chips.com> | 2023-02-28 18:07:28 +0800 |
commit | dd5684b87850ad535ec4fd6532cf675d07b73983 (patch) | |
tree | 64302d4f9f7520d5ba9abb185f7669caad08d686 /drivers/misc/rockchip-efuse.c | |
parent | 16e8afa802ebc3869c99d57186720476f3affd6b (diff) | |
download | u-boot-dd5684b87850ad535ec4fd6532cf675d07b73983.tar.gz u-boot-dd5684b87850ad535ec4fd6532cf675d07b73983.tar.bz2 u-boot-dd5684b87850ad535ec4fd6532cf675d07b73983.zip |
rockchip: efuse: Add support for RK3036
Add support for rk3036 compatible.
Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
Reviewed-by: Kever Yang <kever.yang@rock-chips.com>
Diffstat (limited to 'drivers/misc/rockchip-efuse.c')
-rw-r--r-- | drivers/misc/rockchip-efuse.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/drivers/misc/rockchip-efuse.c b/drivers/misc/rockchip-efuse.c index bc73fd3baa..60931a5131 100644 --- a/drivers/misc/rockchip-efuse.c +++ b/drivers/misc/rockchip-efuse.c @@ -18,6 +18,9 @@ #include <misc.h> #define EFUSE_CTRL 0x0000 +#define RK3036_A_SHIFT 8 +#define RK3036_A_MASK GENMASK(15, 8) +#define RK3036_ADDR(n) ((n) << RK3036_A_SHIFT) #define RK3128_A_SHIFT 7 #define RK3128_A_MASK GENMASK(15, 7) #define RK3128_ADDR(n) ((n) << RK3128_A_SHIFT) @@ -86,6 +89,33 @@ U_BOOT_CMD( ); #endif +static int rockchip_rk3036_efuse_read(struct udevice *dev, int offset, + void *buf, int size) +{ + struct rockchip_efuse_plat *efuse = dev_get_plat(dev); + u8 *buffer = buf; + + /* Switch to read mode */ + writel(EFUSE_LOAD, efuse->base + EFUSE_CTRL); + udelay(2); + + while (size--) { + clrsetbits_le32(efuse->base + EFUSE_CTRL, RK3036_A_MASK, + RK3036_ADDR(offset++)); + udelay(2); + setbits_le32(efuse->base + EFUSE_CTRL, EFUSE_STROBE); + udelay(2); + *buffer++ = (u8)(readl(efuse->base + EFUSE_DOUT) & 0xFF); + clrbits_le32(efuse->base + EFUSE_CTRL, EFUSE_STROBE); + udelay(2); + } + + /* Switch to inactive mode */ + writel(0x0, efuse->base + EFUSE_CTRL); + + return 0; +} + static int rockchip_rk3128_efuse_read(struct udevice *dev, int offset, void *buf, int size) { @@ -241,6 +271,11 @@ static int rockchip_efuse_of_to_plat(struct udevice *dev) return 0; } +static const struct rockchip_efuse_data rk3036_data = { + .read = rockchip_rk3036_efuse_read, + .size = 0x20, +}; + static const struct rockchip_efuse_data rk3128_data = { .read = rockchip_rk3128_efuse_read, .size = 0x40, @@ -266,6 +301,10 @@ static const struct rockchip_efuse_data rk3399_data = { static const struct udevice_id rockchip_efuse_ids[] = { { + .compatible = "rockchip,rk3036-efuse", + .data = (ulong)&rk3036_data, + }, + { .compatible = "rockchip,rk3066a-efuse", .data = (ulong)&rk3288_data, }, |