Commit 7db4f2ca authored by Andy Shevchenko's avatar Andy Shevchenko Committed by Jonathan Cameron
Browse files

iio: st_sensors: Call st_sensors_power_enable() from bus drivers



In case we would initialize two IIO devices from one physical device,
we shouldn't have a clash on regulators. That's why move
st_sensors_power_enable() call from core to bus drivers.

Signed-off-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://lore.kernel.org/r/20210414195454.84183-4-andriy.shevchenko@linux.intel.com


Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent 38934daf
Loading
Loading
Loading
Loading
+5 −16
Original line number Diff line number Diff line
@@ -1260,13 +1260,9 @@ int st_accel_common_probe(struct iio_dev *indio_dev)
	indio_dev->modes = INDIO_DIRECT_MODE;
	indio_dev->info = &accel_info;

	err = st_sensors_power_enable(indio_dev);
	if (err)
		return err;

	err = st_sensors_verify_id(indio_dev);
	if (err < 0)
		goto st_accel_power_off;
		return err;

	adata->num_data_channels = ST_ACCEL_NUMBER_DATA_CHANNELS;
	indio_dev->num_channels = ST_SENSORS_NUMBER_ALL_CHANNELS;
@@ -1275,10 +1271,8 @@ int st_accel_common_probe(struct iio_dev *indio_dev)
	channels = devm_kmemdup(&indio_dev->dev,
				adata->sensor_settings->ch,
				channels_size, GFP_KERNEL);
	if (!channels) {
		err = -ENOMEM;
		goto st_accel_power_off;
	}
	if (!channels)
		return -ENOMEM;

	if (apply_acpi_orientation(indio_dev, channels))
		dev_warn(&indio_dev->dev,
@@ -1293,11 +1287,11 @@ int st_accel_common_probe(struct iio_dev *indio_dev)

	err = st_sensors_init_sensor(indio_dev, pdata);
	if (err < 0)
		goto st_accel_power_off;
		return err;

	err = st_accel_allocate_ring(indio_dev);
	if (err < 0)
		goto st_accel_power_off;
		return err;

	if (adata->irq > 0) {
		err = st_sensors_allocate_trigger(indio_dev,
@@ -1320,9 +1314,6 @@ int st_accel_common_probe(struct iio_dev *indio_dev)
		st_sensors_deallocate_trigger(indio_dev);
st_accel_probe_trigger_error:
	st_accel_deallocate_ring(indio_dev);
st_accel_power_off:
	st_sensors_power_disable(indio_dev);

	return err;
}
EXPORT_SYMBOL(st_accel_common_probe);
@@ -1331,8 +1322,6 @@ void st_accel_common_remove(struct iio_dev *indio_dev)
{
	struct st_sensor_data *adata = iio_priv(indio_dev);

	st_sensors_power_disable(indio_dev);

	iio_device_unregister(indio_dev);
	if (adata->irq > 0)
		st_sensors_deallocate_trigger(indio_dev);
+15 −2
Original line number Diff line number Diff line
@@ -174,16 +174,29 @@ static int st_accel_i2c_probe(struct i2c_client *client)
	if (ret < 0)
		return ret;

	ret = st_sensors_power_enable(indio_dev);
	if (ret)
		return ret;

	ret = st_accel_common_probe(indio_dev);
	if (ret < 0)
		return ret;
		goto st_accel_power_off;

	return 0;

st_accel_power_off:
	st_sensors_power_disable(indio_dev);

	return ret;
}

static int st_accel_i2c_remove(struct i2c_client *client)
{
	st_accel_common_remove(i2c_get_clientdata(client));
	struct iio_dev *indio_dev = i2c_get_clientdata(client);

	st_sensors_power_disable(indio_dev);

	st_accel_common_remove(indio_dev);

	return 0;
}
+15 −2
Original line number Diff line number Diff line
@@ -123,16 +123,29 @@ static int st_accel_spi_probe(struct spi_device *spi)
	if (err < 0)
		return err;

	err = st_sensors_power_enable(indio_dev);
	if (err)
		return err;

	err = st_accel_common_probe(indio_dev);
	if (err < 0)
		return err;
		goto st_accel_power_off;

	return 0;

st_accel_power_off:
	st_sensors_power_disable(indio_dev);

	return err;
}

static int st_accel_spi_remove(struct spi_device *spi)
{
	st_accel_common_remove(spi_get_drvdata(spi));
	struct iio_dev *indio_dev = spi_get_drvdata(spi);

	st_sensors_power_disable(indio_dev);

	st_accel_common_remove(indio_dev);

	return 0;
}
+3 −12
Original line number Diff line number Diff line
@@ -471,13 +471,9 @@ int st_gyro_common_probe(struct iio_dev *indio_dev)
	indio_dev->modes = INDIO_DIRECT_MODE;
	indio_dev->info = &gyro_info;

	err = st_sensors_power_enable(indio_dev);
	if (err)
		return err;

	err = st_sensors_verify_id(indio_dev);
	if (err < 0)
		goto st_gyro_power_off;
		return err;

	gdata->num_data_channels = ST_GYRO_NUMBER_DATA_CHANNELS;
	indio_dev->channels = gdata->sensor_settings->ch;
@@ -490,11 +486,11 @@ int st_gyro_common_probe(struct iio_dev *indio_dev)

	err = st_sensors_init_sensor(indio_dev, pdata);
	if (err < 0)
		goto st_gyro_power_off;
		return err;

	err = st_gyro_allocate_ring(indio_dev);
	if (err < 0)
		goto st_gyro_power_off;
		return err;

	if (gdata->irq > 0) {
		err = st_sensors_allocate_trigger(indio_dev,
@@ -517,9 +513,6 @@ int st_gyro_common_probe(struct iio_dev *indio_dev)
		st_sensors_deallocate_trigger(indio_dev);
st_gyro_probe_trigger_error:
	st_gyro_deallocate_ring(indio_dev);
st_gyro_power_off:
	st_sensors_power_disable(indio_dev);

	return err;
}
EXPORT_SYMBOL(st_gyro_common_probe);
@@ -528,8 +521,6 @@ void st_gyro_common_remove(struct iio_dev *indio_dev)
{
	struct st_sensor_data *gdata = iio_priv(indio_dev);

	st_sensors_power_disable(indio_dev);

	iio_device_unregister(indio_dev);
	if (gdata->irq > 0)
		st_sensors_deallocate_trigger(indio_dev);
+15 −2
Original line number Diff line number Diff line
@@ -86,16 +86,29 @@ static int st_gyro_i2c_probe(struct i2c_client *client,
	if (err < 0)
		return err;

	err = st_sensors_power_enable(indio_dev);
	if (err)
		return err;

	err = st_gyro_common_probe(indio_dev);
	if (err < 0)
		return err;
		goto st_gyro_power_off;

	return 0;

st_gyro_power_off:
	st_sensors_power_disable(indio_dev);

	return err;
}

static int st_gyro_i2c_remove(struct i2c_client *client)
{
	st_gyro_common_remove(i2c_get_clientdata(client));
	struct iio_dev *indio_dev = i2c_get_clientdata(client);

	st_sensors_power_disable(indio_dev);

	st_gyro_common_remove(indio_dev);

	return 0;
}
Loading