diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-10-08 18:07:14 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-10-08 18:07:14 -0400 |
commit | f5a246eab9a268f51ba8189ea5b098a1bfff200e (patch) | |
tree | a6ff7169e0bcaca498d9aec8b0624de1b74eaecb /sound/drivers/aloop.c | |
parent | d5bbd43d5f450c3fca058f5b85f3dfb4e8cc88c9 (diff) | |
parent | 7ff34ad80b7080fafaac8efa9ef0061708eddd51 (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.c | 6 |
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 | ||
125 | static struct platform_device *devices[SNDRV_CARDS]; | 126 | static 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 | ||
187 | static inline void loopback_timer_stop(struct loopback_pcm *dpcm) | 190 | static 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) { |