am 266077c2: Switch sdio driver to private workqueue (http://b/issue?id=2182998)
Merge commit '266077c22ef474c20b103c27f27f2f01f03dfbfe' into eclair-mr2
* commit '266077c22ef474c20b103c27f27f2f01f03dfbfe':
Switch sdio driver to private workqueue (http://b/issue?id=2182998)
diff --git a/wilink_6_1/external_drivers/sdio/linux/SdioDrv.c b/wilink_6_1/external_drivers/sdio/linux/SdioDrv.c
index 0c5fdfe..1b8c424 100644
--- a/wilink_6_1/external_drivers/sdio/linux/SdioDrv.c
+++ b/wilink_6_1/external_drivers/sdio/linux/SdioDrv.c
@@ -39,6 +39,9 @@
/* #define TI_SDIO_DEBUG */
#ifndef CONFIG_MMC_EMBEDDED_SDIO
+
+#define SDIOWQ_NAME "sdio_wq"
+
/*
* HSMMC Address and DMA Settings
*/
@@ -212,6 +215,8 @@
size_t dma_read_size;
dma_addr_t dma_write_addr;
size_t dma_write_size;
+ struct workqueue_struct *sdio_wq; /* Work Queue */
+ struct work_struct sdiodrv_work;
} OMAP3430_sdiodrv_t;
struct omap_hsmmc_regs {
@@ -230,12 +235,10 @@
module_param(g_sdio_debug_level, int, 0644);
MODULE_PARM_DESC(g_sdio_debug_level, "debug level");
int g_sdio_debug_level = SDIO_DEBUGLEVEL_ERR;
-EXPORT_SYMBOL( g_sdio_debug_level);
+EXPORT_SYMBOL(g_sdio_debug_level);
OMAP3430_sdiodrv_t g_drv;
-struct work_struct sdiodrv_work;
-
static int sdiodrv_dma_on = 0;
static int sdiodrv_irq_requested = 0;
static int sdiodrv_iclk_got = 0;
@@ -332,8 +335,7 @@
if (g_drv.async_status) {
PERR("sdiodrv_irq: ERROR in STAT = 0x%x\n", status);
}
- schedule_work(&sdiodrv_work);
-
+ queue_work(g_drv.sdio_wq, &g_drv.sdiodrv_work);
return IRQ_HANDLED;
}
@@ -343,7 +345,7 @@
g_drv.async_status = ch_status & (1 << 7);
- schedule_work(&sdiodrv_work);
+ queue_work(g_drv.sdio_wq, &g_drv.sdiodrv_work);
}
void sdiodrv_dma_write_cb(int lch, u16 ch_status, void *data)
@@ -451,7 +453,6 @@
OMAP_HSMMC_SEND_COMMAND(cmdreg, cmdarg);
return sdiodrv_poll_status(OMAP_HSMMC_STAT, CC, MMC_TIMEOUT_MS);
-
} /* sdiodrv_send_command() */
/*
@@ -685,7 +686,7 @@
g_drv.uBlkSizeShift = uBlkSizeShift;
g_drv.uBlkSize = 1 << uBlkSizeShift;
- INIT_WORK(&sdiodrv_work, sdiodrv_task);
+ INIT_WORK(&g_drv.sdiodrv_work, sdiodrv_task);
/* Provide the DMA buffer address to the upper layer so it will use it
as the transactions host buffer. */
@@ -1275,6 +1276,11 @@
#ifndef TI_SDIO_STANDALONE
sdio_init( sdcnum );
#endif
+ g_drv.sdio_wq = create_freezeable_workqueue(SDIOWQ_NAME);
+ if (!g_drv.sdio_wq) {
+ printk("TISDIO: Fail to create SDIO WQ\n");
+ return -EINVAL;
+ }
/* Register the sdio driver */
return platform_driver_register(&sdioDrv_struct);
}
@@ -1286,6 +1292,8 @@
{
/* Unregister sdio driver */
platform_driver_unregister(&sdioDrv_struct);
+ if (g_drv.sdio_wq)
+ destroy_workqueue(g_drv.sdio_wq);
}
#ifdef TI_SDIO_STANDALONE