diff options
Diffstat (limited to 'drivers/video/omap2/displays')
-rw-r--r-- | drivers/video/omap2/displays/panel-taal.c | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/drivers/video/omap2/displays/panel-taal.c b/drivers/video/omap2/displays/panel-taal.c index c44ae3f..9603413 100644 --- a/drivers/video/omap2/displays/panel-taal.c +++ b/drivers/video/omap2/displays/panel-taal.c @@ -223,11 +223,11 @@ struct taal_data { struct delayed_work te_timeout_work; bool use_dsi_bl; - bool cabc_broken; - unsigned cabc_mode; - bool intro_printed; + bool framedone_timeout; + + unsigned cabc_mode; struct workqueue_struct *workqueue; @@ -1413,8 +1413,27 @@ err: static void taal_framedone_cb(int err, void *data) { struct omap_dss_device *dssdev = data; + struct taal_data *td = dev_get_drvdata(&dssdev->dev); dev_dbg(&dssdev->dev, "framedone, err %d\n", err); + /* + * assert framadone timeout flag before + * unlocking the bus + */ + if (err && !dsi_bus_was_unlocked(dssdev)) + td->framedone_timeout = true; + + /* + * reset framadone timeout flag upon next + * framedone. Ensure no double un-lock from + * the erroneous framedone callback. + */ + if (td->framedone_timeout && !err) { + td->framedone_timeout = false; + if (dsi_bus_was_unlocked(dssdev)) + return; + } dsi_bus_unlock(dssdev); + return; } static irqreturn_t taal_te_isr(int irq, void *data) |