diff options
-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 8797d4e..e3c9b55 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 3383760..3851e3e 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 aa223ba..9b00e79 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; |