Example #1
0
static int __efuse_prog(int blk, u32 val)
{
	u32 cfg0 = __raw_readl((void *)REG_EFUSE_CFG0);

	if (blk < 0 || blk >= EFUSE_BLOCK_MAX)	/* debug purpose */
		goto out;

	/* enable pgm mode and setup magic number before programming */
	cfg0 |= BIT_PGM_EN;
	__raw_writel(cfg0, (void *)REG_EFUSE_CFG0);
	__raw_writel(BITS_MAGIC_NUMBER(efuse_magic),
		     (void *)REG_EFUSE_MAGIC_NUMBER);

	__raw_writel(val, (void *)REG_EFUSE_DATA_WR);
	__raw_writel(BITS_READ_WRITE_INDEX(blk),
		     (void *)REG_EFUSE_READ_WRITE_INDEX);
	pr_debug("cfg0 %x\n", __raw_readl((void *)REG_EFUSE_CFG0));
	__raw_writel(BIT_PG_START, (void *)REG_EFUSE_MODE_CTRL);
	if (IS_ERR_VALUE(__efuse_wait_clear(BIT_PGM_BUSY)))
		goto out;

out:
	__raw_writel(0, (void *)REG_EFUSE_MAGIC_NUMBER);
	cfg0 &= ~BIT_PGM_EN;
	__raw_writel(cfg0, (void *)REG_EFUSE_CFG0);
	return 0;
}
Example #2
0
static u32 adie_efuse_read(int blk_index)
{
    u32 val = 0;

    pr_debug("adie efuse read %d\n", blk_index);
    adie_efuse_lock();
    __adie_efuse_power_on();
    /* enable adie_efuse module clk and power before */

    /* FIXME: set read timing, why 0x20 (default value)
       sci_adi_raw_write(ANA_REG_EFUSE_RD_TIMING_CTRL,
       BITS_EFUSE_RD_TIMING(0x20));
     */

    sci_adi_raw_write(ANA_REG_EFUSE_BLOCK_INDEX,
                      BITS_READ_WRITE_INDEX(blk_index));
    sci_adi_raw_write(ANA_REG_EFUSE_MODE_CTRL, BIT_RD_START);

    if (IS_ERR_VALUE(__adie_efuse_wait_clear(BIT_READ_BUSY)))
        goto out;

    val = sci_adi_read(ANA_REG_EFUSE_DATA_RD);

    /* FIXME: reverse the otp value */
    val = BITS_EFUSE_DATA_RD(~val);

out:
    __adie_efuse_power_off();
    adie_efuse_unlock();
    return val;
}
Example #3
0
static u32 __efuse_read(int blk)
{
	u32 val = 0;

	/* enable efuse module clk and power before */

	__raw_writel(BITS_READ_WRITE_INDEX(blk),
		     (void *)REG_EFUSE_READ_WRITE_INDEX);
	__raw_writel(BIT_RD_START, (void *)REG_EFUSE_MODE_CTRL);

	if (IS_ERR_VALUE(__efuse_wait_clear(BIT_READ_BUSY)))
		goto out;

	val = __raw_readl((void *)REG_EFUSE_DATA_RD);

out:
	return val;
}