[PATCH v2 09/12] rockchip: efuse: Add support for RK3036

Jonas Karlman jonas at kwiboo.se
Wed Feb 22 23:44:40 CET 2023


Add support for rk3036 compatible.

Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
Reviewed-by: Kever Yang <kever.yang at rock-chips.com>
---
v2:
- Use readl instead of readb
- Collect r-b tag

 drivers/misc/rockchip-efuse.c | 39 +++++++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)

diff --git a/drivers/misc/rockchip-efuse.c b/drivers/misc/rockchip-efuse.c
index bc73fd3baa10..60931a513121 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,
@@ -265,6 +300,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,
-- 
2.39.2



More information about the U-Boot mailing list