Commit c40f20da authored by Andres Salomon's avatar Andres Salomon Committed by Greg Kroah-Hartman

staging/olpc_dcon: move wait queue into dcon_priv struct

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: default avatarAndres Salomon <dilinger@queued.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 80256280
...@@ -46,8 +46,6 @@ static struct dcon_platform_data *pdata; ...@@ -46,8 +46,6 @@ static struct dcon_platform_data *pdata;
/* Platform devices */ /* Platform devices */
static struct platform_device *dcon_device; static struct platform_device *dcon_device;
static DECLARE_WAIT_QUEUE_HEAD(dcon_wait_queue);
static unsigned short normal_i2c[] = { 0x0d, I2C_CLIENT_END }; static unsigned short normal_i2c[] = { 0x0d, I2C_CLIENT_END };
static s32 dcon_write(struct dcon_priv *dcon, u8 reg, u16 val) 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) ...@@ -280,7 +278,6 @@ static void dcon_source_switch(struct work_struct *work)
{ {
struct dcon_priv *dcon = container_of(work, struct dcon_priv, struct dcon_priv *dcon = container_of(work, struct dcon_priv,
switch_source); switch_source);
DECLARE_WAITQUEUE(wait, current);
int source = dcon->pending_src; int source = dcon->pending_src;
if (dcon->curr_src == source) if (dcon->curr_src == source)
...@@ -297,11 +294,9 @@ static void dcon_source_switch(struct work_struct *work) ...@@ -297,11 +294,9 @@ static void dcon_source_switch(struct work_struct *work)
if (dcon_write(dcon, DCON_REG_MODE, if (dcon_write(dcon, DCON_REG_MODE,
dcon->disp_mode | MODE_SCAN_INT)) dcon->disp_mode | MODE_SCAN_INT))
pr_err("couldn't enable scanline interrupt!\n"); pr_err("couldn't enable scanline interrupt!\n");
else { else
/* Wait up to one second for the scanline interrupt */ /* Wait up to one second for the scanline interrupt */
wait_event_timeout(dcon_wait_queue, wait_event_timeout(dcon->waitq, dcon->switched, HZ);
dcon->switched == true, HZ);
}
if (!dcon->switched) if (!dcon->switched)
pr_err("Timeout entering CPU mode; expect a screen glitch.\n"); pr_err("Timeout entering CPU mode; expect a screen glitch.\n");
...@@ -332,21 +327,15 @@ static void dcon_source_switch(struct work_struct *work) ...@@ -332,21 +327,15 @@ static void dcon_source_switch(struct work_struct *work)
break; break;
case DCON_SOURCE_DCON: case DCON_SOURCE_DCON:
{ {
int t;
struct timespec delta_t; struct timespec delta_t;
pr_info("dcon_source_switch to DCON\n"); 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 */ /* Clear DCONLOAD - this implies that the DCON is in control */
pdata->set_dconload(0); pdata->set_dconload(0);
getnstimeofday(&dcon->load_time); getnstimeofday(&dcon->load_time);
t = schedule_timeout(HZ/2); wait_event_timeout(dcon->waitq, dcon->switched, HZ/2);
remove_wait_queue(&dcon_wait_queue, &wait);
set_current_state(TASK_RUNNING);
if (!dcon->switched) { if (!dcon->switched) {
pr_err("Timeout entering DCON mode; expect a screen glitch.\n"); 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) ...@@ -614,6 +603,7 @@ static int dcon_probe(struct i2c_client *client, const struct i2c_device_id *id)
return -ENOMEM; return -ENOMEM;
dcon->client = client; dcon->client = client;
init_waitqueue_head(&dcon->waitq);
INIT_WORK(&dcon->switch_source, dcon_source_switch); INIT_WORK(&dcon->switch_source, dcon_source_switch);
dcon->reboot_nb.notifier_call = dcon_reboot_notify; dcon->reboot_nb.notifier_call = dcon_reboot_notify;
dcon->reboot_nb.priority = -1; dcon->reboot_nb.priority = -1;
...@@ -756,7 +746,7 @@ irqreturn_t dcon_interrupt(int irq, void *id) ...@@ -756,7 +746,7 @@ irqreturn_t dcon_interrupt(int irq, void *id)
case 1: /* switch to CPU mode */ case 1: /* switch to CPU mode */
dcon->switched = true; dcon->switched = true;
getnstimeofday(&dcon->irq_time); getnstimeofday(&dcon->irq_time);
wake_up(&dcon_wait_queue); wake_up(&dcon->waitq);
break; break;
case 0: case 0:
...@@ -770,7 +760,7 @@ irqreturn_t dcon_interrupt(int irq, void *id) ...@@ -770,7 +760,7 @@ irqreturn_t dcon_interrupt(int irq, void *id)
if (dcon->curr_src != dcon->pending_src && !dcon->switched) { if (dcon->curr_src != dcon->pending_src && !dcon->switched) {
dcon->switched = true; dcon->switched = true;
getnstimeofday(&dcon->irq_time); getnstimeofday(&dcon->irq_time);
wake_up(&dcon_wait_queue); wake_up(&dcon->waitq);
pr_debug("switching w/ status 0/0\n"); pr_debug("switching w/ status 0/0\n");
} else { } else {
pr_debug("scanline interrupt w/CPU\n"); pr_debug("scanline interrupt w/CPU\n");
......
...@@ -52,6 +52,7 @@ struct dcon_priv { ...@@ -52,6 +52,7 @@ struct dcon_priv {
struct fb_info *fbinfo; struct fb_info *fbinfo;
struct backlight_device *bl_dev; struct backlight_device *bl_dev;
wait_queue_head_t waitq;
struct work_struct switch_source; struct work_struct switch_source;
struct notifier_block reboot_nb; struct notifier_block reboot_nb;
struct notifier_block fbevent_nb; struct notifier_block fbevent_nb;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment