aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_fb_helper.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/drm_fb_helper.c')
-rw-r--r--drivers/gpu/drm/drm_fb_helper.c50
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}
274EXPORT_SYMBOL(drm_fb_helper_debug_leave); 274EXPORT_SYMBOL(drm_fb_helper_debug_leave);
275 275
276/** 276static 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 */
284bool 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}
314EXPORT_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 */
317static 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 */
330bool 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}
339EXPORT_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);
824int drm_fb_helper_set_par(struct fb_info *info) 849int 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;