aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJie Yang <yang.jie@intel.com>2015-10-16 05:57:46 -0400
committerTakashi Iwai <tiwai@suse.de>2015-10-16 08:31:38 -0400
commit90bbaf66ee7b946952f1e82a0069639dea5fd893 (patch)
treee3850c14dde524593c99cf0487a8694601376a22
parentdab9981756dbc3c50c194811f176f0d658c171af (diff)
ALSA: timer: add config item to export PCM timer disabling for expert
PCM timer is not always used. For embedded device, we need an interface to disable it when it is not needed, to shrink the kernel size and memory footprint, here add CONFIG_SND_PCM_TIMER for it. When both CONFIG_SND_PCM_TIMER and CONFIG_SND_TIMER is unselected, about 25KB saving bonus we can get. Please be noted that when disabled, those stubs who using pcm timer (e.g. dmix, dsnoop & co) may work incorrectlly. Suggested-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Jie Yang <yang.jie@intel.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
-rw-r--r--include/sound/pcm.h8
-rw-r--r--sound/core/Kconfig13
-rw-r--r--sound/core/Makefile3
-rw-r--r--sound/core/pcm_lib.c2
-rw-r--r--sound/core/pcm_native.c36
5 files changed, 39 insertions, 23 deletions
diff --git a/include/sound/pcm.h b/include/sound/pcm.h
index a4fcc9456194..2882dddfc91c 100644
--- a/include/sound/pcm.h
+++ b/include/sound/pcm.h
@@ -1111,10 +1111,16 @@ static inline void snd_pcm_set_runtime_buffer(struct snd_pcm_substream *substrea
1111 * Timer interface 1111 * Timer interface
1112 */ 1112 */
1113 1113
1114#ifdef CONFIG_SND_PCM_TIMER
1114void snd_pcm_timer_resolution_change(struct snd_pcm_substream *substream); 1115void snd_pcm_timer_resolution_change(struct snd_pcm_substream *substream);
1115void snd_pcm_timer_init(struct snd_pcm_substream *substream); 1116void snd_pcm_timer_init(struct snd_pcm_substream *substream);
1116void snd_pcm_timer_done(struct snd_pcm_substream *substream); 1117void snd_pcm_timer_done(struct snd_pcm_substream *substream);
1117 1118#else
1119static inline void
1120snd_pcm_timer_resolution_change(struct snd_pcm_substream *substream) {}
1121static inline void snd_pcm_timer_init(struct snd_pcm_substream *substream) {}
1122static inline void snd_pcm_timer_done(struct snd_pcm_substream *substream) {}
1123#endif
1118/** 1124/**
1119 * snd_pcm_gettime - Fill the timespec depending on the timestamp mode 1125 * snd_pcm_gettime - Fill the timespec depending on the timestamp mode
1120 * @runtime: PCM runtime instance 1126 * @runtime: PCM runtime instance
diff --git a/sound/core/Kconfig b/sound/core/Kconfig
index 6c96feeaf01e..e3e949126a56 100644
--- a/sound/core/Kconfig
+++ b/sound/core/Kconfig
@@ -4,7 +4,7 @@ config SND_TIMER
4 4
5config SND_PCM 5config SND_PCM
6 tristate 6 tristate
7 select SND_TIMER 7 select SND_TIMER if SND_PCM_TIMER
8 8
9config SND_PCM_ELD 9config SND_PCM_ELD
10 bool 10 bool
@@ -93,6 +93,17 @@ config SND_PCM_OSS_PLUGINS
93 support conversion of channels, formats and rates. It will 93 support conversion of channels, formats and rates. It will
94 behave like most of new OSS/Free drivers in 2.4/2.6 kernels. 94 behave like most of new OSS/Free drivers in 2.4/2.6 kernels.
95 95
96config SND_PCM_TIMER
97 bool "PCM timer interface" if EXPERT
98 default y
99 help
100 If you disable this option, pcm timer will be inavailable, so
101 those stubs used pcm timer (e.g. dmix, dsnoop & co) may work
102 incorrectlly.
103
104 For some embedded device, we may disable it to reduce memory
105 footprint, about 20KB on x86_64 platform.
106
96config SND_SEQUENCER_OSS 107config SND_SEQUENCER_OSS
97 bool "OSS Sequencer API" 108 bool "OSS Sequencer API"
98 depends on SND_SEQUENCER 109 depends on SND_SEQUENCER
diff --git a/sound/core/Makefile b/sound/core/Makefile
index 3354f91e003a..48ab4b8f8279 100644
--- a/sound/core/Makefile
+++ b/sound/core/Makefile
@@ -13,8 +13,9 @@ snd-$(CONFIG_SND_OSSEMUL) += sound_oss.o
13snd-$(CONFIG_SND_VMASTER) += vmaster.o 13snd-$(CONFIG_SND_VMASTER) += vmaster.o
14snd-$(CONFIG_SND_JACK) += ctljack.o jack.o 14snd-$(CONFIG_SND_JACK) += ctljack.o jack.o
15 15
16snd-pcm-y := pcm.o pcm_native.o pcm_lib.o pcm_timer.o pcm_misc.o \ 16snd-pcm-y := pcm.o pcm_native.o pcm_lib.o pcm_misc.o \
17 pcm_memory.o memalloc.o 17 pcm_memory.o memalloc.o
18snd-pcm-$(CONFIG_SND_PCM_TIMER) += pcm_timer.o
18snd-pcm-$(CONFIG_SND_DMA_SGBUF) += sgbuf.o 19snd-pcm-$(CONFIG_SND_DMA_SGBUF) += sgbuf.o
19snd-pcm-$(CONFIG_SND_PCM_ELD) += pcm_drm_eld.o 20snd-pcm-$(CONFIG_SND_PCM_ELD) += pcm_drm_eld.o
20snd-pcm-$(CONFIG_SND_PCM_IEC958) += pcm_iec958.o 21snd-pcm-$(CONFIG_SND_PCM_IEC958) += pcm_iec958.o
diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c
index 7d45645f10ba..6dc4277937b8 100644
--- a/sound/core/pcm_lib.c
+++ b/sound/core/pcm_lib.c
@@ -1883,8 +1883,10 @@ void snd_pcm_period_elapsed(struct snd_pcm_substream *substream)
1883 snd_pcm_update_hw_ptr0(substream, 1) < 0) 1883 snd_pcm_update_hw_ptr0(substream, 1) < 0)
1884 goto _end; 1884 goto _end;
1885 1885
1886#ifdef CONFIG_SND_PCM_TIMER
1886 if (substream->timer_running) 1887 if (substream->timer_running)
1887 snd_timer_interrupt(substream->timer, 1); 1888 snd_timer_interrupt(substream->timer, 1);
1889#endif
1888 _end: 1890 _end:
1889 snd_pcm_stream_unlock_irqrestore(substream, flags); 1891 snd_pcm_stream_unlock_irqrestore(substream, flags);
1890 if (runtime->transfer_ack_end) 1892 if (runtime->transfer_ack_end)
diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c
index 139887011ba2..a8b27cdc2844 100644
--- a/sound/core/pcm_native.c
+++ b/sound/core/pcm_native.c
@@ -486,6 +486,16 @@ static void snd_pcm_set_state(struct snd_pcm_substream *substream, int state)
486 snd_pcm_stream_unlock_irq(substream); 486 snd_pcm_stream_unlock_irq(substream);
487} 487}
488 488
489static inline void snd_pcm_timer_notify(struct snd_pcm_substream *substream,
490 int event)
491{
492#ifdef CONFIG_SND_PCM_TIMER
493 if (substream->timer)
494 snd_timer_notify(substream->timer, event,
495 &substream->runtime->trigger_tstamp);
496#endif
497}
498
489static int snd_pcm_hw_params(struct snd_pcm_substream *substream, 499static int snd_pcm_hw_params(struct snd_pcm_substream *substream,
490 struct snd_pcm_hw_params *params) 500 struct snd_pcm_hw_params *params)
491{ 501{
@@ -1043,9 +1053,7 @@ static void snd_pcm_post_start(struct snd_pcm_substream *substream, int state)
1043 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK && 1053 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK &&
1044 runtime->silence_size > 0) 1054 runtime->silence_size > 0)
1045 snd_pcm_playback_silence(substream, ULONG_MAX); 1055 snd_pcm_playback_silence(substream, ULONG_MAX);
1046 if (substream->timer) 1056 snd_pcm_timer_notify(substream, SNDRV_TIMER_EVENT_MSTART);
1047 snd_timer_notify(substream->timer, SNDRV_TIMER_EVENT_MSTART,
1048 &runtime->trigger_tstamp);
1049} 1057}
1050 1058
1051static struct action_ops snd_pcm_action_start = { 1059static struct action_ops snd_pcm_action_start = {
@@ -1093,9 +1101,7 @@ static void snd_pcm_post_stop(struct snd_pcm_substream *substream, int state)
1093 if (runtime->status->state != state) { 1101 if (runtime->status->state != state) {
1094 snd_pcm_trigger_tstamp(substream); 1102 snd_pcm_trigger_tstamp(substream);
1095 runtime->status->state = state; 1103 runtime->status->state = state;
1096 if (substream->timer) 1104 snd_pcm_timer_notify(substream, SNDRV_TIMER_EVENT_MSTOP);
1097 snd_timer_notify(substream->timer, SNDRV_TIMER_EVENT_MSTOP,
1098 &runtime->trigger_tstamp);
1099 } 1105 }
1100 wake_up(&runtime->sleep); 1106 wake_up(&runtime->sleep);
1101 wake_up(&runtime->tsleep); 1107 wake_up(&runtime->tsleep);
@@ -1209,18 +1215,12 @@ static void snd_pcm_post_pause(struct snd_pcm_substream *substream, int push)
1209 snd_pcm_trigger_tstamp(substream); 1215 snd_pcm_trigger_tstamp(substream);
1210 if (push) { 1216 if (push) {
1211 runtime->status->state = SNDRV_PCM_STATE_PAUSED; 1217 runtime->status->state = SNDRV_PCM_STATE_PAUSED;
1212 if (substream->timer) 1218 snd_pcm_timer_notify(substream, SNDRV_TIMER_EVENT_MPAUSE);
1213 snd_timer_notify(substream->timer,
1214 SNDRV_TIMER_EVENT_MPAUSE,
1215 &runtime->trigger_tstamp);
1216 wake_up(&runtime->sleep); 1219 wake_up(&runtime->sleep);
1217 wake_up(&runtime->tsleep); 1220 wake_up(&runtime->tsleep);
1218 } else { 1221 } else {
1219 runtime->status->state = SNDRV_PCM_STATE_RUNNING; 1222 runtime->status->state = SNDRV_PCM_STATE_RUNNING;
1220 if (substream->timer) 1223 snd_pcm_timer_notify(substream, SNDRV_TIMER_EVENT_MCONTINUE);
1221 snd_timer_notify(substream->timer,
1222 SNDRV_TIMER_EVENT_MCONTINUE,
1223 &runtime->trigger_tstamp);
1224 } 1224 }
1225} 1225}
1226 1226
@@ -1268,9 +1268,7 @@ static void snd_pcm_post_suspend(struct snd_pcm_substream *substream, int state)
1268 snd_pcm_trigger_tstamp(substream); 1268 snd_pcm_trigger_tstamp(substream);
1269 runtime->status->suspended_state = runtime->status->state; 1269 runtime->status->suspended_state = runtime->status->state;
1270 runtime->status->state = SNDRV_PCM_STATE_SUSPENDED; 1270 runtime->status->state = SNDRV_PCM_STATE_SUSPENDED;
1271 if (substream->timer) 1271 snd_pcm_timer_notify(substream, SNDRV_TIMER_EVENT_MSUSPEND);
1272 snd_timer_notify(substream->timer, SNDRV_TIMER_EVENT_MSUSPEND,
1273 &runtime->trigger_tstamp);
1274 wake_up(&runtime->sleep); 1272 wake_up(&runtime->sleep);
1275 wake_up(&runtime->tsleep); 1273 wake_up(&runtime->tsleep);
1276} 1274}
@@ -1374,9 +1372,7 @@ static void snd_pcm_post_resume(struct snd_pcm_substream *substream, int state)
1374 struct snd_pcm_runtime *runtime = substream->runtime; 1372 struct snd_pcm_runtime *runtime = substream->runtime;
1375 snd_pcm_trigger_tstamp(substream); 1373 snd_pcm_trigger_tstamp(substream);
1376 runtime->status->state = runtime->status->suspended_state; 1374 runtime->status->state = runtime->status->suspended_state;
1377 if (substream->timer) 1375 snd_pcm_timer_notify(substream, SNDRV_TIMER_EVENT_MRESUME);
1378 snd_timer_notify(substream->timer, SNDRV_TIMER_EVENT_MRESUME,
1379 &runtime->trigger_tstamp);
1380} 1376}
1381 1377
1382static struct action_ops snd_pcm_action_resume = { 1378static struct action_ops snd_pcm_action_resume = {