summaryrefslogtreecommitdiffstats
path: root/sound/drivers/aloop.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-10-08 18:07:14 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2012-10-08 18:07:14 -0400
commitf5a246eab9a268f51ba8189ea5b098a1bfff200e (patch)
treea6ff7169e0bcaca498d9aec8b0624de1b74eaecb /sound/drivers/aloop.c
parentd5bbd43d5f450c3fca058f5b85f3dfb4e8cc88c9 (diff)
parent7ff34ad80b7080fafaac8efa9ef0061708eddd51 (diff)
Merge tag 'sound-3.7' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
Pull sound updates from Takashi Iwai: "This contains pretty many small commits covering fairly large range of files in sound/ directory. Partly because of additional API support and partly because of constantly developed ASoC and ARM stuff. Some highlights: - Introduced the helper function and documentation for exposing the channel map via control API, as discussed in Plumbers; most of PCI drivers are covered, will follow more drivers later - Most of drivers have been replaced with the new PM callbacks (if the bus is supported) - HD-audio controller got the support of runtime PM and the support of D3 clock-stop. Also changing the power_save option in sysfs kicks off immediately to enable / disable the power-save mode. - Another significant code change in HD-audio is the rewrite of firmware loading code. Other than that, most of changes in HD-audio are continued cleanups and standardization for the generic auto parser and bug fixes (HBR, device-specific fixups), in addition to the support of channel-map API. - Addition of ASoC bindings for the compressed API, used by the mid-x86 drivers. - Lots of cleanups and API refreshes for ASoC codec drivers and DaVinci. - Conversion of OMAP to dmaengine. - New machine driver for Wolfson Microelectronics Bells. - New CODEC driver for Wolfson Microelectronics WM0010. - Enhancements to the ux500 and wm2000 drivers - A new driver for DA9055 and the support for regulator bypass mode." Fix up various arm soc header file reorg conflicts. * tag 'sound-3.7' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (339 commits) ALSA: hda - Add new codec ALC283 ALC290 support ALSA: hda - avoid unneccesary indices on "Headphone Jack" controls ALSA: hda - fix indices on boost volume on Conexant ALSA: aloop - add locking to timer access ALSA: hda - Fix hang caused by race during suspend. sound: Remove unnecessary semicolon ALSA: hda/realtek - Fix detection of ALC271X codec ALSA: hda - Add inverted internal mic quirk for Lenovo IdeaPad U310 ALSA: hda - make Realtek/Sigmatel/Conexant use the generic unsol event ALSA: hda - make a generic unsol event handler ASoC: codecs: Add DA9055 codec driver ASoC: eukrea-tlv320: Convert it to platform driver ALSA: ASoC: add DT bindings for CS4271 ASoC: wm_hubs: Ensure volume updates are handled during class W startup ASoC: wm5110: Adding missing volume update bits ASoC: wm5110: Add OUT3R support ASoC: wm5110: Add AEC loopback support ASoC: wm5110: Rename EPOUT to HPOUT3 ASoC: arizona: Add more clock rates ASoC: arizona: Add more DSP options for mixer input muxes ...
Diffstat (limited to 'sound/drivers/aloop.c')
-rw-r--r--sound/drivers/aloop.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/sound/drivers/aloop.c b/sound/drivers/aloop.c
index 5a34355e78e8..0fe6d64ff840 100644
--- a/sound/drivers/aloop.c
+++ b/sound/drivers/aloop.c
@@ -120,6 +120,7 @@ struct loopback_pcm {
120 unsigned int last_drift; 120 unsigned int last_drift;
121 unsigned long last_jiffies; 121 unsigned long last_jiffies;
122 struct timer_list timer; 122 struct timer_list timer;
123 spinlock_t timer_lock;
123}; 124};
124 125
125static struct platform_device *devices[SNDRV_CARDS]; 126static struct platform_device *devices[SNDRV_CARDS];
@@ -170,6 +171,7 @@ static void loopback_timer_start(struct loopback_pcm *dpcm)
170 unsigned long tick; 171 unsigned long tick;
171 unsigned int rate_shift = get_rate_shift(dpcm); 172 unsigned int rate_shift = get_rate_shift(dpcm);
172 173
174 spin_lock(&dpcm->timer_lock);
173 if (rate_shift != dpcm->pcm_rate_shift) { 175 if (rate_shift != dpcm->pcm_rate_shift) {
174 dpcm->pcm_rate_shift = rate_shift; 176 dpcm->pcm_rate_shift = rate_shift;
175 dpcm->period_size_frac = frac_pos(dpcm, dpcm->pcm_period_size); 177 dpcm->period_size_frac = frac_pos(dpcm, dpcm->pcm_period_size);
@@ -182,12 +184,15 @@ static void loopback_timer_start(struct loopback_pcm *dpcm)
182 tick = (tick + dpcm->pcm_bps - 1) / dpcm->pcm_bps; 184 tick = (tick + dpcm->pcm_bps - 1) / dpcm->pcm_bps;
183 dpcm->timer.expires = jiffies + tick; 185 dpcm->timer.expires = jiffies + tick;
184 add_timer(&dpcm->timer); 186 add_timer(&dpcm->timer);
187 spin_unlock(&dpcm->timer_lock);
185} 188}
186 189
187static inline void loopback_timer_stop(struct loopback_pcm *dpcm) 190static inline void loopback_timer_stop(struct loopback_pcm *dpcm)
188{ 191{
192 spin_lock(&dpcm->timer_lock);
189 del_timer(&dpcm->timer); 193 del_timer(&dpcm->timer);
190 dpcm->timer.expires = 0; 194 dpcm->timer.expires = 0;
195 spin_unlock(&dpcm->timer_lock);
191} 196}
192 197
193#define CABLE_VALID_PLAYBACK (1 << SNDRV_PCM_STREAM_PLAYBACK) 198#define CABLE_VALID_PLAYBACK (1 << SNDRV_PCM_STREAM_PLAYBACK)
@@ -667,6 +672,7 @@ static int loopback_open(struct snd_pcm_substream *substream)
667 dpcm->substream = substream; 672 dpcm->substream = substream;
668 setup_timer(&dpcm->timer, loopback_timer_function, 673 setup_timer(&dpcm->timer, loopback_timer_function,
669 (unsigned long)dpcm); 674 (unsigned long)dpcm);
675 spin_lock_init(&dpcm->timer_lock);
670 676
671 cable = loopback->cables[substream->number][dev]; 677 cable = loopback->cables[substream->number][dev];
672 if (!cable) { 678 if (!cable) {