diff options
Diffstat (limited to 'drivers/input/misc/ad714x-i2c.c')
| -rw-r--r-- | drivers/input/misc/ad714x-i2c.c | 69 | 
1 files changed, 32 insertions, 37 deletions
diff --git a/drivers/input/misc/ad714x-i2c.c b/drivers/input/misc/ad714x-i2c.c index e21deb1baa8..025417d74ca 100644 --- a/drivers/input/misc/ad714x-i2c.c +++ b/drivers/input/misc/ad714x-i2c.c @@ -1,7 +1,7 @@  /*   * AD714X CapTouch Programmable Controller driver (I2C bus)   * - * Copyright 2009 Analog Devices Inc. + * Copyright 2009-2011 Analog Devices Inc.   *   * Licensed under the GPL-2 or later.   */ @@ -27,54 +27,49 @@ static int ad714x_i2c_resume(struct device *dev)  static SIMPLE_DEV_PM_OPS(ad714x_i2c_pm, ad714x_i2c_suspend, ad714x_i2c_resume); -static int ad714x_i2c_write(struct device *dev, unsigned short reg, -				unsigned short data) +static int ad714x_i2c_write(struct ad714x_chip *chip, +			    unsigned short reg, unsigned short data)  { -	struct i2c_client *client = to_i2c_client(dev); -	int ret = 0; -	u8 *_reg = (u8 *)® -	u8 *_data = (u8 *)&data; +	struct i2c_client *client = to_i2c_client(chip->dev); +	int error; -	u8 tx[4] = { -		_reg[1], -		_reg[0], -		_data[1], -		_data[0] -	}; +	chip->xfer_buf[0] = cpu_to_be16(reg); +	chip->xfer_buf[1] = cpu_to_be16(data); -	ret = i2c_master_send(client, tx, 4); -	if (ret < 0) -		dev_err(&client->dev, "I2C write error\n"); +	error = i2c_master_send(client, (u8 *)chip->xfer_buf, +				2 * sizeof(*chip->xfer_buf)); +	if (unlikely(error < 0)) { +		dev_err(&client->dev, "I2C write error: %d\n", error); +		return error; +	} -	return ret; +	return 0;  } -static int ad714x_i2c_read(struct device *dev, unsigned short reg, -				unsigned short *data) +static int ad714x_i2c_read(struct ad714x_chip *chip, +			   unsigned short reg, unsigned short *data, size_t len)  { -	struct i2c_client *client = to_i2c_client(dev); -	int ret = 0; -	u8 *_reg = (u8 *)® -	u8 *_data = (u8 *)data; +	struct i2c_client *client = to_i2c_client(chip->dev); +	int i; +	int error; -	u8 tx[2] = { -		_reg[1], -		_reg[0] -	}; -	u8 rx[2]; +	chip->xfer_buf[0] = cpu_to_be16(reg); -	ret = i2c_master_send(client, tx, 2); -	if (ret >= 0) -		ret = i2c_master_recv(client, rx, 2); +	error = i2c_master_send(client, (u8 *)chip->xfer_buf, +				sizeof(*chip->xfer_buf)); +	if (error >= 0) +		error = i2c_master_recv(client, (u8 *)chip->xfer_buf, +					len * sizeof(*chip->xfer_buf)); -	if (unlikely(ret < 0)) { -		dev_err(&client->dev, "I2C read error\n"); -	} else { -		_data[0] = rx[1]; -		_data[1] = rx[0]; +	if (unlikely(error < 0)) { +		dev_err(&client->dev, "I2C read error: %d\n", error); +		return error;  	} -	return ret; +	for (i = 0; i < len; i++) +		data[i] = be16_to_cpu(chip->xfer_buf[i]); + +	return 0;  }  static int __devinit ad714x_i2c_probe(struct i2c_client *client,  |