diff options
author | Sylvain Rochet <sylvain.rochet@finsecur.com> | 2015-02-22 12:51:03 -0500 |
---|---|---|
committer | Boris Brezillon <boris.brezillon@free-electrons.com> | 2015-02-24 05:23:07 -0500 |
commit | 58486982586da444f940dc8fdea598649b4a2fe8 (patch) | |
tree | 3b5708af263d2fa235ae19b8e7417a2cbe2e67c3 /drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c | |
parent | 5957017db0f62e00c42d5b8d61ac850636be1230 (diff) |
drm: atmel-hlcdc: Add PM suspend/resume support
On suspend: switch off CRTC if not already suspended with runtime PM
On resume: switch on CRTC if we were not already suspended from runtime
PM while suspending.
Signed-off-by: Sylvain Rochet <sylvain.rochet@finsecur.com>
Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>
Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
Diffstat (limited to 'drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c')
-rw-r--r-- | drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c index 47fd1470f755..01afeafe17b1 100644 --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c | |||
@@ -561,6 +561,52 @@ static int atmel_hlcdc_dc_drm_remove(struct platform_device *pdev) | |||
561 | return 0; | 561 | return 0; |
562 | } | 562 | } |
563 | 563 | ||
564 | #ifdef CONFIG_PM | ||
565 | static int atmel_hlcdc_dc_drm_suspend(struct device *dev) | ||
566 | { | ||
567 | struct drm_device *drm_dev = dev_get_drvdata(dev); | ||
568 | struct drm_crtc *crtc; | ||
569 | |||
570 | if (pm_runtime_suspended(dev)) | ||
571 | return 0; | ||
572 | |||
573 | drm_modeset_lock_all(drm_dev); | ||
574 | list_for_each_entry(crtc, &drm_dev->mode_config.crtc_list, head) { | ||
575 | struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; | ||
576 | if (crtc->enabled) { | ||
577 | crtc_funcs->disable(crtc); | ||
578 | /* save enable state for resume */ | ||
579 | crtc->enabled = true; | ||
580 | } | ||
581 | } | ||
582 | drm_modeset_unlock_all(drm_dev); | ||
583 | return 0; | ||
584 | } | ||
585 | |||
586 | static int atmel_hlcdc_dc_drm_resume(struct device *dev) | ||
587 | { | ||
588 | struct drm_device *drm_dev = dev_get_drvdata(dev); | ||
589 | struct drm_crtc *crtc; | ||
590 | |||
591 | if (pm_runtime_suspended(dev)) | ||
592 | return 0; | ||
593 | |||
594 | drm_modeset_lock_all(drm_dev); | ||
595 | list_for_each_entry(crtc, &drm_dev->mode_config.crtc_list, head) { | ||
596 | struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; | ||
597 | if (crtc->enabled) { | ||
598 | crtc->enabled = false; | ||
599 | crtc_funcs->enable(crtc); | ||
600 | } | ||
601 | } | ||
602 | drm_modeset_unlock_all(drm_dev); | ||
603 | return 0; | ||
604 | } | ||
605 | #endif | ||
606 | |||
607 | static SIMPLE_DEV_PM_OPS(atmel_hlcdc_dc_drm_pm_ops, | ||
608 | atmel_hlcdc_dc_drm_suspend, atmel_hlcdc_dc_drm_resume); | ||
609 | |||
564 | static const struct of_device_id atmel_hlcdc_dc_of_match[] = { | 610 | static const struct of_device_id atmel_hlcdc_dc_of_match[] = { |
565 | { .compatible = "atmel,hlcdc-display-controller" }, | 611 | { .compatible = "atmel,hlcdc-display-controller" }, |
566 | { }, | 612 | { }, |
@@ -571,6 +617,7 @@ static struct platform_driver atmel_hlcdc_dc_platform_driver = { | |||
571 | .remove = atmel_hlcdc_dc_drm_remove, | 617 | .remove = atmel_hlcdc_dc_drm_remove, |
572 | .driver = { | 618 | .driver = { |
573 | .name = "atmel-hlcdc-display-controller", | 619 | .name = "atmel-hlcdc-display-controller", |
620 | .pm = &atmel_hlcdc_dc_drm_pm_ops, | ||
574 | .of_match_table = atmel_hlcdc_dc_of_match, | 621 | .of_match_table = atmel_hlcdc_dc_of_match, |
575 | }, | 622 | }, |
576 | }; | 623 | }; |