diff options
author | Per Persson <per.xb.persson@stericsson.com> | 2011-06-07 10:37:21 +0200 |
---|---|---|
committer | Ulf Hansson <ulf.hansson@stericsson.com> | 2011-09-19 15:15:35 +0200 |
commit | f717040820c64467d8f7d2c8e860237d8a20a022 (patch) | |
tree | 48662870585b96fcb8b5151d39d5d17260cd4f6c | |
parent | 1b0cba2a443d33a4f7fb120aff8d28d300e7bc46 (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.c | 52 | ||||
-rw-r--r-- | drivers/video/mcde/display-av8100.c | 12 |
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) |