diff options
author | Dmitry Shmidt <dimitrysh@google.com> | 2010-05-21 10:22:12 -0700 |
---|---|---|
committer | Dmitry Shmidt <dimitrysh@google.com> | 2010-05-21 10:22:12 -0700 |
commit | 41ecb6fc3e74edbf5c049054b299278e66d92fc1 (patch) | |
tree | 5de903d9344ef24e92269de6525c4bc695f7284d | |
parent | 65c4c23c5333ca408ac6703f6e27eb865af1dfcf (diff) | |
download | wlan-41ecb6fc3e74edbf5c049054b299278e66d92fc1.tar.gz |
wl1271: Add SDIO clock processing to avoid extra triggering
Change-Id: I85df6c4ce76443ec80684918f1d1ea1f9db3cfef
Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
-rw-r--r-- | wl1271/external_drivers/sdio/linux/SdioDrv.c | 30 | ||||
-rw-r--r-- | wl1271/external_drivers/sdio/linux/SdioDrv.h | 2 | ||||
-rw-r--r-- | wl1271/platforms/hw/linux/SdioAdapter.c | 3 |
3 files changed, 34 insertions, 1 deletions
diff --git a/wl1271/external_drivers/sdio/linux/SdioDrv.c b/wl1271/external_drivers/sdio/linux/SdioDrv.c index 8797d4e4..e3c9b553 100644 --- a/wl1271/external_drivers/sdio/linux/SdioDrv.c +++ b/wl1271/external_drivers/sdio/linux/SdioDrv.c @@ -243,6 +243,8 @@ typedef struct OMAP3430_sdiodrv size_t dma_write_size; struct workqueue_struct *sdio_wq; /* Work Queue */ struct work_struct sdiodrv_work; + struct timer_list inact_timer; + int inact_timer_running; } OMAP3430_sdiodrv_t; struct omap_hsmmc_regs { @@ -280,6 +282,7 @@ static int sdiodrv_fclk_got = 0; static void sdioDrv_hsmmc_save_ctx(void); static void sdioDrv_hsmmc_restore_ctx(void); static void sdiodrv_dma_shutdown(void); +static void sdioDrv_inact_timer(unsigned long); #ifndef TI_SDIO_STANDALONE void sdio_init( int sdcnum ) @@ -329,6 +332,26 @@ static void sdioDrv_hsmmc_restore_ctx(void) OMAP_HSMMC_WRITE(HCTL, OMAP_HSMMC_READ(HCTL) | SDBP); } +static void sdioDrv_inact_timer(unsigned long data) +{ + sdioDrv_clk_disable(); + g_drv.inact_timer_running = 0; +} + +void sdioDrv_start_inact_timer(void) +{ + mod_timer(&g_drv.inact_timer, jiffies + msecs_to_jiffies(1000)); + g_drv.inact_timer_running = 1; +} + +void sdioDrv_cancel_inact_timer(void) +{ + if(g_drv.inact_timer_running) { + del_timer_sync(&g_drv.inact_timer); + g_drv.inact_timer_running = 0; + } +} + void sdiodrv_task(struct work_struct *unused) { PDEBUG("sdiodrv_tasklet()\n"); @@ -547,6 +570,8 @@ static void OMAP3430_mmc_set_clock(unsigned int clock, OMAP3430_sdiodrv_t *host) static void sdiodrv_free_resources(void) { + sdioDrv_cancel_inact_timer(); + if(g_drv.ifclks_enabled) { sdioDrv_clk_disable(); } @@ -1144,6 +1169,11 @@ static int sdioDrv_probe(struct platform_device *pdev) /* Disabling clocks for now */ sdioDrv_clk_disable(); + /* inactivity timer initialization*/ + init_timer(&g_drv.inact_timer); + g_drv.inact_timer.function = sdioDrv_inact_timer; + g_drv.inact_timer_running = 0; + return 0; err: sdiodrv_free_resources(); diff --git a/wl1271/external_drivers/sdio/linux/SdioDrv.h b/wl1271/external_drivers/sdio/linux/SdioDrv.h index 33837608..3851e3ef 100644 --- a/wl1271/external_drivers/sdio/linux/SdioDrv.h +++ b/wl1271/external_drivers/sdio/linux/SdioDrv.h @@ -171,5 +171,7 @@ void sdioDrv_register_pm(int (*wlanDrvIf_Start)(void), int sdioDrv_clk_enable(void); void sdioDrv_clk_disable(void); +void sdioDrv_start_inact_timer(void); +void sdioDrv_cancel_inact_timer(void); #endif/* _OMAP3430_SDIODRV_H */ diff --git a/wl1271/platforms/hw/linux/SdioAdapter.c b/wl1271/platforms/hw/linux/SdioAdapter.c index aa223baf..9b00e79f 100644 --- a/wl1271/platforms/hw/linux/SdioAdapter.c +++ b/wl1271/platforms/hw/linux/SdioAdapter.c @@ -537,6 +537,7 @@ ETxnStatus sdioAdapt_TransactBytes (unsigned int uFuncId, if ((bMore == 1) || (lastMore == bMore)) { + sdioDrv_cancel_inact_timer(); sdioDrv_clk_enable(); } @@ -552,7 +553,7 @@ ETxnStatus sdioAdapt_TransactBytes (unsigned int uFuncId, if (bMore == 0) { - sdioDrv_clk_disable(); + sdioDrv_start_inact_timer(); } lastMore = bMore; |