Re: [PATCH v2] iio: humidity: hts221: add power management support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 14/05/17 16:45, Lorenzo Bianconi wrote:
Add system sleep power management support to hts221 driver

Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@xxxxxx>
Given the chance is so minor, I can't see any reason not to
pick this up immediately.

Applied to the togreg branch of iio.git and pushed out as testing
for the autobuilders to play with it.

Thanks,

Jonathan
---
Changes since v1:
- substitute ifdef CONFIG_PM with __maybe_unused macro
---
  drivers/iio/humidity/hts221.h      |  3 +++
  drivers/iio/humidity/hts221_core.c | 54 +++++++++++++++++++++++++++++++++++---
  drivers/iio/humidity/hts221_i2c.c  |  1 +
  drivers/iio/humidity/hts221_spi.c  |  1 +
  4 files changed, 55 insertions(+), 4 deletions(-)

diff --git a/drivers/iio/humidity/hts221.h b/drivers/iio/humidity/hts221.h
index c7154665512e..94510266e0a5 100644
--- a/drivers/iio/humidity/hts221.h
+++ b/drivers/iio/humidity/hts221.h
@@ -57,12 +57,15 @@ struct hts221_hw {
struct hts221_sensor sensors[HTS221_SENSOR_MAX]; + bool enabled;
  	u8 odr;
const struct hts221_transfer_function *tf;
  	struct hts221_transfer_buffer tb;
  };
+extern const struct dev_pm_ops hts221_pm_ops;
+
  int hts221_config_drdy(struct hts221_hw *hw, bool enable);
  int hts221_probe(struct iio_dev *iio_dev);
  int hts221_power_on(struct hts221_hw *hw);
diff --git a/drivers/iio/humidity/hts221_core.c b/drivers/iio/humidity/hts221_core.c
index 3f3ef4a1a474..a56da3999e00 100644
--- a/drivers/iio/humidity/hts221_core.c
+++ b/drivers/iio/humidity/hts221_core.c
@@ -13,6 +13,7 @@
  #include <linux/device.h>
  #include <linux/iio/sysfs.h>
  #include <linux/delay.h>
+#include <linux/pm.h>
  #include <asm/unaligned.h>
#include "hts221.h"
@@ -307,15 +308,30 @@ hts221_sysfs_temp_oversampling_avail(struct device *dev,
int hts221_power_on(struct hts221_hw *hw)
  {
-	return hts221_update_odr(hw, hw->odr);
+	int err;
+
+	err = hts221_update_odr(hw, hw->odr);
+	if (err < 0)
+		return err;
+
+	hw->enabled = true;
+
+	return 0;
  }
int hts221_power_off(struct hts221_hw *hw)
  {
-	u8 data[] = {0x00, 0x00};
+	__le16 data = 0;
+	int err;
- return hw->tf->write(hw->dev, HTS221_REG_CNTRL1_ADDR, sizeof(data),
-			     data);
+	err = hw->tf->write(hw->dev, HTS221_REG_CNTRL1_ADDR, sizeof(data),
+			    (u8 *)&data);
+	if (err < 0)
+		return err;
+
+	hw->enabled = false;
+
+	return 0;
  }
static int hts221_parse_temp_caldata(struct hts221_hw *hw)
@@ -682,6 +698,36 @@ int hts221_probe(struct iio_dev *iio_dev)
  }
  EXPORT_SYMBOL(hts221_probe);
+static int __maybe_unused hts221_suspend(struct device *dev)
+{
+	struct iio_dev *iio_dev = dev_get_drvdata(dev);
+	struct hts221_hw *hw = iio_priv(iio_dev);
+	__le16 data = 0;
+	int err;
+
+	err = hw->tf->write(hw->dev, HTS221_REG_CNTRL1_ADDR, sizeof(data),
+			    (u8 *)&data);
+
+	return err < 0 ? err : 0;
+}
+
+static int __maybe_unused hts221_resume(struct device *dev)
+{
+	struct iio_dev *iio_dev = dev_get_drvdata(dev);
+	struct hts221_hw *hw = iio_priv(iio_dev);
+	int err = 0;
+
+	if (hw->enabled)
+		err = hts221_update_odr(hw, hw->odr);
+
+	return err;
+}
+
+const struct dev_pm_ops hts221_pm_ops = {
+	SET_SYSTEM_SLEEP_PM_OPS(hts221_suspend, hts221_resume)
+};
+EXPORT_SYMBOL(hts221_pm_ops);
+
  MODULE_AUTHOR("Lorenzo Bianconi <lorenzo.bianconi@xxxxxx>");
  MODULE_DESCRIPTION("STMicroelectronics hts221 sensor driver");
  MODULE_LICENSE("GPL v2");
diff --git a/drivers/iio/humidity/hts221_i2c.c b/drivers/iio/humidity/hts221_i2c.c
index 8333c0296c0e..f38e4b7e0160 100644
--- a/drivers/iio/humidity/hts221_i2c.c
+++ b/drivers/iio/humidity/hts221_i2c.c
@@ -105,6 +105,7 @@ MODULE_DEVICE_TABLE(i2c, hts221_i2c_id_table);
  static struct i2c_driver hts221_driver = {
  	.driver = {
  		.name = "hts221_i2c",
+		.pm = &hts221_pm_ops,
  		.of_match_table = of_match_ptr(hts221_i2c_of_match),
  		.acpi_match_table = ACPI_PTR(hts221_acpi_match),
  	},
diff --git a/drivers/iio/humidity/hts221_spi.c b/drivers/iio/humidity/hts221_spi.c
index 70df5e7150c1..57cbc256771b 100644
--- a/drivers/iio/humidity/hts221_spi.c
+++ b/drivers/iio/humidity/hts221_spi.c
@@ -113,6 +113,7 @@ MODULE_DEVICE_TABLE(spi, hts221_spi_id_table);
  static struct spi_driver hts221_driver = {
  	.driver = {
  		.name = "hts221_spi",
+		.pm = &hts221_pm_ops,
  		.of_match_table = of_match_ptr(hts221_spi_of_match),
  	},
  	.probe = hts221_spi_probe,


--
To unsubscribe from this list: send the line "unsubscribe linux-iio" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Input]     [Linux Kernel]     [Linux SCSI]     [X.org]

  Powered by Linux