]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/gpu/drm/nouveau/nouveau_fbcon.c
drm/nouveau: punt fbcon resume out to a workqueue
[karo-tx-linux.git] / drivers / gpu / drm / nouveau / nouveau_fbcon.c
index 8bdd27091db8fd1aa7a34a3174b625c6a6d2a830..49fe6075cc7c50c79d47d2ac24c273e536ac3159 100644 (file)
@@ -486,6 +486,16 @@ static const struct drm_fb_helper_funcs nouveau_fbcon_helper_funcs = {
        .fb_probe = nouveau_fbcon_create,
 };
 
+static void
+nouveau_fbcon_set_suspend_work(struct work_struct *work)
+{
+       struct nouveau_fbdev *fbcon = container_of(work, typeof(*fbcon), work);
+       console_lock();
+       nouveau_fbcon_accel_restore(fbcon->dev);
+       nouveau_fbcon_zfill(fbcon->dev, fbcon);
+       fb_set_suspend(fbcon->helper.fbdev, FBINFO_STATE_RUNNING);
+       console_unlock();
+}
 
 int
 nouveau_fbcon_init(struct drm_device *dev)
@@ -503,6 +513,7 @@ nouveau_fbcon_init(struct drm_device *dev)
        if (!fbcon)
                return -ENOMEM;
 
+       INIT_WORK(&fbcon->work, nouveau_fbcon_set_suspend_work);
        fbcon->dev = dev;
        drm->fbcon = fbcon;
 
@@ -551,14 +562,14 @@ nouveau_fbcon_set_suspend(struct drm_device *dev, int state)
 {
        struct nouveau_drm *drm = nouveau_drm(dev);
        if (drm->fbcon) {
-               console_lock();
-               if (state == 0) {
-                       nouveau_fbcon_accel_restore(dev);
-                       nouveau_fbcon_zfill(dev, drm->fbcon);
+               if (state == FBINFO_STATE_RUNNING) {
+                       schedule_work(&drm->fbcon->work);
+                       return;
                }
+               flush_work(&drm->fbcon->work);
+               console_lock();
                fb_set_suspend(drm->fbcon->helper.fbdev, state);
-               if (state == 1)
-                       nouveau_fbcon_accel_save_disable(dev);
+               nouveau_fbcon_accel_save_disable(dev);
                console_unlock();
        }
 }