From: Imre Deak Date: Mon, 31 Jul 2006 13:13:33 +0000 (+0300) Subject: ARM: OMAP: omapfb: lcd_mipid ESD is blocking keventd X-Git-Tag: v2.6.17-omap2~18 X-Git-Url: http://pilppa.com/gitweb/?a=commitdiff_plain;h=ed4a95e89f87e68a0af123916bd6638163114b02;p=linux-2.6-omap-h63xx.git ARM: OMAP: omapfb: lcd_mipid ESD is blocking keventd Some time critical work may be put onto the keventd workqueue so let's not block it with msleep, use a dedicated workqueue instead. Signed-off-by: Imre Deak Signed-off-by: Juha Yrjola --- diff --git a/drivers/video/omap/lcd_mipid.c b/drivers/video/omap/lcd_mipid.c index c714ad29a6a..5b73ff03e98 100644 --- a/drivers/video/omap/lcd_mipid.c +++ b/drivers/video/omap/lcd_mipid.c @@ -22,6 +22,7 @@ */ #include #include +#include #include #include @@ -65,6 +66,7 @@ struct mipid_device { struct mutex mutex; struct lcd_panel panel; + struct workqueue_struct *esd_wq; struct work_struct esd_work; void (*esd_check)(struct mipid_device *m); }; @@ -120,7 +122,7 @@ static void mipid_transfer(struct mipid_device *md, int cmd, const u8 *wbuf, r = spi_sync(md->spi, &m); if (r < 0) - dev_dbg(md->spi->dev, "spi_sync %d\n", r); + dev_dbg(&md->spi->dev, "spi_sync %d\n", r); if (rlen) rbuf[0] = w & 0xff; @@ -378,13 +380,14 @@ static void ls041y3_esd_check(struct mipid_device *md) static void mipid_esd_start_check(struct mipid_device *md) { if (md->esd_check != NULL) - schedule_delayed_work(&md->esd_work, MIPID_ESD_CHECK_PERIOD); + queue_delayed_work(md->esd_wq, &md->esd_work, + MIPID_ESD_CHECK_PERIOD); } static void mipid_esd_stop_check(struct mipid_device *md) { if (md->esd_check != NULL) - cancel_rearming_delayed_work(&md->esd_work); + cancel_rearming_delayed_workqueue(md->esd_wq, &md->esd_work); } static void mipid_esd_work(void *data) @@ -460,6 +463,11 @@ static int mipid_init(struct lcd_panel *panel, struct mipid_device *md = to_mipid_device(panel); md->fbdev = fbdev; + md->esd_wq = create_singlethread_workqueue("mipid_esd"); + if (md->esd_wq == NULL) { + dev_err(&md->spi->dev, "can't create ESD workqueue\n"); + return -ENOMEM; + } INIT_WORK(&md->esd_work, mipid_esd_work, md); mutex_init(&md->mutex); @@ -478,6 +486,7 @@ static void mipid_cleanup(struct lcd_panel *panel) struct mipid_device *md = to_mipid_device(panel); mipid_esd_stop_check(md); + destroy_workqueue(md->esd_wq); } static struct lcd_panel mipid_panel = {