system_serial_high = crc32(system_serial_low, buf + 8, 8);
}
+int rk312x_efuse_readregs(u32 addr, u32 length, u8 *buf)
+{
+ unsigned long flags;
+ int ret = length;
+
+ if (!length)
+ return 0;
+
+ efuse_writel(EFUSE_LOAD, REG_EFUSE_CTRL);
+ udelay(2);
+ do {
+ efuse_writel(efuse_readl(REG_EFUSE_CTRL) &
+ (~(EFUSE_A_MASK << RK312X_EFUSE_A_SHIFT)),
+ REG_EFUSE_CTRL);
+ efuse_writel(efuse_readl(REG_EFUSE_CTRL) |
+ ((addr & EFUSE_A_MASK) << RK312X_EFUSE_A_SHIFT),
+ REG_EFUSE_CTRL);
+ udelay(2);
+ efuse_writel(efuse_readl(REG_EFUSE_CTRL) |
+ EFUSE_STROBE, REG_EFUSE_CTRL);
+ udelay(2);
+ *buf = efuse_readl(REG_EFUSE_DOUT);
+ efuse_writel(efuse_readl(REG_EFUSE_CTRL) &
+ (~EFUSE_STROBE), REG_EFUSE_CTRL);
+ udelay(2);
+ buf++;
+ addr++;
+ } while (--length);
+ udelay(2);
+ efuse_writel(efuse_readl(REG_EFUSE_CTRL) &
+ (~EFUSE_LOAD) , REG_EFUSE_CTRL);
+ udelay(1);
+
+ return ret;
+}
+
int rockchip_efuse_version(void)
{
return efuse.efuse_version;
} else {
pr_err("failed to read eFuse, return %d\n", ret);
}
+ } else if (cpu_is_rk312x()) {
+ ret = rk312x_efuse_readregs(0, 32, efuse_buf);
+ if (ret == 32)
+ efuse.get_leakage = rk3288_get_leakage;
+ else
+ pr_err("failed to read eFuse, return %d\n", ret);
}
}
/* eFuse controller register */
#define EFUSE_A_SHIFT (6)
+#define RK312X_EFUSE_A_SHIFT (7)
#define EFUSE_A_MASK (0x3FF)
//#define EFUSE_PD (1 << 5)
//#define EFUSE_PS (1 << 4)