diff options
Diffstat (limited to 'drivers/gpu/drm/drm_fb_helper.c')
-rw-r--r-- | drivers/gpu/drm/drm_fb_helper.c | 50 |
1 files changed, 36 insertions, 14 deletions
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index 43329cee299f..d5d8cea1a679 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c | |||
@@ -273,15 +273,7 @@ int drm_fb_helper_debug_leave(struct fb_info *info) | |||
273 | } | 273 | } |
274 | EXPORT_SYMBOL(drm_fb_helper_debug_leave); | 274 | EXPORT_SYMBOL(drm_fb_helper_debug_leave); |
275 | 275 | ||
276 | /** | 276 | static bool restore_fbdev_mode(struct drm_fb_helper *fb_helper) |
277 | * drm_fb_helper_restore_fbdev_mode - restore fbdev configuration | ||
278 | * @fb_helper: fbcon to restore | ||
279 | * | ||
280 | * This should be called from driver's drm ->lastclose callback | ||
281 | * when implementing an fbcon on top of kms using this helper. This ensures that | ||
282 | * the user isn't greeted with a black screen when e.g. X dies. | ||
283 | */ | ||
284 | bool drm_fb_helper_restore_fbdev_mode(struct drm_fb_helper *fb_helper) | ||
285 | { | 277 | { |
286 | struct drm_device *dev = fb_helper->dev; | 278 | struct drm_device *dev = fb_helper->dev; |
287 | struct drm_plane *plane; | 279 | struct drm_plane *plane; |
@@ -311,7 +303,40 @@ bool drm_fb_helper_restore_fbdev_mode(struct drm_fb_helper *fb_helper) | |||
311 | } | 303 | } |
312 | return error; | 304 | return error; |
313 | } | 305 | } |
314 | EXPORT_SYMBOL(drm_fb_helper_restore_fbdev_mode); | 306 | /** |
307 | * drm_fb_helper_restore_fbdev_mode - restore fbdev configuration | ||
308 | * @fb_helper: fbcon to restore | ||
309 | * | ||
310 | * This should be called from driver's drm ->lastclose callback | ||
311 | * when implementing an fbcon on top of kms using this helper. This ensures that | ||
312 | * the user isn't greeted with a black screen when e.g. X dies. | ||
313 | * | ||
314 | * Use this variant if you need to bypass locking (panic), or already | ||
315 | * hold all modeset locks. Otherwise use drm_fb_helper_restore_fbdev_mode_unlocked() | ||
316 | */ | ||
317 | static bool drm_fb_helper_restore_fbdev_mode(struct drm_fb_helper *fb_helper) | ||
318 | { | ||
319 | return restore_fbdev_mode(fb_helper); | ||
320 | } | ||
321 | |||
322 | /** | ||
323 | * drm_fb_helper_restore_fbdev_mode_unlocked - restore fbdev configuration | ||
324 | * @fb_helper: fbcon to restore | ||
325 | * | ||
326 | * This should be called from driver's drm ->lastclose callback | ||
327 | * when implementing an fbcon on top of kms using this helper. This ensures that | ||
328 | * the user isn't greeted with a black screen when e.g. X dies. | ||
329 | */ | ||
330 | bool drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper) | ||
331 | { | ||
332 | struct drm_device *dev = fb_helper->dev; | ||
333 | bool ret; | ||
334 | drm_modeset_lock_all(dev); | ||
335 | ret = restore_fbdev_mode(fb_helper); | ||
336 | drm_modeset_unlock_all(dev); | ||
337 | return ret; | ||
338 | } | ||
339 | EXPORT_SYMBOL(drm_fb_helper_restore_fbdev_mode_unlocked); | ||
315 | 340 | ||
316 | /* | 341 | /* |
317 | * restore fbcon display for all kms driver's using this helper, used for sysrq | 342 | * restore fbcon display for all kms driver's using this helper, used for sysrq |
@@ -824,7 +849,6 @@ EXPORT_SYMBOL(drm_fb_helper_check_var); | |||
824 | int drm_fb_helper_set_par(struct fb_info *info) | 849 | int drm_fb_helper_set_par(struct fb_info *info) |
825 | { | 850 | { |
826 | struct drm_fb_helper *fb_helper = info->par; | 851 | struct drm_fb_helper *fb_helper = info->par; |
827 | struct drm_device *dev = fb_helper->dev; | ||
828 | struct fb_var_screeninfo *var = &info->var; | 852 | struct fb_var_screeninfo *var = &info->var; |
829 | 853 | ||
830 | if (var->pixclock != 0) { | 854 | if (var->pixclock != 0) { |
@@ -832,9 +856,7 @@ int drm_fb_helper_set_par(struct fb_info *info) | |||
832 | return -EINVAL; | 856 | return -EINVAL; |
833 | } | 857 | } |
834 | 858 | ||
835 | drm_modeset_lock_all(dev); | 859 | drm_fb_helper_restore_fbdev_mode_unlocked(fb_helper); |
836 | drm_fb_helper_restore_fbdev_mode(fb_helper); | ||
837 | drm_modeset_unlock_all(dev); | ||
838 | 860 | ||
839 | if (fb_helper->delayed_hotplug) { | 861 | if (fb_helper->delayed_hotplug) { |
840 | fb_helper->delayed_hotplug = false; | 862 | fb_helper->delayed_hotplug = false; |