Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5ea1f752 authored by Rob Clark's avatar Rob Clark Committed by Dave Airlie
Browse files

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: default avatarRob Clark <robdclark@gmail.com>
Reviewed-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent 51fd371b
Loading
Loading
Loading
Loading
+1 −3
Original line number Original line Diff line number Diff line
@@ -181,10 +181,8 @@ void armada_fbdev_lastclose(struct drm_device *dev)
{
{
	struct armada_private *priv = dev->dev_private;
	struct armada_private *priv = dev->dev_private;


	drm_modeset_lock_all(dev);
	if (priv->fbdev)
	if (priv->fbdev)
		drm_fb_helper_restore_fbdev_mode(priv->fbdev);
		drm_fb_helper_restore_fbdev_mode_unlocked(priv->fbdev);
	drm_modeset_unlock_all(dev);
}
}


void armada_fbdev_fini(struct drm_device *dev)
void armada_fbdev_fini(struct drm_device *dev)
+2 −7
Original line number Original line Diff line number Diff line
@@ -429,13 +429,8 @@ EXPORT_SYMBOL_GPL(drm_fbdev_cma_fini);
 */
 */
void drm_fbdev_cma_restore_mode(struct drm_fbdev_cma *fbdev_cma)
void drm_fbdev_cma_restore_mode(struct drm_fbdev_cma *fbdev_cma)
{
{
	if (fbdev_cma) {
	if (fbdev_cma)
		struct drm_device *dev = fbdev_cma->fb_helper.dev;
		drm_fb_helper_restore_fbdev_mode_unlocked(&fbdev_cma->fb_helper);

		drm_modeset_lock_all(dev);
		drm_fb_helper_restore_fbdev_mode(&fbdev_cma->fb_helper);
		drm_modeset_unlock_all(dev);
	}
}
}
EXPORT_SYMBOL_GPL(drm_fbdev_cma_restore_mode);
EXPORT_SYMBOL_GPL(drm_fbdev_cma_restore_mode);


+36 −14
Original line number Original line Diff line number Diff line
@@ -273,15 +273,7 @@ int drm_fb_helper_debug_leave(struct fb_info *info)
}
}
EXPORT_SYMBOL(drm_fb_helper_debug_leave);
EXPORT_SYMBOL(drm_fb_helper_debug_leave);


/**
static bool restore_fbdev_mode(struct drm_fb_helper *fb_helper)
 * drm_fb_helper_restore_fbdev_mode - restore fbdev configuration
 * @fb_helper: fbcon to restore
 *
 * This should be called from driver's drm ->lastclose callback
 * when implementing an fbcon on top of kms using this helper. This ensures that
 * the user isn't greeted with a black screen when e.g. X dies.
 */
bool drm_fb_helper_restore_fbdev_mode(struct drm_fb_helper *fb_helper)
{
{
	struct drm_device *dev = fb_helper->dev;
	struct drm_device *dev = fb_helper->dev;
	struct drm_plane *plane;
	struct drm_plane *plane;
@@ -311,7 +303,40 @@ bool drm_fb_helper_restore_fbdev_mode(struct drm_fb_helper *fb_helper)
	}
	}
	return error;
	return error;
}
}
EXPORT_SYMBOL(drm_fb_helper_restore_fbdev_mode);
/**
 * drm_fb_helper_restore_fbdev_mode - restore fbdev configuration
 * @fb_helper: fbcon to restore
 *
 * This should be called from driver's drm ->lastclose callback
 * when implementing an fbcon on top of kms using this helper. This ensures that
 * the user isn't greeted with a black screen when e.g. X dies.
 *
 * Use this variant if you need to bypass locking (panic), or already
 * hold all modeset locks.  Otherwise use drm_fb_helper_restore_fbdev_mode_unlocked()
 */
static bool drm_fb_helper_restore_fbdev_mode(struct drm_fb_helper *fb_helper)
{
	return restore_fbdev_mode(fb_helper);
}

/**
 * drm_fb_helper_restore_fbdev_mode_unlocked - restore fbdev configuration
 * @fb_helper: fbcon to restore
 *
 * This should be called from driver's drm ->lastclose callback
 * when implementing an fbcon on top of kms using this helper. This ensures that
 * the user isn't greeted with a black screen when e.g. X dies.
 */
bool drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper)
{
	struct drm_device *dev = fb_helper->dev;
	bool ret;
	drm_modeset_lock_all(dev);
	ret = restore_fbdev_mode(fb_helper);
	drm_modeset_unlock_all(dev);
	return ret;
}
EXPORT_SYMBOL(drm_fb_helper_restore_fbdev_mode_unlocked);


/*
/*
 * restore fbcon display for all kms driver's using this helper, used for sysrq
 * 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);
int drm_fb_helper_set_par(struct fb_info *info)
int drm_fb_helper_set_par(struct fb_info *info)
{
{
	struct drm_fb_helper *fb_helper = info->par;
	struct drm_fb_helper *fb_helper = info->par;
	struct drm_device *dev = fb_helper->dev;
	struct fb_var_screeninfo *var = &info->var;
	struct fb_var_screeninfo *var = &info->var;


	if (var->pixclock != 0) {
	if (var->pixclock != 0) {
@@ -832,9 +856,7 @@ int drm_fb_helper_set_par(struct fb_info *info)
		return -EINVAL;
		return -EINVAL;
	}
	}


	drm_modeset_lock_all(dev);
	drm_fb_helper_restore_fbdev_mode_unlocked(fb_helper);
	drm_fb_helper_restore_fbdev_mode(fb_helper);
	drm_modeset_unlock_all(dev);


	if (fb_helper->delayed_hotplug) {
	if (fb_helper->delayed_hotplug) {
		fb_helper->delayed_hotplug = false;
		fb_helper->delayed_hotplug = false;
+1 −3
Original line number Original line Diff line number Diff line
@@ -367,7 +367,5 @@ void exynos_drm_fbdev_restore_mode(struct drm_device *dev)
	if (!private || !private->fb_helper)
	if (!private || !private->fb_helper)
		return;
		return;


	drm_modeset_lock_all(dev);
	drm_fb_helper_restore_fbdev_mode_unlocked(private->fb_helper);
	drm_fb_helper_restore_fbdev_mode(private->fb_helper);
	drm_modeset_unlock_all(dev);
}
}
+1 −3
Original line number Original line Diff line number Diff line
@@ -112,11 +112,9 @@ static void psb_driver_lastclose(struct drm_device *dev)
	struct drm_psb_private *dev_priv = dev->dev_private;
	struct drm_psb_private *dev_priv = dev->dev_private;
	struct psb_fbdev *fbdev = dev_priv->fbdev;
	struct psb_fbdev *fbdev = dev_priv->fbdev;


	drm_modeset_lock_all(dev);
	ret = drm_fb_helper_restore_fbdev_mode_unlocked(&fbdev->psb_fb_helper);
	ret = drm_fb_helper_restore_fbdev_mode(&fbdev->psb_fb_helper);
	if (ret)
	if (ret)
		DRM_DEBUG("failed to restore crtc mode\n");
		DRM_DEBUG("failed to restore crtc mode\n");
	drm_modeset_unlock_all(dev);


	return;
	return;
}
}
Loading