2 * Copyright (C) 2013 ROCKCHIP, Inc.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
9 #include <linux/delay.h>
10 #include <linux/kernel.h>
12 #include <linux/spinlock.h>
13 #include <plat/efuse.h>
15 #if defined(CONFIG_ARCH_RK3188)
16 #define efuse_readl(offset) readl_relaxed(RK30_EFUSE_BASE + offset)
17 #define efuse_writel(val, offset) writel_relaxed(val, RK30_EFUSE_BASE + offset)
20 u8 efuse_buf[32 + 1] = {0, 0};
22 static int efuse_readregs(u32 addr, u32 length, u8 *buf)
28 static DEFINE_SPINLOCK(efuse_lock);
34 spin_lock_irqsave(&efuse_lock, flags);
36 efuse_writel(EFUSE_CSB, REG_EFUSE_CTRL);
37 efuse_writel(EFUSE_LOAD | EFUSE_PGENB, REG_EFUSE_CTRL);
40 efuse_writel(efuse_readl(REG_EFUSE_CTRL) & (~(EFUSE_A_MASK << EFUSE_A_SHIFT)), REG_EFUSE_CTRL);
41 efuse_writel(efuse_readl(REG_EFUSE_CTRL) | ((addr & EFUSE_A_MASK) << EFUSE_A_SHIFT), REG_EFUSE_CTRL);
43 efuse_writel(efuse_readl(REG_EFUSE_CTRL) | EFUSE_STROBE, REG_EFUSE_CTRL);
45 *buf = efuse_readl(REG_EFUSE_DOUT);
46 efuse_writel(efuse_readl(REG_EFUSE_CTRL) & (~EFUSE_STROBE), REG_EFUSE_CTRL);
52 efuse_writel(efuse_readl(REG_EFUSE_CTRL) | EFUSE_CSB, REG_EFUSE_CTRL);
55 spin_unlock_irqrestore(&efuse_lock, flags);
60 void rk_efuse_init(void)
62 efuse_readregs(0x0, 32, efuse_buf);
67 return efuse_buf[22] & 0x3;
70 int rk_leakage_val(void)
72 return (efuse_buf[22] >> 4) & 0x0f;