/* * read one u32 to indexed fuse */ int imx_otp_read_one_u32(u32 index, u32 *pdata) { u32 ctrl_reg = 0; int ret = 0; log("index: 0x%X", index); if (index > IMX_OTP_ADDR_MAX) { printf("ERROR: invalid address.\n"); ret = -1; goto exit_nop; } if (otp_clk_enable()) { ret = -1; printf("ERROR: failed to initialize OTP\n"); goto exit_nop; } if (otp_read_prep()) { ret = -1; printf("ERROR: read preparation failed\n"); goto exit_cleanup; } if (fuse_read_addr(index, pdata)) { ret = -1; printf("ERROR: read failed\n"); goto exit_cleanup; } if (otp_read_post()) { ret = -1; printf("ERROR: read post operation failed\n"); goto exit_cleanup; } if (*pdata == IMX_OTP_DATA_ERROR_VAL) { ctrl_reg = readl(IMX_OTP_BASE + HW_OCOTP_CTRL); if (ctrl_reg & BM_OCOTP_CTRL_ERROR) { printf("ERROR: read fuse failed\n"); ret = -1; goto exit_cleanup; } } exit_cleanup: otp_clk_disable(); exit_nop: return ret; }
int imx6_ocotp_read_one_u32(struct ocotp_priv *priv, u32 index, u32 *pdata) { int ret; ret = imx6_ocotp_prepare(priv); if (ret) { dev_err(&priv->dev, "failed to prepare read fuse 0x%08x\n", index); return ret; } ret = fuse_read_addr(priv, index, pdata); if (ret) { dev_err(&priv->dev, "failed to read fuse 0x%08x\n", index); return ret; } return 0; }