static int msm_ssbi_read_bytes(struct msm_ssbi *ssbi, u16 addr, u8 *buf, int len) { u32 cmd = SSBI_CMD_RDWRN | ((addr & 0xff) << 16); int ret = 0; if (ssbi->controller_type == MSM_SBI_CTRL_SSBI2) { u32 mode2 = ssbi_readl(ssbi, SSBI2_MODE2); mode2 = SET_SSBI_MODE2_REG_ADDR_15_8(mode2, addr); ssbi_writel(ssbi, mode2, SSBI2_MODE2); } if (ssbi->controller_type == FSM_SBI_CTRL_SSBI) cmd = SSBI_FSM_CMD_READ(addr); else cmd = SSBI_CMD_RDWRN | ((addr & 0xff) << 16); while (len) { ret = ssbi_wait_mask(ssbi, SSBI_STATUS_READY, 0); if (ret) goto err; ssbi_writel(ssbi, cmd, SSBI2_CMD); ret = ssbi_wait_mask(ssbi, SSBI_STATUS_RD_READY, 0); if (ret) goto err; *buf++ = ssbi_readl(ssbi, SSBI2_RD) & 0xff; len--; } err: return ret; }
static int i2c_ssbi_read_bytes(struct i2c_ssbi_dev *ssbi, struct i2c_msg *msg) { int ret = 0; u8 *buf = msg->buf; u16 len = msg->len; u16 addr = msg->addr; u32 read_cmd; if (ssbi->controller_type == FSM_SBI_CTRL_SSBI) read_cmd = SSBI_FSM_CMD_READ(addr); else read_cmd = SSBI_CMD_READ(addr); if (ssbi->controller_type == MSM_SBI_CTRL_SSBI2) { u32 mode2 = readl(ssbi->base + SSBI2_MODE2); writel(SSBI_MODE2_REG_ADDR_15_8(mode2, addr), ssbi->base + SSBI2_MODE2); } while (len) { ret = i2c_ssbi_poll_for_device_ready(ssbi); if (ret) goto read_failed; writel(read_cmd, ssbi->base + SSBI2_CMD); ret = i2c_ssbi_poll_for_read_completed(ssbi); if (ret) goto read_failed; *buf++ = readl(ssbi->base + SSBI2_RD) & SSBI_RD_REG_DATA_MASK; len--; } read_failed: return ret; }