diff options
author | Dmitry Shmidt <dimitrysh@google.com> | 2009-10-19 15:49:47 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2009-10-19 15:49:47 -0700 |
commit | 18fc778564517faa85a0f472bc136672f9428a52 (patch) | |
tree | db8ac0247efdc1e39801815698c89e2ffed1dcaa | |
parent | a01ebdd82780b8559e63f77f8730e4761f025771 (diff) | |
parent | 266077c22ef474c20b103c27f27f2f01f03dfbfe (diff) | |
download | ti-18fc778564517faa85a0f472bc136672f9428a52.tar.gz |
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)
-rw-r--r-- | wilink_6_1/external_drivers/sdio/linux/SdioDrv.c | 24 |
1 files changed, 16 insertions, 8 deletions
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 @@ typedef void *TI_HANDLE; /* #define TI_SDIO_DEBUG */ #ifndef CONFIG_MMC_EMBEDDED_SDIO + +#define SDIOWQ_NAME "sdio_wq" + /* * HSMMC Address and DMA Settings */ @@ -212,6 +215,8 @@ typedef struct OMAP3430_sdiodrv 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 @@ static struct omap_hsmmc_regs hsmmc_ctx; 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 @@ irqreturn_t sdiodrv_irq(int irq, void *drv) 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 @@ void sdiodrv_dma_read_cb(int lch, u16 ch_status, void *data) 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 @@ static int sdiodrv_send_command(u32 cmdreg, u32 cmdarg) OMAP_HSMMC_SEND_COMMAND(cmdreg, cmdarg); return sdiodrv_poll_status(OMAP_HSMMC_STAT, CC, MMC_TIMEOUT_MS); - } /* sdiodrv_send_command() */ /* @@ -685,7 +686,7 @@ int sdioDrv_ConnectBus (void * fCbFunc, 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 @@ int __init sdioDrv_init(int sdcnum) #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 @@ void __exit sdioDrv_exit(void) { /* Unregister sdio driver */ platform_driver_unregister(&sdioDrv_struct); + if (g_drv.sdio_wq) + destroy_workqueue(g_drv.sdio_wq); } #ifdef TI_SDIO_STANDALONE |