summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPer Persson <per.xb.persson@stericsson.com>2011-06-07 10:37:21 +0200
committerUlf Hansson <ulf.hansson@stericsson.com>2011-09-19 15:15:35 +0200
commitf717040820c64467d8f7d2c8e860237d8a20a022 (patch)
tree48662870585b96fcb8b5151d39d5d17260cd4f6c
parent1b0cba2a443d33a4f7fb120aff8d28d300e7bc46 (diff)
video: av8100: Add suspend resume
Parts of suspend/resume handling are moved from display driver to av8100 driver. ST-Ericsson ID: 326691 ST-Ericsson Linux next: Not tested, ER 282779 ST-Ericsson FOSS-OUT ID: Trivial Change-Id: I9a6ac38c138bfea4cf07d3b38d16d4ac95d05a84 Signed-off-by: Per Persson <per.xb.persson@stericsson.com>
-rw-r--r--drivers/video/av8100/av8100.c52
-rw-r--r--drivers/video/mcde/display-av8100.c12
2 files changed, 52 insertions, 12 deletions
diff --git a/drivers/video/av8100/av8100.c b/drivers/video/av8100/av8100.c
index 1e17256194c..39d32ba5cb6 100644
--- a/drivers/video/av8100/av8100.c
+++ b/drivers/video/av8100/av8100.c
@@ -476,9 +476,60 @@ static const struct i2c_device_id av8100_id[] = {
{ }
};
+#ifdef CONFIG_PM
+static int av8100_suspend(struct i2c_client *i2c_client, pm_message_t state)
+{
+ int ret;
+
+ dev_dbg(av8100dev, "%s\n", __func__);
+
+ ret = av8100_powerdown();
+ if (ret)
+ dev_err(av8100dev, "av8100_powerdown failed\n");
+
+ return ret;
+}
+
+static int av8100_resume(struct i2c_client *i2c_client)
+{
+ int ret;
+ u8 hpds = 0;
+
+ dev_dbg(av8100dev, "%s\n", __func__);
+
+ ret = av8100_powerup();
+ if (ret) {
+ dev_err(av8100dev, "av8100_powerup failed\n");
+ return ret;
+ }
+
+ /* Check HDMI plug status */
+ if (av8100_reg_stby_r(NULL, NULL, &hpds, NULL, NULL)) {
+ dev_warn(av8100dev, "av8100_reg_stby_r failed\n");
+ goto av8100_resume_end;
+ }
+
+ if (hpds)
+ set_plug_status(AV8100_HDMI_PLUGIN); /* Plugged*/
+ else
+ clr_plug_status(AV8100_HDMI_PLUGIN); /* Unplugged*/
+
+ av8100_globals->hpdm = AV8100_STANDBY_INTERRUPT_MASK_HPDM_HIGH;
+ av8100_enable_interrupt();
+
+av8100_resume_end:
+ return 0;
+}
+#else
+#define av8100_suspend NULL
+#define av8100_resume NULL
+#endif
+
static struct i2c_driver av8100_driver = {
.probe = av8100_probe,
.remove = av8100_remove,
+ .suspend = av8100_suspend,
+ .resume = av8100_resume,
.driver = {
.name = "av8100",
},
@@ -538,7 +589,6 @@ static int av8100_int_event_handle(void)
}
if (hpdi & av8100_globals->hpdm) {
-
/* HDMI plugin change */
if (hpds) {
/* Plugged */
diff --git a/drivers/video/mcde/display-av8100.c b/drivers/video/mcde/display-av8100.c
index 9134e4bf33f..99070b6071f 100644
--- a/drivers/video/mcde/display-av8100.c
+++ b/drivers/video/mcde/display-av8100.c
@@ -1253,13 +1253,6 @@ static int hdmi_set_power_mode(struct mcde_display_device *ddev,
return ret;
}
- ret = av8100_powerup();
- if (ret) {
- dev_err(&ddev->dev, "av8100_powerup failed\n");
- return ret;
- }
- av8100_enable_interrupt();
-
/*
* the regulator for analog TV out is only enabled here,
* this means that one needs to switch to the OFF state
@@ -1292,10 +1285,7 @@ static int hdmi_set_power_mode(struct mcde_display_device *ddev,
if (ddev->power_mode == MCDE_DISPLAY_PM_STANDBY &&
power_mode == MCDE_DISPLAY_PM_OFF) {
memset(&(ddev->video_mode), 0, sizeof(struct mcde_video_mode));
- ret = av8100_powerdown();
- if (ret)
- dev_err(&ddev->dev, "%s:av8100_powerdown failed\n"
- , __func__);
+
if (ddev->platform_disable) {
ret = ddev->platform_disable(ddev);
if (ret)