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; 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; }
int i2c_ssbi_write_bytes(unsigned char *buffer, unsigned short length, unsigned short slave_addr) { int ret = 0; unsigned long timeout = SSBI_TIMEOUT_US; unsigned char *buf = buffer; unsigned short len = length; unsigned short addr = slave_addr; unsigned long mode2 = readl(MSM_SSBI_BASE + SSBI2_MODE2); if (mode2 & SSBI_MODE2_SSBI2_MODE) writel(SSBI_MODE2_REG_ADDR_15_8(mode2, addr), MSM_SSBI_BASE + SSBI2_MODE2); while (len) { ret = i2c_ssbi_poll_for_device_ready(); if (ret) { dprintf (CRITICAL, "Error: device not ready\n"); return ret; } writel(SSBI_CMD_WRITE(addr, *buf++), MSM_SSBI_BASE + SSBI2_CMD); while (readl(MSM_SSBI_BASE + SSBI2_STATUS) & SSBI_STATUS_MCHN_BUSY) { if (--timeout == 0) { dprintf(INFO, "In Device ready function:Timeout, status %x\n", readl(MSM_SSBI_BASE + SSBI2_STATUS)); return 1; } } len--; } return 0; }