[PATCH 17/23] pca953x: add power management support
Brad Figg
brad.figg at canonical.com
Thu Aug 27 23:20:57 UTC 2009
From: Saeed Bishara <saeed at marvell.com>
Signed-off-by: Saeed Bishara <saeed at marvell.com>
Signed-off-by: Brad Figg <brad.figg at canonical.com>
---
drivers/gpio/pca953x.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 48 insertions(+), 0 deletions(-)
diff --git a/drivers/gpio/pca953x.c b/drivers/gpio/pca953x.c
index cdb6574..2707624 100644
--- a/drivers/gpio/pca953x.c
+++ b/drivers/gpio/pca953x.c
@@ -350,12 +350,60 @@ static int pca953x_remove(struct i2c_client *client)
return 0;
}
+#ifdef CONFIG_PM
+static int pca953x_suspend(struct i2c_client *client, pm_message_t state)
+{
+ struct pca953x_platform_data *pdata = client->dev.platform_data;
+ struct pca953x_chip *chip = i2c_get_clientdata(client);
+ int ret;
+
+ ret = pca953x_read_reg(chip, PCA953X_OUTPUT, &chip->reg_output);
+ if (ret)
+ return ret;
+
+ ret = pca953x_read_reg(chip, PCA953X_DIRECTION, &chip->reg_direction);
+
+ return ret;
+}
+
+static int pca953x_resume(struct i2c_client *client)
+{
+ struct pca953x_platform_data *pdata = client->dev.platform_data;
+ struct pca953x_chip *chip = i2c_get_clientdata(client);
+ uint16_t reg_val;
+ int ret = 0;
+
+ /* set platform specific polarity inversion */
+ ret = pca953x_write_reg(chip, PCA953X_INVERT, pdata->invert);
+ if (ret)
+ return ret;
+
+ ret = pca953x_write_reg(chip, PCA953X_OUTPUT, chip->reg_output);
+ if (ret)
+ return ret;
+
+ ret = pca953x_write_reg(chip, PCA953X_DIRECTION, chip->reg_direction);
+
+ if (ret)
+ return ret;
+
+ ret = pca953x_read_reg(chip, PCA953X_INPUT, ®_val);
+ return ret;
+}
+
+#else
+#define pca953x_suspend NULL
+#define pca953x_resume NULL
+#endif
+
static struct i2c_driver pca953x_driver = {
.driver = {
.name = "pca953x",
},
.probe = pca953x_probe,
.remove = pca953x_remove,
+ .suspend = pca953x_suspend,
+ .resume = pca953x_resume,
.id_table = pca953x_id,
};
--
1.6.0.4
More information about the kernel-team
mailing list