Commit c39a05e3 authored by David Heidelberg's avatar David Heidelberg Committed by Jonathan Cameron

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: default avatarDavid Heidelberg <david@ixit.cz>
Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent c36b5195
...@@ -7,6 +7,9 @@ ...@@ -7,6 +7,9 @@
* IIO driver for AL3320A (7-bit I2C slave address 0x1C). * IIO driver for AL3320A (7-bit I2C slave address 0x1C).
* *
* TODO: interrupt support, thresholds * 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> #include <linux/bitfield.h>
...@@ -78,13 +81,18 @@ static const struct attribute_group al3320a_attribute_group = { ...@@ -78,13 +81,18 @@ static const struct attribute_group al3320a_attribute_group = {
.attrs = al3320a_attributes, .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) static int al3320a_init(struct al3320a_data *data)
{ {
int ret; int ret;
/* power on */ ret = al3320a_set_pwr(data->client, true);
ret = i2c_smbus_write_byte_data(data->client, AL3320A_REG_CONFIG,
AL3320A_CONFIG_ENABLE);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -203,10 +211,21 @@ static int al3320a_probe(struct i2c_client *client, ...@@ -203,10 +211,21 @@ static int al3320a_probe(struct i2c_client *client,
static int al3320a_remove(struct i2c_client *client) static int al3320a_remove(struct i2c_client *client)
{ {
return i2c_smbus_write_byte_data(client, AL3320A_REG_CONFIG, return al3320a_set_pwr(client, false);
AL3320A_CONFIG_DISABLE);
} }
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[] = { static const struct i2c_device_id al3320a_id[] = {
{"al3320a", 0}, {"al3320a", 0},
{} {}
...@@ -216,6 +235,7 @@ MODULE_DEVICE_TABLE(i2c, al3320a_id); ...@@ -216,6 +235,7 @@ MODULE_DEVICE_TABLE(i2c, al3320a_id);
static struct i2c_driver al3320a_driver = { static struct i2c_driver al3320a_driver = {
.driver = { .driver = {
.name = AL3320A_DRV_NAME, .name = AL3320A_DRV_NAME,
.pm = &al3320a_pm_ops,
}, },
.probe = al3320a_probe, .probe = al3320a_probe,
.remove = al3320a_remove, .remove = al3320a_remove,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment