Esempio n. 1
0
static int
i2c_ssbi_transfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
{
	int ret = 0;
	int rem = num;
	unsigned long flags;
	struct i2c_ssbi_dev *ssbi = i2c_get_adapdata(adap);

	remote_spin_lock_irqsave(&ssbi->rspin_lock, flags);
	while (rem) {
		if (msgs->flags & I2C_M_RD) {
			ret = i2c_ssbi_read_bytes(ssbi, msgs);
			if (ret)
				goto transfer_failed;
		} else {
			ret = i2c_ssbi_write_bytes(ssbi, msgs);
			if (ret)
				goto transfer_failed;
		}

		msgs++;
		rem--;
	}
	remote_spin_unlock_irqrestore(&ssbi->rspin_lock, flags);

	return num;

transfer_failed:
	remote_spin_unlock_irqrestore(&ssbi->rspin_lock, flags);
	return ret;
}
Esempio n. 2
0
static int
i2c_ssbi_transfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
{
	int ret = 0;
	int rem = num;
	struct i2c_ssbi_dev *ssbi = i2c_get_adapdata(adap);

	if (ssbi->suspended)
		return -EBUSY;

	while (rem) {
		if (msgs->flags & I2C_M_RD) {
			ret = i2c_ssbi_read_bytes(ssbi, msgs);
			if (ret)
				goto transfer_failed;
		} else {
			ret = i2c_ssbi_write_bytes(ssbi, msgs);
			if (ret)
				goto transfer_failed;
		}

		msgs++;
		rem--;
	}

	return num;

transfer_failed:
	return ret;
}