staging/olpc_dcon: move wait queue into dcon_priv struct
authorAndres Salomon <dilinger@queued.net>
Mon, 1 Oct 2012 21:45:50 +0000 (14:45 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 22 Oct 2012 18:39:21 +0000 (11:39 -0700)
Another global variable (dcon_wait_queue) moved into the dcon_priv struct.
In the process, replace an instance of a manually implemented
wait_event_timeout.  This code came from Jordan's original gxfb_dcon.c
driver waaaay back in 2006; well past time for a replacement.

Signed-off-by: Andres Salomon <dilinger@queued.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/olpc_dcon/olpc_dcon.c
drivers/staging/olpc_dcon/olpc_dcon.h

index 7dcd0603318ed133f9752980db03f5fcd1acca9b..38f988b7f16d2cb18f77490e0ed2b9c4ff7097ff 100644 (file)
@@ -46,8 +46,6 @@ static struct dcon_platform_data *pdata;
 /* Platform devices */
 static struct platform_device *dcon_device;
 
-static DECLARE_WAIT_QUEUE_HEAD(dcon_wait_queue);
-
 static unsigned short normal_i2c[] = { 0x0d, I2C_CLIENT_END };
 
 static s32 dcon_write(struct dcon_priv *dcon, u8 reg, u16 val)
@@ -280,7 +278,6 @@ static void dcon_source_switch(struct work_struct *work)
 {
        struct dcon_priv *dcon = container_of(work, struct dcon_priv,
                        switch_source);
-       DECLARE_WAITQUEUE(wait, current);
        int source = dcon->pending_src;
 
        if (dcon->curr_src == source)
@@ -297,11 +294,9 @@ static void dcon_source_switch(struct work_struct *work)
                if (dcon_write(dcon, DCON_REG_MODE,
                                dcon->disp_mode | MODE_SCAN_INT))
                        pr_err("couldn't enable scanline interrupt!\n");
-               else {
+               else
                        /* Wait up to one second for the scanline interrupt */
-                       wait_event_timeout(dcon_wait_queue,
-                                          dcon->switched == true, HZ);
-               }
+                       wait_event_timeout(dcon->waitq, dcon->switched, HZ);
 
                if (!dcon->switched)
                        pr_err("Timeout entering CPU mode; expect a screen glitch.\n");
@@ -332,21 +327,15 @@ static void dcon_source_switch(struct work_struct *work)
                break;
        case DCON_SOURCE_DCON:
        {
-               int t;
                struct timespec delta_t;
 
                pr_info("dcon_source_switch to DCON\n");
 
-               add_wait_queue(&dcon_wait_queue, &wait);
-               set_current_state(TASK_UNINTERRUPTIBLE);
-
                /* Clear DCONLOAD - this implies that the DCON is in control */
                pdata->set_dconload(0);
                getnstimeofday(&dcon->load_time);
 
-               t = schedule_timeout(HZ/2);
-               remove_wait_queue(&dcon_wait_queue, &wait);
-               set_current_state(TASK_RUNNING);
+               wait_event_timeout(dcon->waitq, dcon->switched, HZ/2);
 
                if (!dcon->switched) {
                        pr_err("Timeout entering DCON mode; expect a screen glitch.\n");
@@ -614,6 +603,7 @@ static int dcon_probe(struct i2c_client *client, const struct i2c_device_id *id)
                return -ENOMEM;
 
        dcon->client = client;
+       init_waitqueue_head(&dcon->waitq);
        INIT_WORK(&dcon->switch_source, dcon_source_switch);
        dcon->reboot_nb.notifier_call = dcon_reboot_notify;
        dcon->reboot_nb.priority = -1;
@@ -756,7 +746,7 @@ irqreturn_t dcon_interrupt(int irq, void *id)
        case 1: /* switch to CPU mode */
                dcon->switched = true;
                getnstimeofday(&dcon->irq_time);
-               wake_up(&dcon_wait_queue);
+               wake_up(&dcon->waitq);
                break;
 
        case 0:
@@ -770,7 +760,7 @@ irqreturn_t dcon_interrupt(int irq, void *id)
                if (dcon->curr_src != dcon->pending_src && !dcon->switched) {
                        dcon->switched = true;
                        getnstimeofday(&dcon->irq_time);
-                       wake_up(&dcon_wait_queue);
+                       wake_up(&dcon->waitq);
                        pr_debug("switching w/ status 0/0\n");
                } else {
                        pr_debug("scanline interrupt w/CPU\n");
index 167a41778be61ef3dd11474e615143ac90f987e8..e3f8437a8acfb7fe751a75895b1eb999f06da4ac 100644 (file)
@@ -52,6 +52,7 @@ struct dcon_priv {
        struct fb_info *fbinfo;
        struct backlight_device *bl_dev;
 
+       wait_queue_head_t waitq;
        struct work_struct switch_source;
        struct notifier_block reboot_nb;
        struct notifier_block fbevent_nb;