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: Andres Salomon <dilinger@queued.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
802562807a
commit
c40f20da3b
2 changed files with 7 additions and 16 deletions
|
@ -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)
|
||||||
{
|
{
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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 {
|
||||||
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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue