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