summaryrefslogtreecommitdiff
path: root/wl1271/external_drivers/sdio/linux/SdioDrv.c
diff options
context:
space:
mode:
Diffstat (limited to 'wl1271/external_drivers/sdio/linux/SdioDrv.c')
-rw-r--r--wl1271/external_drivers/sdio/linux/SdioDrv.c30
1 files changed, 30 insertions, 0 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();