>From 1558c960aa92d107a0fdb1db8d825be7fdccad79 Mon Sep 17 00:00:00 2001
From: Feng Tang <feng.t...@intel.com>
Date: Fri, 29 Jul 2011 15:01:47 +0800
Subject: [PATCH 2/2] sst: add support for disabling periodic HW irq

Disabling period audio IRQ will greatly reduce the wakeup from Audio
subsystem. And also it will help to solve the playback/capture
latency issue for instant IM APPs like skype.

Signed-off-by: Feng Tang <feng.t...@intel.com>
---
 drivers/staging/intel_sst/intel_sst_ioctl.h |    1 +
 drivers/staging/intel_sst/intelmid.c        |    3 ++-
 drivers/staging/intel_sst/intelmid_pvt.c    |   24 ++++++++++++++----------
 3 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/drivers/staging/intel_sst/intel_sst_ioctl.h 
b/drivers/staging/intel_sst/intel_sst_ioctl.h
index dec99df..e22175f 100644
--- a/drivers/staging/intel_sst/intel_sst_ioctl.h
+++ b/drivers/staging/intel_sst/intel_sst_ioctl.h
@@ -123,6 +123,7 @@ struct snd_pcm_params {
        __u32 ring_buffer_size;
        __u32 period_count;     /* period elapsed in samples*/
        __u32 ring_buffer_addr;
+       __u32 no_irq;
 };
 
 /* MP3 Music Parameters Message */
diff --git a/drivers/staging/intel_sst/intelmid.c 
b/drivers/staging/intel_sst/intelmid.c
index 9088256..ee9fdb3 100644
--- a/drivers/staging/intel_sst/intelmid.c
+++ b/drivers/staging/intel_sst/intelmid.c
@@ -79,7 +79,8 @@ static struct snd_pcm_hardware snd_intelmad_stream = {
                        SNDRV_PCM_INFO_MMAP|
                        SNDRV_PCM_INFO_MMAP_VALID |
                        SNDRV_PCM_INFO_BLOCK_TRANSFER |
-                       SNDRV_PCM_INFO_SYNC_START),
+                       SNDRV_PCM_INFO_SYNC_START |
+                       SNDRV_PCM_INFO_NO_PERIOD_WAKEUP),
        .formats = (SNDRV_PCM_FMTBIT_S16 | SNDRV_PCM_FMTBIT_U16 |
                        SNDRV_PCM_FMTBIT_S24 | SNDRV_PCM_FMTBIT_U24 |
                        SNDRV_PCM_FMTBIT_S32 | SNDRV_PCM_FMTBIT_U32),
diff --git a/drivers/staging/intel_sst/intelmid_pvt.c 
b/drivers/staging/intel_sst/intelmid_pvt.c
index 387eeb8..d93a879 100644
--- a/drivers/staging/intel_sst/intelmid_pvt.c
+++ b/drivers/staging/intel_sst/intelmid_pvt.c
@@ -58,26 +58,30 @@ void period_elapsed(void *mad_substream)
 int snd_intelmad_alloc_stream(struct snd_pcm_substream *substream)
 {
        struct snd_intelmad *intelmaddata = snd_pcm_substream_chip(substream);
-       struct mad_stream_pvt *stream = substream->runtime->private_data;
+       struct snd_pcm_runtime *runtime = substream->runtime;
+       struct mad_stream_pvt *stream = runtime->private_data;
        struct snd_sst_stream_params param = {{{0,},},};
        struct snd_sst_params str_params = {0};
        int ret_val;
 
        /* set codec params and inform SST driver the same */
-
        param.uc.pcm_params.codec = SST_CODEC_TYPE_PCM;
-       param.uc.pcm_params.num_chan = (u8) substream->runtime->channels;
-       param.uc.pcm_params.pcm_wd_sz = substream->runtime->sample_bits;
+       param.uc.pcm_params.num_chan = (u8) runtime->channels;
+       param.uc.pcm_params.pcm_wd_sz = runtime->sample_bits;
        param.uc.pcm_params.reserved = 0;
-       param.uc.pcm_params.sfreq = substream->runtime->rate;
+       param.uc.pcm_params.sfreq = runtime->rate;
        param.uc.pcm_params.ring_buffer_size =
                                        snd_pcm_lib_buffer_bytes(substream);
-       param.uc.pcm_params.period_count = substream->runtime->period_size;
+       param.uc.pcm_params.period_count = runtime->period_size;
        param.uc.pcm_params.ring_buffer_addr =
-                               virt_to_phys(substream->runtime->dma_area);
-       pr_debug("sst: period_cnt = %d\n", param.uc.pcm_params.period_count);
-       pr_debug("sst: sfreq= %d, wd_sz = %d\n",
-                param.uc.pcm_params.sfreq, param.uc.pcm_params.pcm_wd_sz);
+                               virt_to_phys(runtime->dma_area);
+       param.uc.pcm_params.no_irq = runtime->no_period_wakeup;
+       pr_debug("sst: hw_param: period_cnt=%d sfreq=%d wd_sz=%d chan=%d 
no_irq=%d\n",
+                       param.uc.pcm_params.period_count,
+                       param.uc.pcm_params.sfreq,
+                       param.uc.pcm_params.pcm_wd_sz,
+                       param.uc.pcm_params.num_chan,
+                       param.uc.pcm_params.no_irq);
 
        str_params.sparams = param;
        str_params.codec = SST_CODEC_TYPE_PCM;
-- 
1.7.1
_______________________________________________
MeeGo-kernel mailing list
MeeGo-kernel@lists.meego.com
http://lists.meego.com/listinfo/meego-kernel

Reply via email to