Merge branch 'develop-3.0' of ssh://rk29/rk/kernel into develop-3.0
[firefly-linux-kernel-4.4.55.git] / drivers / video / msm / msm_fb.c
index debe5933fd2e6c0d3c3e272242e093632f2732cf..ec351309e60739c1969102614b6d55a46d95d837 100644 (file)
@@ -81,7 +81,6 @@ struct msmfb_info {
        spinlock_t update_lock;
        struct mutex panel_init_lock;
        wait_queue_head_t frame_wq;
-       struct workqueue_struct *resume_workqueue;
        struct work_struct resume_work;
        struct msmfb_callback dma_callback;
        struct msmfb_callback vsync_callback;
@@ -111,7 +110,7 @@ static void msmfb_handle_dma_interrupt(struct msmfb_callback *callback)
        if (msmfb->sleeping == UPDATING &&
            msmfb->frame_done == msmfb->update_frame) {
                DLOG(SUSPEND_RESUME, "full update completed\n");
-               queue_work(msmfb->resume_workqueue, &msmfb->resume_work);
+               schedule_work(&msmfb->resume_work);
        }
        spin_unlock_irqrestore(&msmfb->update_lock, irq_flags);
        wake_up(&msmfb->frame_wq);
@@ -220,8 +219,8 @@ restart:
 
        sleeping = msmfb->sleeping;
        /* on a full update, if the last frame has not completed, wait for it */
-       if (pan_display && (msmfb->frame_requested != msmfb->frame_done ||
-                           sleeping == UPDATING)) {
+       if ((pan_display && msmfb->frame_requested != msmfb->frame_done) ||
+                           sleeping == UPDATING) {
                int ret;
                spin_unlock_irqrestore(&msmfb->update_lock, irq_flags);
                ret = wait_event_interruptible_timeout(msmfb->frame_wq,
@@ -470,6 +469,18 @@ static void setup_fb_info(struct msmfb_info *msmfb)
        fb_info->var.yoffset = 0;
 
        if (msmfb->panel->caps & MSMFB_CAP_PARTIAL_UPDATES) {
+               /*
+                * Set the param in the fixed screen, so userspace can't
+                * change it. This will be used to check for the
+                * capability.
+                */
+               fb_info->fix.reserved[0] = 0x5444;
+               fb_info->fix.reserved[1] = 0x5055;
+
+               /*
+                * This preloads the value so that if userspace doesn't
+                * change it, it will be a full update
+                */
                fb_info->var.reserved[0] = 0x54445055;
                fb_info->var.reserved[1] = 0;
                fb_info->var.reserved[2] = (uint16_t)msmfb->xres |
@@ -559,12 +570,6 @@ static int msmfb_probe(struct platform_device *pdev)
        spin_lock_init(&msmfb->update_lock);
        mutex_init(&msmfb->panel_init_lock);
        init_waitqueue_head(&msmfb->frame_wq);
-       msmfb->resume_workqueue = create_workqueue("panel_on");
-       if (msmfb->resume_workqueue == NULL) {
-               printk(KERN_ERR "failed to create panel_on workqueue\n");
-               ret = -ENOMEM;
-               goto error_create_workqueue;
-       }
        INIT_WORK(&msmfb->resume_work, power_on_panel);
        msmfb->black = kzalloc(msmfb->fb->var.bits_per_pixel*msmfb->xres,
                               GFP_KERNEL);
@@ -589,8 +594,6 @@ static int msmfb_probe(struct platform_device *pdev)
        return 0;
 
 error_register_framebuffer:
-       destroy_workqueue(msmfb->resume_workqueue);
-error_create_workqueue:
        iounmap(fb->screen_base);
 error_setup_fbmem:
        framebuffer_release(msmfb->fb);