diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-11-02 12:50:22 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-11-02 12:50:22 -0500 |
commit | 20107f84b29536887b958e38b20474cccc619322 (patch) | |
tree | 457a84cafe89bf63ba243edb3f8074955c478838 /sound | |
parent | 3fe866ca6cc0495510a1d37c03a4abdc55174e83 (diff) | |
parent | 8fd6959de180f727b28813741468c9cb2a7028ec (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6:
ALSA: hda - Don't check invalid HP pin
ALSA: dummy - Fix descriptions of pcm_substreams parameter
ALSA: pcmcia: use dynamic debug infrastructure, deprecate CS_CHECK (sound)
ALSA: hda: Use quirk mask for Dell Inspiron Mini9/Vostro A90 using ALC268
sound: via82xx: deactivate DXS controls of inactive streams
ALSA: snd-usb-caiaq: Bump version number to 1.3.20
ALSA: snd-usb-caiaq: Lock on stream start/unpause
ALSA: snd-usb-caiaq: Missing lock around use of buffer positions
ALSA: sound/parisc: Move dereference after NULL test
ALSA: sound: Move dereference after NULL test and drop unnecessary NULL tests
ALSA: hda_intel: Add the Linux device ID for NVIDIA HDA controller
ALSA: pcsp - Fix nforce workaround
ALSA: SND_CS5535AUDIO: Remove the X86 platform dependency
ASoC: Amstrad Delta: add info about the line discipline requirement to Kconfig help text
ASoC: Fix possible codec_dai->ops NULL pointer problems
ALSA: hda - Fix capture source checks for ALC662/663 codecs
ASoC: Serialize access to dapm_power_widgets()
Diffstat (limited to 'sound')
-rw-r--r-- | sound/core/pcm.c | 5 | ||||
-rw-r--r-- | sound/drivers/dummy.c | 4 | ||||
-rw-r--r-- | sound/drivers/pcsp/pcsp_lib.c | 65 | ||||
-rw-r--r-- | sound/drivers/pcsp/pcsp_mixer.c | 2 | ||||
-rw-r--r-- | sound/parisc/harmony.c | 6 | ||||
-rw-r--r-- | sound/pci/Kconfig | 1 | ||||
-rw-r--r-- | sound/pci/ali5451/ali5451.c | 2 | ||||
-rw-r--r-- | sound/pci/hda/hda_intel.c | 1 | ||||
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 7 | ||||
-rw-r--r-- | sound/pci/via82xx.c | 59 | ||||
-rw-r--r-- | sound/pcmcia/pdaudiocf/pdaudiocf.c | 21 | ||||
-rw-r--r-- | sound/pcmcia/vx/vxpocket.c | 21 | ||||
-rw-r--r-- | sound/soc/omap/Kconfig | 13 | ||||
-rw-r--r-- | sound/soc/soc-core.c | 11 | ||||
-rw-r--r-- | sound/soc/soc-dapm.c | 2 | ||||
-rw-r--r-- | sound/usb/caiaq/audio.c | 16 | ||||
-rw-r--r-- | sound/usb/caiaq/device.c | 2 |
17 files changed, 162 insertions, 76 deletions
diff --git a/sound/core/pcm.c b/sound/core/pcm.c index 0c1440121c22..c69c60b2a48a 100644 --- a/sound/core/pcm.c +++ b/sound/core/pcm.c | |||
@@ -953,11 +953,12 @@ static int snd_pcm_dev_register(struct snd_device *device) | |||
953 | struct snd_pcm_substream *substream; | 953 | struct snd_pcm_substream *substream; |
954 | struct snd_pcm_notify *notify; | 954 | struct snd_pcm_notify *notify; |
955 | char str[16]; | 955 | char str[16]; |
956 | struct snd_pcm *pcm = device->device_data; | 956 | struct snd_pcm *pcm; |
957 | struct device *dev; | 957 | struct device *dev; |
958 | 958 | ||
959 | if (snd_BUG_ON(!pcm || !device)) | 959 | if (snd_BUG_ON(!device || !device->device_data)) |
960 | return -ENXIO; | 960 | return -ENXIO; |
961 | pcm = device->device_data; | ||
961 | mutex_lock(®ister_mutex); | 962 | mutex_lock(®ister_mutex); |
962 | err = snd_pcm_add(pcm); | 963 | err = snd_pcm_add(pcm); |
963 | if (err) { | 964 | if (err) { |
diff --git a/sound/drivers/dummy.c b/sound/drivers/dummy.c index 6ba066c41d2e..252e04ce602f 100644 --- a/sound/drivers/dummy.c +++ b/sound/drivers/dummy.c | |||
@@ -165,7 +165,7 @@ MODULE_PARM_DESC(enable, "Enable this dummy soundcard."); | |||
165 | module_param_array(pcm_devs, int, NULL, 0444); | 165 | module_param_array(pcm_devs, int, NULL, 0444); |
166 | MODULE_PARM_DESC(pcm_devs, "PCM devices # (0-4) for dummy driver."); | 166 | MODULE_PARM_DESC(pcm_devs, "PCM devices # (0-4) for dummy driver."); |
167 | module_param_array(pcm_substreams, int, NULL, 0444); | 167 | module_param_array(pcm_substreams, int, NULL, 0444); |
168 | MODULE_PARM_DESC(pcm_substreams, "PCM substreams # (1-16) for dummy driver."); | 168 | MODULE_PARM_DESC(pcm_substreams, "PCM substreams # (1-128) for dummy driver."); |
169 | //module_param_array(midi_devs, int, NULL, 0444); | 169 | //module_param_array(midi_devs, int, NULL, 0444); |
170 | //MODULE_PARM_DESC(midi_devs, "MIDI devices # (0-2) for dummy driver."); | 170 | //MODULE_PARM_DESC(midi_devs, "MIDI devices # (0-2) for dummy driver."); |
171 | module_param(fake_buffer, bool, 0444); | 171 | module_param(fake_buffer, bool, 0444); |
@@ -808,8 +808,6 @@ static int __devinit snd_card_dummy_new_mixer(struct snd_dummy *dummy) | |||
808 | unsigned int idx; | 808 | unsigned int idx; |
809 | int err; | 809 | int err; |
810 | 810 | ||
811 | if (snd_BUG_ON(!dummy)) | ||
812 | return -EINVAL; | ||
813 | spin_lock_init(&dummy->mixer_lock); | 811 | spin_lock_init(&dummy->mixer_lock); |
814 | strcpy(card->mixername, "Dummy Mixer"); | 812 | strcpy(card->mixername, "Dummy Mixer"); |
815 | 813 | ||
diff --git a/sound/drivers/pcsp/pcsp_lib.c b/sound/drivers/pcsp/pcsp_lib.c index 84cc2658c05b..e1145ac6e908 100644 --- a/sound/drivers/pcsp/pcsp_lib.c +++ b/sound/drivers/pcsp/pcsp_lib.c | |||
@@ -39,25 +39,20 @@ static DECLARE_TASKLET(pcsp_pcm_tasklet, pcsp_call_pcm_elapsed, 0); | |||
39 | /* write the port and returns the next expire time in ns; | 39 | /* write the port and returns the next expire time in ns; |
40 | * called at the trigger-start and in hrtimer callback | 40 | * called at the trigger-start and in hrtimer callback |
41 | */ | 41 | */ |
42 | static unsigned long pcsp_timer_update(struct hrtimer *handle) | 42 | static u64 pcsp_timer_update(struct snd_pcsp *chip) |
43 | { | 43 | { |
44 | unsigned char timer_cnt, val; | 44 | unsigned char timer_cnt, val; |
45 | u64 ns; | 45 | u64 ns; |
46 | struct snd_pcm_substream *substream; | 46 | struct snd_pcm_substream *substream; |
47 | struct snd_pcm_runtime *runtime; | 47 | struct snd_pcm_runtime *runtime; |
48 | struct snd_pcsp *chip = container_of(handle, struct snd_pcsp, timer); | ||
49 | unsigned long flags; | 48 | unsigned long flags; |
50 | 49 | ||
51 | if (chip->thalf) { | 50 | if (chip->thalf) { |
52 | outb(chip->val61, 0x61); | 51 | outb(chip->val61, 0x61); |
53 | chip->thalf = 0; | 52 | chip->thalf = 0; |
54 | if (!atomic_read(&chip->timer_active)) | ||
55 | return 0; | ||
56 | return chip->ns_rem; | 53 | return chip->ns_rem; |
57 | } | 54 | } |
58 | 55 | ||
59 | if (!atomic_read(&chip->timer_active)) | ||
60 | return 0; | ||
61 | substream = chip->playback_substream; | 56 | substream = chip->playback_substream; |
62 | if (!substream) | 57 | if (!substream) |
63 | return 0; | 58 | return 0; |
@@ -88,24 +83,17 @@ static unsigned long pcsp_timer_update(struct hrtimer *handle) | |||
88 | return ns; | 83 | return ns; |
89 | } | 84 | } |
90 | 85 | ||
91 | enum hrtimer_restart pcsp_do_timer(struct hrtimer *handle) | 86 | static void pcsp_pointer_update(struct snd_pcsp *chip) |
92 | { | 87 | { |
93 | struct snd_pcsp *chip = container_of(handle, struct snd_pcsp, timer); | ||
94 | struct snd_pcm_substream *substream; | 88 | struct snd_pcm_substream *substream; |
95 | int periods_elapsed, pointer_update; | ||
96 | size_t period_bytes, buffer_bytes; | 89 | size_t period_bytes, buffer_bytes; |
97 | unsigned long ns; | 90 | int periods_elapsed; |
98 | unsigned long flags; | 91 | unsigned long flags; |
99 | 92 | ||
100 | pointer_update = !chip->thalf; | ||
101 | ns = pcsp_timer_update(handle); | ||
102 | if (!ns) | ||
103 | return HRTIMER_NORESTART; | ||
104 | |||
105 | /* update the playback position */ | 93 | /* update the playback position */ |
106 | substream = chip->playback_substream; | 94 | substream = chip->playback_substream; |
107 | if (!substream) | 95 | if (!substream) |
108 | return HRTIMER_NORESTART; | 96 | return; |
109 | 97 | ||
110 | period_bytes = snd_pcm_lib_period_bytes(substream); | 98 | period_bytes = snd_pcm_lib_period_bytes(substream); |
111 | buffer_bytes = snd_pcm_lib_buffer_bytes(substream); | 99 | buffer_bytes = snd_pcm_lib_buffer_bytes(substream); |
@@ -134,6 +122,26 @@ enum hrtimer_restart pcsp_do_timer(struct hrtimer *handle) | |||
134 | 122 | ||
135 | if (periods_elapsed) | 123 | if (periods_elapsed) |
136 | tasklet_schedule(&pcsp_pcm_tasklet); | 124 | tasklet_schedule(&pcsp_pcm_tasklet); |
125 | } | ||
126 | |||
127 | enum hrtimer_restart pcsp_do_timer(struct hrtimer *handle) | ||
128 | { | ||
129 | struct snd_pcsp *chip = container_of(handle, struct snd_pcsp, timer); | ||
130 | int pointer_update; | ||
131 | u64 ns; | ||
132 | |||
133 | if (!atomic_read(&chip->timer_active) || !chip->playback_substream) | ||
134 | return HRTIMER_NORESTART; | ||
135 | |||
136 | pointer_update = !chip->thalf; | ||
137 | ns = pcsp_timer_update(chip); | ||
138 | if (!ns) { | ||
139 | printk(KERN_WARNING "PCSP: unexpected stop\n"); | ||
140 | return HRTIMER_NORESTART; | ||
141 | } | ||
142 | |||
143 | if (pointer_update) | ||
144 | pcsp_pointer_update(chip); | ||
137 | 145 | ||
138 | hrtimer_forward(handle, hrtimer_get_expires(handle), ns_to_ktime(ns)); | 146 | hrtimer_forward(handle, hrtimer_get_expires(handle), ns_to_ktime(ns)); |
139 | 147 | ||
@@ -142,8 +150,6 @@ enum hrtimer_restart pcsp_do_timer(struct hrtimer *handle) | |||
142 | 150 | ||
143 | static int pcsp_start_playing(struct snd_pcsp *chip) | 151 | static int pcsp_start_playing(struct snd_pcsp *chip) |
144 | { | 152 | { |
145 | unsigned long ns; | ||
146 | |||
147 | #if PCSP_DEBUG | 153 | #if PCSP_DEBUG |
148 | printk(KERN_INFO "PCSP: start_playing called\n"); | 154 | printk(KERN_INFO "PCSP: start_playing called\n"); |
149 | #endif | 155 | #endif |
@@ -159,11 +165,7 @@ static int pcsp_start_playing(struct snd_pcsp *chip) | |||
159 | atomic_set(&chip->timer_active, 1); | 165 | atomic_set(&chip->timer_active, 1); |
160 | chip->thalf = 0; | 166 | chip->thalf = 0; |
161 | 167 | ||
162 | ns = pcsp_timer_update(&pcsp_chip.timer); | 168 | hrtimer_start(&pcsp_chip.timer, ktime_set(0, 0), HRTIMER_MODE_REL); |
163 | if (!ns) | ||
164 | return -EIO; | ||
165 | |||
166 | hrtimer_start(&pcsp_chip.timer, ktime_set(0, ns), HRTIMER_MODE_REL); | ||
167 | return 0; | 169 | return 0; |
168 | } | 170 | } |
169 | 171 | ||
@@ -232,21 +234,22 @@ static int snd_pcsp_playback_hw_free(struct snd_pcm_substream *substream) | |||
232 | static int snd_pcsp_playback_prepare(struct snd_pcm_substream *substream) | 234 | static int snd_pcsp_playback_prepare(struct snd_pcm_substream *substream) |
233 | { | 235 | { |
234 | struct snd_pcsp *chip = snd_pcm_substream_chip(substream); | 236 | struct snd_pcsp *chip = snd_pcm_substream_chip(substream); |
237 | pcsp_sync_stop(chip); | ||
238 | chip->playback_ptr = 0; | ||
239 | chip->period_ptr = 0; | ||
240 | chip->fmt_size = | ||
241 | snd_pcm_format_physical_width(substream->runtime->format) >> 3; | ||
242 | chip->is_signed = snd_pcm_format_signed(substream->runtime->format); | ||
235 | #if PCSP_DEBUG | 243 | #if PCSP_DEBUG |
236 | printk(KERN_INFO "PCSP: prepare called, " | 244 | printk(KERN_INFO "PCSP: prepare called, " |
237 | "size=%zi psize=%zi f=%zi f1=%i\n", | 245 | "size=%zi psize=%zi f=%zi f1=%i fsize=%i\n", |
238 | snd_pcm_lib_buffer_bytes(substream), | 246 | snd_pcm_lib_buffer_bytes(substream), |
239 | snd_pcm_lib_period_bytes(substream), | 247 | snd_pcm_lib_period_bytes(substream), |
240 | snd_pcm_lib_buffer_bytes(substream) / | 248 | snd_pcm_lib_buffer_bytes(substream) / |
241 | snd_pcm_lib_period_bytes(substream), | 249 | snd_pcm_lib_period_bytes(substream), |
242 | substream->runtime->periods); | 250 | substream->runtime->periods, |
251 | chip->fmt_size); | ||
243 | #endif | 252 | #endif |
244 | pcsp_sync_stop(chip); | ||
245 | chip->playback_ptr = 0; | ||
246 | chip->period_ptr = 0; | ||
247 | chip->fmt_size = | ||
248 | snd_pcm_format_physical_width(substream->runtime->format) >> 3; | ||
249 | chip->is_signed = snd_pcm_format_signed(substream->runtime->format); | ||
250 | return 0; | 253 | return 0; |
251 | } | 254 | } |
252 | 255 | ||
diff --git a/sound/drivers/pcsp/pcsp_mixer.c b/sound/drivers/pcsp/pcsp_mixer.c index 199b03377142..903bc846763f 100644 --- a/sound/drivers/pcsp/pcsp_mixer.c +++ b/sound/drivers/pcsp/pcsp_mixer.c | |||
@@ -72,7 +72,7 @@ static int pcsp_treble_put(struct snd_kcontrol *kcontrol, | |||
72 | if (treble != chip->treble) { | 72 | if (treble != chip->treble) { |
73 | chip->treble = treble; | 73 | chip->treble = treble; |
74 | #if PCSP_DEBUG | 74 | #if PCSP_DEBUG |
75 | printk(KERN_INFO "PCSP: rate set to %i\n", PCSP_RATE()); | 75 | printk(KERN_INFO "PCSP: rate set to %li\n", PCSP_RATE()); |
76 | #endif | 76 | #endif |
77 | changed = 1; | 77 | changed = 1; |
78 | } | 78 | } |
diff --git a/sound/parisc/harmony.c b/sound/parisc/harmony.c index e924492df21d..f47f9e226b08 100644 --- a/sound/parisc/harmony.c +++ b/sound/parisc/harmony.c | |||
@@ -624,6 +624,9 @@ snd_harmony_pcm_init(struct snd_harmony *h) | |||
624 | struct snd_pcm *pcm; | 624 | struct snd_pcm *pcm; |
625 | int err; | 625 | int err; |
626 | 626 | ||
627 | if (snd_BUG_ON(!h)) | ||
628 | return -EINVAL; | ||
629 | |||
627 | harmony_disable_interrupts(h); | 630 | harmony_disable_interrupts(h); |
628 | 631 | ||
629 | err = snd_pcm_new(h->card, "harmony", 0, 1, 1, &pcm); | 632 | err = snd_pcm_new(h->card, "harmony", 0, 1, 1, &pcm); |
@@ -865,11 +868,12 @@ snd_harmony_mixer_reset(struct snd_harmony *h) | |||
865 | static int __devinit | 868 | static int __devinit |
866 | snd_harmony_mixer_init(struct snd_harmony *h) | 869 | snd_harmony_mixer_init(struct snd_harmony *h) |
867 | { | 870 | { |
868 | struct snd_card *card = h->card; | 871 | struct snd_card *card; |
869 | int idx, err; | 872 | int idx, err; |
870 | 873 | ||
871 | if (snd_BUG_ON(!h)) | 874 | if (snd_BUG_ON(!h)) |
872 | return -EINVAL; | 875 | return -EINVAL; |
876 | card = h->card; | ||
873 | strcpy(card->mixername, "Harmony Gain control interface"); | 877 | strcpy(card->mixername, "Harmony Gain control interface"); |
874 | 878 | ||
875 | for (idx = 0; idx < HARMONY_CONTROLS; idx++) { | 879 | for (idx = 0; idx < HARMONY_CONTROLS; idx++) { |
diff --git a/sound/pci/Kconfig b/sound/pci/Kconfig index fb5ee3cc3968..75c602b5b132 100644 --- a/sound/pci/Kconfig +++ b/sound/pci/Kconfig | |||
@@ -259,7 +259,6 @@ config SND_CS5530 | |||
259 | 259 | ||
260 | config SND_CS5535AUDIO | 260 | config SND_CS5535AUDIO |
261 | tristate "CS5535/CS5536 Audio" | 261 | tristate "CS5535/CS5536 Audio" |
262 | depends on X86 && !X86_64 | ||
263 | select SND_PCM | 262 | select SND_PCM |
264 | select SND_AC97_CODEC | 263 | select SND_AC97_CODEC |
265 | help | 264 | help |
diff --git a/sound/pci/ali5451/ali5451.c b/sound/pci/ali5451/ali5451.c index b458d208720b..aaf4da68969c 100644 --- a/sound/pci/ali5451/ali5451.c +++ b/sound/pci/ali5451/ali5451.c | |||
@@ -973,7 +973,7 @@ static void snd_ali_free_voice(struct snd_ali * codec, | |||
973 | void *private_data; | 973 | void *private_data; |
974 | 974 | ||
975 | snd_ali_printk("free_voice: channel=%d\n",pvoice->number); | 975 | snd_ali_printk("free_voice: channel=%d\n",pvoice->number); |
976 | if (pvoice == NULL || !pvoice->use) | 976 | if (!pvoice->use) |
977 | return; | 977 | return; |
978 | snd_ali_clear_voices(codec, pvoice->number, pvoice->number); | 978 | snd_ali_clear_voices(codec, pvoice->number, pvoice->number); |
979 | spin_lock_irq(&codec->voice_alloc); | 979 | spin_lock_irq(&codec->voice_alloc); |
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index c9ad182e1b4b..e340792f6cb3 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
@@ -2674,6 +2674,7 @@ static struct pci_device_id azx_ids[] = { | |||
2674 | { PCI_DEVICE(0x10de, 0x044b), .driver_data = AZX_DRIVER_NVIDIA }, | 2674 | { PCI_DEVICE(0x10de, 0x044b), .driver_data = AZX_DRIVER_NVIDIA }, |
2675 | { PCI_DEVICE(0x10de, 0x055c), .driver_data = AZX_DRIVER_NVIDIA }, | 2675 | { PCI_DEVICE(0x10de, 0x055c), .driver_data = AZX_DRIVER_NVIDIA }, |
2676 | { PCI_DEVICE(0x10de, 0x055d), .driver_data = AZX_DRIVER_NVIDIA }, | 2676 | { PCI_DEVICE(0x10de, 0x055d), .driver_data = AZX_DRIVER_NVIDIA }, |
2677 | { PCI_DEVICE(0x10de, 0x0590), .driver_data = AZX_DRIVER_NVIDIA }, | ||
2677 | { PCI_DEVICE(0x10de, 0x0774), .driver_data = AZX_DRIVER_NVIDIA }, | 2678 | { PCI_DEVICE(0x10de, 0x0774), .driver_data = AZX_DRIVER_NVIDIA }, |
2678 | { PCI_DEVICE(0x10de, 0x0775), .driver_data = AZX_DRIVER_NVIDIA }, | 2679 | { PCI_DEVICE(0x10de, 0x0775), .driver_data = AZX_DRIVER_NVIDIA }, |
2679 | { PCI_DEVICE(0x10de, 0x0776), .driver_data = AZX_DRIVER_NVIDIA }, | 2680 | { PCI_DEVICE(0x10de, 0x0776), .driver_data = AZX_DRIVER_NVIDIA }, |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index c08ca660daba..ff20048504b6 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -965,6 +965,8 @@ static void alc_automute_pin(struct hda_codec *codec) | |||
965 | unsigned int nid = spec->autocfg.hp_pins[0]; | 965 | unsigned int nid = spec->autocfg.hp_pins[0]; |
966 | int i; | 966 | int i; |
967 | 967 | ||
968 | if (!nid) | ||
969 | return; | ||
968 | pincap = snd_hda_query_pin_caps(codec, nid); | 970 | pincap = snd_hda_query_pin_caps(codec, nid); |
969 | if (pincap & AC_PINCAP_TRIG_REQ) /* need trigger? */ | 971 | if (pincap & AC_PINCAP_TRIG_REQ) /* need trigger? */ |
970 | snd_hda_codec_read(codec, nid, 0, AC_VERB_SET_PIN_SENSE, 0); | 972 | snd_hda_codec_read(codec, nid, 0, AC_VERB_SET_PIN_SENSE, 0); |
@@ -12602,7 +12604,8 @@ static struct snd_pci_quirk alc268_cfg_tbl[] = { | |||
12602 | SND_PCI_QUIRK(0x1025, 0x015b, "Acer Aspire One", | 12604 | SND_PCI_QUIRK(0x1025, 0x015b, "Acer Aspire One", |
12603 | ALC268_ACER_ASPIRE_ONE), | 12605 | ALC268_ACER_ASPIRE_ONE), |
12604 | SND_PCI_QUIRK(0x1028, 0x0253, "Dell OEM", ALC268_DELL), | 12606 | SND_PCI_QUIRK(0x1028, 0x0253, "Dell OEM", ALC268_DELL), |
12605 | SND_PCI_QUIRK(0x1028, 0x02b0, "Dell Inspiron Mini9", ALC268_DELL), | 12607 | SND_PCI_QUIRK_MASK(0x1028, 0xfff0, 0x02b0, |
12608 | "Dell Inspiron Mini9/Vostro A90", ALC268_DELL), | ||
12606 | /* almost compatible with toshiba but with optional digital outs; | 12609 | /* almost compatible with toshiba but with optional digital outs; |
12607 | * auto-probing seems working fine | 12610 | * auto-probing seems working fine |
12608 | */ | 12611 | */ |
@@ -17374,7 +17377,7 @@ static int alc662_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin, | |||
17374 | 17377 | ||
17375 | /* create playback/capture controls for input pins */ | 17378 | /* create playback/capture controls for input pins */ |
17376 | #define alc662_auto_create_input_ctls \ | 17379 | #define alc662_auto_create_input_ctls \ |
17377 | alc880_auto_create_input_ctls | 17380 | alc882_auto_create_input_ctls |
17378 | 17381 | ||
17379 | static void alc662_auto_set_output_and_unmute(struct hda_codec *codec, | 17382 | static void alc662_auto_set_output_and_unmute(struct hda_codec *codec, |
17380 | hda_nid_t nid, int pin_type, | 17383 | hda_nid_t nid, int pin_type, |
diff --git a/sound/pci/via82xx.c b/sound/pci/via82xx.c index 91683a349035..8a332d2f615c 100644 --- a/sound/pci/via82xx.c +++ b/sound/pci/via82xx.c | |||
@@ -386,6 +386,7 @@ struct via82xx { | |||
386 | 386 | ||
387 | struct snd_pcm *pcms[2]; | 387 | struct snd_pcm *pcms[2]; |
388 | struct snd_rawmidi *rmidi; | 388 | struct snd_rawmidi *rmidi; |
389 | struct snd_kcontrol *dxs_controls[4]; | ||
389 | 390 | ||
390 | struct snd_ac97_bus *ac97_bus; | 391 | struct snd_ac97_bus *ac97_bus; |
391 | struct snd_ac97 *ac97; | 392 | struct snd_ac97 *ac97; |
@@ -1216,9 +1217,9 @@ static int snd_via82xx_pcm_open(struct via82xx *chip, struct viadev *viadev, | |||
1216 | 1217 | ||
1217 | 1218 | ||
1218 | /* | 1219 | /* |
1219 | * open callback for playback on via686 and via823x DSX | 1220 | * open callback for playback on via686 |
1220 | */ | 1221 | */ |
1221 | static int snd_via82xx_playback_open(struct snd_pcm_substream *substream) | 1222 | static int snd_via686_playback_open(struct snd_pcm_substream *substream) |
1222 | { | 1223 | { |
1223 | struct via82xx *chip = snd_pcm_substream_chip(substream); | 1224 | struct via82xx *chip = snd_pcm_substream_chip(substream); |
1224 | struct viadev *viadev = &chip->devs[chip->playback_devno + substream->number]; | 1225 | struct viadev *viadev = &chip->devs[chip->playback_devno + substream->number]; |
@@ -1230,6 +1231,32 @@ static int snd_via82xx_playback_open(struct snd_pcm_substream *substream) | |||
1230 | } | 1231 | } |
1231 | 1232 | ||
1232 | /* | 1233 | /* |
1234 | * open callback for playback on via823x DXS | ||
1235 | */ | ||
1236 | static int snd_via8233_playback_open(struct snd_pcm_substream *substream) | ||
1237 | { | ||
1238 | struct via82xx *chip = snd_pcm_substream_chip(substream); | ||
1239 | struct viadev *viadev; | ||
1240 | unsigned int stream; | ||
1241 | int err; | ||
1242 | |||
1243 | viadev = &chip->devs[chip->playback_devno + substream->number]; | ||
1244 | if ((err = snd_via82xx_pcm_open(chip, viadev, substream)) < 0) | ||
1245 | return err; | ||
1246 | stream = viadev->reg_offset / 0x10; | ||
1247 | if (chip->dxs_controls[stream]) { | ||
1248 | chip->playback_volume[stream][0] = 0; | ||
1249 | chip->playback_volume[stream][1] = 0; | ||
1250 | chip->dxs_controls[stream]->vd[0].access &= | ||
1251 | ~SNDRV_CTL_ELEM_ACCESS_INACTIVE; | ||
1252 | snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE | | ||
1253 | SNDRV_CTL_EVENT_MASK_INFO, | ||
1254 | &chip->dxs_controls[stream]->id); | ||
1255 | } | ||
1256 | return 0; | ||
1257 | } | ||
1258 | |||
1259 | /* | ||
1233 | * open callback for playback on via823x multi-channel | 1260 | * open callback for playback on via823x multi-channel |
1234 | */ | 1261 | */ |
1235 | static int snd_via8233_multi_open(struct snd_pcm_substream *substream) | 1262 | static int snd_via8233_multi_open(struct snd_pcm_substream *substream) |
@@ -1302,10 +1329,26 @@ static int snd_via82xx_pcm_close(struct snd_pcm_substream *substream) | |||
1302 | return 0; | 1329 | return 0; |
1303 | } | 1330 | } |
1304 | 1331 | ||
1332 | static int snd_via8233_playback_close(struct snd_pcm_substream *substream) | ||
1333 | { | ||
1334 | struct via82xx *chip = snd_pcm_substream_chip(substream); | ||
1335 | struct viadev *viadev = substream->runtime->private_data; | ||
1336 | unsigned int stream; | ||
1337 | |||
1338 | stream = viadev->reg_offset / 0x10; | ||
1339 | if (chip->dxs_controls[stream]) { | ||
1340 | chip->dxs_controls[stream]->vd[0].access |= | ||
1341 | SNDRV_CTL_ELEM_ACCESS_INACTIVE; | ||
1342 | snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_INFO, | ||
1343 | &chip->dxs_controls[stream]->id); | ||
1344 | } | ||
1345 | return snd_via82xx_pcm_close(substream); | ||
1346 | } | ||
1347 | |||
1305 | 1348 | ||
1306 | /* via686 playback callbacks */ | 1349 | /* via686 playback callbacks */ |
1307 | static struct snd_pcm_ops snd_via686_playback_ops = { | 1350 | static struct snd_pcm_ops snd_via686_playback_ops = { |
1308 | .open = snd_via82xx_playback_open, | 1351 | .open = snd_via686_playback_open, |
1309 | .close = snd_via82xx_pcm_close, | 1352 | .close = snd_via82xx_pcm_close, |
1310 | .ioctl = snd_pcm_lib_ioctl, | 1353 | .ioctl = snd_pcm_lib_ioctl, |
1311 | .hw_params = snd_via82xx_hw_params, | 1354 | .hw_params = snd_via82xx_hw_params, |
@@ -1331,8 +1374,8 @@ static struct snd_pcm_ops snd_via686_capture_ops = { | |||
1331 | 1374 | ||
1332 | /* via823x DSX playback callbacks */ | 1375 | /* via823x DSX playback callbacks */ |
1333 | static struct snd_pcm_ops snd_via8233_playback_ops = { | 1376 | static struct snd_pcm_ops snd_via8233_playback_ops = { |
1334 | .open = snd_via82xx_playback_open, | 1377 | .open = snd_via8233_playback_open, |
1335 | .close = snd_via82xx_pcm_close, | 1378 | .close = snd_via8233_playback_close, |
1336 | .ioctl = snd_pcm_lib_ioctl, | 1379 | .ioctl = snd_pcm_lib_ioctl, |
1337 | .hw_params = snd_via82xx_hw_params, | 1380 | .hw_params = snd_via82xx_hw_params, |
1338 | .hw_free = snd_via82xx_hw_free, | 1381 | .hw_free = snd_via82xx_hw_free, |
@@ -1709,8 +1752,9 @@ static struct snd_kcontrol_new snd_via8233_dxs_volume_control __devinitdata = { | |||
1709 | .device = 0, | 1752 | .device = 0, |
1710 | /* .subdevice set later */ | 1753 | /* .subdevice set later */ |
1711 | .name = "PCM Playback Volume", | 1754 | .name = "PCM Playback Volume", |
1712 | .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | | 1755 | .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | |
1713 | SNDRV_CTL_ELEM_ACCESS_TLV_READ), | 1756 | SNDRV_CTL_ELEM_ACCESS_TLV_READ | |
1757 | SNDRV_CTL_ELEM_ACCESS_INACTIVE, | ||
1714 | .info = snd_via8233_dxs_volume_info, | 1758 | .info = snd_via8233_dxs_volume_info, |
1715 | .get = snd_via8233_dxs_volume_get, | 1759 | .get = snd_via8233_dxs_volume_get, |
1716 | .put = snd_via8233_dxs_volume_put, | 1760 | .put = snd_via8233_dxs_volume_put, |
@@ -1948,6 +1992,7 @@ static int __devinit snd_via8233_init_misc(struct via82xx *chip) | |||
1948 | err = snd_ctl_add(chip->card, kctl); | 1992 | err = snd_ctl_add(chip->card, kctl); |
1949 | if (err < 0) | 1993 | if (err < 0) |
1950 | return err; | 1994 | return err; |
1995 | chip->dxs_controls[i] = kctl; | ||
1951 | } | 1996 | } |
1952 | } | 1997 | } |
1953 | } | 1998 | } |
diff --git a/sound/pcmcia/pdaudiocf/pdaudiocf.c b/sound/pcmcia/pdaudiocf/pdaudiocf.c index 7dea74b71cf1..64b859925c0b 100644 --- a/sound/pcmcia/pdaudiocf/pdaudiocf.c +++ b/sound/pcmcia/pdaudiocf/pdaudiocf.c | |||
@@ -217,20 +217,25 @@ static void snd_pdacf_detach(struct pcmcia_device *link) | |||
217 | * configuration callback | 217 | * configuration callback |
218 | */ | 218 | */ |
219 | 219 | ||
220 | #define CS_CHECK(fn, ret) \ | ||
221 | do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) | ||
222 | |||
223 | static int pdacf_config(struct pcmcia_device *link) | 220 | static int pdacf_config(struct pcmcia_device *link) |
224 | { | 221 | { |
225 | struct snd_pdacf *pdacf = link->priv; | 222 | struct snd_pdacf *pdacf = link->priv; |
226 | int last_fn, last_ret; | 223 | int ret; |
227 | 224 | ||
228 | snd_printdd(KERN_DEBUG "pdacf_config called\n"); | 225 | snd_printdd(KERN_DEBUG "pdacf_config called\n"); |
229 | link->conf.ConfigIndex = 0x5; | 226 | link->conf.ConfigIndex = 0x5; |
230 | 227 | ||
231 | CS_CHECK(RequestIO, pcmcia_request_io(link, &link->io)); | 228 | ret = pcmcia_request_io(link, &link->io); |
232 | CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); | 229 | if (ret) |
233 | CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); | 230 | goto failed; |
231 | |||
232 | ret = pcmcia_request_irq(link, &link->irq); | ||
233 | if (ret) | ||
234 | goto failed; | ||
235 | |||
236 | ret = pcmcia_request_configuration(link, &link->conf); | ||
237 | if (ret) | ||
238 | goto failed; | ||
234 | 239 | ||
235 | if (snd_pdacf_assign_resources(pdacf, link->io.BasePort1, link->irq.AssignedIRQ) < 0) | 240 | if (snd_pdacf_assign_resources(pdacf, link->io.BasePort1, link->irq.AssignedIRQ) < 0) |
236 | goto failed; | 241 | goto failed; |
@@ -238,8 +243,6 @@ static int pdacf_config(struct pcmcia_device *link) | |||
238 | link->dev_node = &pdacf->node; | 243 | link->dev_node = &pdacf->node; |
239 | return 0; | 244 | return 0; |
240 | 245 | ||
241 | cs_failed: | ||
242 | cs_error(link, last_fn, last_ret); | ||
243 | failed: | 246 | failed: |
244 | pcmcia_disable_device(link); | 247 | pcmcia_disable_device(link); |
245 | return -ENODEV; | 248 | return -ENODEV; |
diff --git a/sound/pcmcia/vx/vxpocket.c b/sound/pcmcia/vx/vxpocket.c index 7445cc8a47d3..1492744ad67f 100644 --- a/sound/pcmcia/vx/vxpocket.c +++ b/sound/pcmcia/vx/vxpocket.c | |||
@@ -213,14 +213,11 @@ static int snd_vxpocket_assign_resources(struct vx_core *chip, int port, int irq | |||
213 | * configuration callback | 213 | * configuration callback |
214 | */ | 214 | */ |
215 | 215 | ||
216 | #define CS_CHECK(fn, ret) \ | ||
217 | do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) | ||
218 | |||
219 | static int vxpocket_config(struct pcmcia_device *link) | 216 | static int vxpocket_config(struct pcmcia_device *link) |
220 | { | 217 | { |
221 | struct vx_core *chip = link->priv; | 218 | struct vx_core *chip = link->priv; |
222 | struct snd_vxpocket *vxp = (struct snd_vxpocket *)chip; | 219 | struct snd_vxpocket *vxp = (struct snd_vxpocket *)chip; |
223 | int last_fn, last_ret; | 220 | int ret; |
224 | 221 | ||
225 | snd_printdd(KERN_DEBUG "vxpocket_config called\n"); | 222 | snd_printdd(KERN_DEBUG "vxpocket_config called\n"); |
226 | 223 | ||
@@ -235,9 +232,17 @@ static int vxpocket_config(struct pcmcia_device *link) | |||
235 | strcpy(chip->card->driver, vxp440_hw.name); | 232 | strcpy(chip->card->driver, vxp440_hw.name); |
236 | } | 233 | } |
237 | 234 | ||
238 | CS_CHECK(RequestIO, pcmcia_request_io(link, &link->io)); | 235 | ret = pcmcia_request_io(link, &link->io); |
239 | CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); | 236 | if (ret) |
240 | CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); | 237 | goto failed; |
238 | |||
239 | ret = pcmcia_request_irq(link, &link->irq); | ||
240 | if (ret) | ||
241 | goto failed; | ||
242 | |||
243 | ret = pcmcia_request_configuration(link, &link->conf); | ||
244 | if (ret) | ||
245 | goto failed; | ||
241 | 246 | ||
242 | chip->dev = &handle_to_dev(link); | 247 | chip->dev = &handle_to_dev(link); |
243 | snd_card_set_dev(chip->card, chip->dev); | 248 | snd_card_set_dev(chip->card, chip->dev); |
@@ -248,8 +253,6 @@ static int vxpocket_config(struct pcmcia_device *link) | |||
248 | link->dev_node = &vxp->node; | 253 | link->dev_node = &vxp->node; |
249 | return 0; | 254 | return 0; |
250 | 255 | ||
251 | cs_failed: | ||
252 | cs_error(link, last_fn, last_ret); | ||
253 | failed: | 256 | failed: |
254 | pcmcia_disable_device(link); | 257 | pcmcia_disable_device(link); |
255 | return -ENODEV; | 258 | return -ENODEV; |
diff --git a/sound/soc/omap/Kconfig b/sound/soc/omap/Kconfig index 2dee9839be86..653a362425df 100644 --- a/sound/soc/omap/Kconfig +++ b/sound/soc/omap/Kconfig | |||
@@ -21,7 +21,18 @@ config SND_OMAP_SOC_AMS_DELTA | |||
21 | select SND_OMAP_SOC_MCBSP | 21 | select SND_OMAP_SOC_MCBSP |
22 | select SND_SOC_CX20442 | 22 | select SND_SOC_CX20442 |
23 | help | 23 | help |
24 | Say Y if you want to add support for SoC audio on Amstrad Delta. | 24 | Say Y if you want to add support for SoC audio device connected to |
25 | a handset and a speakerphone found on Amstrad E3 (Delta) videophone. | ||
26 | |||
27 | Note that in order to get those devices fully supported, you have to | ||
28 | build the kernel with standard serial port driver included and | ||
29 | configured for at least 4 ports. Then, from userspace, you must load | ||
30 | a line discipline #19 on the modem (ttyS3) serial line. The simplest | ||
31 | way to achieve this is to install util-linux-ng and use the included | ||
32 | ldattach utility. This can be started automatically from udev, | ||
33 | a simple rule like this one should do the trick (it does for me): | ||
34 | ACTION=="add", KERNEL=="controlC0", \ | ||
35 | RUN+="/usr/sbin/ldattach 19 /dev/ttyS3" | ||
25 | 36 | ||
26 | config SND_OMAP_SOC_OSK5912 | 37 | config SND_OMAP_SOC_OSK5912 |
27 | tristate "SoC Audio support for omap osk5912" | 38 | tristate "SoC Audio support for omap osk5912" |
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 7ff04ad2a97e..0a1b2f64bbee 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c | |||
@@ -834,6 +834,9 @@ EXPORT_SYMBOL_GPL(snd_soc_resume_device); | |||
834 | #define soc_resume NULL | 834 | #define soc_resume NULL |
835 | #endif | 835 | #endif |
836 | 836 | ||
837 | static struct snd_soc_dai_ops null_dai_ops = { | ||
838 | }; | ||
839 | |||
837 | static void snd_soc_instantiate_card(struct snd_soc_card *card) | 840 | static void snd_soc_instantiate_card(struct snd_soc_card *card) |
838 | { | 841 | { |
839 | struct platform_device *pdev = container_of(card->dev, | 842 | struct platform_device *pdev = container_of(card->dev, |
@@ -877,6 +880,11 @@ static void snd_soc_instantiate_card(struct snd_soc_card *card) | |||
877 | ac97 = 1; | 880 | ac97 = 1; |
878 | } | 881 | } |
879 | 882 | ||
883 | for (i = 0; i < card->num_links; i++) { | ||
884 | if (!card->dai_link[i].codec_dai->ops) | ||
885 | card->dai_link[i].codec_dai->ops = &null_dai_ops; | ||
886 | } | ||
887 | |||
880 | /* If we have AC97 in the system then don't wait for the | 888 | /* If we have AC97 in the system then don't wait for the |
881 | * codec. This will need revisiting if we have to handle | 889 | * codec. This will need revisiting if we have to handle |
882 | * systems with mixed AC97 and non-AC97 parts. Only check for | 890 | * systems with mixed AC97 and non-AC97 parts. Only check for |
@@ -2329,9 +2337,6 @@ static int snd_soc_unregister_card(struct snd_soc_card *card) | |||
2329 | return 0; | 2337 | return 0; |
2330 | } | 2338 | } |
2331 | 2339 | ||
2332 | static struct snd_soc_dai_ops null_dai_ops = { | ||
2333 | }; | ||
2334 | |||
2335 | /** | 2340 | /** |
2336 | * snd_soc_register_dai - Register a DAI with the ASoC core | 2341 | * snd_soc_register_dai - Register a DAI with the ASoC core |
2337 | * | 2342 | * |
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c index 8de6f9dec4a2..d89f6dc00908 100644 --- a/sound/soc/soc-dapm.c +++ b/sound/soc/soc-dapm.c | |||
@@ -2072,9 +2072,9 @@ int snd_soc_dapm_stream_event(struct snd_soc_codec *codec, | |||
2072 | } | 2072 | } |
2073 | } | 2073 | } |
2074 | } | 2074 | } |
2075 | mutex_unlock(&codec->mutex); | ||
2076 | 2075 | ||
2077 | dapm_power_widgets(codec, event); | 2076 | dapm_power_widgets(codec, event); |
2077 | mutex_unlock(&codec->mutex); | ||
2078 | dump_dapm(codec, __func__); | 2078 | dump_dapm(codec, __func__); |
2079 | return 0; | 2079 | return 0; |
2080 | } | 2080 | } |
diff --git a/sound/usb/caiaq/audio.c b/sound/usb/caiaq/audio.c index 121af0644fd9..86b2c3b92df5 100644 --- a/sound/usb/caiaq/audio.c +++ b/sound/usb/caiaq/audio.c | |||
@@ -62,10 +62,14 @@ static void | |||
62 | activate_substream(struct snd_usb_caiaqdev *dev, | 62 | activate_substream(struct snd_usb_caiaqdev *dev, |
63 | struct snd_pcm_substream *sub) | 63 | struct snd_pcm_substream *sub) |
64 | { | 64 | { |
65 | spin_lock(&dev->spinlock); | ||
66 | |||
65 | if (sub->stream == SNDRV_PCM_STREAM_PLAYBACK) | 67 | if (sub->stream == SNDRV_PCM_STREAM_PLAYBACK) |
66 | dev->sub_playback[sub->number] = sub; | 68 | dev->sub_playback[sub->number] = sub; |
67 | else | 69 | else |
68 | dev->sub_capture[sub->number] = sub; | 70 | dev->sub_capture[sub->number] = sub; |
71 | |||
72 | spin_unlock(&dev->spinlock); | ||
69 | } | 73 | } |
70 | 74 | ||
71 | static void | 75 | static void |
@@ -269,16 +273,22 @@ snd_usb_caiaq_pcm_pointer(struct snd_pcm_substream *sub) | |||
269 | { | 273 | { |
270 | int index = sub->number; | 274 | int index = sub->number; |
271 | struct snd_usb_caiaqdev *dev = snd_pcm_substream_chip(sub); | 275 | struct snd_usb_caiaqdev *dev = snd_pcm_substream_chip(sub); |
276 | snd_pcm_uframes_t ptr; | ||
277 | |||
278 | spin_lock(&dev->spinlock); | ||
272 | 279 | ||
273 | if (dev->input_panic || dev->output_panic) | 280 | if (dev->input_panic || dev->output_panic) |
274 | return SNDRV_PCM_POS_XRUN; | 281 | ptr = SNDRV_PCM_POS_XRUN; |
275 | 282 | ||
276 | if (sub->stream == SNDRV_PCM_STREAM_PLAYBACK) | 283 | if (sub->stream == SNDRV_PCM_STREAM_PLAYBACK) |
277 | return bytes_to_frames(sub->runtime, | 284 | ptr = bytes_to_frames(sub->runtime, |
278 | dev->audio_out_buf_pos[index]); | 285 | dev->audio_out_buf_pos[index]); |
279 | else | 286 | else |
280 | return bytes_to_frames(sub->runtime, | 287 | ptr = bytes_to_frames(sub->runtime, |
281 | dev->audio_in_buf_pos[index]); | 288 | dev->audio_in_buf_pos[index]); |
289 | |||
290 | spin_unlock(&dev->spinlock); | ||
291 | return ptr; | ||
282 | } | 292 | } |
283 | 293 | ||
284 | /* operators for both playback and capture */ | 294 | /* operators for both playback and capture */ |
diff --git a/sound/usb/caiaq/device.c b/sound/usb/caiaq/device.c index 83e6c1312d47..a3f02dd97440 100644 --- a/sound/usb/caiaq/device.c +++ b/sound/usb/caiaq/device.c | |||
@@ -35,7 +35,7 @@ | |||
35 | #include "input.h" | 35 | #include "input.h" |
36 | 36 | ||
37 | MODULE_AUTHOR("Daniel Mack <daniel@caiaq.de>"); | 37 | MODULE_AUTHOR("Daniel Mack <daniel@caiaq.de>"); |
38 | MODULE_DESCRIPTION("caiaq USB audio, version 1.3.19"); | 38 | MODULE_DESCRIPTION("caiaq USB audio, version 1.3.20"); |
39 | MODULE_LICENSE("GPL"); | 39 | MODULE_LICENSE("GPL"); |
40 | MODULE_SUPPORTED_DEVICE("{{Native Instruments, RigKontrol2}," | 40 | MODULE_SUPPORTED_DEVICE("{{Native Instruments, RigKontrol2}," |
41 | "{Native Instruments, RigKontrol3}," | 41 | "{Native Instruments, RigKontrol3}," |