summaryrefslogtreecommitdiff
path: root/drivers/iio/light/al3320a.c
diff options
context:
space:
mode:
authorDavid Heidelberg <david@ixit.cz>2020-02-11 22:11:59 +0300
committerJonathan Cameron <Jonathan.Cameron@huawei.com>2020-03-08 20:28:34 +0300
commitc39a05e35263a2c8abea81df40b42aef33d1a759 (patch)
tree6dee9ca585ffd6395ac1fd59f4703199904abdab /drivers/iio/light/al3320a.c
parentc36b5195ab7035cc7ee0b79f621a3a9ecd71cf9c (diff)
downloadlinux-c39a05e35263a2c8abea81df40b42aef33d1a759.tar.xz
iio: light: al3320a implement suspend support
AL3320a is fairly simple chip, so for suspend is enough to disable and later enable it again. Signed-off-by: David Heidelberg <david@ixit.cz> Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Diffstat (limited to 'drivers/iio/light/al3320a.c')
-rw-r--r--drivers/iio/light/al3320a.c30
1 files changed, 25 insertions, 5 deletions
diff --git a/drivers/iio/light/al3320a.c b/drivers/iio/light/al3320a.c
index cd3e25dd8153..2659a352b55e 100644
--- a/drivers/iio/light/al3320a.c
+++ b/drivers/iio/light/al3320a.c
@@ -7,6 +7,9 @@
* IIO driver for AL3320A (7-bit I2C slave address 0x1C).
*
* TODO: interrupt support, thresholds
+ * When the driver will get support for interrupt handling, then interrupt
+ * will need to be disabled before turning sensor OFF in order to avoid
+ * potential races with the interrupt handling.
*/
#include <linux/bitfield.h>
@@ -78,13 +81,18 @@ static const struct attribute_group al3320a_attribute_group = {
.attrs = al3320a_attributes,
};
+static int al3320a_set_pwr(struct i2c_client *client, bool pwr)
+{
+ u8 val = pwr ? AL3320A_CONFIG_ENABLE : AL3320A_CONFIG_DISABLE;
+ return i2c_smbus_write_byte_data(client, AL3320A_REG_CONFIG, val);
+}
+
static int al3320a_init(struct al3320a_data *data)
{
int ret;
- /* power on */
- ret = i2c_smbus_write_byte_data(data->client, AL3320A_REG_CONFIG,
- AL3320A_CONFIG_ENABLE);
+ ret = al3320a_set_pwr(data->client, true);
+
if (ret < 0)
return ret;
@@ -203,10 +211,21 @@ static int al3320a_probe(struct i2c_client *client,
static int al3320a_remove(struct i2c_client *client)
{
- return i2c_smbus_write_byte_data(client, AL3320A_REG_CONFIG,
- AL3320A_CONFIG_DISABLE);
+ return al3320a_set_pwr(client, false);
}
+static int __maybe_unused al3320a_suspend(struct device *dev)
+{
+ return al3320a_set_pwr(to_i2c_client(dev), false);
+}
+
+static int __maybe_unused al3320a_resume(struct device *dev)
+{
+ return al3320a_set_pwr(to_i2c_client(dev), true);
+}
+
+static SIMPLE_DEV_PM_OPS(al3320a_pm_ops, al3320a_suspend, al3320a_resume);
+
static const struct i2c_device_id al3320a_id[] = {
{"al3320a", 0},
{}
@@ -216,6 +235,7 @@ MODULE_DEVICE_TABLE(i2c, al3320a_id);
static struct i2c_driver al3320a_driver = {
.driver = {
.name = AL3320A_DRV_NAME,
+ .pm = &al3320a_pm_ops,
},
.probe = al3320a_probe,
.remove = al3320a_remove,