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>
This commit is contained in:
parent
51fd371bba
commit
5ea1f752ae
|
@ -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);
|
||||||
*/
|
*/
|
||||||
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)
|
||||||
}
|
}
|
||||||
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;
|
||||||
|
|
|
@ -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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
||||||
|
|
||||||
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);
|
||||||
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,
|
||||||
|
|
Loading…
Reference in a new issue