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

Commit 393dbe4e authored by Daniel Baluta's avatar Daniel Baluta Committed by Jonathan Cameron
Browse files

iio: imu: mpu6050: Fix name/chip_id when using ACPI



When using ACPI, id is NULL and the current code automatically
defaults name to NULL and chip id to 0. We should instead use
the data provided in the ACPI device table.

Fixes: c816d9e7 ("iio: imu: mpu6050: fix possible NULL dereferences")
Signed-off-by: default avatarDaniel Baluta <daniel.baluta@intel.com>
Reviewed-By: default avatarMatt Ranostay <matt.ranostay@intel.com>
Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
parent 140afdd9
Loading
Loading
Loading
Loading
+26 −3
Original line number Original line Diff line number Diff line
@@ -104,6 +104,19 @@ static int inv_mpu6050_deselect_bypass(struct i2c_adapter *adap,
	return 0;
	return 0;
}
}


static const char *inv_mpu_match_acpi_device(struct device *dev, int *chip_id)
{
	const struct acpi_device_id *id;

	id = acpi_match_device(dev->driver->acpi_match_table, dev);
	if (!id)
		return NULL;

	*chip_id = (int)id->driver_data;

	return dev_name(dev);
}

/**
/**
 *  inv_mpu_probe() - probe function.
 *  inv_mpu_probe() - probe function.
 *  @client:          i2c client.
 *  @client:          i2c client.
@@ -115,15 +128,25 @@ static int inv_mpu_probe(struct i2c_client *client,
			 const struct i2c_device_id *id)
			 const struct i2c_device_id *id)
{
{
	struct inv_mpu6050_state *st;
	struct inv_mpu6050_state *st;
	int result;
	int result, chip_type;
	const char *name = id ? id->name : NULL;
	const int chip_type = id ? id->driver_data : 0;
	struct regmap *regmap;
	struct regmap *regmap;
	const char *name;


	if (!i2c_check_functionality(client->adapter,
	if (!i2c_check_functionality(client->adapter,
				     I2C_FUNC_SMBUS_I2C_BLOCK))
				     I2C_FUNC_SMBUS_I2C_BLOCK))
		return -EOPNOTSUPP;
		return -EOPNOTSUPP;


	if (id) {
		chip_type = (int)id->driver_data;
		name = id->name;
	} else if (ACPI_HANDLE(&client->dev)) {
		name = inv_mpu_match_acpi_device(&client->dev, &chip_type);
		if (!name)
			return -ENODEV;
	} else {
		return -ENOSYS;
	}

	regmap = devm_regmap_init_i2c(client, &inv_mpu_regmap_config);
	regmap = devm_regmap_init_i2c(client, &inv_mpu_regmap_config);
	if (IS_ERR(regmap)) {
	if (IS_ERR(regmap)) {
		dev_err(&client->dev, "Failed to register i2c regmap %d\n",
		dev_err(&client->dev, "Failed to register i2c regmap %d\n",