diff options
Diffstat (limited to 'drivers/gpu/drm/omapdrm')
-rw-r--r-- | drivers/gpu/drm/omapdrm/dss/core.c | 29 | ||||
-rw-r--r-- | drivers/gpu/drm/omapdrm/dss/display.c | 36 | ||||
-rw-r--r-- | drivers/gpu/drm/omapdrm/dss/dss.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/omapdrm/omap_drv.c | 44 |
4 files changed, 44 insertions, 67 deletions
diff --git a/drivers/gpu/drm/omapdrm/dss/core.c b/drivers/gpu/drm/omapdrm/dss/core.c index 54eeb507f9b3..1f55d0aae03d 100644 --- a/drivers/gpu/drm/omapdrm/dss/core.c +++ b/drivers/gpu/drm/omapdrm/dss/core.c | |||
@@ -165,31 +165,6 @@ int dss_debugfs_create_file(const char *name, void (*write)(struct seq_file *)) | |||
165 | #endif /* CONFIG_OMAP2_DSS_DEBUGFS */ | 165 | #endif /* CONFIG_OMAP2_DSS_DEBUGFS */ |
166 | 166 | ||
167 | /* PLATFORM DEVICE */ | 167 | /* PLATFORM DEVICE */ |
168 | static int omap_dss_pm_notif(struct notifier_block *b, unsigned long v, void *d) | ||
169 | { | ||
170 | DSSDBG("pm notif %lu\n", v); | ||
171 | |||
172 | switch (v) { | ||
173 | case PM_SUSPEND_PREPARE: | ||
174 | case PM_HIBERNATION_PREPARE: | ||
175 | case PM_RESTORE_PREPARE: | ||
176 | DSSDBG("suspending displays\n"); | ||
177 | return dss_suspend_all_devices(); | ||
178 | |||
179 | case PM_POST_SUSPEND: | ||
180 | case PM_POST_HIBERNATION: | ||
181 | case PM_POST_RESTORE: | ||
182 | DSSDBG("resuming displays\n"); | ||
183 | return dss_resume_all_devices(); | ||
184 | |||
185 | default: | ||
186 | return 0; | ||
187 | } | ||
188 | } | ||
189 | |||
190 | static struct notifier_block omap_dss_pm_notif_block = { | ||
191 | .notifier_call = omap_dss_pm_notif, | ||
192 | }; | ||
193 | 168 | ||
194 | static int __init omap_dss_probe(struct platform_device *pdev) | 169 | static int __init omap_dss_probe(struct platform_device *pdev) |
195 | { | 170 | { |
@@ -211,8 +186,6 @@ static int __init omap_dss_probe(struct platform_device *pdev) | |||
211 | else if (pdata->default_device) | 186 | else if (pdata->default_device) |
212 | core.default_display_name = pdata->default_device->name; | 187 | core.default_display_name = pdata->default_device->name; |
213 | 188 | ||
214 | register_pm_notifier(&omap_dss_pm_notif_block); | ||
215 | |||
216 | return 0; | 189 | return 0; |
217 | 190 | ||
218 | err_debugfs: | 191 | err_debugfs: |
@@ -222,8 +195,6 @@ err_debugfs: | |||
222 | 195 | ||
223 | static int omap_dss_remove(struct platform_device *pdev) | 196 | static int omap_dss_remove(struct platform_device *pdev) |
224 | { | 197 | { |
225 | unregister_pm_notifier(&omap_dss_pm_notif_block); | ||
226 | |||
227 | dss_uninitialize_debugfs(); | 198 | dss_uninitialize_debugfs(); |
228 | 199 | ||
229 | return 0; | 200 | return 0; |
diff --git a/drivers/gpu/drm/omapdrm/dss/display.c b/drivers/gpu/drm/omapdrm/dss/display.c index ef5b9027985d..24c2bffa0036 100644 --- a/drivers/gpu/drm/omapdrm/dss/display.c +++ b/drivers/gpu/drm/omapdrm/dss/display.c | |||
@@ -78,42 +78,6 @@ void omapdss_default_get_timings(struct omap_dss_device *dssdev, | |||
78 | } | 78 | } |
79 | EXPORT_SYMBOL(omapdss_default_get_timings); | 79 | EXPORT_SYMBOL(omapdss_default_get_timings); |
80 | 80 | ||
81 | int dss_suspend_all_devices(void) | ||
82 | { | ||
83 | struct omap_dss_device *dssdev = NULL; | ||
84 | |||
85 | for_each_dss_dev(dssdev) { | ||
86 | if (!dssdev->driver) | ||
87 | continue; | ||
88 | |||
89 | if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) { | ||
90 | dssdev->driver->disable(dssdev); | ||
91 | dssdev->activate_after_resume = true; | ||
92 | } else { | ||
93 | dssdev->activate_after_resume = false; | ||
94 | } | ||
95 | } | ||
96 | |||
97 | return 0; | ||
98 | } | ||
99 | |||
100 | int dss_resume_all_devices(void) | ||
101 | { | ||
102 | struct omap_dss_device *dssdev = NULL; | ||
103 | |||
104 | for_each_dss_dev(dssdev) { | ||
105 | if (!dssdev->driver) | ||
106 | continue; | ||
107 | |||
108 | if (dssdev->activate_after_resume) { | ||
109 | dssdev->driver->enable(dssdev); | ||
110 | dssdev->activate_after_resume = false; | ||
111 | } | ||
112 | } | ||
113 | |||
114 | return 0; | ||
115 | } | ||
116 | |||
117 | void dss_disable_all_devices(void) | 81 | void dss_disable_all_devices(void) |
118 | { | 82 | { |
119 | struct omap_dss_device *dssdev = NULL; | 83 | struct omap_dss_device *dssdev = NULL; |
diff --git a/drivers/gpu/drm/omapdrm/dss/dss.h b/drivers/gpu/drm/omapdrm/dss/dss.h index 9a6453235585..a974d46672db 100644 --- a/drivers/gpu/drm/omapdrm/dss/dss.h +++ b/drivers/gpu/drm/omapdrm/dss/dss.h | |||
@@ -206,8 +206,6 @@ int dss_set_min_bus_tput(struct device *dev, unsigned long tput); | |||
206 | int dss_debugfs_create_file(const char *name, void (*write)(struct seq_file *)); | 206 | int dss_debugfs_create_file(const char *name, void (*write)(struct seq_file *)); |
207 | 207 | ||
208 | /* display */ | 208 | /* display */ |
209 | int dss_suspend_all_devices(void); | ||
210 | int dss_resume_all_devices(void); | ||
211 | void dss_disable_all_devices(void); | 209 | void dss_disable_all_devices(void); |
212 | 210 | ||
213 | int display_init_sysfs(struct platform_device *pdev); | 211 | int display_init_sysfs(struct platform_device *pdev); |
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c index dfafdb602ad2..e21433c3fda4 100644 --- a/drivers/gpu/drm/omapdrm/omap_drv.c +++ b/drivers/gpu/drm/omapdrm/omap_drv.c | |||
@@ -900,12 +900,52 @@ static int pdev_remove(struct platform_device *device) | |||
900 | } | 900 | } |
901 | 901 | ||
902 | #ifdef CONFIG_PM_SLEEP | 902 | #ifdef CONFIG_PM_SLEEP |
903 | static int omap_drm_suspend_all_displays(void) | ||
904 | { | ||
905 | struct omap_dss_device *dssdev = NULL; | ||
906 | |||
907 | for_each_dss_dev(dssdev) { | ||
908 | if (!dssdev->driver) | ||
909 | continue; | ||
910 | |||
911 | if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) { | ||
912 | dssdev->driver->disable(dssdev); | ||
913 | dssdev->activate_after_resume = true; | ||
914 | } else { | ||
915 | dssdev->activate_after_resume = false; | ||
916 | } | ||
917 | } | ||
918 | |||
919 | return 0; | ||
920 | } | ||
921 | |||
922 | static int omap_drm_resume_all_displays(void) | ||
923 | { | ||
924 | struct omap_dss_device *dssdev = NULL; | ||
925 | |||
926 | for_each_dss_dev(dssdev) { | ||
927 | if (!dssdev->driver) | ||
928 | continue; | ||
929 | |||
930 | if (dssdev->activate_after_resume) { | ||
931 | dssdev->driver->enable(dssdev); | ||
932 | dssdev->activate_after_resume = false; | ||
933 | } | ||
934 | } | ||
935 | |||
936 | return 0; | ||
937 | } | ||
938 | |||
903 | static int omap_drm_suspend(struct device *dev) | 939 | static int omap_drm_suspend(struct device *dev) |
904 | { | 940 | { |
905 | struct drm_device *drm_dev = dev_get_drvdata(dev); | 941 | struct drm_device *drm_dev = dev_get_drvdata(dev); |
906 | 942 | ||
907 | drm_kms_helper_poll_disable(drm_dev); | 943 | drm_kms_helper_poll_disable(drm_dev); |
908 | 944 | ||
945 | drm_modeset_lock_all(drm_dev); | ||
946 | omap_drm_suspend_all_displays(); | ||
947 | drm_modeset_unlock_all(drm_dev); | ||
948 | |||
909 | return 0; | 949 | return 0; |
910 | } | 950 | } |
911 | 951 | ||
@@ -913,6 +953,10 @@ static int omap_drm_resume(struct device *dev) | |||
913 | { | 953 | { |
914 | struct drm_device *drm_dev = dev_get_drvdata(dev); | 954 | struct drm_device *drm_dev = dev_get_drvdata(dev); |
915 | 955 | ||
956 | drm_modeset_lock_all(drm_dev); | ||
957 | omap_drm_resume_all_displays(); | ||
958 | drm_modeset_unlock_all(drm_dev); | ||
959 | |||
916 | drm_kms_helper_poll_enable(drm_dev); | 960 | drm_kms_helper_poll_enable(drm_dev); |
917 | 961 | ||
918 | return omap_gem_resume(dev); | 962 | return omap_gem_resume(dev); |