>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