Commit 630aac5a authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'staging-4.6-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging

Pull IIO driver fixes from Grek KH:
 "It's really just IIO drivers here, some small fixes that resolve some
  'crash on boot' errors that have shown up in the -rc series, and other
  bugfixes that are required.

  All have been in linux-next with no reported problems"

* tag 'staging-4.6-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging:
  iio: imu: mpu6050: Fix name/chip_id when using ACPI
  iio: imu: mpu6050: fix possible NULL dereferences
  iio:adc:at91-sama5d2: Repair crash on module removal
  iio: ak8975: fix maybe-uninitialized warning
  iio: ak8975: Fix NULL pointer exception on early interrupt
parents 3f8f0cf2 2b86c4a8
...@@ -451,6 +451,8 @@ static int at91_adc_probe(struct platform_device *pdev) ...@@ -451,6 +451,8 @@ static int at91_adc_probe(struct platform_device *pdev)
if (ret) if (ret)
goto vref_disable; goto vref_disable;
platform_set_drvdata(pdev, indio_dev);
ret = iio_device_register(indio_dev); ret = iio_device_register(indio_dev);
if (ret < 0) if (ret < 0)
goto per_clk_disable_unprepare; goto per_clk_disable_unprepare;
......
...@@ -104,6 +104,19 @@ static int inv_mpu6050_deselect_bypass(struct i2c_adapter *adap, ...@@ -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,14 +128,25 @@ static int inv_mpu_probe(struct i2c_client *client, ...@@ -115,14 +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;
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",
...@@ -131,7 +155,7 @@ static int inv_mpu_probe(struct i2c_client *client, ...@@ -131,7 +155,7 @@ static int inv_mpu_probe(struct i2c_client *client,
} }
result = inv_mpu_core_probe(regmap, client->irq, name, result = inv_mpu_core_probe(regmap, client->irq, name,
NULL, id->driver_data); NULL, chip_type);
if (result < 0) if (result < 0)
return result; return result;
......
...@@ -46,6 +46,7 @@ static int inv_mpu_probe(struct spi_device *spi) ...@@ -46,6 +46,7 @@ static int inv_mpu_probe(struct spi_device *spi)
struct regmap *regmap; struct regmap *regmap;
const struct spi_device_id *id = spi_get_device_id(spi); const struct spi_device_id *id = spi_get_device_id(spi);
const char *name = id ? id->name : NULL; const char *name = id ? id->name : NULL;
const int chip_type = id ? id->driver_data : 0;
regmap = devm_regmap_init_spi(spi, &inv_mpu_regmap_config); regmap = devm_regmap_init_spi(spi, &inv_mpu_regmap_config);
if (IS_ERR(regmap)) { if (IS_ERR(regmap)) {
...@@ -55,7 +56,7 @@ static int inv_mpu_probe(struct spi_device *spi) ...@@ -55,7 +56,7 @@ static int inv_mpu_probe(struct spi_device *spi)
} }
return inv_mpu_core_probe(regmap, spi->irq, name, return inv_mpu_core_probe(regmap, spi->irq, name,
inv_mpu_i2c_disable, id->driver_data); inv_mpu_i2c_disable, chip_type);
} }
static int inv_mpu_remove(struct spi_device *spi) static int inv_mpu_remove(struct spi_device *spi)
......
...@@ -462,6 +462,8 @@ static int ak8975_setup_irq(struct ak8975_data *data) ...@@ -462,6 +462,8 @@ static int ak8975_setup_irq(struct ak8975_data *data)
int rc; int rc;
int irq; int irq;
init_waitqueue_head(&data->data_ready_queue);
clear_bit(0, &data->flags);
if (client->irq) if (client->irq)
irq = client->irq; irq = client->irq;
else else
...@@ -477,8 +479,6 @@ static int ak8975_setup_irq(struct ak8975_data *data) ...@@ -477,8 +479,6 @@ static int ak8975_setup_irq(struct ak8975_data *data)
return rc; return rc;
} }
init_waitqueue_head(&data->data_ready_queue);
clear_bit(0, &data->flags);
data->eoc_irq = irq; data->eoc_irq = irq;
return rc; return rc;
...@@ -732,7 +732,7 @@ static int ak8975_probe(struct i2c_client *client, ...@@ -732,7 +732,7 @@ static int ak8975_probe(struct i2c_client *client,
int eoc_gpio; int eoc_gpio;
int err; int err;
const char *name = NULL; const char *name = NULL;
enum asahi_compass_chipset chipset; enum asahi_compass_chipset chipset = AK_MAX_TYPE;
/* Grab and set up the supplied GPIO. */ /* Grab and set up the supplied GPIO. */
if (client->dev.platform_data) if (client->dev.platform_data)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment