aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Walleij <linus.walleij@linaro.org>2016-11-11 20:40:06 +0100
committerLinus Walleij <linus.walleij@linaro.org>2017-01-12 00:04:06 +0100
commit1ff1a398d76b3e3d12d66b4a0e6d5155028a2ba3 (patch)
treee29184c875d24dc9daa40d5cc96b1a54a170e24f
parent8963258a2714f5bbc89f567955ebd5dbb884466c (diff)
scratch PMsensors
-rw-r--r--drivers/iio/accel/st_accel_buffer.c9
-rw-r--r--drivers/iio/accel/st_accel_core.c12
-rw-r--r--drivers/iio/accel/st_accel_i2c.c1
-rw-r--r--drivers/iio/accel/st_accel_spi.c1
-rw-r--r--drivers/iio/common/st_sensors/st_sensors_core.c81
-rw-r--r--drivers/iio/gyro/st_gyro_buffer.c9
-rw-r--r--drivers/iio/gyro/st_gyro_core.c12
-rw-r--r--drivers/iio/gyro/st_gyro_i2c.c1
-rw-r--r--drivers/iio/gyro/st_gyro_spi.c1
-rw-r--r--drivers/iio/magnetometer/st_magn_buffer.c9
-rw-r--r--drivers/iio/magnetometer/st_magn_core.c12
-rw-r--r--drivers/iio/pressure/st_pressure_buffer.c9
-rw-r--r--drivers/iio/pressure/st_pressure_core.c11
-rw-r--r--drivers/iio/pressure/st_pressure_i2c.c1
-rw-r--r--drivers/iio/pressure/st_pressure_spi.c1
-rw-r--r--include/linux/iio/common/st_sensors.h10
16 files changed, 131 insertions, 49 deletions
diff --git a/drivers/iio/accel/st_accel_buffer.c b/drivers/iio/accel/st_accel_buffer.c
index 5501aad9108c..bf9dbe66b11e 100644
--- a/drivers/iio/accel/st_accel_buffer.c
+++ b/drivers/iio/accel/st_accel_buffer.c
@@ -19,8 +19,8 @@
#include <linux/iio/buffer.h>
#include <linux/iio/trigger_consumer.h>
#include <linux/iio/triggered_buffer.h>
-
#include <linux/iio/common/st_sensors.h>
+#include <linux/pm_runtime.h>
#include "st_accel.h"
int st_accel_trig_set_state(struct iio_trigger *trig, bool state)
@@ -32,7 +32,9 @@ int st_accel_trig_set_state(struct iio_trigger *trig, bool state)
static int st_accel_buffer_preenable(struct iio_dev *indio_dev)
{
- return st_sensors_power_enable(indio_dev);
+ pm_runtime_get_sync(indio_dev->dev.parent);
+
+ return 0;
}
static int st_accel_buffer_postenable(struct iio_dev *indio_dev)
@@ -76,7 +78,8 @@ static int st_accel_buffer_predisable(struct iio_dev *indio_dev)
if (err < 0)
goto st_accel_buffer_predisable_error;
- err = st_sensors_power_disable(indio_dev);
+ pm_runtime_mark_last_busy(indio_dev->dev.parent);
+ pm_runtime_put_autosuspend(indio_dev->dev.parent);
st_accel_buffer_predisable_error:
kfree(adata->buffer_data);
diff --git a/drivers/iio/accel/st_accel_core.c b/drivers/iio/accel/st_accel_core.c
index 1d77a623a5b8..ca5f6927e7a8 100644
--- a/drivers/iio/accel/st_accel_core.c
+++ b/drivers/iio/accel/st_accel_core.c
@@ -22,7 +22,7 @@
#include <linux/iio/sysfs.h>
#include <linux/iio/trigger.h>
#include <linux/iio/buffer.h>
-
+#include <linux/pm_runtime.h>
#include <linux/iio/common/st_sensors.h>
#include "st_accel.h"
@@ -717,7 +717,7 @@ int st_accel_common_probe(struct iio_dev *indio_dev)
indio_dev->info = &accel_info;
mutex_init(&adata->tb.buf_lock);
- err = st_sensors_power_init(indio_dev);
+ err = st_sensors_pm_init(indio_dev);
if (err)
return err;
@@ -762,7 +762,9 @@ int st_accel_common_probe(struct iio_dev *indio_dev)
dev_info(&indio_dev->dev, "registered accelerometer %s\n",
indio_dev->name);
- return st_sensors_power_disable(indio_dev);
+ pm_runtime_put(indio_dev->dev.parent);
+
+ return 0;
st_accel_device_register_error:
if (irq > 0)
@@ -770,7 +772,7 @@ st_accel_device_register_error:
st_accel_probe_trigger_error:
st_accel_deallocate_ring(indio_dev);
st_accel_power_off:
- st_sensors_power_disable(indio_dev);
+ st_sensors_pm_disable(indio_dev);
return err;
}
@@ -780,7 +782,7 @@ 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);
+ st_sensors_pm_disable(indio_dev);
iio_device_unregister(indio_dev);
if (adata->get_irq_data_ready(indio_dev) > 0)
diff --git a/drivers/iio/accel/st_accel_i2c.c b/drivers/iio/accel/st_accel_i2c.c
index 8257240fde1a..28e0e6917e32 100644
--- a/drivers/iio/accel/st_accel_i2c.c
+++ b/drivers/iio/accel/st_accel_i2c.c
@@ -142,6 +142,7 @@ static struct i2c_driver st_accel_driver = {
.driver = {
.name = "st-accel-i2c",
.of_match_table = of_match_ptr(st_accel_of_match),
+ .pm = &st_sensors_dev_pm_ops,
},
.probe = st_accel_i2c_probe,
.remove = st_accel_i2c_remove,
diff --git a/drivers/iio/accel/st_accel_spi.c b/drivers/iio/accel/st_accel_spi.c
index 00d762df936b..dde19efbf0e3 100644
--- a/drivers/iio/accel/st_accel_spi.c
+++ b/drivers/iio/accel/st_accel_spi.c
@@ -63,6 +63,7 @@ MODULE_DEVICE_TABLE(spi, st_accel_id_table);
static struct spi_driver st_accel_driver = {
.driver = {
.name = "st-accel-spi",
+ .pm = &st_sensors_dev_pm_ops,
},
.probe = st_accel_spi_probe,
.remove = st_accel_spi_remove,
diff --git a/drivers/iio/common/st_sensors/st_sensors_core.c b/drivers/iio/common/st_sensors/st_sensors_core.c
index e1be54ecae4d..122976fe7a3b 100644
--- a/drivers/iio/common/st_sensors/st_sensors_core.c
+++ b/drivers/iio/common/st_sensors/st_sensors_core.c
@@ -15,9 +15,9 @@
#include <linux/iio/iio.h>
#include <linux/regulator/consumer.h>
#include <linux/of.h>
-#include <asm/unaligned.h>
#include <linux/iio/common/st_sensors.h>
-
+#include <linux/pm_runtime.h>
+#include <asm/unaligned.h>
#include "st_sensors_core.h"
static inline u32 st_sensors_get_unaligned_le24(const u8 *p)
@@ -181,11 +181,13 @@ int st_sensors_set_axis_enable(struct iio_dev *indio_dev, u8 axis_enable)
}
EXPORT_SYMBOL(st_sensors_set_axis_enable);
-int st_sensors_power_init(struct iio_dev *indio_dev)
+int st_sensors_pm_init(struct iio_dev *indio_dev)
{
struct st_sensor_data *pdata = iio_priv(indio_dev);
int err;
+ dev_info(&indio_dev->dev, "ENTER %s\n", __func__);
+
/* Regulators not mandatory, but if requested we should enable them. */
pdata->vdd = devm_regulator_get(indio_dev->dev.parent, "vdd");
if (IS_ERR(pdata->vdd)) {
@@ -212,15 +214,30 @@ int st_sensors_power_init(struct iio_dev *indio_dev)
goto st_sensors_disable_vdd;
}
+ dev_info(&indio_dev->dev, "RUNTIME ENABLE %s\n", __func__);
+
+ /* Enable runtime PM */
+ pm_runtime_get_noresume(indio_dev->dev.parent);
+ pm_runtime_set_active(indio_dev->dev.parent);
+ pm_runtime_enable(indio_dev->dev.parent);
+ /*
+ * Set autosuspend to two orders of magnitude larger than the
+ * start-up time.
+ */
+ pm_runtime_set_autosuspend_delay(indio_dev->dev.parent,
+ pdata->sensor_settings->bootime * 1000 * 10);
+ pm_runtime_use_autosuspend(indio_dev->dev.parent);
+ /* The individual driver will call pm_runtime_put() */
+
return 0;
st_sensors_disable_vdd:
regulator_disable(pdata->vdd);
return err;
}
-EXPORT_SYMBOL(st_sensors_power_init);
+EXPORT_SYMBOL(st_sensors_pm_init);
-int st_sensors_power_enable(struct iio_dev *indio_dev)
+static int st_sensors_power_enable(struct iio_dev *indio_dev)
{
struct st_sensor_data *sdata = iio_priv(indio_dev);
bool odr_match = false;
@@ -228,6 +245,8 @@ int st_sensors_power_enable(struct iio_dev *indio_dev)
u8 tmp;
int err;
+ dev_info(&indio_dev->dev, "%s\n", __func__);
+
/* First turn on the regulators */
err = regulator_enable(sdata->vdd);
if (err) {
@@ -325,13 +344,14 @@ int st_sensors_power_enable(struct iio_dev *indio_dev)
return 0;
}
-EXPORT_SYMBOL(st_sensors_power_enable);
-int st_sensors_power_disable(struct iio_dev *indio_dev)
+static int st_sensors_power_disable(struct iio_dev *indio_dev)
{
struct st_sensor_data *sdata = iio_priv(indio_dev);
int err;
+ dev_info(&indio_dev->dev, "%s\n", __func__);
+
err = st_sensors_write_data_with_mask(indio_dev,
sdata->sensor_settings->pw.addr,
sdata->sensor_settings->pw.mask,
@@ -347,7 +367,41 @@ int st_sensors_power_disable(struct iio_dev *indio_dev)
return 0;
}
-EXPORT_SYMBOL(st_sensors_power_disable);
+
+void st_sensors_pm_disable(struct iio_dev *indio_dev)
+{
+ pm_runtime_get_sync(indio_dev->dev.parent);
+ pm_runtime_put_noidle(indio_dev->dev.parent);
+ pm_runtime_disable(indio_dev->dev.parent);
+ st_sensors_power_disable(indio_dev);
+}
+EXPORT_SYMBOL(st_sensors_pm_disable);
+
+#ifdef CONFIG_PM
+static int st_sensors_runtime_suspend(struct device *dev)
+{
+ /* This is the I2C clientdata or SPI drvdata */
+ struct iio_dev *indio_dev = dev_get_drvdata(dev);
+
+ return st_sensors_power_disable(indio_dev);
+}
+
+static int st_sensors_runtime_resume(struct device *dev)
+{
+ /* This is the I2C clientdata or SPI drvdata */
+ struct iio_dev *indio_dev = dev_get_drvdata(dev);
+
+ return st_sensors_power_enable(indio_dev);
+}
+#endif /* CONFIG_PM */
+
+const struct dev_pm_ops st_sensors_dev_pm_ops = {
+ SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
+ pm_runtime_force_resume)
+ SET_RUNTIME_PM_OPS(st_sensors_runtime_suspend,
+ st_sensors_runtime_resume, NULL)
+};
+EXPORT_SYMBOL(st_sensors_dev_pm_ops);
static int st_sensors_set_drdy_int_pin(struct iio_dev *indio_dev,
struct st_sensors_platform_data *pdata)
@@ -545,25 +599,24 @@ int st_sensors_read_info_raw(struct iio_dev *indio_dev,
{
int err;
+ pm_runtime_get_sync(indio_dev->dev.parent);
mutex_lock(&indio_dev->mlock);
+
if (indio_dev->currentmode == INDIO_BUFFER_TRIGGERED) {
err = -EBUSY;
goto out;
} else {
- err = st_sensors_power_enable(indio_dev);
- if (err)
- goto out;
-
err = st_sensors_read_axis_data(indio_dev, ch, val);
if (err < 0)
goto out;
*val = *val >> ch->scan_type.shift;
-
- err = st_sensors_power_disable(indio_dev);
}
+
out:
mutex_unlock(&indio_dev->mlock);
+ pm_runtime_mark_last_busy(indio_dev->dev.parent);
+ pm_runtime_put_autosuspend(indio_dev->dev.parent);
return err;
}
diff --git a/drivers/iio/gyro/st_gyro_buffer.c b/drivers/iio/gyro/st_gyro_buffer.c
index a8611ea1ffc4..e6e01e9df551 100644
--- a/drivers/iio/gyro/st_gyro_buffer.c
+++ b/drivers/iio/gyro/st_gyro_buffer.c
@@ -19,8 +19,8 @@
#include <linux/iio/buffer.h>
#include <linux/iio/trigger_consumer.h>
#include <linux/iio/triggered_buffer.h>
-
#include <linux/iio/common/st_sensors.h>
+#include <linux/pm_runtime.h>
#include "st_gyro.h"
int st_gyro_trig_set_state(struct iio_trigger *trig, bool state)
@@ -32,7 +32,9 @@ int st_gyro_trig_set_state(struct iio_trigger *trig, bool state)
static int st_gyro_buffer_preenable(struct iio_dev *indio_dev)
{
- return st_sensors_power_enable(indio_dev);
+ pm_runtime_get_sync(indio_dev->dev.parent);
+
+ return 0;
}
static int st_gyro_buffer_postenable(struct iio_dev *indio_dev)
@@ -76,7 +78,8 @@ static int st_gyro_buffer_predisable(struct iio_dev *indio_dev)
if (err < 0)
goto st_gyro_buffer_predisable_error;
- err = st_sensors_power_disable(indio_dev);
+ pm_runtime_mark_last_busy(indio_dev->dev.parent);
+ pm_runtime_put_autosuspend(indio_dev->dev.parent);
st_gyro_buffer_predisable_error:
kfree(gdata->buffer_data);
diff --git a/drivers/iio/gyro/st_gyro_core.c b/drivers/iio/gyro/st_gyro_core.c
index 56764d6fbb2c..906e37b399da 100644
--- a/drivers/iio/gyro/st_gyro_core.c
+++ b/drivers/iio/gyro/st_gyro_core.c
@@ -23,7 +23,7 @@
#include <linux/iio/sysfs.h>
#include <linux/iio/trigger.h>
#include <linux/iio/buffer.h>
-
+#include <linux/pm_runtime.h>
#include <linux/iio/common/st_sensors.h>
#include "st_gyro.h"
@@ -353,7 +353,7 @@ int st_gyro_common_probe(struct iio_dev *indio_dev)
indio_dev->info = &gyro_info;
mutex_init(&gdata->tb.buf_lock);
- err = st_sensors_power_init(indio_dev);
+ err = st_sensors_pm_init(indio_dev);
if (err)
return err;
@@ -395,7 +395,9 @@ int st_gyro_common_probe(struct iio_dev *indio_dev)
dev_info(&indio_dev->dev, "registered gyroscope %s\n",
indio_dev->name);
- return st_sensors_power_disable(indio_dev);
+ pm_runtime_put(indio_dev->dev.parent);
+
+ return 0;
st_gyro_device_register_error:
if (irq > 0)
@@ -403,7 +405,7 @@ st_gyro_device_register_error:
st_gyro_probe_trigger_error:
st_gyro_deallocate_ring(indio_dev);
st_gyro_power_off:
- st_sensors_power_disable(indio_dev);
+ st_sensors_pm_disable(indio_dev);
return err;
}
@@ -413,7 +415,7 @@ 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);
+ st_sensors_pm_disable(indio_dev);
iio_device_unregister(indio_dev);
if (gdata->get_irq_data_ready(indio_dev) > 0)
diff --git a/drivers/iio/gyro/st_gyro_i2c.c b/drivers/iio/gyro/st_gyro_i2c.c
index 2fac5c63c8b3..269dd10513f6 100644
--- a/drivers/iio/gyro/st_gyro_i2c.c
+++ b/drivers/iio/gyro/st_gyro_i2c.c
@@ -100,6 +100,7 @@ static struct i2c_driver st_gyro_driver = {
.driver = {
.name = "st-gyro-i2c",
.of_match_table = of_match_ptr(st_gyro_of_match),
+ .pm = &st_sensors_dev_pm_ops,
},
.probe = st_gyro_i2c_probe,
.remove = st_gyro_i2c_remove,
diff --git a/drivers/iio/gyro/st_gyro_spi.c b/drivers/iio/gyro/st_gyro_spi.c
index ce73c55b6b2c..bae077825e6a 100644
--- a/drivers/iio/gyro/st_gyro_spi.c
+++ b/drivers/iio/gyro/st_gyro_spi.c
@@ -57,6 +57,7 @@ MODULE_DEVICE_TABLE(spi, st_gyro_id_table);
static struct spi_driver st_gyro_driver = {
.driver = {
.name = "st-gyro-spi",
+ .pm = &st_sensors_dev_pm_ops,
},
.probe = st_gyro_spi_probe,
.remove = st_gyro_spi_remove,
diff --git a/drivers/iio/magnetometer/st_magn_buffer.c b/drivers/iio/magnetometer/st_magn_buffer.c
index 29f18cd506ee..618c67d5ed31 100644
--- a/drivers/iio/magnetometer/st_magn_buffer.c
+++ b/drivers/iio/magnetometer/st_magn_buffer.c
@@ -19,8 +19,8 @@
#include <linux/iio/buffer.h>
#include <linux/iio/trigger_consumer.h>
#include <linux/iio/triggered_buffer.h>
-
#include <linux/iio/common/st_sensors.h>
+#include <linux/pm_runtime.h>
#include "st_magn.h"
int st_magn_trig_set_state(struct iio_trigger *trig, bool state)
@@ -32,7 +32,9 @@ int st_magn_trig_set_state(struct iio_trigger *trig, bool state)
static int st_magn_buffer_preenable(struct iio_dev *indio_dev)
{
- return st_sensors_power_enable(indio_dev);
+ pm_runtime_get_sync(indio_dev->dev.parent);
+
+ return 0;
}
static int st_magn_buffer_postenable(struct iio_dev *indio_dev)
@@ -67,7 +69,8 @@ static int st_magn_buffer_predisable(struct iio_dev *indio_dev)
if (err < 0)
goto st_magn_buffer_predisable_error;
- err = st_sensors_power_disable(indio_dev);
+ pm_runtime_mark_last_busy(indio_dev->dev.parent);
+ pm_runtime_put_autosuspend(indio_dev->dev.parent);
st_magn_buffer_predisable_error:
kfree(mdata->buffer_data);
diff --git a/drivers/iio/magnetometer/st_magn_core.c b/drivers/iio/magnetometer/st_magn_core.c
index 2f09286bcf57..e6d9d1e4b405 100644
--- a/drivers/iio/magnetometer/st_magn_core.c
+++ b/drivers/iio/magnetometer/st_magn_core.c
@@ -22,7 +22,7 @@
#include <linux/iio/iio.h>
#include <linux/iio/sysfs.h>
#include <linux/iio/buffer.h>
-
+#include <linux/pm_runtime.h>
#include <linux/iio/common/st_sensors.h>
#include "st_magn.h"
@@ -463,7 +463,7 @@ int st_magn_common_probe(struct iio_dev *indio_dev)
indio_dev->info = &magn_info;
mutex_init(&mdata->tb.buf_lock);
- err = st_sensors_power_init(indio_dev);
+ err = st_sensors_pm_init(indio_dev);
if (err)
return err;
@@ -504,7 +504,9 @@ int st_magn_common_probe(struct iio_dev *indio_dev)
dev_info(&indio_dev->dev, "registered magnetometer %s\n",
indio_dev->name);
- return st_sensors_power_disable(indio_dev);
+ pm_runtime_put(indio_dev->dev.parent);
+
+ return 0;
st_magn_device_register_error:
if (irq > 0)
@@ -512,7 +514,7 @@ st_magn_device_register_error:
st_magn_probe_trigger_error:
st_magn_deallocate_ring(indio_dev);
st_magn_power_off:
- st_sensors_power_disable(indio_dev);
+ st_sensors_pm_disable(indio_dev);
return err;
}
@@ -522,7 +524,7 @@ void st_magn_common_remove(struct iio_dev *indio_dev)
{
struct st_sensor_data *mdata = iio_priv(indio_dev);
- st_sensors_power_disable(indio_dev);
+ st_sensors_pm_disable(indio_dev);
iio_device_unregister(indio_dev);
if (mdata->get_irq_data_ready(indio_dev) > 0)
diff --git a/drivers/iio/pressure/st_pressure_buffer.c b/drivers/iio/pressure/st_pressure_buffer.c
index 4013b0da7c90..ece0e9a4b734 100644
--- a/drivers/iio/pressure/st_pressure_buffer.c
+++ b/drivers/iio/pressure/st_pressure_buffer.c
@@ -19,8 +19,8 @@
#include <linux/iio/buffer.h>
#include <linux/iio/trigger_consumer.h>
#include <linux/iio/triggered_buffer.h>
-
#include <linux/iio/common/st_sensors.h>
+#include <linux/pm_runtime.h>
#include "st_pressure.h"
int st_press_trig_set_state(struct iio_trigger *trig, bool state)
@@ -32,7 +32,9 @@ int st_press_trig_set_state(struct iio_trigger *trig, bool state)
static int st_press_buffer_preenable(struct iio_dev *indio_dev)
{
- return st_sensors_power_enable(indio_dev);
+ pm_runtime_get_sync(indio_dev->dev.parent);
+
+ return 0;
}
static int st_press_buffer_postenable(struct iio_dev *indio_dev)
@@ -67,7 +69,8 @@ static int st_press_buffer_predisable(struct iio_dev *indio_dev)
if (err < 0)
goto st_press_buffer_predisable_error;
- err = st_sensors_power_disable(indio_dev);
+ pm_runtime_mark_last_busy(indio_dev->dev.parent);
+ pm_runtime_put_autosuspend(indio_dev->dev.parent);
st_press_buffer_predisable_error:
kfree(press_data->buffer_data);
diff --git a/drivers/iio/pressure/st_pressure_core.c b/drivers/iio/pressure/st_pressure_core.c
index 84de05d03764..246476253386 100644
--- a/drivers/iio/pressure/st_pressure_core.c
+++ b/drivers/iio/pressure/st_pressure_core.c
@@ -23,6 +23,7 @@
#include <linux/iio/sysfs.h>
#include <linux/iio/trigger.h>
#include <linux/iio/buffer.h>
+#include <linux/pm_runtime.h>
#include <asm/unaligned.h>
#include <linux/iio/common/st_sensors.h>
@@ -572,7 +573,7 @@ int st_press_common_probe(struct iio_dev *indio_dev)
indio_dev->info = &press_info;
mutex_init(&press_data->tb.buf_lock);
- err = st_sensors_power_init(indio_dev);
+ err = st_sensors_pm_init(indio_dev);
if (err)
return err;
@@ -627,7 +628,9 @@ int st_press_common_probe(struct iio_dev *indio_dev)
dev_info(&indio_dev->dev, "registered pressure sensor %s\n",
indio_dev->name);
- return st_sensors_power_disable(indio_dev);
+ pm_runtime_put(indio_dev->dev.parent);
+
+ return 0;
st_press_device_register_error:
if (irq > 0)
@@ -635,7 +638,7 @@ st_press_device_register_error:
st_press_probe_trigger_error:
st_press_deallocate_ring(indio_dev);
st_press_power_off:
- st_sensors_power_disable(indio_dev);
+ st_sensors_pm_disable(indio_dev);
return err;
}
@@ -645,7 +648,7 @@ void st_press_common_remove(struct iio_dev *indio_dev)
{
struct st_sensor_data *press_data = iio_priv(indio_dev);
- st_sensors_power_disable(indio_dev);
+ st_sensors_pm_disable(indio_dev);
iio_device_unregister(indio_dev);
if (press_data->get_irq_data_ready(indio_dev) > 0)
diff --git a/drivers/iio/pressure/st_pressure_i2c.c b/drivers/iio/pressure/st_pressure_i2c.c
index 4d78e39c8a2f..47da8509d5b1 100644
--- a/drivers/iio/pressure/st_pressure_i2c.c
+++ b/drivers/iio/pressure/st_pressure_i2c.c
@@ -79,6 +79,7 @@ static struct i2c_driver st_press_driver = {
.driver = {
.name = "st-press-i2c",
.of_match_table = of_match_ptr(st_press_of_match),
+ .pm = &st_sensors_dev_pm_ops,
},
.probe = st_press_i2c_probe,
.remove = st_press_i2c_remove,
diff --git a/drivers/iio/pressure/st_pressure_spi.c b/drivers/iio/pressure/st_pressure_spi.c
index d97dcddae064..1552cefd28fb 100644
--- a/drivers/iio/pressure/st_pressure_spi.c
+++ b/drivers/iio/pressure/st_pressure_spi.c
@@ -53,6 +53,7 @@ MODULE_DEVICE_TABLE(spi, st_press_id_table);
static struct spi_driver st_press_driver = {
.driver = {
.name = "st-press-spi",
+ .pm = &st_sensors_dev_pm_ops,
},
.probe = st_press_spi_probe,
.remove = st_press_spi_remove,
diff --git a/include/linux/iio/common/st_sensors.h b/include/linux/iio/common/st_sensors.h
index 2df38a0f2e9d..6a044f97bb13 100644
--- a/include/linux/iio/common/st_sensors.h
+++ b/include/linux/iio/common/st_sensors.h
@@ -17,6 +17,7 @@
#include <linux/iio/trigger.h>
#include <linux/bitops.h>
#include <linux/regulator/consumer.h>
+#include <linux/device.h>
#include <linux/platform_data/st_sensors_pdata.h>
@@ -268,6 +269,9 @@ struct st_sensor_data {
s64 hw_timestamp;
};
+/* PM ops */
+extern const struct dev_pm_ops st_sensors_dev_pm_ops;
+
#ifdef CONFIG_IIO_BUFFER
irqreturn_t st_sensors_trigger_handler(int irq, void *p);
#endif
@@ -297,11 +301,9 @@ int st_sensors_init_sensor(struct iio_dev *indio_dev,
int st_sensors_set_axis_enable(struct iio_dev *indio_dev, u8 axis_enable);
-int st_sensors_power_init(struct iio_dev *indio_dev);
-
-int st_sensors_power_enable(struct iio_dev *indio_dev);
+int st_sensors_pm_init(struct iio_dev *indio_dev);
-int st_sensors_power_disable(struct iio_dev *indio_dev);
+void st_sensors_pm_disable(struct iio_dev *indio_dev);
int st_sensors_debugfs_reg_access(struct iio_dev *indio_dev,
unsigned reg, unsigned writeval,