diff options
author | Andy Gross <andy.gross@ti.com> | 2012-12-19 14:53:37 -0600 |
---|---|---|
committer | Rob Clark <robdclark@gmail.com> | 2013-02-16 17:38:04 -0500 |
commit | 4836d15789c85224662d3e037694d15ec9901631 (patch) | |
tree | e112870812cb4556086167d2f1e8ef90691348f4 /drivers/staging/omapdrm/omap_drv.c | |
parent | 3314fdf8b44bd4914050614fa2c56b7c587fabc2 (diff) | |
download | linux-stable-4836d15789c85224662d3e037694d15ec9901631.tar.gz linux-stable-4836d15789c85224662d3e037694d15ec9901631.tar.bz2 linux-stable-4836d15789c85224662d3e037694d15ec9901631.zip |
drm/omap: Add PM capabilities
Added power management capabilities into the omapdrm and DMM drivers.
During suspend, we don't need to do anything to maintain the state of
the LUT. We have all the necessary information to recreate the mappings
of the GEM object list maintained by the omapdrm driver.
On resume, the DMM resume handler will first reprogram the LUT to point
to the dummy page. The subsequent resume handler in the omapdrm will call
into the DMM and reprogram each of the buffer objects. This will ensure
that all of the necessary objects will be pinned into the DMM properly.
Order of suspend/resume handlers is done by device creation. We create
the DMM device before the omapdrm, so the correct order is maintained.
Signed-off-by: Andy Gross <andy.gross@ti.com>
Signed-off-by: Rob Clark <rob@ti.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging/omapdrm/omap_drv.c')
-rw-r--r-- | drivers/staging/omapdrm/omap_drv.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/staging/omapdrm/omap_drv.c b/drivers/staging/omapdrm/omap_drv.c index dfdb4ba1e7c6..9d6a584113d2 100644 --- a/drivers/staging/omapdrm/omap_drv.c +++ b/drivers/staging/omapdrm/omap_drv.c @@ -368,6 +368,9 @@ static int dev_load(struct drm_device *dev, unsigned long flags) /* well, limp along without an fbdev.. maybe X11 will work? */ } + /* store off drm_device for use in pm ops */ + dev_set_drvdata(dev->dev, dev); + drm_kms_helper_poll_init(dev); return 0; @@ -393,6 +396,8 @@ static int dev_unload(struct drm_device *dev) kfree(dev->dev_private); dev->dev_private = NULL; + dev_set_drvdata(dev->dev, NULL); + return 0; } @@ -558,10 +563,19 @@ static int pdev_remove(struct platform_device *device) return 0; } +#ifdef CONFIG_PM +static const struct dev_pm_ops omapdrm_pm_ops = { + .resume = omap_gem_resume, +}; +#endif + struct platform_driver pdev = { .driver = { .name = DRIVER_NAME, .owner = THIS_MODULE, +#ifdef CONFIG_PM + .pm = &omapdrm_pm_ops, +#endif }, .probe = pdev_probe, .remove = pdev_remove, |