iio: ak8975: Support adapters limited to BYTE_DATA

The device has simple 8-bit registers but the driver incorrectly uses
block or word reads without checking functionality bits.

Fix by using i2c_smbus_read_i2c_block_data_or_emulated instead of
i2c_smbus_read_i2c_block_data or i2c_smbus_read_word_data. This will
check functionality bits and use the fastest available transfer method.

Signed-off-by: Crestez Dan Leonard <leonard.crestez@intel.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
This commit is contained in:
Crestez Dan Leonard 2016-04-29 22:05:32 +03:00 committed by Jonathan Cameron
parent fbced0e946
commit a8175ba335

View File

@ -430,8 +430,8 @@ static int ak8975_who_i_am(struct i2c_client *client,
* AK8975 | DEVICE_ID | NA * AK8975 | DEVICE_ID | NA
* AK8963 | DEVICE_ID | NA * AK8963 | DEVICE_ID | NA
*/ */
ret = i2c_smbus_read_i2c_block_data(client, AK09912_REG_WIA1, ret = i2c_smbus_read_i2c_block_data_or_emulated(
2, wia_val); client, AK09912_REG_WIA1, 2, wia_val);
if (ret < 0) { if (ret < 0) {
dev_err(&client->dev, "Error reading WIA\n"); dev_err(&client->dev, "Error reading WIA\n");
return ret; return ret;
@ -543,9 +543,9 @@ static int ak8975_setup(struct i2c_client *client)
} }
/* Get asa data and store in the device data. */ /* Get asa data and store in the device data. */
ret = i2c_smbus_read_i2c_block_data(client, ret = i2c_smbus_read_i2c_block_data_or_emulated(
data->def->ctrl_regs[ASA_BASE], client, data->def->ctrl_regs[ASA_BASE],
3, data->asa); 3, data->asa);
if (ret < 0) { if (ret < 0) {
dev_err(&client->dev, "Not able to read asa data\n"); dev_err(&client->dev, "Not able to read asa data\n");
return ret; return ret;
@ -686,6 +686,7 @@ static int ak8975_read_axis(struct iio_dev *indio_dev, int index, int *val)
struct ak8975_data *data = iio_priv(indio_dev); struct ak8975_data *data = iio_priv(indio_dev);
const struct i2c_client *client = data->client; const struct i2c_client *client = data->client;
const struct ak_def *def = data->def; const struct ak_def *def = data->def;
u16 buff;
int ret; int ret;
mutex_lock(&data->lock); mutex_lock(&data->lock);
@ -694,14 +695,17 @@ static int ak8975_read_axis(struct iio_dev *indio_dev, int index, int *val)
if (ret) if (ret)
goto exit; goto exit;
ret = i2c_smbus_read_word_data(client, def->data_regs[index]); ret = i2c_smbus_read_i2c_block_data_or_emulated(
client, def->data_regs[index],
sizeof(buff), (u8*)&buff);
if (ret < 0) if (ret < 0)
goto exit; goto exit;
mutex_unlock(&data->lock); mutex_unlock(&data->lock);
/* Clamp to valid range. */ /* Swap bytes and convert to valid range. */
*val = clamp_t(s16, ret, -def->range, def->range); buff = le16_to_cpu(buff);
*val = clamp_t(s16, buff, -def->range, def->range);
return IIO_VAL_INT; return IIO_VAL_INT;
exit: exit: