summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Shmidt <dimitrysh@google.com>2010-05-21 10:22:12 -0700
committerDmitry Shmidt <dimitrysh@google.com>2010-05-21 10:22:12 -0700
commit41ecb6fc3e74edbf5c049054b299278e66d92fc1 (patch)
tree5de903d9344ef24e92269de6525c4bc695f7284d
parent65c4c23c5333ca408ac6703f6e27eb865af1dfcf (diff)
downloadwlan-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.c30
-rw-r--r--wl1271/external_drivers/sdio/linux/SdioDrv.h2
-rw-r--r--wl1271/platforms/hw/linux/SdioAdapter.c3
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;