forked from Minki/linux
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:
parent
fbced0e946
commit
a8175ba335
@ -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:
|
||||||
|
Loading…
Reference in New Issue
Block a user