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; }
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 = 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; }
int i2c_ssbi_read_bytes(unsigned char *buffer, unsigned short length, unsigned short slave_addr) { int ret = 0; unsigned char *buf = buffer; unsigned short len = length; unsigned short addr = slave_addr; unsigned long read_cmd = SSBI_CMD_READ(addr); unsigned long mode2 = readl(MSM_SSBI_BASE + SSBI2_MODE2); //buf = alloc(len * sizeof(8)); 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(read_cmd, MSM_SSBI_BASE + SSBI2_CMD); ret = i2c_ssbi_poll_for_read_completed(); if (ret) { dprintf (CRITICAL, "Error: read not completed\n"); return ret; } *buf++ = readl(MSM_SSBI_BASE + SSBI2_RD) & SSBI_RD_REG_DATA_MASK; len--; } return 0; }