Commit 74614f8d authored by Daniel Mack's avatar Daniel Mack Committed by Linus Torvalds

isl29003: fix resume functionality

The isl29003 does not interpret the return value of
i2c_smbus_write_byte_data() correctly and hence causes an error on system
resume.

Also introduce power_state_before_suspend and restore the chip's power
state upon wakeup.
Signed-off-by: default avatarDaniel Mack <daniel@caiaq.de>
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>
Cc: Jean Delvare <khali@linux-fr.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 57226e78
...@@ -64,6 +64,7 @@ struct isl29003_data { ...@@ -64,6 +64,7 @@ struct isl29003_data {
struct i2c_client *client; struct i2c_client *client;
struct mutex lock; struct mutex lock;
u8 reg_cache[ISL29003_NUM_CACHABLE_REGS]; u8 reg_cache[ISL29003_NUM_CACHABLE_REGS];
u8 power_state_before_suspend;
}; };
static int gain_range[] = { static int gain_range[] = {
...@@ -411,6 +412,9 @@ static int __devexit isl29003_remove(struct i2c_client *client) ...@@ -411,6 +412,9 @@ static int __devexit isl29003_remove(struct i2c_client *client)
#ifdef CONFIG_PM #ifdef CONFIG_PM
static int isl29003_suspend(struct i2c_client *client, pm_message_t mesg) static int isl29003_suspend(struct i2c_client *client, pm_message_t mesg)
{ {
struct isl29003_data *data = i2c_get_clientdata(client);
data->power_state_before_suspend = isl29003_get_power_state(client);
return isl29003_set_power_state(client, 0); return isl29003_set_power_state(client, 0);
} }
...@@ -421,10 +425,11 @@ static int isl29003_resume(struct i2c_client *client) ...@@ -421,10 +425,11 @@ static int isl29003_resume(struct i2c_client *client)
/* restore registers from cache */ /* restore registers from cache */
for (i = 0; i < ARRAY_SIZE(data->reg_cache); i++) for (i = 0; i < ARRAY_SIZE(data->reg_cache); i++)
if (!i2c_smbus_write_byte_data(client, i, data->reg_cache[i])) if (i2c_smbus_write_byte_data(client, i, data->reg_cache[i]))
return -EIO; return -EIO;
return 0; return isl29003_set_power_state(client,
data->power_state_before_suspend);
} }
#else #else
......
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