Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm: add drm_fb_helper_restore_fbdev_mode_unlocked()

All drm_fb_helper_restore_fbdev_mode() call sites, save one, do the same
locking. Simplify this into drm_fb_helper_restore_fbdev_mode_unlocked().

Signed-off-by: Rob Clark <robdclark@gmail.com>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Dave Airlie <airlied@redhat.com>

authored by

Rob Clark and committed by
Dave Airlie
5ea1f752 51fd371b

+48 -49
+1 -3
drivers/gpu/drm/armada/armada_fbdev.c
··· 181 181 { 182 182 struct armada_private *priv = dev->dev_private; 183 183 184 - drm_modeset_lock_all(dev); 185 184 if (priv->fbdev) 186 - drm_fb_helper_restore_fbdev_mode(priv->fbdev); 187 - drm_modeset_unlock_all(dev); 185 + drm_fb_helper_restore_fbdev_mode_unlocked(priv->fbdev); 188 186 } 189 187 190 188 void armada_fbdev_fini(struct drm_device *dev)
+2 -7
drivers/gpu/drm/drm_fb_cma_helper.c
··· 429 429 */ 430 430 void drm_fbdev_cma_restore_mode(struct drm_fbdev_cma *fbdev_cma) 431 431 { 432 - if (fbdev_cma) { 433 - struct drm_device *dev = fbdev_cma->fb_helper.dev; 434 - 435 - drm_modeset_lock_all(dev); 436 - drm_fb_helper_restore_fbdev_mode(&fbdev_cma->fb_helper); 437 - drm_modeset_unlock_all(dev); 438 - } 432 + if (fbdev_cma) 433 + drm_fb_helper_restore_fbdev_mode_unlocked(&fbdev_cma->fb_helper); 439 434 } 440 435 EXPORT_SYMBOL_GPL(drm_fbdev_cma_restore_mode); 441 436
+36 -14
drivers/gpu/drm/drm_fb_helper.c
··· 273 273 } 274 274 EXPORT_SYMBOL(drm_fb_helper_debug_leave); 275 275 276 - /** 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) 276 + static bool restore_fbdev_mode(struct drm_fb_helper *fb_helper) 285 277 { 286 278 struct drm_device *dev = fb_helper->dev; 287 279 struct drm_plane *plane; ··· 303 311 } 304 312 return error; 305 313 } 306 - EXPORT_SYMBOL(drm_fb_helper_restore_fbdev_mode); 314 + /** 315 + * drm_fb_helper_restore_fbdev_mode - restore fbdev configuration 316 + * @fb_helper: fbcon to restore 317 + * 318 + * This should be called from driver's drm ->lastclose callback 319 + * when implementing an fbcon on top of kms using this helper. This ensures that 320 + * the user isn't greeted with a black screen when e.g. X dies. 321 + * 322 + * Use this variant if you need to bypass locking (panic), or already 323 + * hold all modeset locks. Otherwise use drm_fb_helper_restore_fbdev_mode_unlocked() 324 + */ 325 + static bool drm_fb_helper_restore_fbdev_mode(struct drm_fb_helper *fb_helper) 326 + { 327 + return restore_fbdev_mode(fb_helper); 328 + } 329 + 330 + /** 331 + * drm_fb_helper_restore_fbdev_mode_unlocked - restore fbdev configuration 332 + * @fb_helper: fbcon to restore 333 + * 334 + * This should be called from driver's drm ->lastclose callback 335 + * when implementing an fbcon on top of kms using this helper. This ensures that 336 + * the user isn't greeted with a black screen when e.g. X dies. 337 + */ 338 + bool drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper) 339 + { 340 + struct drm_device *dev = fb_helper->dev; 341 + bool ret; 342 + drm_modeset_lock_all(dev); 343 + ret = restore_fbdev_mode(fb_helper); 344 + drm_modeset_unlock_all(dev); 345 + return ret; 346 + } 347 + EXPORT_SYMBOL(drm_fb_helper_restore_fbdev_mode_unlocked); 307 348 308 349 /* 309 350 * restore fbcon display for all kms driver's using this helper, used for sysrq ··· 849 824 int drm_fb_helper_set_par(struct fb_info *info) 850 825 { 851 826 struct drm_fb_helper *fb_helper = info->par; 852 - struct drm_device *dev = fb_helper->dev; 853 827 struct fb_var_screeninfo *var = &info->var; 854 828 855 829 if (var->pixclock != 0) { ··· 856 832 return -EINVAL; 857 833 } 858 834 859 - drm_modeset_lock_all(dev); 860 - drm_fb_helper_restore_fbdev_mode(fb_helper); 861 - drm_modeset_unlock_all(dev); 835 + drm_fb_helper_restore_fbdev_mode_unlocked(fb_helper); 862 836 863 837 if (fb_helper->delayed_hotplug) { 864 838 fb_helper->delayed_hotplug = false;
+1 -3
drivers/gpu/drm/exynos/exynos_drm_fbdev.c
··· 367 367 if (!private || !private->fb_helper) 368 368 return; 369 369 370 - drm_modeset_lock_all(dev); 371 - drm_fb_helper_restore_fbdev_mode(private->fb_helper); 372 - drm_modeset_unlock_all(dev); 370 + drm_fb_helper_restore_fbdev_mode_unlocked(private->fb_helper); 373 371 }
+1 -3
drivers/gpu/drm/gma500/psb_drv.c
··· 112 112 struct drm_psb_private *dev_priv = dev->dev_private; 113 113 struct psb_fbdev *fbdev = dev_priv->fbdev; 114 114 115 - drm_modeset_lock_all(dev); 116 - ret = drm_fb_helper_restore_fbdev_mode(&fbdev->psb_fb_helper); 115 + ret = drm_fb_helper_restore_fbdev_mode_unlocked(&fbdev->psb_fb_helper); 117 116 if (ret) 118 117 DRM_DEBUG("failed to restore crtc mode\n"); 119 - drm_modeset_unlock_all(dev); 120 118 121 119 return; 122 120 }
+1 -5
drivers/gpu/drm/i915/intel_fbdev.c
··· 687 687 if (!dev_priv->fbdev) 688 688 return; 689 689 690 - drm_modeset_lock_all(dev); 691 - 692 - ret = drm_fb_helper_restore_fbdev_mode(&dev_priv->fbdev->helper); 690 + ret = drm_fb_helper_restore_fbdev_mode_unlocked(&dev_priv->fbdev->helper); 693 691 if (ret) 694 692 DRM_DEBUG("failed to restore crtc mode\n"); 695 - 696 - drm_modeset_unlock_all(dev); 697 693 }
+2 -5
drivers/gpu/drm/msm/msm_drv.c
··· 386 386 static void msm_lastclose(struct drm_device *dev) 387 387 { 388 388 struct msm_drm_private *priv = dev->dev_private; 389 - if (priv->fbdev) { 390 - drm_modeset_lock_all(dev); 391 - drm_fb_helper_restore_fbdev_mode(priv->fbdev); 392 - drm_modeset_unlock_all(dev); 393 - } 389 + if (priv->fbdev) 390 + drm_fb_helper_restore_fbdev_mode_unlocked(priv->fbdev); 394 391 } 395 392 396 393 static irqreturn_t msm_irq(int irq, void *arg)
+1 -3
drivers/gpu/drm/omapdrm/omap_drv.c
··· 588 588 } 589 589 } 590 590 591 - drm_modeset_lock_all(dev); 592 - ret = drm_fb_helper_restore_fbdev_mode(priv->fbdev); 593 - drm_modeset_unlock_all(dev); 591 + ret = drm_fb_helper_restore_fbdev_mode_unlocked(priv->fbdev); 594 592 if (ret) 595 593 DBG("failed to restore crtc mode"); 596 594 }
+2 -5
drivers/gpu/drm/tegra/fb.c
··· 346 346 347 347 void tegra_fbdev_restore_mode(struct tegra_fbdev *fbdev) 348 348 { 349 - if (fbdev) { 350 - drm_modeset_lock_all(fbdev->base.dev); 351 - drm_fb_helper_restore_fbdev_mode(&fbdev->base); 352 - drm_modeset_unlock_all(fbdev->base.dev); 353 - } 349 + if (fbdev) 350 + drm_fb_helper_restore_fbdev_mode_unlocked(&fbdev->base); 354 351 } 355 352 356 353 static void tegra_fb_output_poll_changed(struct drm_device *drm)
+1 -1
include/drm/drm_fb_helper.h
··· 108 108 int drm_fb_helper_check_var(struct fb_var_screeninfo *var, 109 109 struct fb_info *info); 110 110 111 - bool drm_fb_helper_restore_fbdev_mode(struct drm_fb_helper *fb_helper); 111 + bool drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper); 112 112 void drm_fb_helper_fill_var(struct fb_info *info, struct drm_fb_helper *fb_helper, 113 113 uint32_t fb_width, uint32_t fb_height); 114 114 void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch,