linux-iio.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2] iio: humidity: hts221: add power management support
@ 2017-05-14 15:45 Lorenzo Bianconi
  2017-05-14 15:53 ` Jonathan Cameron
  0 siblings, 1 reply; 2+ messages in thread
From: Lorenzo Bianconi @ 2017-05-14 15:45 UTC (permalink / raw)
  To: jic23; +Cc: linux-iio, masneyb, lorenzo.bianconi

Add system sleep power management support to hts221 driver

Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@st.com>
---
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@st.com>");
 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,
-- 
2.12.2


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH v2] iio: humidity: hts221: add power management support
  2017-05-14 15:45 [PATCH v2] iio: humidity: hts221: add power management support Lorenzo Bianconi
@ 2017-05-14 15:53 ` Jonathan Cameron
  0 siblings, 0 replies; 2+ messages in thread
From: Jonathan Cameron @ 2017-05-14 15:53 UTC (permalink / raw)
  To: Lorenzo Bianconi; +Cc: linux-iio, masneyb, lorenzo.bianconi

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@st.com>
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@st.com>");
>   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,
> 


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2017-05-14 15:53 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-05-14 15:45 [PATCH v2] iio: humidity: hts221: add power management support Lorenzo Bianconi
2017-05-14 15:53 ` Jonathan Cameron

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).