static int msm_ssbi_write_bytes(struct msm_ssbi *ssbi, u16 addr, u8 *buf, int len) { 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); } while (len) { ret = ssbi_wait_mask(ssbi, SSBI_STATUS_READY, 0); if (ret) goto err; if (ssbi->controller_type == FSM_SBI_CTRL_SSBI) ssbi_writel(ssbi, SSBI_FSM_CMD_WRITE(addr, *buf), SSBI2_CMD); else ssbi_writel(ssbi, ((addr & 0xff) << 16) | *buf, SSBI2_CMD); ret = ssbi_wait_mask(ssbi, 0, SSBI_STATUS_MCHN_BUSY); if (ret) goto err; buf++; len--; } err: return ret; }
static int i2c_ssbi_write_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; 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 write_failed; if (ssbi->controller_type == FSM_SBI_CTRL_SSBI) writel(SSBI_FSM_CMD_WRITE(addr, *buf++), ssbi->base + SSBI2_CMD); else writel(SSBI_CMD_WRITE(addr, *buf++), ssbi->base + SSBI2_CMD); ret = i2c_ssbi_poll_for_transfer_completed(ssbi); if (ret) goto write_failed; len--; } write_failed: return ret; }