static int
i2c_bit_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
{
    struct nouveau_i2c_port *port = adap->algo_data;
    struct i2c_msg *msg = msgs;
    int ret = 0, mcnt = num;

    if (port->func->acquire)
        port->func->acquire(port);

    while (!ret && mcnt--) {
        u8 remaining = msg->len;
        u8 *ptr = msg->buf;

        ret = i2c_start(port);
        if (ret == 0)
            ret = i2c_addr(port, msg);

        if (msg->flags & I2C_M_RD) {
            while (!ret && remaining--)
                ret = i2c_get_byte(port, ptr++, !remaining);
        } else {
            while (!ret && remaining--)
                ret = i2c_put_byte(port, *ptr++);
        }

        msg++;
    }

    i2c_stop(port);
    return (ret < 0) ? ret : num;
}
Exemple #2
0
int
nvkm_i2c_bit_xfer(struct nvkm_i2c_bus *bus, struct i2c_msg *msgs, int num)
{
	struct i2c_msg *msg = msgs;
	int ret = 0, mcnt = num;

	while (!ret && mcnt--) {
		u8 remaining = msg->len;
		u8 *ptr = msg->buf;

		ret = i2c_start(bus);
		if (ret == 0)
			ret = i2c_addr(bus, msg);

		if (msg->flags & I2C_M_RD) {
			while (!ret && remaining--)
				ret = nvkm_i2c_get_byte(bus, ptr++, !remaining);
		} else {
			while (!ret && remaining--)
				ret = nvkm_i2c_put_byte(bus, *ptr++);
		}

		msg++;
	}

	i2c_stop(bus);
	return (ret < 0) ? ret : num;
}