Skip to content

Commit

Permalink
DRM: Armada: implement lastclose() for fbhelper
Browse files Browse the repository at this point in the history
Call drm_fb_helper_restore_fbdev_mode() upon last close so that in the
event of the X server crashing, we have some kind of mode restored.

Reviewed-by: Rob Clark <robdclark@gmail.com>
Reviewed-by: Thierry Reding <treding@nvidia.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
  • Loading branch information
Russell King committed Dec 10, 2013
1 parent 796c8e1 commit 2f5ae49
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 1 deletion.
1 change: 1 addition & 0 deletions drivers/gpu/drm/armada/armada_drm.h
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ void armada_drm_queue_unref_work(struct drm_device *,
extern const struct drm_mode_config_funcs armada_drm_mode_config_funcs;

int armada_fbdev_init(struct drm_device *);
void armada_fbdev_lastclose(struct drm_device *);
void armada_fbdev_fini(struct drm_device *);

int armada_overlay_plane_create(struct drm_device *, unsigned long);
Expand Down
7 changes: 6 additions & 1 deletion drivers/gpu/drm/armada/armada_drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -321,6 +321,11 @@ static struct drm_ioctl_desc armada_ioctls[] = {
DRM_UNLOCKED),
};

static void armada_drm_lastclose(struct drm_device *dev)
{
armada_fbdev_lastclose(dev);
}

static const struct file_operations armada_drm_fops = {
.owner = THIS_MODULE,
.llseek = no_llseek,
Expand All @@ -337,7 +342,7 @@ static struct drm_driver armada_drm_driver = {
.open = NULL,
.preclose = NULL,
.postclose = NULL,
.lastclose = NULL,
.lastclose = armada_drm_lastclose,
.unload = armada_drm_unload,
.get_vblank_counter = drm_vblank_count,
.enable_vblank = armada_drm_enable_vblank,
Expand Down
10 changes: 10 additions & 0 deletions drivers/gpu/drm/armada/armada_fbdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,16 @@ int armada_fbdev_init(struct drm_device *dev)
return ret;
}

void armada_fbdev_lastclose(struct drm_device *dev)
{
struct armada_private *priv = dev->dev_private;

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

void armada_fbdev_fini(struct drm_device *dev)
{
struct armada_private *priv = dev->dev_private;
Expand Down

0 comments on commit 2f5ae49

Please sign in to comment.