Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}