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

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
...@@ -181,10 +181,8 @@ void armada_fbdev_lastclose(struct drm_device *dev) ...@@ -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)
......
...@@ -429,13 +429,8 @@ EXPORT_SYMBOL_GPL(drm_fbdev_cma_fini); ...@@ -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);
......
...@@ -273,15 +273,7 @@ int drm_fb_helper_debug_leave(struct fb_info *info) ...@@ -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) ...@@ -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); ...@@ -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) ...@@ -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;
......
...@@ -367,7 +367,5 @@ void exynos_drm_fbdev_restore_mode(struct drm_device *dev) ...@@ -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);
} }
...@@ -112,11 +112,9 @@ static void psb_driver_lastclose(struct drm_device *dev) ...@@ -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;
} }
......
...@@ -687,11 +687,7 @@ void intel_fbdev_restore_mode(struct drm_device *dev) ...@@ -687,11 +687,7 @@ void intel_fbdev_restore_mode(struct drm_device *dev)
if (!dev_priv->fbdev) if (!dev_priv->fbdev)
return; return;
drm_modeset_lock_all(dev); ret = drm_fb_helper_restore_fbdev_mode_unlocked(&dev_priv->fbdev->helper);
ret = drm_fb_helper_restore_fbdev_mode(&dev_priv->fbdev->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);
} }
...@@ -386,11 +386,8 @@ static void msm_preclose(struct drm_device *dev, struct drm_file *file) ...@@ -386,11 +386,8 @@ static void msm_preclose(struct drm_device *dev, struct drm_file *file)
static void msm_lastclose(struct drm_device *dev) static void msm_lastclose(struct drm_device *dev)
{ {
struct msm_drm_private *priv = dev->dev_private; struct msm_drm_private *priv = dev->dev_private;
if (priv->fbdev) { if (priv->fbdev)
drm_modeset_lock_all(dev); drm_fb_helper_restore_fbdev_mode_unlocked(priv->fbdev);
drm_fb_helper_restore_fbdev_mode(priv->fbdev);
drm_modeset_unlock_all(dev);
}
} }
static irqreturn_t msm_irq(int irq, void *arg) static irqreturn_t msm_irq(int irq, void *arg)
......
...@@ -588,9 +588,7 @@ static void dev_lastclose(struct drm_device *dev) ...@@ -588,9 +588,7 @@ static void dev_lastclose(struct drm_device *dev)
} }
} }
drm_modeset_lock_all(dev); ret = drm_fb_helper_restore_fbdev_mode_unlocked(priv->fbdev);
ret = drm_fb_helper_restore_fbdev_mode(priv->fbdev);
drm_modeset_unlock_all(dev);
if (ret) if (ret)
DBG("failed to restore crtc mode"); DBG("failed to restore crtc mode");
} }
......
...@@ -346,11 +346,8 @@ static void tegra_fbdev_free(struct tegra_fbdev *fbdev) ...@@ -346,11 +346,8 @@ static void tegra_fbdev_free(struct tegra_fbdev *fbdev)
void tegra_fbdev_restore_mode(struct tegra_fbdev *fbdev) void tegra_fbdev_restore_mode(struct tegra_fbdev *fbdev)
{ {
if (fbdev) { if (fbdev)
drm_modeset_lock_all(fbdev->base.dev); drm_fb_helper_restore_fbdev_mode_unlocked(&fbdev->base);
drm_fb_helper_restore_fbdev_mode(&fbdev->base);
drm_modeset_unlock_all(fbdev->base.dev);
}
} }
static void tegra_fb_output_poll_changed(struct drm_device *drm) static void tegra_fb_output_poll_changed(struct drm_device *drm)
......
...@@ -108,7 +108,7 @@ int drm_fb_helper_set_par(struct fb_info *info); ...@@ -108,7 +108,7 @@ int drm_fb_helper_set_par(struct fb_info *info);
int drm_fb_helper_check_var(struct fb_var_screeninfo *var, int drm_fb_helper_check_var(struct fb_var_screeninfo *var,
struct fb_info *info); struct fb_info *info);
bool drm_fb_helper_restore_fbdev_mode(struct drm_fb_helper *fb_helper); bool drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper);
void drm_fb_helper_fill_var(struct fb_info *info, struct drm_fb_helper *fb_helper, void drm_fb_helper_fill_var(struct fb_info *info, struct drm_fb_helper *fb_helper,
uint32_t fb_width, uint32_t fb_height); uint32_t fb_width, uint32_t fb_height);
void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch, void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment