Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a8175ba3 authored by Crestez Dan Leonard's avatar Crestez Dan Leonard Committed by Jonathan Cameron
Browse files

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: default avatarCrestez Dan Leonard <leonard.crestez@intel.com>
Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
parent fbced0e9
Loading
Loading
Loading
Loading
+12 −8
Original line number Diff line number Diff line
@@ -430,8 +430,8 @@ static int ak8975_who_i_am(struct i2c_client *client,
	 * AK8975   |  DEVICE_ID |  NA
	 * AK8963   |  DEVICE_ID |  NA
	 */
	ret = i2c_smbus_read_i2c_block_data(client, AK09912_REG_WIA1,
					    2, wia_val);
	ret = i2c_smbus_read_i2c_block_data_or_emulated(
			client, AK09912_REG_WIA1, 2, wia_val);
	if (ret < 0) {
		dev_err(&client->dev, "Error reading WIA\n");
		return ret;
@@ -543,8 +543,8 @@ static int ak8975_setup(struct i2c_client *client)
	}

	/* Get asa data and store in the device data. */
	ret = i2c_smbus_read_i2c_block_data(client,
					    data->def->ctrl_regs[ASA_BASE],
	ret = i2c_smbus_read_i2c_block_data_or_emulated(
			client, data->def->ctrl_regs[ASA_BASE],
			3, data->asa);
	if (ret < 0) {
		dev_err(&client->dev, "Not able to read asa data\n");
@@ -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);
	const struct i2c_client *client = data->client;
	const struct ak_def *def = data->def;
	u16 buff;
	int ret;

	mutex_lock(&data->lock);
@@ -694,14 +695,17 @@ static int ak8975_read_axis(struct iio_dev *indio_dev, int index, int *val)
	if (ret)
		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)
		goto exit;

	mutex_unlock(&data->lock);

	/* Clamp to valid range. */
	*val = clamp_t(s16, ret, -def->range, def->range);
	/* Swap bytes and convert to valid range. */
	buff = le16_to_cpu(buff);
	*val = clamp_t(s16, buff, -def->range, def->range);
	return IIO_VAL_INT;

exit: