Skip to content

Commit

Permalink
OMAP: DSS2: DSI: Use system workqueue for delayed work instead of a p…
Browse files Browse the repository at this point in the history
…rivate workqueue

In the previous DSI driver design, a private workqueue was needed to prevent a
deadlock as explained in the commit : 0f16aa0
. In the current design, the workqueue is only used for queueing delayed work in
the case where we don't get a FRAMEDONE interrupt for 250 milliseconds. It is
safe to remove the private workqueue amd use the system workqueue instead to
schedule the delayed work with the new design where the deadlock can't occur.

Signed-off-by: Archit Taneja <archit@ti.com>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
  • Loading branch information
Archit Taneja authored and Tomi Valkeinen committed May 16, 2011
1 parent b6cbb02 commit 49dbf58
Showing 1 changed file with 7 additions and 18 deletions.
25 changes: 7 additions & 18 deletions drivers/video/omap2/dss/dsi.c
Original file line number Diff line number Diff line change
Expand Up @@ -294,8 +294,6 @@ struct dsi_data {
bool te_enabled;
bool ulps_enabled;

struct workqueue_struct *workqueue;

void (*framedone_callback)(int, void *);
void *framedone_data;

Expand Down Expand Up @@ -3753,8 +3751,8 @@ static void dsi_update_screen_dispc(struct omap_dss_device *dssdev,

dsi_perf_mark_start(dsidev);

r = queue_delayed_work(dsi->workqueue, &dsi->framedone_timeout_work,
msecs_to_jiffies(250));
r = schedule_delayed_work(&dsi->framedone_timeout_work,
msecs_to_jiffies(250));
BUG_ON(r == 0);

dss_start_update(dssdev);
Expand Down Expand Up @@ -4369,12 +4367,6 @@ static int dsi_init(struct platform_device *dsidev)
mutex_init(&dsi->lock);
sema_init(&dsi->bus_lock, 1);

dsi->workqueue = create_singlethread_workqueue(dev_name(&dsidev->dev));
if (dsi->workqueue == NULL) {
r = -ENOMEM;
goto err1;
}

INIT_DELAYED_WORK_DEFERRABLE(&dsi->framedone_timeout_work,
dsi_framedone_timeout_work_callback);

Expand All @@ -4387,26 +4379,26 @@ static int dsi_init(struct platform_device *dsidev)
if (!dsi_mem) {
DSSERR("can't get IORESOURCE_MEM DSI\n");
r = -EINVAL;
goto err2;
goto err1;
}
dsi->base = ioremap(dsi_mem->start, resource_size(dsi_mem));
if (!dsi->base) {
DSSERR("can't ioremap DSI\n");
r = -ENOMEM;
goto err2;
goto err1;
}
dsi->irq = platform_get_irq(dsi->pdev, 0);
if (dsi->irq < 0) {
DSSERR("platform_get_irq failed\n");
r = -ENODEV;
goto err3;
goto err2;
}

r = request_irq(dsi->irq, omap_dsi_irq_handler, IRQF_SHARED,
dev_name(&dsidev->dev), dsi->pdev);
if (r < 0) {
DSSERR("request_irq failed\n");
goto err3;
goto err2;
}

/* DSI VCs initialization */
Expand All @@ -4427,10 +4419,8 @@ static int dsi_init(struct platform_device *dsidev)
enable_clocks(0);

return 0;
err3:
iounmap(dsi->base);
err2:
destroy_workqueue(dsi->workqueue);
iounmap(dsi->base);
err1:
kfree(dsi);
err0:
Expand All @@ -4454,7 +4444,6 @@ static void dsi_exit(struct platform_device *dsidev)
free_irq(dsi->irq, dsi->pdev);
iounmap(dsi->base);

destroy_workqueue(dsi->workqueue);
kfree(dsi);

DSSDBG("omap_dsi_exit\n");
Expand Down

0 comments on commit 49dbf58

Please sign in to comment.