aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
Diffstat (limited to 'sound')
-rw-r--r--sound/aoa/soundbus/core.c2
-rw-r--r--sound/core/control.c8
-rw-r--r--sound/core/init.c5
-rw-r--r--sound/core/pcm_native.c1
-rw-r--r--sound/core/rawmidi.c8
-rw-r--r--sound/core/timer.c1
-rw-r--r--sound/drivers/ml403-ac97cr.c4
-rw-r--r--sound/drivers/pcsp/pcsp_input.c4
-rw-r--r--sound/isa/Kconfig2
-rw-r--r--sound/isa/ad1848/ad1848.c6
-rw-r--r--sound/isa/adlib.c12
-rw-r--r--sound/isa/cs423x/cs4231.c8
-rw-r--r--sound/isa/cs423x/cs4236.c8
-rw-r--r--sound/isa/es1688/es1688.c9
-rw-r--r--sound/isa/gus/gusclassic.c13
-rw-r--r--sound/isa/gus/gusextreme.c19
-rw-r--r--sound/isa/sb/sb8.c4
-rw-r--r--sound/oss/dmasound/dmasound.h2
-rw-r--r--sound/oss/dmasound/dmasound_core.c4
-rw-r--r--sound/pci/ac97/ac97_codec.c6
-rw-r--r--sound/pci/emu10k1/emu10k1_main.c3
-rw-r--r--sound/pci/hda/hda_beep.c8
-rw-r--r--sound/pci/hda/hda_beep.h1
-rw-r--r--sound/pci/hda/hda_codec.c5
-rw-r--r--sound/pci/hda/hda_intel.c29
-rw-r--r--sound/pci/hda/hda_proc.c2
-rw-r--r--sound/pci/hda/patch_analog.c3
-rw-r--r--sound/pci/hda/patch_realtek.c30
-rw-r--r--sound/pci/hda/patch_sigmatel.c372
-rw-r--r--sound/pci/ice1712/ice1712.c6
-rw-r--r--sound/pci/intel8x0.c1
-rw-r--r--sound/pci/pcxhr/pcxhr.c5
-rw-r--r--sound/pci/rme9652/hdsp.c27
-rw-r--r--sound/soc/codecs/wm9713.c2
-rw-r--r--sound/soc/fsl/Kconfig3
-rw-r--r--sound/soc/fsl/mpc5200_psc_i2s.c14
-rw-r--r--sound/soc/soc-core.c6
-rw-r--r--sound/sound_core.c6
-rw-r--r--sound/sparc/dbri.c2
-rw-r--r--sound/usb/usbquirks.h30
40 files changed, 492 insertions, 189 deletions
diff --git a/sound/aoa/soundbus/core.c b/sound/aoa/soundbus/core.c
index f84f3e505788..fa8ab2815a98 100644
--- a/sound/aoa/soundbus/core.c
+++ b/sound/aoa/soundbus/core.c
@@ -176,7 +176,7 @@ int soundbus_add_one(struct soundbus_dev *dev)
176 return -EINVAL; 176 return -EINVAL;
177 } 177 }
178 178
179 snprintf(dev->ofdev.dev.bus_id, BUS_ID_SIZE, "soundbus:%x", ++devcount); 179 dev_set_name(&dev->ofdev.dev, "soundbus:%x", ++devcount);
180 dev->ofdev.dev.bus = &soundbus_bus_type; 180 dev->ofdev.dev.bus = &soundbus_bus_type;
181 return of_device_register(&dev->ofdev); 181 return of_device_register(&dev->ofdev);
182} 182}
diff --git a/sound/core/control.c b/sound/core/control.c
index 6d71f9a7ccbb..636b3b52ef8b 100644
--- a/sound/core/control.c
+++ b/sound/core/control.c
@@ -113,7 +113,6 @@ static int snd_ctl_release(struct inode *inode, struct file *file)
113 unsigned int idx; 113 unsigned int idx;
114 114
115 ctl = file->private_data; 115 ctl = file->private_data;
116 fasync_helper(-1, file, 0, &ctl->fasync);
117 file->private_data = NULL; 116 file->private_data = NULL;
118 card = ctl->card; 117 card = ctl->card;
119 write_lock_irqsave(&card->ctl_files_rwlock, flags); 118 write_lock_irqsave(&card->ctl_files_rwlock, flags);
@@ -225,8 +224,13 @@ struct snd_kcontrol *snd_ctl_new1(const struct snd_kcontrol_new *ncontrol,
225 kctl.id.iface = ncontrol->iface; 224 kctl.id.iface = ncontrol->iface;
226 kctl.id.device = ncontrol->device; 225 kctl.id.device = ncontrol->device;
227 kctl.id.subdevice = ncontrol->subdevice; 226 kctl.id.subdevice = ncontrol->subdevice;
228 if (ncontrol->name) 227 if (ncontrol->name) {
229 strlcpy(kctl.id.name, ncontrol->name, sizeof(kctl.id.name)); 228 strlcpy(kctl.id.name, ncontrol->name, sizeof(kctl.id.name));
229 if (strcmp(ncontrol->name, kctl.id.name) != 0)
230 snd_printk(KERN_WARNING
231 "Control name '%s' truncated to '%s'\n",
232 ncontrol->name, kctl.id.name);
233 }
230 kctl.id.index = ncontrol->index; 234 kctl.id.index = ncontrol->index;
231 kctl.count = ncontrol->count ? ncontrol->count : 1; 235 kctl.count = ncontrol->count ? ncontrol->count : 1;
232 access = ncontrol->access == 0 ? SNDRV_CTL_ELEM_ACCESS_READWRITE : 236 access = ncontrol->access == 0 ? SNDRV_CTL_ELEM_ACCESS_READWRITE :
diff --git a/sound/core/init.c b/sound/core/init.c
index ef2352c2e451..b47ff8b44be8 100644
--- a/sound/core/init.c
+++ b/sound/core/init.c
@@ -264,8 +264,11 @@ static int snd_disconnect_release(struct inode *inode, struct file *file)
264 } 264 }
265 spin_unlock(&shutdown_lock); 265 spin_unlock(&shutdown_lock);
266 266
267 if (likely(df)) 267 if (likely(df)) {
268 if ((file->f_flags & FASYNC) && df->disconnected_f_op->fasync)
269 df->disconnected_f_op->fasync(-1, file, 0);
268 return df->disconnected_f_op->release(inode, file); 270 return df->disconnected_f_op->release(inode, file);
271 }
269 272
270 panic("%s(%p, %p) failed!", __func__, inode, file); 273 panic("%s(%p, %p) failed!", __func__, inode, file);
271} 274}
diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c
index aef18682c035..a789efc9df39 100644
--- a/sound/core/pcm_native.c
+++ b/sound/core/pcm_native.c
@@ -2169,7 +2169,6 @@ static int snd_pcm_release(struct inode *inode, struct file *file)
2169 if (snd_BUG_ON(!substream)) 2169 if (snd_BUG_ON(!substream))
2170 return -ENXIO; 2170 return -ENXIO;
2171 pcm = substream->pcm; 2171 pcm = substream->pcm;
2172 fasync_helper(-1, file, 0, &substream->runtime->fasync);
2173 mutex_lock(&pcm->open_mutex); 2172 mutex_lock(&pcm->open_mutex);
2174 snd_pcm_release_substream(substream); 2173 snd_pcm_release_substream(substream);
2175 kfree(pcm_file); 2174 kfree(pcm_file);
diff --git a/sound/core/rawmidi.c b/sound/core/rawmidi.c
index c4995c9f5730..39672f68ce5d 100644
--- a/sound/core/rawmidi.c
+++ b/sound/core/rawmidi.c
@@ -148,6 +148,8 @@ static int snd_rawmidi_runtime_free(struct snd_rawmidi_substream *substream)
148 148
149static inline void snd_rawmidi_output_trigger(struct snd_rawmidi_substream *substream,int up) 149static inline void snd_rawmidi_output_trigger(struct snd_rawmidi_substream *substream,int up)
150{ 150{
151 if (!substream->opened)
152 return;
151 if (up) { 153 if (up) {
152 tasklet_hi_schedule(&substream->runtime->tasklet); 154 tasklet_hi_schedule(&substream->runtime->tasklet);
153 } else { 155 } else {
@@ -158,6 +160,8 @@ static inline void snd_rawmidi_output_trigger(struct snd_rawmidi_substream *subs
158 160
159static void snd_rawmidi_input_trigger(struct snd_rawmidi_substream *substream, int up) 161static void snd_rawmidi_input_trigger(struct snd_rawmidi_substream *substream, int up)
160{ 162{
163 if (!substream->opened)
164 return;
161 substream->ops->trigger(substream, up); 165 substream->ops->trigger(substream, up);
162 if (!up && substream->runtime->event) 166 if (!up && substream->runtime->event)
163 tasklet_kill(&substream->runtime->tasklet); 167 tasklet_kill(&substream->runtime->tasklet);
@@ -857,6 +861,8 @@ int snd_rawmidi_receive(struct snd_rawmidi_substream *substream,
857 int result = 0, count1; 861 int result = 0, count1;
858 struct snd_rawmidi_runtime *runtime = substream->runtime; 862 struct snd_rawmidi_runtime *runtime = substream->runtime;
859 863
864 if (!substream->opened)
865 return -EBADFD;
860 if (runtime->buffer == NULL) { 866 if (runtime->buffer == NULL) {
861 snd_printd("snd_rawmidi_receive: input is not active!!!\n"); 867 snd_printd("snd_rawmidi_receive: input is not active!!!\n");
862 return -EINVAL; 868 return -EINVAL;
@@ -1126,6 +1132,8 @@ int snd_rawmidi_transmit_ack(struct snd_rawmidi_substream *substream, int count)
1126int snd_rawmidi_transmit(struct snd_rawmidi_substream *substream, 1132int snd_rawmidi_transmit(struct snd_rawmidi_substream *substream,
1127 unsigned char *buffer, int count) 1133 unsigned char *buffer, int count)
1128{ 1134{
1135 if (!substream->opened)
1136 return -EBADFD;
1129 count = snd_rawmidi_transmit_peek(substream, buffer, count); 1137 count = snd_rawmidi_transmit_peek(substream, buffer, count);
1130 if (count < 0) 1138 if (count < 0)
1131 return count; 1139 return count;
diff --git a/sound/core/timer.c b/sound/core/timer.c
index e582face89d2..c584408c9f17 100644
--- a/sound/core/timer.c
+++ b/sound/core/timer.c
@@ -1263,7 +1263,6 @@ static int snd_timer_user_release(struct inode *inode, struct file *file)
1263 if (file->private_data) { 1263 if (file->private_data) {
1264 tu = file->private_data; 1264 tu = file->private_data;
1265 file->private_data = NULL; 1265 file->private_data = NULL;
1266 fasync_helper(-1, file, 0, &tu->fasync);
1267 if (tu->timeri) 1266 if (tu->timeri)
1268 snd_timer_close(tu->timeri); 1267 snd_timer_close(tu->timeri);
1269 kfree(tu->queue); 1268 kfree(tu->queue);
diff --git a/sound/drivers/ml403-ac97cr.c b/sound/drivers/ml403-ac97cr.c
index ecdbeb6d3603..7783843ca9ae 100644
--- a/sound/drivers/ml403-ac97cr.c
+++ b/sound/drivers/ml403-ac97cr.c
@@ -1153,7 +1153,7 @@ snd_ml403_ac97cr_create(struct snd_card *card, struct platform_device *pfdev,
1153 /* get irq */ 1153 /* get irq */
1154 irq = platform_get_irq(pfdev, 0); 1154 irq = platform_get_irq(pfdev, 0);
1155 if (request_irq(irq, snd_ml403_ac97cr_irq, IRQF_DISABLED, 1155 if (request_irq(irq, snd_ml403_ac97cr_irq, IRQF_DISABLED,
1156 pfdev->dev.bus_id, (void *)ml403_ac97cr)) { 1156 dev_name(&pfdev->dev), (void *)ml403_ac97cr)) {
1157 snd_printk(KERN_ERR SND_ML403_AC97CR_DRIVER ": " 1157 snd_printk(KERN_ERR SND_ML403_AC97CR_DRIVER ": "
1158 "unable to grab IRQ %d\n", 1158 "unable to grab IRQ %d\n",
1159 irq); 1159 irq);
@@ -1166,7 +1166,7 @@ snd_ml403_ac97cr_create(struct snd_card *card, struct platform_device *pfdev,
1166 ml403_ac97cr->irq); 1166 ml403_ac97cr->irq);
1167 irq = platform_get_irq(pfdev, 1); 1167 irq = platform_get_irq(pfdev, 1);
1168 if (request_irq(irq, snd_ml403_ac97cr_irq, IRQF_DISABLED, 1168 if (request_irq(irq, snd_ml403_ac97cr_irq, IRQF_DISABLED,
1169 pfdev->dev.bus_id, (void *)ml403_ac97cr)) { 1169 dev_name(&pfdev->dev), (void *)ml403_ac97cr)) {
1170 snd_printk(KERN_ERR SND_ML403_AC97CR_DRIVER ": " 1170 snd_printk(KERN_ERR SND_ML403_AC97CR_DRIVER ": "
1171 "unable to grab IRQ %d\n", 1171 "unable to grab IRQ %d\n",
1172 irq); 1172 irq);
diff --git a/sound/drivers/pcsp/pcsp_input.c b/sound/drivers/pcsp/pcsp_input.c
index cd9b83e7f7d1..0444cdeb4bec 100644
--- a/sound/drivers/pcsp/pcsp_input.c
+++ b/sound/drivers/pcsp/pcsp_input.c
@@ -24,13 +24,13 @@ static void pcspkr_do_sound(unsigned int count)
24 spin_lock_irqsave(&i8253_lock, flags); 24 spin_lock_irqsave(&i8253_lock, flags);
25 25
26 if (count) { 26 if (count) {
27 /* enable counter 2 */
28 outb_p(inb_p(0x61) | 3, 0x61);
29 /* set command for counter 2, 2 byte write */ 27 /* set command for counter 2, 2 byte write */
30 outb_p(0xB6, 0x43); 28 outb_p(0xB6, 0x43);
31 /* select desired HZ */ 29 /* select desired HZ */
32 outb_p(count & 0xff, 0x42); 30 outb_p(count & 0xff, 0x42);
33 outb((count >> 8) & 0xff, 0x42); 31 outb((count >> 8) & 0xff, 0x42);
32 /* enable counter 2 */
33 outb_p(inb_p(0x61) | 3, 0x61);
34 } else { 34 } else {
35 /* disable counter 2 */ 35 /* disable counter 2 */
36 outb(inb_p(0x61) & 0xFC, 0x61); 36 outb(inb_p(0x61) & 0xFC, 0x61);
diff --git a/sound/isa/Kconfig b/sound/isa/Kconfig
index 660beb41f767..ce0aa044e274 100644
--- a/sound/isa/Kconfig
+++ b/sound/isa/Kconfig
@@ -211,7 +211,7 @@ config SND_GUSCLASSIC
211 211
212config SND_GUSEXTREME 212config SND_GUSEXTREME
213 tristate "Gravis UltraSound Extreme" 213 tristate "Gravis UltraSound Extreme"
214 select SND_HWDEP 214 select SND_OPL3_LIB
215 select SND_MPU401_UART 215 select SND_MPU401_UART
216 select SND_PCM 216 select SND_PCM
217 help 217 help
diff --git a/sound/isa/ad1848/ad1848.c b/sound/isa/ad1848/ad1848.c
index b68d20edc20f..223a6c038819 100644
--- a/sound/isa/ad1848/ad1848.c
+++ b/sound/isa/ad1848/ad1848.c
@@ -70,15 +70,15 @@ static int __devinit snd_ad1848_match(struct device *dev, unsigned int n)
70 return 0; 70 return 0;
71 71
72 if (port[n] == SNDRV_AUTO_PORT) { 72 if (port[n] == SNDRV_AUTO_PORT) {
73 snd_printk(KERN_ERR "%s: please specify port\n", dev->bus_id); 73 dev_err(dev, "please specify port\n");
74 return 0; 74 return 0;
75 } 75 }
76 if (irq[n] == SNDRV_AUTO_IRQ) { 76 if (irq[n] == SNDRV_AUTO_IRQ) {
77 snd_printk(KERN_ERR "%s: please specify irq\n", dev->bus_id); 77 dev_err(dev, "please specify irq\n");
78 return 0; 78 return 0;
79 } 79 }
80 if (dma1[n] == SNDRV_AUTO_DMA) { 80 if (dma1[n] == SNDRV_AUTO_DMA) {
81 snd_printk(KERN_ERR "%s: please specify dma1\n", dev->bus_id); 81 dev_err(dev, "please specify dma1\n");
82 return 0; 82 return 0;
83 } 83 }
84 return 1; 84 return 1;
diff --git a/sound/isa/adlib.c b/sound/isa/adlib.c
index efa8c80d05b6..374b7177e111 100644
--- a/sound/isa/adlib.c
+++ b/sound/isa/adlib.c
@@ -36,7 +36,7 @@ static int __devinit snd_adlib_match(struct device *dev, unsigned int n)
36 return 0; 36 return 0;
37 37
38 if (port[n] == SNDRV_AUTO_PORT) { 38 if (port[n] == SNDRV_AUTO_PORT) {
39 snd_printk(KERN_ERR "%s: please specify port\n", dev->bus_id); 39 dev_err(dev, "please specify port\n");
40 return 0; 40 return 0;
41 } 41 }
42 return 1; 42 return 1;
@@ -55,13 +55,13 @@ static int __devinit snd_adlib_probe(struct device *dev, unsigned int n)
55 55
56 card = snd_card_new(index[n], id[n], THIS_MODULE, 0); 56 card = snd_card_new(index[n], id[n], THIS_MODULE, 0);
57 if (!card) { 57 if (!card) {
58 snd_printk(KERN_ERR "%s: could not create card\n", dev->bus_id); 58 dev_err(dev, "could not create card\n");
59 return -EINVAL; 59 return -EINVAL;
60 } 60 }
61 61
62 card->private_data = request_region(port[n], 4, CRD_NAME); 62 card->private_data = request_region(port[n], 4, CRD_NAME);
63 if (!card->private_data) { 63 if (!card->private_data) {
64 snd_printk(KERN_ERR "%s: could not grab ports\n", dev->bus_id); 64 dev_err(dev, "could not grab ports\n");
65 error = -EBUSY; 65 error = -EBUSY;
66 goto out; 66 goto out;
67 } 67 }
@@ -73,13 +73,13 @@ static int __devinit snd_adlib_probe(struct device *dev, unsigned int n)
73 73
74 error = snd_opl3_create(card, port[n], port[n] + 2, OPL3_HW_AUTO, 1, &opl3); 74 error = snd_opl3_create(card, port[n], port[n] + 2, OPL3_HW_AUTO, 1, &opl3);
75 if (error < 0) { 75 if (error < 0) {
76 snd_printk(KERN_ERR "%s: could not create OPL\n", dev->bus_id); 76 dev_err(dev, "could not create OPL\n");
77 goto out; 77 goto out;
78 } 78 }
79 79
80 error = snd_opl3_hwdep_new(opl3, 0, 0, NULL); 80 error = snd_opl3_hwdep_new(opl3, 0, 0, NULL);
81 if (error < 0) { 81 if (error < 0) {
82 snd_printk(KERN_ERR "%s: could not create FM\n", dev->bus_id); 82 dev_err(dev, "could not create FM\n");
83 goto out; 83 goto out;
84 } 84 }
85 85
@@ -87,7 +87,7 @@ static int __devinit snd_adlib_probe(struct device *dev, unsigned int n)
87 87
88 error = snd_card_register(card); 88 error = snd_card_register(card);
89 if (error < 0) { 89 if (error < 0) {
90 snd_printk(KERN_ERR "%s: could not register card\n", dev->bus_id); 90 dev_err(dev, "could not register card\n");
91 goto out; 91 goto out;
92 } 92 }
93 93
diff --git a/sound/isa/cs423x/cs4231.c b/sound/isa/cs423x/cs4231.c
index ddd289120aa8..f019d449e2d6 100644
--- a/sound/isa/cs423x/cs4231.c
+++ b/sound/isa/cs423x/cs4231.c
@@ -74,15 +74,15 @@ static int __devinit snd_cs4231_match(struct device *dev, unsigned int n)
74 return 0; 74 return 0;
75 75
76 if (port[n] == SNDRV_AUTO_PORT) { 76 if (port[n] == SNDRV_AUTO_PORT) {
77 snd_printk(KERN_ERR "%s: please specify port\n", dev->bus_id); 77 dev_err(dev, "please specify port\n");
78 return 0; 78 return 0;
79 } 79 }
80 if (irq[n] == SNDRV_AUTO_IRQ) { 80 if (irq[n] == SNDRV_AUTO_IRQ) {
81 snd_printk(KERN_ERR "%s: please specify irq\n", dev->bus_id); 81 dev_err(dev, "please specify irq\n");
82 return 0; 82 return 0;
83 } 83 }
84 if (dma1[n] == SNDRV_AUTO_DMA) { 84 if (dma1[n] == SNDRV_AUTO_DMA) {
85 snd_printk(KERN_ERR "%s: please specify dma1\n", dev->bus_id); 85 dev_err(dev, "please specify dma1\n");
86 return 0; 86 return 0;
87 } 87 }
88 return 1; 88 return 1;
@@ -133,7 +133,7 @@ static int __devinit snd_cs4231_probe(struct device *dev, unsigned int n)
133 mpu_port[n], 0, mpu_irq[n], 133 mpu_port[n], 0, mpu_irq[n],
134 mpu_irq[n] >= 0 ? IRQF_DISABLED : 0, 134 mpu_irq[n] >= 0 ? IRQF_DISABLED : 0,
135 NULL) < 0) 135 NULL) < 0)
136 printk(KERN_WARNING "%s: MPU401 not detected\n", dev->bus_id); 136 dev_warn(dev, "MPU401 not detected\n");
137 } 137 }
138 138
139 snd_card_set_dev(card, dev); 139 snd_card_set_dev(card, dev);
diff --git a/sound/isa/cs423x/cs4236.c b/sound/isa/cs423x/cs4236.c
index 91f9c15d3e30..019c9401663e 100644
--- a/sound/isa/cs423x/cs4236.c
+++ b/sound/isa/cs423x/cs4236.c
@@ -488,19 +488,19 @@ static int __devinit snd_cs423x_isa_match(struct device *pdev,
488 return 0; 488 return 0;
489 489
490 if (port[dev] == SNDRV_AUTO_PORT) { 490 if (port[dev] == SNDRV_AUTO_PORT) {
491 snd_printk(KERN_ERR "%s: please specify port\n", pdev->bus_id); 491 dev_err(pdev, "please specify port\n");
492 return 0; 492 return 0;
493 } 493 }
494 if (cport[dev] == SNDRV_AUTO_PORT) { 494 if (cport[dev] == SNDRV_AUTO_PORT) {
495 snd_printk(KERN_ERR "%s: please specify cport\n", pdev->bus_id); 495 dev_err(pdev, "please specify cport\n");
496 return 0; 496 return 0;
497 } 497 }
498 if (irq[dev] == SNDRV_AUTO_IRQ) { 498 if (irq[dev] == SNDRV_AUTO_IRQ) {
499 snd_printk(KERN_ERR "%s: please specify irq\n", pdev->bus_id); 499 dev_err(pdev, "please specify irq\n");
500 return 0; 500 return 0;
501 } 501 }
502 if (dma1[dev] == SNDRV_AUTO_DMA) { 502 if (dma1[dev] == SNDRV_AUTO_DMA) {
503 snd_printk(KERN_ERR "%s: please specify dma1\n", pdev->bus_id); 503 dev_err(pdev, "please specify dma1\n");
504 return 0; 504 return 0;
505 } 505 }
506 return 1; 506 return 1;
diff --git a/sound/isa/es1688/es1688.c b/sound/isa/es1688/es1688.c
index f88639ea64b2..b46377139cf8 100644
--- a/sound/isa/es1688/es1688.c
+++ b/sound/isa/es1688/es1688.c
@@ -88,16 +88,14 @@ static int __devinit snd_es1688_legacy_create(struct snd_card *card,
88 if (irq[n] == SNDRV_AUTO_IRQ) { 88 if (irq[n] == SNDRV_AUTO_IRQ) {
89 irq[n] = snd_legacy_find_free_irq(possible_irqs); 89 irq[n] = snd_legacy_find_free_irq(possible_irqs);
90 if (irq[n] < 0) { 90 if (irq[n] < 0) {
91 snd_printk(KERN_ERR "%s: unable to find a free IRQ\n", 91 dev_err(dev, "unable to find a free IRQ\n");
92 dev->bus_id);
93 return -EBUSY; 92 return -EBUSY;
94 } 93 }
95 } 94 }
96 if (dma8[n] == SNDRV_AUTO_DMA) { 95 if (dma8[n] == SNDRV_AUTO_DMA) {
97 dma8[n] = snd_legacy_find_free_dma(possible_dmas); 96 dma8[n] = snd_legacy_find_free_dma(possible_dmas);
98 if (dma8[n] < 0) { 97 if (dma8[n] < 0) {
99 snd_printk(KERN_ERR "%s: unable to find a free DMA\n", 98 dev_err(dev, "unable to find a free DMA\n");
100 dev->bus_id);
101 return -EBUSY; 99 return -EBUSY;
102 } 100 }
103 } 101 }
@@ -147,8 +145,7 @@ static int __devinit snd_es1688_probe(struct device *dev, unsigned int n)
147 145
148 if (snd_opl3_create(card, chip->port, chip->port + 2, 146 if (snd_opl3_create(card, chip->port, chip->port + 2,
149 OPL3_HW_OPL3, 0, &opl3) < 0) 147 OPL3_HW_OPL3, 0, &opl3) < 0)
150 printk(KERN_WARNING "%s: opl3 not detected at 0x%lx\n", 148 dev_warn(dev, "opl3 not detected at 0x%lx\n", chip->port);
151 dev->bus_id, chip->port);
152 else { 149 else {
153 error = snd_opl3_hwdep_new(opl3, 0, 1, NULL); 150 error = snd_opl3_hwdep_new(opl3, 0, 1, NULL);
154 if (error < 0) 151 if (error < 0)
diff --git a/sound/isa/gus/gusclassic.c b/sound/isa/gus/gusclassic.c
index 8f914b37bf89..426532a4d730 100644
--- a/sound/isa/gus/gusclassic.c
+++ b/sound/isa/gus/gusclassic.c
@@ -90,24 +90,21 @@ static int __devinit snd_gusclassic_create(struct snd_card *card,
90 if (irq[n] == SNDRV_AUTO_IRQ) { 90 if (irq[n] == SNDRV_AUTO_IRQ) {
91 irq[n] = snd_legacy_find_free_irq(possible_irqs); 91 irq[n] = snd_legacy_find_free_irq(possible_irqs);
92 if (irq[n] < 0) { 92 if (irq[n] < 0) {
93 snd_printk(KERN_ERR "%s: unable to find a free IRQ\n", 93 dev_err(dev, "unable to find a free IRQ\n");
94 dev->bus_id);
95 return -EBUSY; 94 return -EBUSY;
96 } 95 }
97 } 96 }
98 if (dma1[n] == SNDRV_AUTO_DMA) { 97 if (dma1[n] == SNDRV_AUTO_DMA) {
99 dma1[n] = snd_legacy_find_free_dma(possible_dmas); 98 dma1[n] = snd_legacy_find_free_dma(possible_dmas);
100 if (dma1[n] < 0) { 99 if (dma1[n] < 0) {
101 snd_printk(KERN_ERR "%s: unable to find a free DMA1\n", 100 dev_err(dev, "unable to find a free DMA1\n");
102 dev->bus_id);
103 return -EBUSY; 101 return -EBUSY;
104 } 102 }
105 } 103 }
106 if (dma2[n] == SNDRV_AUTO_DMA) { 104 if (dma2[n] == SNDRV_AUTO_DMA) {
107 dma2[n] = snd_legacy_find_free_dma(possible_dmas); 105 dma2[n] = snd_legacy_find_free_dma(possible_dmas);
108 if (dma2[n] < 0) { 106 if (dma2[n] < 0) {
109 snd_printk(KERN_ERR "%s: unable to find a free DMA2\n", 107 dev_err(dev, "unable to find a free DMA2\n");
110 dev->bus_id);
111 return -EBUSY; 108 return -EBUSY;
112 } 109 }
113 } 110 }
@@ -174,8 +171,8 @@ static int __devinit snd_gusclassic_probe(struct device *dev, unsigned int n)
174 171
175 error = -ENODEV; 172 error = -ENODEV;
176 if (gus->max_flag || gus->ess_flag) { 173 if (gus->max_flag || gus->ess_flag) {
177 snd_printk(KERN_ERR "%s: GUS Classic or ACE soundcard was " 174 dev_err(dev, "GUS Classic or ACE soundcard was "
178 "not detected at 0x%lx\n", dev->bus_id, gus->gf1.port); 175 "not detected at 0x%lx\n", gus->gf1.port);
179 goto out; 176 goto out;
180 } 177 }
181 178
diff --git a/sound/isa/gus/gusextreme.c b/sound/isa/gus/gusextreme.c
index da13185eb0a0..7ad4c3b41a84 100644
--- a/sound/isa/gus/gusextreme.c
+++ b/sound/isa/gus/gusextreme.c
@@ -106,16 +106,14 @@ static int __devinit snd_gusextreme_es1688_create(struct snd_card *card,
106 if (irq[n] == SNDRV_AUTO_IRQ) { 106 if (irq[n] == SNDRV_AUTO_IRQ) {
107 irq[n] = snd_legacy_find_free_irq(possible_irqs); 107 irq[n] = snd_legacy_find_free_irq(possible_irqs);
108 if (irq[n] < 0) { 108 if (irq[n] < 0) {
109 snd_printk(KERN_ERR "%s: unable to find a free IRQ " 109 dev_err(dev, "unable to find a free IRQ for ES1688\n");
110 "for ES1688\n", dev->bus_id);
111 return -EBUSY; 110 return -EBUSY;
112 } 111 }
113 } 112 }
114 if (dma8[n] == SNDRV_AUTO_DMA) { 113 if (dma8[n] == SNDRV_AUTO_DMA) {
115 dma8[n] = snd_legacy_find_free_dma(possible_dmas); 114 dma8[n] = snd_legacy_find_free_dma(possible_dmas);
116 if (dma8[n] < 0) { 115 if (dma8[n] < 0) {
117 snd_printk(KERN_ERR "%s: unable to find a free DMA " 116 dev_err(dev, "unable to find a free DMA for ES1688\n");
118 "for ES1688\n", dev->bus_id);
119 return -EBUSY; 117 return -EBUSY;
120 } 118 }
121 } 119 }
@@ -143,16 +141,14 @@ static int __devinit snd_gusextreme_gus_card_create(struct snd_card *card,
143 if (gf1_irq[n] == SNDRV_AUTO_IRQ) { 141 if (gf1_irq[n] == SNDRV_AUTO_IRQ) {
144 gf1_irq[n] = snd_legacy_find_free_irq(possible_irqs); 142 gf1_irq[n] = snd_legacy_find_free_irq(possible_irqs);
145 if (gf1_irq[n] < 0) { 143 if (gf1_irq[n] < 0) {
146 snd_printk(KERN_ERR "%s: unable to find a free IRQ " 144 dev_err(dev, "unable to find a free IRQ for GF1\n");
147 "for GF1\n", dev->bus_id);
148 return -EBUSY; 145 return -EBUSY;
149 } 146 }
150 } 147 }
151 if (dma1[n] == SNDRV_AUTO_DMA) { 148 if (dma1[n] == SNDRV_AUTO_DMA) {
152 dma1[n] = snd_legacy_find_free_dma(possible_dmas); 149 dma1[n] = snd_legacy_find_free_dma(possible_dmas);
153 if (dma1[n] < 0) { 150 if (dma1[n] < 0) {
154 snd_printk(KERN_ERR "%s: unable to find a free DMA " 151 dev_err(dev, "unable to find a free DMA for GF1\n");
155 "for GF1\n", dev->bus_id);
156 return -EBUSY; 152 return -EBUSY;
157 } 153 }
158 } 154 }
@@ -278,8 +274,8 @@ static int __devinit snd_gusextreme_probe(struct device *dev, unsigned int n)
278 274
279 error = -ENODEV; 275 error = -ENODEV;
280 if (!gus->ess_flag) { 276 if (!gus->ess_flag) {
281 snd_printk(KERN_ERR "%s: GUS Extreme soundcard was not " 277 dev_err(dev, "GUS Extreme soundcard was not "
282 "detected at 0x%lx\n", dev->bus_id, gus->gf1.port); 278 "detected at 0x%lx\n", gus->gf1.port);
283 goto out; 279 goto out;
284 } 280 }
285 gus->codec_flag = 1; 281 gus->codec_flag = 1;
@@ -310,8 +306,7 @@ static int __devinit snd_gusextreme_probe(struct device *dev, unsigned int n)
310 306
311 if (snd_opl3_create(card, es1688->port, es1688->port + 2, 307 if (snd_opl3_create(card, es1688->port, es1688->port + 2,
312 OPL3_HW_OPL3, 0, &opl3) < 0) 308 OPL3_HW_OPL3, 0, &opl3) < 0)
313 printk(KERN_ERR "%s: opl3 not detected at 0x%lx\n", 309 dev_warn(dev, "opl3 not detected at 0x%lx\n", es1688->port);
314 dev->bus_id, es1688->port);
315 else { 310 else {
316 error = snd_opl3_hwdep_new(opl3, 0, 2, NULL); 311 error = snd_opl3_hwdep_new(opl3, 0, 2, NULL);
317 if (error < 0) 312 if (error < 0)
diff --git a/sound/isa/sb/sb8.c b/sound/isa/sb/sb8.c
index 336a34277907..667eccc676a4 100644
--- a/sound/isa/sb/sb8.c
+++ b/sound/isa/sb/sb8.c
@@ -85,11 +85,11 @@ static int __devinit snd_sb8_match(struct device *pdev, unsigned int dev)
85 if (!enable[dev]) 85 if (!enable[dev])
86 return 0; 86 return 0;
87 if (irq[dev] == SNDRV_AUTO_IRQ) { 87 if (irq[dev] == SNDRV_AUTO_IRQ) {
88 snd_printk(KERN_ERR "%s: please specify irq\n", pdev->bus_id); 88 dev_err(pdev, "please specify irq\n");
89 return 0; 89 return 0;
90 } 90 }
91 if (dma8[dev] == SNDRV_AUTO_DMA) { 91 if (dma8[dev] == SNDRV_AUTO_DMA) {
92 snd_printk(KERN_ERR "%s: please specify dma8\n", pdev->bus_id); 92 dev_err(pdev, "please specify dma8\n");
93 return 0; 93 return 0;
94 } 94 }
95 return 1; 95 return 1;
diff --git a/sound/oss/dmasound/dmasound.h b/sound/oss/dmasound/dmasound.h
index 1cb13fe56ec4..1308d8d34186 100644
--- a/sound/oss/dmasound/dmasound.h
+++ b/sound/oss/dmasound/dmasound.h
@@ -235,7 +235,7 @@ struct sound_queue {
235 */ 235 */
236 int active; 236 int active;
237 wait_queue_head_t action_queue, open_queue, sync_queue; 237 wait_queue_head_t action_queue, open_queue, sync_queue;
238 fmode_t open_mode; 238 int non_blocking;
239 int busy, syncing, xruns, died; 239 int busy, syncing, xruns, died;
240}; 240};
241 241
diff --git a/sound/oss/dmasound/dmasound_core.c b/sound/oss/dmasound/dmasound_core.c
index b8239f3168fb..793b7f478433 100644
--- a/sound/oss/dmasound/dmasound_core.c
+++ b/sound/oss/dmasound/dmasound_core.c
@@ -603,7 +603,7 @@ static ssize_t sq_write(struct file *file, const char __user *src, size_t uLeft,
603 while (uLeft) { 603 while (uLeft) {
604 while (write_sq.count >= write_sq.max_active) { 604 while (write_sq.count >= write_sq.max_active) {
605 sq_play(); 605 sq_play();
606 if (write_sq.open_mode & O_NONBLOCK) 606 if (write_sq.non_blocking)
607 return uWritten > 0 ? uWritten : -EAGAIN; 607 return uWritten > 0 ? uWritten : -EAGAIN;
608 SLEEP(write_sq.action_queue); 608 SLEEP(write_sq.action_queue);
609 if (signal_pending(current)) 609 if (signal_pending(current))
@@ -718,7 +718,7 @@ static int sq_open2(struct sound_queue *sq, struct file *file, fmode_t mode,
718 return rc; 718 return rc;
719 } 719 }
720 720
721 sq->open_mode = file->f_mode; 721 sq->non_blocking = file->f_flags & O_NONBLOCK;
722 } 722 }
723 return rc; 723 return rc;
724} 724}
diff --git a/sound/pci/ac97/ac97_codec.c b/sound/pci/ac97/ac97_codec.c
index 6704acbca8c0..bd510eceff1f 100644
--- a/sound/pci/ac97/ac97_codec.c
+++ b/sound/pci/ac97/ac97_codec.c
@@ -1927,9 +1927,9 @@ static int snd_ac97_dev_register(struct snd_device *device)
1927 ac97->dev.bus = &ac97_bus_type; 1927 ac97->dev.bus = &ac97_bus_type;
1928 ac97->dev.parent = ac97->bus->card->dev; 1928 ac97->dev.parent = ac97->bus->card->dev;
1929 ac97->dev.release = ac97_device_release; 1929 ac97->dev.release = ac97_device_release;
1930 snprintf(ac97->dev.bus_id, BUS_ID_SIZE, "%d-%d:%s", 1930 dev_set_name(&ac97->dev, "%d-%d:%s",
1931 ac97->bus->card->number, ac97->num, 1931 ac97->bus->card->number, ac97->num,
1932 snd_ac97_get_short_name(ac97)); 1932 snd_ac97_get_short_name(ac97));
1933 if ((err = device_register(&ac97->dev)) < 0) { 1933 if ((err = device_register(&ac97->dev)) < 0) {
1934 snd_printk(KERN_ERR "Can't register ac97 bus\n"); 1934 snd_printk(KERN_ERR "Can't register ac97 bus\n");
1935 ac97->dev.bus = NULL; 1935 ac97->dev.bus = NULL;
diff --git a/sound/pci/emu10k1/emu10k1_main.c b/sound/pci/emu10k1/emu10k1_main.c
index 2f283ea6ad9a..de5ee8f097f6 100644
--- a/sound/pci/emu10k1/emu10k1_main.c
+++ b/sound/pci/emu10k1/emu10k1_main.c
@@ -1464,6 +1464,7 @@ static struct snd_emu_chip_details emu_chip_details[] = {
1464 .ca0151_chip = 1, 1464 .ca0151_chip = 1,
1465 .spk71 = 1, 1465 .spk71 = 1,
1466 .spdif_bug = 1, 1466 .spdif_bug = 1,
1467 .invert_shared_spdif = 1, /* digital/analog switch swapped */
1467 .ac97_chip = 1} , 1468 .ac97_chip = 1} ,
1468 {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x20021102, 1469 {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x20021102,
1469 .driver = "Audigy2", .name = "Audigy 2 ZS [SB0350]", 1470 .driver = "Audigy2", .name = "Audigy 2 ZS [SB0350]",
@@ -1473,6 +1474,7 @@ static struct snd_emu_chip_details emu_chip_details[] = {
1473 .ca0151_chip = 1, 1474 .ca0151_chip = 1,
1474 .spk71 = 1, 1475 .spk71 = 1,
1475 .spdif_bug = 1, 1476 .spdif_bug = 1,
1477 .invert_shared_spdif = 1, /* digital/analog switch swapped */
1476 .ac97_chip = 1} , 1478 .ac97_chip = 1} ,
1477 {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x20011102, 1479 {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x20011102,
1478 .driver = "Audigy2", .name = "Audigy 2 ZS [2001]", 1480 .driver = "Audigy2", .name = "Audigy 2 ZS [2001]",
@@ -1482,6 +1484,7 @@ static struct snd_emu_chip_details emu_chip_details[] = {
1482 .ca0151_chip = 1, 1484 .ca0151_chip = 1,
1483 .spk71 = 1, 1485 .spk71 = 1,
1484 .spdif_bug = 1, 1486 .spdif_bug = 1,
1487 .invert_shared_spdif = 1, /* digital/analog switch swapped */
1485 .ac97_chip = 1} , 1488 .ac97_chip = 1} ,
1486 /* Audigy 2 */ 1489 /* Audigy 2 */
1487 /* Tested by James@superbug.co.uk 3rd July 2005 */ 1490 /* Tested by James@superbug.co.uk 3rd July 2005 */
diff --git a/sound/pci/hda/hda_beep.c b/sound/pci/hda/hda_beep.c
index 9b77b3e0fa98..3ecd7e797dee 100644
--- a/sound/pci/hda/hda_beep.c
+++ b/sound/pci/hda/hda_beep.c
@@ -37,6 +37,9 @@ static void snd_hda_generate_beep(struct work_struct *work)
37 container_of(work, struct hda_beep, beep_work); 37 container_of(work, struct hda_beep, beep_work);
38 struct hda_codec *codec = beep->codec; 38 struct hda_codec *codec = beep->codec;
39 39
40 if (!beep->enabled)
41 return;
42
40 /* generate tone */ 43 /* generate tone */
41 snd_hda_codec_write_cache(codec, beep->nid, 0, 44 snd_hda_codec_write_cache(codec, beep->nid, 0,
42 AC_VERB_SET_BEEP_CONTROL, beep->tone); 45 AC_VERB_SET_BEEP_CONTROL, beep->tone);
@@ -85,6 +88,10 @@ int snd_hda_attach_beep_device(struct hda_codec *codec, int nid)
85 snprintf(beep->phys, sizeof(beep->phys), 88 snprintf(beep->phys, sizeof(beep->phys),
86 "card%d/codec#%d/beep0", codec->bus->card->number, codec->addr); 89 "card%d/codec#%d/beep0", codec->bus->card->number, codec->addr);
87 input_dev = input_allocate_device(); 90 input_dev = input_allocate_device();
91 if (!input_dev) {
92 kfree(beep);
93 return -ENOMEM;
94 }
88 95
89 /* setup digital beep device */ 96 /* setup digital beep device */
90 input_dev->name = "HDA Digital PCBeep"; 97 input_dev->name = "HDA Digital PCBeep";
@@ -115,6 +122,7 @@ int snd_hda_attach_beep_device(struct hda_codec *codec, int nid)
115 beep->nid = nid; 122 beep->nid = nid;
116 beep->dev = input_dev; 123 beep->dev = input_dev;
117 beep->codec = codec; 124 beep->codec = codec;
125 beep->enabled = 1;
118 codec->beep = beep; 126 codec->beep = beep;
119 127
120 INIT_WORK(&beep->beep_work, &snd_hda_generate_beep); 128 INIT_WORK(&beep->beep_work, &snd_hda_generate_beep);
diff --git a/sound/pci/hda/hda_beep.h b/sound/pci/hda/hda_beep.h
index de4036e6e710..b9679f081cae 100644
--- a/sound/pci/hda/hda_beep.h
+++ b/sound/pci/hda/hda_beep.h
@@ -31,6 +31,7 @@ struct hda_beep {
31 char phys[32]; 31 char phys[32];
32 int tone; 32 int tone;
33 int nid; 33 int nid;
34 int enabled;
34 struct work_struct beep_work; /* scheduled task for beep event */ 35 struct work_struct beep_work; /* scheduled task for beep event */
35}; 36};
36 37
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
index 6447754ae56e..eb9164176dab 100644
--- a/sound/pci/hda/hda_codec.c
+++ b/sound/pci/hda/hda_codec.c
@@ -64,6 +64,7 @@ static struct hda_vendor_id hda_vendor_ids[] = {
64 { 0x14f1, "Conexant" }, 64 { 0x14f1, "Conexant" },
65 { 0x17e8, "Chrontel" }, 65 { 0x17e8, "Chrontel" },
66 { 0x1854, "LG" }, 66 { 0x1854, "LG" },
67 { 0x1aec, "Wolfson Microelectronics" },
67 { 0x434d, "C-Media" }, 68 { 0x434d, "C-Media" },
68 { 0x8384, "SigmaTel" }, 69 { 0x8384, "SigmaTel" },
69 {} /* terminator */ 70 {} /* terminator */
@@ -1435,12 +1436,12 @@ static void set_dig_out(struct hda_codec *codec, hda_nid_t nid,
1435{ 1436{
1436 hda_nid_t *d; 1437 hda_nid_t *d;
1437 1438
1438 snd_hda_codec_write(codec, nid, 0, verb, val); 1439 snd_hda_codec_write_cache(codec, nid, 0, verb, val);
1439 d = codec->slave_dig_outs; 1440 d = codec->slave_dig_outs;
1440 if (!d) 1441 if (!d)
1441 return; 1442 return;
1442 for (; *d; d++) 1443 for (; *d; d++)
1443 snd_hda_codec_write(codec, *d, 0, verb, val); 1444 snd_hda_codec_write_cache(codec, *d, 0, verb, val);
1444} 1445}
1445 1446
1446static inline void set_dig_out_convert(struct hda_codec *codec, hda_nid_t nid, 1447static inline void set_dig_out_convert(struct hda_codec *codec, hda_nid_t nid,
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
index f080f8ce0ecb..35722ec920cb 100644
--- a/sound/pci/hda/hda_intel.c
+++ b/sound/pci/hda/hda_intel.c
@@ -45,6 +45,7 @@
45#include <linux/slab.h> 45#include <linux/slab.h>
46#include <linux/pci.h> 46#include <linux/pci.h>
47#include <linux/mutex.h> 47#include <linux/mutex.h>
48#include <linux/reboot.h>
48#include <sound/core.h> 49#include <sound/core.h>
49#include <sound/initval.h> 50#include <sound/initval.h>
50#include "hda_codec.h" 51#include "hda_codec.h"
@@ -397,6 +398,9 @@ struct azx {
397 398
398 /* for pending irqs */ 399 /* for pending irqs */
399 struct work_struct irq_pending_work; 400 struct work_struct irq_pending_work;
401
402 /* reboot notifier (for mysterious hangup problem at power-down) */
403 struct notifier_block reboot_notifier;
400}; 404};
401 405
402/* driver types */ 406/* driver types */
@@ -1979,12 +1983,36 @@ static int azx_resume(struct pci_dev *pci)
1979 1983
1980 1984
1981/* 1985/*
1986 * reboot notifier for hang-up problem at power-down
1987 */
1988static int azx_halt(struct notifier_block *nb, unsigned long event, void *buf)
1989{
1990 struct azx *chip = container_of(nb, struct azx, reboot_notifier);
1991 azx_stop_chip(chip);
1992 return NOTIFY_OK;
1993}
1994
1995static void azx_notifier_register(struct azx *chip)
1996{
1997 chip->reboot_notifier.notifier_call = azx_halt;
1998 register_reboot_notifier(&chip->reboot_notifier);
1999}
2000
2001static void azx_notifier_unregister(struct azx *chip)
2002{
2003 if (chip->reboot_notifier.notifier_call)
2004 unregister_reboot_notifier(&chip->reboot_notifier);
2005}
2006
2007/*
1982 * destructor 2008 * destructor
1983 */ 2009 */
1984static int azx_free(struct azx *chip) 2010static int azx_free(struct azx *chip)
1985{ 2011{
1986 int i; 2012 int i;
1987 2013
2014 azx_notifier_unregister(chip);
2015
1988 if (chip->initialized) { 2016 if (chip->initialized) {
1989 azx_clear_irq_pending(chip); 2017 azx_clear_irq_pending(chip);
1990 for (i = 0; i < chip->num_streams; i++) 2018 for (i = 0; i < chip->num_streams; i++)
@@ -2348,6 +2376,7 @@ static int __devinit azx_probe(struct pci_dev *pci,
2348 pci_set_drvdata(pci, card); 2376 pci_set_drvdata(pci, card);
2349 chip->running = 1; 2377 chip->running = 1;
2350 power_down_all_codecs(chip); 2378 power_down_all_codecs(chip);
2379 azx_notifier_register(chip);
2351 2380
2352 dev++; 2381 dev++;
2353 return err; 2382 return err;
diff --git a/sound/pci/hda/hda_proc.c b/sound/pci/hda/hda_proc.c
index 743d77922bce..c39af986bff1 100644
--- a/sound/pci/hda/hda_proc.c
+++ b/sound/pci/hda/hda_proc.c
@@ -483,6 +483,8 @@ static void print_gpio(struct snd_info_buffer *buffer,
483 (gpio & AC_GPIO_UNSOLICITED) ? 1 : 0, 483 (gpio & AC_GPIO_UNSOLICITED) ? 1 : 0,
484 (gpio & AC_GPIO_WAKE) ? 1 : 0); 484 (gpio & AC_GPIO_WAKE) ? 1 : 0);
485 max = gpio & AC_GPIO_IO_COUNT; 485 max = gpio & AC_GPIO_IO_COUNT;
486 if (!max || max > 8)
487 return;
486 enable = snd_hda_codec_read(codec, nid, 0, 488 enable = snd_hda_codec_read(codec, nid, 0,
487 AC_VERB_GET_GPIO_MASK, 0); 489 AC_VERB_GET_GPIO_MASK, 0);
488 direction = snd_hda_codec_read(codec, nid, 0, 490 direction = snd_hda_codec_read(codec, nid, 0,
diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c
index 2b00c4afdf97..686c77491dea 100644
--- a/sound/pci/hda/patch_analog.c
+++ b/sound/pci/hda/patch_analog.c
@@ -3860,6 +3860,9 @@ static const char *ad1884a_models[AD1884A_MODELS] = {
3860 3860
3861static struct snd_pci_quirk ad1884a_cfg_tbl[] = { 3861static struct snd_pci_quirk ad1884a_cfg_tbl[] = {
3862 SND_PCI_QUIRK(0x103c, 0x3030, "HP", AD1884A_MOBILE), 3862 SND_PCI_QUIRK(0x103c, 0x3030, "HP", AD1884A_MOBILE),
3863 SND_PCI_QUIRK(0x103c, 0x3056, "HP", AD1884A_MOBILE),
3864 SND_PCI_QUIRK(0x103c, 0x30e7, "HP EliteBook 8530p", AD1884A_LAPTOP),
3865 SND_PCI_QUIRK(0x103c, 0x3614, "HP 6730s", AD1884A_LAPTOP),
3863 SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X300", AD1884A_THINKPAD), 3866 SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X300", AD1884A_THINKPAD),
3864 {} 3867 {}
3865}; 3868};
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index 4eceab9bd109..a378c0145125 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -829,6 +829,7 @@ static void alc_sku_automute(struct hda_codec *codec)
829 spec->jack_present ? 0 : PIN_OUT); 829 spec->jack_present ? 0 : PIN_OUT);
830} 830}
831 831
832#if 0 /* it's broken in some acses -- temporarily disabled */
832static void alc_mic_automute(struct hda_codec *codec) 833static void alc_mic_automute(struct hda_codec *codec)
833{ 834{
834 struct alc_spec *spec = codec->spec; 835 struct alc_spec *spec = codec->spec;
@@ -849,6 +850,9 @@ static void alc_mic_automute(struct hda_codec *codec)
849 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, capsrc_idx_fmic, 850 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, capsrc_idx_fmic,
850 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 851 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
851} 852}
853#else
854#define alc_mic_automute(codec) /* NOP */
855#endif /* disabled */
852 856
853/* unsolicited event for HP jack sensing */ 857/* unsolicited event for HP jack sensing */
854static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res) 858static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res)
@@ -1058,12 +1062,14 @@ do_sku:
1058 AC_VERB_SET_UNSOLICITED_ENABLE, 1062 AC_VERB_SET_UNSOLICITED_ENABLE,
1059 AC_USRSP_EN | ALC880_HP_EVENT); 1063 AC_USRSP_EN | ALC880_HP_EVENT);
1060 1064
1065#if 0 /* it's broken in some acses -- temporarily disabled */
1061 if (spec->autocfg.input_pins[AUTO_PIN_MIC] && 1066 if (spec->autocfg.input_pins[AUTO_PIN_MIC] &&
1062 spec->autocfg.input_pins[AUTO_PIN_FRONT_MIC]) 1067 spec->autocfg.input_pins[AUTO_PIN_FRONT_MIC])
1063 snd_hda_codec_write(codec, 1068 snd_hda_codec_write(codec,
1064 spec->autocfg.input_pins[AUTO_PIN_MIC], 0, 1069 spec->autocfg.input_pins[AUTO_PIN_MIC], 0,
1065 AC_VERB_SET_UNSOLICITED_ENABLE, 1070 AC_VERB_SET_UNSOLICITED_ENABLE,
1066 AC_USRSP_EN | ALC880_MIC_EVENT); 1071 AC_USRSP_EN | ALC880_MIC_EVENT);
1072#endif /* disabled */
1067 1073
1068 spec->unsol_event = alc_sku_unsol_event; 1074 spec->unsol_event = alc_sku_unsol_event;
1069} 1075}
@@ -8408,6 +8414,7 @@ static const char *alc883_models[ALC883_MODEL_LAST] = {
8408static struct snd_pci_quirk alc883_cfg_tbl[] = { 8414static struct snd_pci_quirk alc883_cfg_tbl[] = {
8409 SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC883_3ST_6ch_DIG), 8415 SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC883_3ST_6ch_DIG),
8410 SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE), 8416 SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE),
8417 SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_ACER_ASPIRE),
8411 SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE), 8418 SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE),
8412 SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE), 8419 SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE),
8413 SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_ACER_ASPIRE), 8420 SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_ACER_ASPIRE),
@@ -8462,6 +8469,7 @@ static struct snd_pci_quirk alc883_cfg_tbl[] = {
8462 SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763), 8469 SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763),
8463 SND_PCI_QUIRK(0x17aa, 0x101d, "Lenovo Sky", ALC888_LENOVO_SKY), 8470 SND_PCI_QUIRK(0x17aa, 0x101d, "Lenovo Sky", ALC888_LENOVO_SKY),
8464 SND_PCI_QUIRK(0x17c0, 0x4071, "MEDION MD2", ALC883_MEDION_MD2), 8471 SND_PCI_QUIRK(0x17c0, 0x4071, "MEDION MD2", ALC883_MEDION_MD2),
8472 SND_PCI_QUIRK(0x17c0, 0x4085, "MEDION MD96630", ALC888_LENOVO_MS7195_DIG),
8465 SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG), 8473 SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG),
8466 SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66), 8474 SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66),
8467 SND_PCI_QUIRK(0x8086, 0x0001, "DG33BUC", ALC883_3ST_6ch_INTEL), 8475 SND_PCI_QUIRK(0x8086, 0x0001, "DG33BUC", ALC883_3ST_6ch_INTEL),
@@ -12238,8 +12246,26 @@ static int alc269_auto_create_multi_out_ctls(struct alc_spec *spec,
12238 return 0; 12246 return 0;
12239} 12247}
12240 12248
12241#define alc269_auto_create_analog_input_ctls \ 12249static int alc269_auto_create_analog_input_ctls(struct alc_spec *spec,
12242 alc880_auto_create_analog_input_ctls 12250 const struct auto_pin_cfg *cfg)
12251{
12252 int err;
12253
12254 err = alc880_auto_create_analog_input_ctls(spec, cfg);
12255 if (err < 0)
12256 return err;
12257 /* digital-mic input pin is excluded in alc880_auto_create..()
12258 * because it's under 0x18
12259 */
12260 if (cfg->input_pins[AUTO_PIN_MIC] == 0x12 ||
12261 cfg->input_pins[AUTO_PIN_FRONT_MIC] == 0x12) {
12262 struct hda_input_mux *imux = &spec->private_imux;
12263 imux->items[imux->num_items].label = "Int Mic";
12264 imux->items[imux->num_items].index = 0x05;
12265 imux->num_items++;
12266 }
12267 return 0;
12268}
12243 12269
12244#ifdef CONFIG_SND_HDA_POWER_SAVE 12270#ifdef CONFIG_SND_HDA_POWER_SAVE
12245#define alc269_loopbacks alc880_loopbacks 12271#define alc269_loopbacks alc880_loopbacks
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c
index 788fdc6f3264..5dd3e89f620a 100644
--- a/sound/pci/hda/patch_sigmatel.c
+++ b/sound/pci/hda/patch_sigmatel.c
@@ -36,9 +36,11 @@
36#include "hda_beep.h" 36#include "hda_beep.h"
37 37
38#define NUM_CONTROL_ALLOC 32 38#define NUM_CONTROL_ALLOC 32
39
40#define STAC_VREF_EVENT 0x00
41#define STAC_INSERT_EVENT 0x10
39#define STAC_PWR_EVENT 0x20 42#define STAC_PWR_EVENT 0x20
40#define STAC_HP_EVENT 0x30 43#define STAC_HP_EVENT 0x30
41#define STAC_VREF_EVENT 0x40
42 44
43enum { 45enum {
44 STAC_REF, 46 STAC_REF,
@@ -68,7 +70,10 @@ enum {
68 70
69enum { 71enum {
70 STAC_92HD73XX_REF, 72 STAC_92HD73XX_REF,
71 STAC_DELL_M6, 73 STAC_DELL_M6_AMIC,
74 STAC_DELL_M6_DMIC,
75 STAC_DELL_M6_BOTH,
76 STAC_DELL_EQ,
72 STAC_92HD73XX_MODELS 77 STAC_92HD73XX_MODELS
73}; 78};
74 79
@@ -81,6 +86,7 @@ enum {
81 STAC_92HD71BXX_REF, 86 STAC_92HD71BXX_REF,
82 STAC_DELL_M4_1, 87 STAC_DELL_M4_1,
83 STAC_DELL_M4_2, 88 STAC_DELL_M4_2,
89 STAC_DELL_M4_3,
84 STAC_HP_M4, 90 STAC_HP_M4,
85 STAC_92HD71BXX_MODELS 91 STAC_92HD71BXX_MODELS
86}; 92};
@@ -134,6 +140,7 @@ struct sigmatel_spec {
134 unsigned int num_mixers; 140 unsigned int num_mixers;
135 141
136 int board_config; 142 int board_config;
143 unsigned int eapd_switch: 1;
137 unsigned int surr_switch: 1; 144 unsigned int surr_switch: 1;
138 unsigned int line_switch: 1; 145 unsigned int line_switch: 1;
139 unsigned int mic_switch: 1; 146 unsigned int mic_switch: 1;
@@ -211,7 +218,7 @@ struct sigmatel_spec {
211 /* i/o switches */ 218 /* i/o switches */
212 unsigned int io_switch[2]; 219 unsigned int io_switch[2];
213 unsigned int clfe_swap; 220 unsigned int clfe_swap;
214 unsigned int hp_switch; 221 unsigned int hp_switch; /* NID of HP as line-out */
215 unsigned int aloopback; 222 unsigned int aloopback;
216 223
217 struct hda_pcm pcm_rec[2]; /* PCM information */ 224 struct hda_pcm pcm_rec[2]; /* PCM information */
@@ -566,10 +573,8 @@ static int stac92xx_smux_enum_put(struct snd_kcontrol *kcontrol,
566 nid = codec->slave_dig_outs[smux_idx - 1]; 573 nid = codec->slave_dig_outs[smux_idx - 1];
567 if (spec->cur_smux[smux_idx] == smux->num_items - 1) 574 if (spec->cur_smux[smux_idx] == smux->num_items - 1)
568 val = AMP_OUT_MUTE; 575 val = AMP_OUT_MUTE;
569 if (smux_idx == 0)
570 nid = spec->multiout.dig_out_nid;
571 else 576 else
572 nid = codec->slave_dig_outs[smux_idx - 1]; 577 val = AMP_OUT_UNMUTE;
573 /* un/mute SPDIF out */ 578 /* un/mute SPDIF out */
574 snd_hda_codec_write_cache(codec, nid, 0, 579 snd_hda_codec_write_cache(codec, nid, 0,
575 AC_VERB_SET_AMP_GAIN_MUTE, val); 580 AC_VERB_SET_AMP_GAIN_MUTE, val);
@@ -775,9 +780,7 @@ static struct hda_verb dell_eq_core_init[] = {
775}; 780};
776 781
777static struct hda_verb dell_m6_core_init[] = { 782static struct hda_verb dell_m6_core_init[] = {
778 /* set master volume to max value without distortion 783 { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
779 * and direct control */
780 { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xec},
781 /* setup audio connections */ 784 /* setup audio connections */
782 { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00}, 785 { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00},
783 { 0x0a, AC_VERB_SET_CONNECT_SEL, 0x01}, 786 { 0x0a, AC_VERB_SET_CONNECT_SEL, 0x01},
@@ -1601,12 +1604,18 @@ static unsigned int dell_m6_pin_configs[13] = {
1601 1604
1602static unsigned int *stac92hd73xx_brd_tbl[STAC_92HD73XX_MODELS] = { 1605static unsigned int *stac92hd73xx_brd_tbl[STAC_92HD73XX_MODELS] = {
1603 [STAC_92HD73XX_REF] = ref92hd73xx_pin_configs, 1606 [STAC_92HD73XX_REF] = ref92hd73xx_pin_configs,
1604 [STAC_DELL_M6] = dell_m6_pin_configs, 1607 [STAC_DELL_M6_AMIC] = dell_m6_pin_configs,
1608 [STAC_DELL_M6_DMIC] = dell_m6_pin_configs,
1609 [STAC_DELL_M6_BOTH] = dell_m6_pin_configs,
1610 [STAC_DELL_EQ] = dell_m6_pin_configs,
1605}; 1611};
1606 1612
1607static const char *stac92hd73xx_models[STAC_92HD73XX_MODELS] = { 1613static const char *stac92hd73xx_models[STAC_92HD73XX_MODELS] = {
1608 [STAC_92HD73XX_REF] = "ref", 1614 [STAC_92HD73XX_REF] = "ref",
1609 [STAC_DELL_M6] = "dell-m6", 1615 [STAC_DELL_M6_AMIC] = "dell-m6-amic",
1616 [STAC_DELL_M6_DMIC] = "dell-m6-dmic",
1617 [STAC_DELL_M6_BOTH] = "dell-m6",
1618 [STAC_DELL_EQ] = "dell-eq",
1610}; 1619};
1611 1620
1612static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = { 1621static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = {
@@ -1614,19 +1623,23 @@ static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = {
1614 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, 1623 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1615 "DFI LanParty", STAC_92HD73XX_REF), 1624 "DFI LanParty", STAC_92HD73XX_REF),
1616 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0254, 1625 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0254,
1617 "unknown Dell", STAC_DELL_M6), 1626 "Dell Studio 1535", STAC_DELL_M6_DMIC),
1618 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0255, 1627 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0255,
1619 "unknown Dell", STAC_DELL_M6), 1628 "unknown Dell", STAC_DELL_M6_DMIC),
1620 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0256, 1629 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0256,
1621 "unknown Dell", STAC_DELL_M6), 1630 "unknown Dell", STAC_DELL_M6_BOTH),
1622 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0257, 1631 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0257,
1623 "unknown Dell", STAC_DELL_M6), 1632 "unknown Dell", STAC_DELL_M6_BOTH),
1624 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x025e, 1633 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x025e,
1625 "unknown Dell", STAC_DELL_M6), 1634 "unknown Dell", STAC_DELL_M6_AMIC),
1626 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x025f, 1635 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x025f,
1627 "unknown Dell", STAC_DELL_M6), 1636 "unknown Dell", STAC_DELL_M6_AMIC),
1628 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0271, 1637 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0271,
1629 "unknown Dell", STAC_DELL_M6), 1638 "unknown Dell", STAC_DELL_M6_DMIC),
1639 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0272,
1640 "unknown Dell", STAC_DELL_M6_DMIC),
1641 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x029f,
1642 "Dell Studio 1537", STAC_DELL_M6_DMIC),
1630 {} /* terminator */ 1643 {} /* terminator */
1631}; 1644};
1632 1645
@@ -1669,10 +1682,17 @@ static unsigned int dell_m4_2_pin_configs[11] = {
1669 0x40f000f0, 0x044413b0, 0x044413b0, 1682 0x40f000f0, 0x044413b0, 0x044413b0,
1670}; 1683};
1671 1684
1685static unsigned int dell_m4_3_pin_configs[11] = {
1686 0x0421101f, 0x04a11221, 0x90a70330, 0x90170110,
1687 0x40f000f0, 0x40f000f0, 0x40f000f0, 0x90a000f0,
1688 0x40f000f0, 0x044413b0, 0x044413b0,
1689};
1690
1672static unsigned int *stac92hd71bxx_brd_tbl[STAC_92HD71BXX_MODELS] = { 1691static unsigned int *stac92hd71bxx_brd_tbl[STAC_92HD71BXX_MODELS] = {
1673 [STAC_92HD71BXX_REF] = ref92hd71bxx_pin_configs, 1692 [STAC_92HD71BXX_REF] = ref92hd71bxx_pin_configs,
1674 [STAC_DELL_M4_1] = dell_m4_1_pin_configs, 1693 [STAC_DELL_M4_1] = dell_m4_1_pin_configs,
1675 [STAC_DELL_M4_2] = dell_m4_2_pin_configs, 1694 [STAC_DELL_M4_2] = dell_m4_2_pin_configs,
1695 [STAC_DELL_M4_3] = dell_m4_3_pin_configs,
1676 [STAC_HP_M4] = NULL, 1696 [STAC_HP_M4] = NULL,
1677}; 1697};
1678 1698
@@ -1680,6 +1700,7 @@ static const char *stac92hd71bxx_models[STAC_92HD71BXX_MODELS] = {
1680 [STAC_92HD71BXX_REF] = "ref", 1700 [STAC_92HD71BXX_REF] = "ref",
1681 [STAC_DELL_M4_1] = "dell-m4-1", 1701 [STAC_DELL_M4_1] = "dell-m4-1",
1682 [STAC_DELL_M4_2] = "dell-m4-2", 1702 [STAC_DELL_M4_2] = "dell-m4-2",
1703 [STAC_DELL_M4_3] = "dell-m4-3",
1683 [STAC_HP_M4] = "hp-m4", 1704 [STAC_HP_M4] = "hp-m4",
1684}; 1705};
1685 1706
@@ -1687,6 +1708,10 @@ static struct snd_pci_quirk stac92hd71bxx_cfg_tbl[] = {
1687 /* SigmaTel reference board */ 1708 /* SigmaTel reference board */
1688 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, 1709 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1689 "DFI LanParty", STAC_92HD71BXX_REF), 1710 "DFI LanParty", STAC_92HD71BXX_REF),
1711 SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30f2,
1712 "HP dv5", STAC_HP_M4),
1713 SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30f4,
1714 "HP dv7", STAC_HP_M4),
1690 SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361a, 1715 SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361a,
1691 "unknown HP", STAC_HP_M4), 1716 "unknown HP", STAC_HP_M4),
1692 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0233, 1717 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0233,
@@ -1711,6 +1736,8 @@ static struct snd_pci_quirk stac92hd71bxx_cfg_tbl[] = {
1711 "unknown Dell", STAC_DELL_M4_2), 1736 "unknown Dell", STAC_DELL_M4_2),
1712 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0264, 1737 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0264,
1713 "unknown Dell", STAC_DELL_M4_2), 1738 "unknown Dell", STAC_DELL_M4_2),
1739 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02aa,
1740 "unknown Dell", STAC_DELL_M4_3),
1714 {} /* terminator */ 1741 {} /* terminator */
1715}; 1742};
1716 1743
@@ -2444,7 +2471,7 @@ static int stac92xx_hp_switch_get(struct snd_kcontrol *kcontrol,
2444 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 2471 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2445 struct sigmatel_spec *spec = codec->spec; 2472 struct sigmatel_spec *spec = codec->spec;
2446 2473
2447 ucontrol->value.integer.value[0] = spec->hp_switch; 2474 ucontrol->value.integer.value[0] = !!spec->hp_switch;
2448 return 0; 2475 return 0;
2449} 2476}
2450 2477
@@ -2453,8 +2480,9 @@ static int stac92xx_hp_switch_put(struct snd_kcontrol *kcontrol,
2453{ 2480{
2454 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 2481 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2455 struct sigmatel_spec *spec = codec->spec; 2482 struct sigmatel_spec *spec = codec->spec;
2456 2483 int nid = kcontrol->private_value;
2457 spec->hp_switch = ucontrol->value.integer.value[0]; 2484
2485 spec->hp_switch = ucontrol->value.integer.value[0] ? nid : 0;
2458 2486
2459 /* check to be sure that the ports are upto date with 2487 /* check to be sure that the ports are upto date with
2460 * switch changes 2488 * switch changes
@@ -2587,8 +2615,10 @@ static struct snd_kcontrol_new stac92xx_control_templates[] = {
2587}; 2615};
2588 2616
2589/* add dynamic controls */ 2617/* add dynamic controls */
2590static int stac92xx_add_control_idx(struct sigmatel_spec *spec, int type, 2618static int stac92xx_add_control_temp(struct sigmatel_spec *spec,
2591 int idx, const char *name, unsigned long val) 2619 struct snd_kcontrol_new *ktemp,
2620 int idx, const char *name,
2621 unsigned long val)
2592{ 2622{
2593 struct snd_kcontrol_new *knew; 2623 struct snd_kcontrol_new *knew;
2594 2624
@@ -2607,20 +2637,29 @@ static int stac92xx_add_control_idx(struct sigmatel_spec *spec, int type,
2607 } 2637 }
2608 2638
2609 knew = &spec->kctl_alloc[spec->num_kctl_used]; 2639 knew = &spec->kctl_alloc[spec->num_kctl_used];
2610 *knew = stac92xx_control_templates[type]; 2640 *knew = *ktemp;
2611 knew->index = idx; 2641 knew->index = idx;
2612 knew->name = kstrdup(name, GFP_KERNEL); 2642 knew->name = kstrdup(name, GFP_KERNEL);
2613 if (! knew->name) 2643 if (!knew->name)
2614 return -ENOMEM; 2644 return -ENOMEM;
2615 knew->private_value = val; 2645 knew->private_value = val;
2616 spec->num_kctl_used++; 2646 spec->num_kctl_used++;
2617 return 0; 2647 return 0;
2618} 2648}
2619 2649
2650static inline int stac92xx_add_control_idx(struct sigmatel_spec *spec,
2651 int type, int idx, const char *name,
2652 unsigned long val)
2653{
2654 return stac92xx_add_control_temp(spec,
2655 &stac92xx_control_templates[type],
2656 idx, name, val);
2657}
2658
2620 2659
2621/* add dynamic controls */ 2660/* add dynamic controls */
2622static int stac92xx_add_control(struct sigmatel_spec *spec, int type, 2661static inline int stac92xx_add_control(struct sigmatel_spec *spec, int type,
2623 const char *name, unsigned long val) 2662 const char *name, unsigned long val)
2624{ 2663{
2625 return stac92xx_add_control_idx(spec, type, 0, name, val); 2664 return stac92xx_add_control_idx(spec, type, 0, name, val);
2626} 2665}
@@ -2860,10 +2899,11 @@ static int stac92xx_auto_create_multi_out_ctls(struct hda_codec *codec,
2860 cfg->hp_outs && !spec->multiout.hp_nid) 2899 cfg->hp_outs && !spec->multiout.hp_nid)
2861 spec->multiout.hp_nid = nid; 2900 spec->multiout.hp_nid = nid;
2862 2901
2863 if (cfg->hp_outs > 1) { 2902 if (cfg->hp_outs > 1 && cfg->line_out_type == AUTO_PIN_LINE_OUT) {
2864 err = stac92xx_add_control(spec, 2903 err = stac92xx_add_control(spec,
2865 STAC_CTL_WIDGET_HP_SWITCH, 2904 STAC_CTL_WIDGET_HP_SWITCH,
2866 "Headphone as Line Out Switch", 0); 2905 "Headphone as Line Out Switch",
2906 cfg->hp_pins[cfg->hp_outs - 1]);
2867 if (err < 0) 2907 if (err < 0)
2868 return err; 2908 return err;
2869 } 2909 }
@@ -3061,6 +3101,43 @@ static int stac92xx_auto_create_beep_ctls(struct hda_codec *codec,
3061 return 0; 3101 return 0;
3062} 3102}
3063 3103
3104#ifdef CONFIG_SND_HDA_INPUT_BEEP
3105#define stac92xx_dig_beep_switch_info snd_ctl_boolean_mono_info
3106
3107static int stac92xx_dig_beep_switch_get(struct snd_kcontrol *kcontrol,
3108 struct snd_ctl_elem_value *ucontrol)
3109{
3110 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3111 ucontrol->value.integer.value[0] = codec->beep->enabled;
3112 return 0;
3113}
3114
3115static int stac92xx_dig_beep_switch_put(struct snd_kcontrol *kcontrol,
3116 struct snd_ctl_elem_value *ucontrol)
3117{
3118 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3119 int enabled = !!ucontrol->value.integer.value[0];
3120 if (codec->beep->enabled != enabled) {
3121 codec->beep->enabled = enabled;
3122 return 1;
3123 }
3124 return 0;
3125}
3126
3127static struct snd_kcontrol_new stac92xx_dig_beep_ctrl = {
3128 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3129 .info = stac92xx_dig_beep_switch_info,
3130 .get = stac92xx_dig_beep_switch_get,
3131 .put = stac92xx_dig_beep_switch_put,
3132};
3133
3134static int stac92xx_beep_switch_ctl(struct hda_codec *codec)
3135{
3136 return stac92xx_add_control_temp(codec->spec, &stac92xx_dig_beep_ctrl,
3137 0, "PC Beep Playback Switch", 0);
3138}
3139#endif
3140
3064static int stac92xx_auto_create_mux_input_ctls(struct hda_codec *codec) 3141static int stac92xx_auto_create_mux_input_ctls(struct hda_codec *codec)
3065{ 3142{
3066 struct sigmatel_spec *spec = codec->spec; 3143 struct sigmatel_spec *spec = codec->spec;
@@ -3367,6 +3444,7 @@ static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out
3367#ifdef CONFIG_SND_HDA_INPUT_BEEP 3444#ifdef CONFIG_SND_HDA_INPUT_BEEP
3368 if (spec->digbeep_nid > 0) { 3445 if (spec->digbeep_nid > 0) {
3369 hda_nid_t nid = spec->digbeep_nid; 3446 hda_nid_t nid = spec->digbeep_nid;
3447 unsigned int caps;
3370 3448
3371 err = stac92xx_auto_create_beep_ctls(codec, nid); 3449 err = stac92xx_auto_create_beep_ctls(codec, nid);
3372 if (err < 0) 3450 if (err < 0)
@@ -3374,6 +3452,14 @@ static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out
3374 err = snd_hda_attach_beep_device(codec, nid); 3452 err = snd_hda_attach_beep_device(codec, nid);
3375 if (err < 0) 3453 if (err < 0)
3376 return err; 3454 return err;
3455 /* if no beep switch is available, make its own one */
3456 caps = query_amp_caps(codec, nid, HDA_OUTPUT);
3457 if (codec->beep &&
3458 !((caps & AC_AMPCAP_MUTE) >> AC_AMPCAP_MUTE_SHIFT)) {
3459 err = stac92xx_beep_switch_ctl(codec);
3460 if (err < 0)
3461 return err;
3462 }
3377 } 3463 }
3378#endif 3464#endif
3379 3465
@@ -3531,6 +3617,12 @@ static int stac9200_parse_auto_config(struct hda_codec *codec)
3531 if ((err = stac9200_auto_create_lfe_ctls(codec, &spec->autocfg)) < 0) 3617 if ((err = stac9200_auto_create_lfe_ctls(codec, &spec->autocfg)) < 0)
3532 return err; 3618 return err;
3533 3619
3620 if (spec->num_muxes > 0) {
3621 err = stac92xx_auto_create_mux_input_ctls(codec);
3622 if (err < 0)
3623 return err;
3624 }
3625
3534 if (spec->autocfg.dig_out_pin) 3626 if (spec->autocfg.dig_out_pin)
3535 spec->multiout.dig_out_nid = 0x05; 3627 spec->multiout.dig_out_nid = 0x05;
3536 if (spec->autocfg.dig_in_pin) 3628 if (spec->autocfg.dig_in_pin)
@@ -3613,10 +3705,14 @@ static void stac92xx_power_down(struct hda_codec *codec)
3613 AC_VERB_SET_POWER_STATE, AC_PWRST_D3); 3705 AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
3614} 3706}
3615 3707
3708static void stac_toggle_power_map(struct hda_codec *codec, hda_nid_t nid,
3709 int enable);
3710
3616static int stac92xx_init(struct hda_codec *codec) 3711static int stac92xx_init(struct hda_codec *codec)
3617{ 3712{
3618 struct sigmatel_spec *spec = codec->spec; 3713 struct sigmatel_spec *spec = codec->spec;
3619 struct auto_pin_cfg *cfg = &spec->autocfg; 3714 struct auto_pin_cfg *cfg = &spec->autocfg;
3715 unsigned int gpio;
3620 int i; 3716 int i;
3621 3717
3622 snd_hda_sequence_write(codec, spec->init); 3718 snd_hda_sequence_write(codec, spec->init);
@@ -3627,6 +3723,16 @@ static int stac92xx_init(struct hda_codec *codec)
3627 snd_hda_codec_write_cache(codec, 3723 snd_hda_codec_write_cache(codec,
3628 spec->adc_nids[i], 0, 3724 spec->adc_nids[i], 0,
3629 AC_VERB_SET_POWER_STATE, AC_PWRST_D3); 3725 AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
3726
3727 /* set up GPIO */
3728 gpio = spec->gpio_data;
3729 /* turn on EAPD statically when spec->eapd_switch isn't set.
3730 * otherwise, unsol event will turn it on/off dynamically
3731 */
3732 if (!spec->eapd_switch)
3733 gpio |= spec->eapd_mask;
3734 stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir, gpio);
3735
3630 /* set up pins */ 3736 /* set up pins */
3631 if (spec->hp_detect) { 3737 if (spec->hp_detect) {
3632 /* Enable unsolicited responses on the HP widget */ 3738 /* Enable unsolicited responses on the HP widget */
@@ -3648,53 +3754,61 @@ static int stac92xx_init(struct hda_codec *codec)
3648 for (i = 0; i < AUTO_PIN_LAST; i++) { 3754 for (i = 0; i < AUTO_PIN_LAST; i++) {
3649 hda_nid_t nid = cfg->input_pins[i]; 3755 hda_nid_t nid = cfg->input_pins[i];
3650 if (nid) { 3756 if (nid) {
3651 unsigned int pinctl = snd_hda_codec_read(codec, nid, 3757 unsigned int pinctl;
3652 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0); 3758 if (i == AUTO_PIN_MIC || i == AUTO_PIN_FRONT_MIC) {
3653 /* if PINCTL already set then skip */ 3759 /* for mic pins, force to initialize */
3654 if (pinctl & AC_PINCAP_IN) 3760 pinctl = stac92xx_get_vref(codec, nid);
3655 continue; 3761 } else {
3656 pinctl = AC_PINCTL_IN_EN; 3762 pinctl = snd_hda_codec_read(codec, nid, 0,
3657 if (i == AUTO_PIN_MIC || i == AUTO_PIN_FRONT_MIC) 3763 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3658 pinctl |= stac92xx_get_vref(codec, nid); 3764 /* if PINCTL already set then skip */
3765 if (pinctl & AC_PINCTL_IN_EN)
3766 continue;
3767 }
3768 pinctl |= AC_PINCTL_IN_EN;
3659 stac92xx_auto_set_pinctl(codec, nid, pinctl); 3769 stac92xx_auto_set_pinctl(codec, nid, pinctl);
3660 } 3770 }
3661 } 3771 }
3662 for (i = 0; i < spec->num_dmics; i++) 3772 for (i = 0; i < spec->num_dmics; i++)
3663 stac92xx_auto_set_pinctl(codec, spec->dmic_nids[i], 3773 stac92xx_auto_set_pinctl(codec, spec->dmic_nids[i],
3664 AC_PINCTL_IN_EN); 3774 AC_PINCTL_IN_EN);
3775 if (cfg->dig_out_pin)
3776 stac92xx_auto_set_pinctl(codec, cfg->dig_out_pin,
3777 AC_PINCTL_OUT_EN);
3778 if (cfg->dig_in_pin)
3779 stac92xx_auto_set_pinctl(codec, cfg->dig_in_pin,
3780 AC_PINCTL_IN_EN);
3665 for (i = 0; i < spec->num_pwrs; i++) { 3781 for (i = 0; i < spec->num_pwrs; i++) {
3666 int event = is_nid_hp_pin(cfg, spec->pwr_nids[i]) 3782 hda_nid_t nid = spec->pwr_nids[i];
3667 ? STAC_HP_EVENT : STAC_PWR_EVENT; 3783 int pinctl, def_conf;
3668 int pinctl = snd_hda_codec_read(codec, spec->pwr_nids[i], 3784 int event = STAC_PWR_EVENT;
3669 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0); 3785
3670 int def_conf = snd_hda_codec_read(codec, spec->pwr_nids[i], 3786 if (is_nid_hp_pin(cfg, nid) && spec->hp_detect)
3671 0, AC_VERB_GET_CONFIG_DEFAULT, 0); 3787 continue; /* already has an unsol event */
3672 def_conf = get_defcfg_connect(def_conf); 3788
3789 pinctl = snd_hda_codec_read(codec, nid, 0,
3790 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3673 /* outputs are only ports capable of power management 3791 /* outputs are only ports capable of power management
3674 * any attempts on powering down a input port cause the 3792 * any attempts on powering down a input port cause the
3675 * referenced VREF to act quirky. 3793 * referenced VREF to act quirky.
3676 */ 3794 */
3677 if (pinctl & AC_PINCTL_IN_EN) 3795 if (pinctl & AC_PINCTL_IN_EN)
3678 continue; 3796 continue;
3797 def_conf = snd_hda_codec_read(codec, nid, 0,
3798 AC_VERB_GET_CONFIG_DEFAULT, 0);
3799 def_conf = get_defcfg_connect(def_conf);
3679 /* skip any ports that don't have jacks since presence 3800 /* skip any ports that don't have jacks since presence
3680 * detection is useless */ 3801 * detection is useless */
3681 if (def_conf && def_conf != AC_JACK_PORT_FIXED) 3802 if (def_conf != AC_JACK_PORT_COMPLEX) {
3803 if (def_conf != AC_JACK_PORT_NONE)
3804 stac_toggle_power_map(codec, nid, 1);
3682 continue; 3805 continue;
3806 }
3683 enable_pin_detect(codec, spec->pwr_nids[i], event | i); 3807 enable_pin_detect(codec, spec->pwr_nids[i], event | i);
3684 codec->patch_ops.unsol_event(codec, (event | i) << 26); 3808 codec->patch_ops.unsol_event(codec, (event | i) << 26);
3685 } 3809 }
3686 if (spec->dac_list) 3810 if (spec->dac_list)
3687 stac92xx_power_down(codec); 3811 stac92xx_power_down(codec);
3688 if (cfg->dig_out_pin)
3689 stac92xx_auto_set_pinctl(codec, cfg->dig_out_pin,
3690 AC_PINCTL_OUT_EN);
3691 if (cfg->dig_in_pin)
3692 stac92xx_auto_set_pinctl(codec, cfg->dig_in_pin,
3693 AC_PINCTL_IN_EN);
3694
3695 stac_gpio_set(codec, spec->gpio_mask,
3696 spec->gpio_dir, spec->gpio_data);
3697
3698 return 0; 3812 return 0;
3699} 3813}
3700 3814
@@ -3777,11 +3891,30 @@ static int get_hp_pin_presence(struct hda_codec *codec, hda_nid_t nid)
3777 return 0; 3891 return 0;
3778} 3892}
3779 3893
3894/* return non-zero if the hp-pin of the given array index isn't
3895 * a jack-detection target
3896 */
3897static int no_hp_sensing(struct sigmatel_spec *spec, int i)
3898{
3899 struct auto_pin_cfg *cfg = &spec->autocfg;
3900
3901 /* ignore sensing of shared line and mic jacks */
3902 if (spec->line_switch &&
3903 cfg->hp_pins[i] == cfg->input_pins[AUTO_PIN_LINE])
3904 return 1;
3905 if (spec->mic_switch &&
3906 cfg->hp_pins[i] == cfg->input_pins[AUTO_PIN_MIC])
3907 return 1;
3908 /* ignore if the pin is set as line-out */
3909 if (cfg->hp_pins[i] == spec->hp_switch)
3910 return 1;
3911 return 0;
3912}
3913
3780static void stac92xx_hp_detect(struct hda_codec *codec, unsigned int res) 3914static void stac92xx_hp_detect(struct hda_codec *codec, unsigned int res)
3781{ 3915{
3782 struct sigmatel_spec *spec = codec->spec; 3916 struct sigmatel_spec *spec = codec->spec;
3783 struct auto_pin_cfg *cfg = &spec->autocfg; 3917 struct auto_pin_cfg *cfg = &spec->autocfg;
3784 int nid = cfg->hp_pins[cfg->hp_outs - 1];
3785 int i, presence; 3918 int i, presence;
3786 3919
3787 presence = 0; 3920 presence = 0;
@@ -3792,52 +3925,66 @@ static void stac92xx_hp_detect(struct hda_codec *codec, unsigned int res)
3792 for (i = 0; i < cfg->hp_outs; i++) { 3925 for (i = 0; i < cfg->hp_outs; i++) {
3793 if (presence) 3926 if (presence)
3794 break; 3927 break;
3795 if (spec->hp_switch && cfg->hp_pins[i] == nid) 3928 if (no_hp_sensing(spec, i))
3796 break; 3929 continue;
3797 presence = get_hp_pin_presence(codec, cfg->hp_pins[i]); 3930 presence = get_hp_pin_presence(codec, cfg->hp_pins[i]);
3798 } 3931 }
3799 3932
3800 if (presence) { 3933 if (presence) {
3801 /* disable lineouts, enable hp */ 3934 /* disable lineouts */
3802 if (spec->hp_switch) 3935 if (spec->hp_switch)
3803 stac92xx_reset_pinctl(codec, nid, AC_PINCTL_OUT_EN); 3936 stac92xx_reset_pinctl(codec, spec->hp_switch,
3937 AC_PINCTL_OUT_EN);
3804 for (i = 0; i < cfg->line_outs; i++) 3938 for (i = 0; i < cfg->line_outs; i++)
3805 stac92xx_reset_pinctl(codec, cfg->line_out_pins[i], 3939 stac92xx_reset_pinctl(codec, cfg->line_out_pins[i],
3806 AC_PINCTL_OUT_EN); 3940 AC_PINCTL_OUT_EN);
3807 for (i = 0; i < cfg->speaker_outs; i++) 3941 for (i = 0; i < cfg->speaker_outs; i++)
3808 stac92xx_reset_pinctl(codec, cfg->speaker_pins[i], 3942 stac92xx_reset_pinctl(codec, cfg->speaker_pins[i],
3809 AC_PINCTL_OUT_EN); 3943 AC_PINCTL_OUT_EN);
3810 if (spec->eapd_mask) 3944 if (spec->eapd_mask && spec->eapd_switch)
3811 stac_gpio_set(codec, spec->gpio_mask, 3945 stac_gpio_set(codec, spec->gpio_mask,
3812 spec->gpio_dir, spec->gpio_data & 3946 spec->gpio_dir, spec->gpio_data &
3813 ~spec->eapd_mask); 3947 ~spec->eapd_mask);
3814 } else { 3948 } else {
3815 /* enable lineouts, disable hp */ 3949 /* enable lineouts */
3816 if (spec->hp_switch) 3950 if (spec->hp_switch)
3817 stac92xx_set_pinctl(codec, nid, AC_PINCTL_OUT_EN); 3951 stac92xx_set_pinctl(codec, spec->hp_switch,
3952 AC_PINCTL_OUT_EN);
3818 for (i = 0; i < cfg->line_outs; i++) 3953 for (i = 0; i < cfg->line_outs; i++)
3819 stac92xx_set_pinctl(codec, cfg->line_out_pins[i], 3954 stac92xx_set_pinctl(codec, cfg->line_out_pins[i],
3820 AC_PINCTL_OUT_EN); 3955 AC_PINCTL_OUT_EN);
3821 for (i = 0; i < cfg->speaker_outs; i++) 3956 for (i = 0; i < cfg->speaker_outs; i++)
3822 stac92xx_set_pinctl(codec, cfg->speaker_pins[i], 3957 stac92xx_set_pinctl(codec, cfg->speaker_pins[i],
3823 AC_PINCTL_OUT_EN); 3958 AC_PINCTL_OUT_EN);
3824 if (spec->eapd_mask) 3959 if (spec->eapd_mask && spec->eapd_switch)
3825 stac_gpio_set(codec, spec->gpio_mask, 3960 stac_gpio_set(codec, spec->gpio_mask,
3826 spec->gpio_dir, spec->gpio_data | 3961 spec->gpio_dir, spec->gpio_data |
3827 spec->eapd_mask); 3962 spec->eapd_mask);
3828 } 3963 }
3829 if (!spec->hp_switch && cfg->hp_outs > 1 && presence) 3964 /* toggle hp outs */
3830 stac92xx_set_pinctl(codec, nid, AC_PINCTL_OUT_EN); 3965 for (i = 0; i < cfg->hp_outs; i++) {
3966 unsigned int val = AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN;
3967 if (no_hp_sensing(spec, i))
3968 continue;
3969 if (presence)
3970 stac92xx_set_pinctl(codec, cfg->hp_pins[i], val);
3971 else
3972 stac92xx_reset_pinctl(codec, cfg->hp_pins[i], val);
3973 }
3831} 3974}
3832 3975
3833static void stac92xx_pin_sense(struct hda_codec *codec, int idx) 3976static void stac_toggle_power_map(struct hda_codec *codec, hda_nid_t nid,
3977 int enable)
3834{ 3978{
3835 struct sigmatel_spec *spec = codec->spec; 3979 struct sigmatel_spec *spec = codec->spec;
3836 hda_nid_t nid = spec->pwr_nids[idx]; 3980 unsigned int idx, val;
3837 int presence, val; 3981
3838 val = snd_hda_codec_read(codec, codec->afg, 0, 0x0fec, 0x0) 3982 for (idx = 0; idx < spec->num_pwrs; idx++) {
3839 & 0x000000ff; 3983 if (spec->pwr_nids[idx] == nid)
3840 presence = get_hp_pin_presence(codec, nid); 3984 break;
3985 }
3986 if (idx >= spec->num_pwrs)
3987 return;
3841 3988
3842 /* several codecs have two power down bits */ 3989 /* several codecs have two power down bits */
3843 if (spec->pwr_mapping) 3990 if (spec->pwr_mapping)
@@ -3845,14 +3992,20 @@ static void stac92xx_pin_sense(struct hda_codec *codec, int idx)
3845 else 3992 else
3846 idx = 1 << idx; 3993 idx = 1 << idx;
3847 3994
3848 if (presence) 3995 val = snd_hda_codec_read(codec, codec->afg, 0, 0x0fec, 0x0) & 0xff;
3996 if (enable)
3849 val &= ~idx; 3997 val &= ~idx;
3850 else 3998 else
3851 val |= idx; 3999 val |= idx;
3852 4000
3853 /* power down unused output ports */ 4001 /* power down unused output ports */
3854 snd_hda_codec_write(codec, codec->afg, 0, 0x7ec, val); 4002 snd_hda_codec_write(codec, codec->afg, 0, 0x7ec, val);
3855}; 4003}
4004
4005static void stac92xx_pin_sense(struct hda_codec *codec, hda_nid_t nid)
4006{
4007 stac_toggle_power_map(codec, nid, get_hp_pin_presence(codec, nid));
4008}
3856 4009
3857static void stac92xx_unsol_event(struct hda_codec *codec, unsigned int res) 4010static void stac92xx_unsol_event(struct hda_codec *codec, unsigned int res)
3858{ 4011{
@@ -4133,31 +4286,32 @@ again:
4133 sizeof(stac92hd73xx_dmux)); 4286 sizeof(stac92hd73xx_dmux));
4134 4287
4135 switch (spec->board_config) { 4288 switch (spec->board_config) {
4136 case STAC_DELL_M6: 4289 case STAC_DELL_EQ:
4137 spec->init = dell_eq_core_init; 4290 spec->init = dell_eq_core_init;
4291 /* fallthru */
4292 case STAC_DELL_M6_AMIC:
4293 case STAC_DELL_M6_DMIC:
4294 case STAC_DELL_M6_BOTH:
4138 spec->num_smuxes = 0; 4295 spec->num_smuxes = 0;
4139 spec->mixer = &stac92hd73xx_6ch_mixer[DELL_M6_MIXER]; 4296 spec->mixer = &stac92hd73xx_6ch_mixer[DELL_M6_MIXER];
4140 spec->amp_nids = &stac92hd73xx_amp_nids[DELL_M6_AMP]; 4297 spec->amp_nids = &stac92hd73xx_amp_nids[DELL_M6_AMP];
4298 spec->eapd_switch = 0;
4141 spec->num_amps = 1; 4299 spec->num_amps = 1;
4142 switch (codec->subsystem_id) { 4300
4143 case 0x1028025e: /* Analog Mics */ 4301 if (!spec->init)
4144 case 0x1028025f: 4302 spec->init = dell_m6_core_init;
4303 switch (spec->board_config) {
4304 case STAC_DELL_M6_AMIC: /* Analog Mics */
4145 stac92xx_set_config_reg(codec, 0x0b, 0x90A70170); 4305 stac92xx_set_config_reg(codec, 0x0b, 0x90A70170);
4146 spec->num_dmics = 0; 4306 spec->num_dmics = 0;
4147 spec->private_dimux.num_items = 1; 4307 spec->private_dimux.num_items = 1;
4148 break; 4308 break;
4149 case 0x10280271: /* Digital Mics */ 4309 case STAC_DELL_M6_DMIC: /* Digital Mics */
4150 case 0x10280272:
4151 spec->init = dell_m6_core_init;
4152 /* fall-through */
4153 case 0x10280254:
4154 case 0x10280255:
4155 stac92xx_set_config_reg(codec, 0x13, 0x90A60160); 4310 stac92xx_set_config_reg(codec, 0x13, 0x90A60160);
4156 spec->num_dmics = 1; 4311 spec->num_dmics = 1;
4157 spec->private_dimux.num_items = 2; 4312 spec->private_dimux.num_items = 2;
4158 break; 4313 break;
4159 case 0x10280256: /* Both */ 4314 case STAC_DELL_M6_BOTH: /* Both */
4160 case 0x10280057:
4161 stac92xx_set_config_reg(codec, 0x0b, 0x90A70170); 4315 stac92xx_set_config_reg(codec, 0x0b, 0x90A70170);
4162 stac92xx_set_config_reg(codec, 0x13, 0x90A60160); 4316 stac92xx_set_config_reg(codec, 0x13, 0x90A60160);
4163 spec->num_dmics = 1; 4317 spec->num_dmics = 1;
@@ -4168,6 +4322,7 @@ again:
4168 default: 4322 default:
4169 spec->num_dmics = STAC92HD73XX_NUM_DMICS; 4323 spec->num_dmics = STAC92HD73XX_NUM_DMICS;
4170 spec->num_smuxes = ARRAY_SIZE(stac92hd73xx_smux_nids); 4324 spec->num_smuxes = ARRAY_SIZE(stac92hd73xx_smux_nids);
4325 spec->eapd_switch = 1;
4171 } 4326 }
4172 if (spec->board_config > STAC_92HD73XX_REF) { 4327 if (spec->board_config > STAC_92HD73XX_REF) {
4173 /* GPIO0 High = Enable EAPD */ 4328 /* GPIO0 High = Enable EAPD */
@@ -4313,7 +4468,13 @@ static int stac92hd71xx_resume(struct hda_codec *codec)
4313 4468
4314static int stac92hd71xx_suspend(struct hda_codec *codec, pm_message_t state) 4469static int stac92hd71xx_suspend(struct hda_codec *codec, pm_message_t state)
4315{ 4470{
4471 struct sigmatel_spec *spec = codec->spec;
4472
4316 stac92hd71xx_set_power_state(codec, AC_PWRST_D3); 4473 stac92hd71xx_set_power_state(codec, AC_PWRST_D3);
4474 if (spec->eapd_mask)
4475 stac_gpio_set(codec, spec->gpio_mask,
4476 spec->gpio_dir, spec->gpio_data &
4477 ~spec->eapd_mask);
4317 return 0; 4478 return 0;
4318}; 4479};
4319 4480
@@ -4376,6 +4537,13 @@ again:
4376 stac92xx_set_config_regs(codec); 4537 stac92xx_set_config_regs(codec);
4377 } 4538 }
4378 4539
4540 if (spec->board_config > STAC_92HD71BXX_REF) {
4541 /* GPIO0 = EAPD */
4542 spec->gpio_mask = 0x01;
4543 spec->gpio_dir = 0x01;
4544 spec->gpio_data = 0x01;
4545 }
4546
4379 switch (codec->vendor_id) { 4547 switch (codec->vendor_id) {
4380 case 0x111d76b6: /* 4 Port without Analog Mixer */ 4548 case 0x111d76b6: /* 4 Port without Analog Mixer */
4381 case 0x111d76b7: 4549 case 0x111d76b7:
@@ -4386,10 +4554,10 @@ again:
4386 codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs; 4554 codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs;
4387 break; 4555 break;
4388 case 0x111d7608: /* 5 Port with Analog Mixer */ 4556 case 0x111d7608: /* 5 Port with Analog Mixer */
4389 switch (codec->subsystem_id) { 4557 switch (spec->board_config) {
4390 case 0x103c361a: 4558 case STAC_HP_M4:
4391 /* Enable VREF power saving on GPIO1 detect */ 4559 /* Enable VREF power saving on GPIO1 detect */
4392 snd_hda_codec_write(codec, codec->afg, 0, 4560 snd_hda_codec_write_cache(codec, codec->afg, 0,
4393 AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x02); 4561 AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x02);
4394 snd_hda_codec_write_cache(codec, codec->afg, 0, 4562 snd_hda_codec_write_cache(codec, codec->afg, 0,
4395 AC_VERB_SET_UNSOLICITED_ENABLE, 4563 AC_VERB_SET_UNSOLICITED_ENABLE,
@@ -4435,13 +4603,6 @@ again:
4435 spec->aloopback_mask = 0x50; 4603 spec->aloopback_mask = 0x50;
4436 spec->aloopback_shift = 0; 4604 spec->aloopback_shift = 0;
4437 4605
4438 if (spec->board_config > STAC_92HD71BXX_REF) {
4439 /* GPIO0 = EAPD */
4440 spec->gpio_mask = 0x01;
4441 spec->gpio_dir = 0x01;
4442 spec->gpio_data = 0x01;
4443 }
4444
4445 spec->powerdown_adcs = 1; 4606 spec->powerdown_adcs = 1;
4446 spec->digbeep_nid = 0x26; 4607 spec->digbeep_nid = 0x26;
4447 spec->mux_nids = stac92hd71bxx_mux_nids; 4608 spec->mux_nids = stac92hd71bxx_mux_nids;
@@ -4456,14 +4617,21 @@ again:
4456 4617
4457 switch (spec->board_config) { 4618 switch (spec->board_config) {
4458 case STAC_HP_M4: 4619 case STAC_HP_M4:
4459 spec->num_dmics = 0;
4460 spec->num_smuxes = 0;
4461 spec->num_dmuxes = 0;
4462
4463 /* enable internal microphone */ 4620 /* enable internal microphone */
4464 stac92xx_set_config_reg(codec, 0x0e, 0x01813040); 4621 stac92xx_set_config_reg(codec, 0x0e, 0x01813040);
4465 stac92xx_auto_set_pinctl(codec, 0x0e, 4622 stac92xx_auto_set_pinctl(codec, 0x0e,
4466 AC_PINCTL_IN_EN | AC_PINCTL_VREF_80); 4623 AC_PINCTL_IN_EN | AC_PINCTL_VREF_80);
4624 /* fallthru */
4625 case STAC_DELL_M4_2:
4626 spec->num_dmics = 0;
4627 spec->num_smuxes = 0;
4628 spec->num_dmuxes = 0;
4629 break;
4630 case STAC_DELL_M4_1:
4631 case STAC_DELL_M4_3:
4632 spec->num_dmics = 1;
4633 spec->num_smuxes = 0;
4634 spec->num_dmuxes = 0;
4467 break; 4635 break;
4468 default: 4636 default:
4469 spec->num_dmics = STAC92HD71BXX_NUM_DMICS; 4637 spec->num_dmics = STAC92HD71BXX_NUM_DMICS;
@@ -4700,6 +4868,7 @@ static int patch_stac927x(struct hda_codec *codec)
4700 spec->num_pwrs = 0; 4868 spec->num_pwrs = 0;
4701 spec->aloopback_mask = 0x40; 4869 spec->aloopback_mask = 0x40;
4702 spec->aloopback_shift = 0; 4870 spec->aloopback_shift = 0;
4871 spec->eapd_switch = 1;
4703 4872
4704 err = stac92xx_parse_auto_config(codec, 0x1e, 0x20); 4873 err = stac92xx_parse_auto_config(codec, 0x1e, 0x20);
4705 if (!err) { 4874 if (!err) {
@@ -4780,6 +4949,7 @@ static int patch_stac9205(struct hda_codec *codec)
4780 4949
4781 spec->aloopback_mask = 0x40; 4950 spec->aloopback_mask = 0x40;
4782 spec->aloopback_shift = 0; 4951 spec->aloopback_shift = 0;
4952 spec->eapd_switch = 1;
4783 spec->multiout.dac_nids = spec->dac_nids; 4953 spec->multiout.dac_nids = spec->dac_nids;
4784 4954
4785 switch (spec->board_config){ 4955 switch (spec->board_config){
@@ -4789,7 +4959,7 @@ static int patch_stac9205(struct hda_codec *codec)
4789 stac92xx_set_config_reg(codec, 0x20, 0x1c410030); 4959 stac92xx_set_config_reg(codec, 0x20, 0x1c410030);
4790 4960
4791 /* Enable unsol response for GPIO4/Dock HP connection */ 4961 /* Enable unsol response for GPIO4/Dock HP connection */
4792 snd_hda_codec_write(codec, codec->afg, 0, 4962 snd_hda_codec_write_cache(codec, codec->afg, 0,
4793 AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x10); 4963 AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x10);
4794 snd_hda_codec_write_cache(codec, codec->afg, 0, 4964 snd_hda_codec_write_cache(codec, codec->afg, 0,
4795 AC_VERB_SET_UNSOLICITED_ENABLE, 4965 AC_VERB_SET_UNSOLICITED_ENABLE,
diff --git a/sound/pci/ice1712/ice1712.c b/sound/pci/ice1712/ice1712.c
index 5b442383fcda..58d7cda03de5 100644
--- a/sound/pci/ice1712/ice1712.c
+++ b/sound/pci/ice1712/ice1712.c
@@ -2688,12 +2688,13 @@ static int __devinit snd_ice1712_probe(struct pci_dev *pci,
2688 return err; 2688 return err;
2689 } 2689 }
2690 2690
2691 if (ice_has_con_ac97(ice)) 2691 if (ice_has_con_ac97(ice)) {
2692 err = snd_ice1712_pcm(ice, pcm_dev++, NULL); 2692 err = snd_ice1712_pcm(ice, pcm_dev++, NULL);
2693 if (err < 0) { 2693 if (err < 0) {
2694 snd_card_free(card); 2694 snd_card_free(card);
2695 return err; 2695 return err;
2696 } 2696 }
2697 }
2697 2698
2698 err = snd_ice1712_ac97_mixer(ice); 2699 err = snd_ice1712_ac97_mixer(ice);
2699 if (err < 0) { 2700 if (err < 0) {
@@ -2715,12 +2716,13 @@ static int __devinit snd_ice1712_probe(struct pci_dev *pci,
2715 } 2716 }
2716 } 2717 }
2717 2718
2718 if (ice_has_con_ac97(ice)) 2719 if (ice_has_con_ac97(ice)) {
2719 err = snd_ice1712_pcm_ds(ice, pcm_dev++, NULL); 2720 err = snd_ice1712_pcm_ds(ice, pcm_dev++, NULL);
2720 if (err < 0) { 2721 if (err < 0) {
2721 snd_card_free(card); 2722 snd_card_free(card);
2722 return err; 2723 return err;
2723 } 2724 }
2725 }
2724 2726
2725 if (!c->no_mpu401) { 2727 if (!c->no_mpu401) {
2726 err = snd_mpu401_uart_new(card, 0, MPU401_HW_ICE1712, 2728 err = snd_mpu401_uart_new(card, 0, MPU401_HW_ICE1712,
diff --git a/sound/pci/intel8x0.c b/sound/pci/intel8x0.c
index c88d1eace1c4..19d3391e229f 100644
--- a/sound/pci/intel8x0.c
+++ b/sound/pci/intel8x0.c
@@ -2702,6 +2702,7 @@ static struct snd_pci_quirk intel8x0_clock_list[] __devinitdata = {
2702 SND_PCI_QUIRK(0x0e11, 0x008a, "AD1885", 41000), 2702 SND_PCI_QUIRK(0x0e11, 0x008a, "AD1885", 41000),
2703 SND_PCI_QUIRK(0x1028, 0x00be, "AD1885", 44100), 2703 SND_PCI_QUIRK(0x1028, 0x00be, "AD1885", 44100),
2704 SND_PCI_QUIRK(0x1028, 0x0177, "AD1980", 48000), 2704 SND_PCI_QUIRK(0x1028, 0x0177, "AD1980", 48000),
2705 SND_PCI_QUIRK(0x1028, 0x01ad, "AD1981B", 48000),
2705 SND_PCI_QUIRK(0x1043, 0x80f3, "AD1985", 48000), 2706 SND_PCI_QUIRK(0x1043, 0x80f3, "AD1985", 48000),
2706 { } /* terminator */ 2707 { } /* terminator */
2707}; 2708};
diff --git a/sound/pci/pcxhr/pcxhr.c b/sound/pci/pcxhr/pcxhr.c
index 0e06c6c9fcc0..73de6e989b3d 100644
--- a/sound/pci/pcxhr/pcxhr.c
+++ b/sound/pci/pcxhr/pcxhr.c
@@ -1229,8 +1229,11 @@ static int __devinit pcxhr_probe(struct pci_dev *pci, const struct pci_device_id
1229 return -ENOMEM; 1229 return -ENOMEM;
1230 } 1230 }
1231 1231
1232 if (snd_BUG_ON(pci_id->driver_data >= PCI_ID_LAST)) 1232 if (snd_BUG_ON(pci_id->driver_data >= PCI_ID_LAST)) {
1233 kfree(mgr);
1234 pci_disable_device(pci);
1233 return -ENODEV; 1235 return -ENODEV;
1236 }
1234 card_name = pcxhr_board_params[pci_id->driver_data].board_name; 1237 card_name = pcxhr_board_params[pci_id->driver_data].board_name;
1235 mgr->playback_chips = pcxhr_board_params[pci_id->driver_data].playback_chips; 1238 mgr->playback_chips = pcxhr_board_params[pci_id->driver_data].playback_chips;
1236 mgr->capture_chips = pcxhr_board_params[pci_id->driver_data].capture_chips; 1239 mgr->capture_chips = pcxhr_board_params[pci_id->driver_data].capture_chips;
diff --git a/sound/pci/rme9652/hdsp.c b/sound/pci/rme9652/hdsp.c
index d723543beadd..736246f98acc 100644
--- a/sound/pci/rme9652/hdsp.c
+++ b/sound/pci/rme9652/hdsp.c
@@ -4548,11 +4548,20 @@ static int snd_hdsp_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, unsigne
4548{ 4548{
4549 struct hdsp *hdsp = (struct hdsp *)hw->private_data; 4549 struct hdsp *hdsp = (struct hdsp *)hw->private_data;
4550 void __user *argp = (void __user *)arg; 4550 void __user *argp = (void __user *)arg;
4551 int err;
4551 4552
4552 switch (cmd) { 4553 switch (cmd) {
4553 case SNDRV_HDSP_IOCTL_GET_PEAK_RMS: { 4554 case SNDRV_HDSP_IOCTL_GET_PEAK_RMS: {
4554 struct hdsp_peak_rms __user *peak_rms = (struct hdsp_peak_rms __user *)arg; 4555 struct hdsp_peak_rms __user *peak_rms = (struct hdsp_peak_rms __user *)arg;
4555 4556
4557 err = hdsp_check_for_iobox(hdsp);
4558 if (err < 0)
4559 return err;
4560
4561 err = hdsp_check_for_firmware(hdsp, 1);
4562 if (err < 0)
4563 return err;
4564
4556 if (!(hdsp->state & HDSP_FirmwareLoaded)) { 4565 if (!(hdsp->state & HDSP_FirmwareLoaded)) {
4557 snd_printk(KERN_ERR "Hammerfall-DSP: firmware needs to be uploaded to the card.\n"); 4566 snd_printk(KERN_ERR "Hammerfall-DSP: firmware needs to be uploaded to the card.\n");
4558 return -EINVAL; 4567 return -EINVAL;
@@ -4572,10 +4581,14 @@ static int snd_hdsp_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, unsigne
4572 unsigned long flags; 4581 unsigned long flags;
4573 int i; 4582 int i;
4574 4583
4575 if (!(hdsp->state & HDSP_FirmwareLoaded)) { 4584 err = hdsp_check_for_iobox(hdsp);
4576 snd_printk(KERN_ERR "Hammerfall-DSP: Firmware needs to be uploaded to the card.\n"); 4585 if (err < 0)
4577 return -EINVAL; 4586 return err;
4578 } 4587
4588 err = hdsp_check_for_firmware(hdsp, 1);
4589 if (err < 0)
4590 return err;
4591
4579 spin_lock_irqsave(&hdsp->lock, flags); 4592 spin_lock_irqsave(&hdsp->lock, flags);
4580 info.pref_sync_ref = (unsigned char)hdsp_pref_sync_ref(hdsp); 4593 info.pref_sync_ref = (unsigned char)hdsp_pref_sync_ref(hdsp);
4581 info.wordclock_sync_check = (unsigned char)hdsp_wc_sync_check(hdsp); 4594 info.wordclock_sync_check = (unsigned char)hdsp_wc_sync_check(hdsp);
@@ -5045,6 +5058,10 @@ static int __devinit snd_hdsp_create(struct snd_card *card,
5045 /* we wait 2 seconds to let freshly inserted cardbus cards do their hardware init */ 5058 /* we wait 2 seconds to let freshly inserted cardbus cards do their hardware init */
5046 ssleep(2); 5059 ssleep(2);
5047 5060
5061 err = hdsp_check_for_iobox(hdsp);
5062 if (err < 0)
5063 return err;
5064
5048 if ((hdsp_read (hdsp, HDSP_statusRegister) & HDSP_DllError) != 0) { 5065 if ((hdsp_read (hdsp, HDSP_statusRegister) & HDSP_DllError) != 0) {
5049#ifdef HDSP_FW_LOADER 5066#ifdef HDSP_FW_LOADER
5050 if ((err = hdsp_request_fw_loader(hdsp)) < 0) 5067 if ((err = hdsp_request_fw_loader(hdsp)) < 0)
@@ -5057,7 +5074,7 @@ static int __devinit snd_hdsp_create(struct snd_card *card,
5057 /* init is complete, we return */ 5074 /* init is complete, we return */
5058 return 0; 5075 return 0;
5059#endif 5076#endif
5060 /* no iobox connected, we defer initialization */ 5077 /* we defer initialization */
5061 snd_printk(KERN_INFO "Hammerfall-DSP: card initialization pending : waiting for firmware\n"); 5078 snd_printk(KERN_INFO "Hammerfall-DSP: card initialization pending : waiting for firmware\n");
5062 if ((err = snd_hdsp_create_hwdep(card, hdsp)) < 0) 5079 if ((err = snd_hdsp_create_hwdep(card, hdsp)) < 0)
5063 return err; 5080 return err;
diff --git a/sound/soc/codecs/wm9713.c b/sound/soc/codecs/wm9713.c
index aba402b3c999..945b32ed9884 100644
--- a/sound/soc/codecs/wm9713.c
+++ b/sound/soc/codecs/wm9713.c
@@ -140,7 +140,7 @@ SOC_SINGLE("Capture ADC Boost (+20dB) Switch", AC97_VIDEO, 6, 1, 0),
140 140
141SOC_SINGLE("ALC Target Volume", AC97_CODEC_CLASS_REV, 12, 15, 0), 141SOC_SINGLE("ALC Target Volume", AC97_CODEC_CLASS_REV, 12, 15, 0),
142SOC_SINGLE("ALC Hold Time", AC97_CODEC_CLASS_REV, 8, 15, 0), 142SOC_SINGLE("ALC Hold Time", AC97_CODEC_CLASS_REV, 8, 15, 0),
143SOC_SINGLE("ALC Decay Time ", AC97_CODEC_CLASS_REV, 4, 15, 0), 143SOC_SINGLE("ALC Decay Time", AC97_CODEC_CLASS_REV, 4, 15, 0),
144SOC_SINGLE("ALC Attack Time", AC97_CODEC_CLASS_REV, 0, 15, 0), 144SOC_SINGLE("ALC Attack Time", AC97_CODEC_CLASS_REV, 0, 15, 0),
145SOC_ENUM("ALC Function", wm9713_enum[6]), 145SOC_ENUM("ALC Function", wm9713_enum[6]),
146SOC_SINGLE("ALC Max Volume", AC97_PCI_SVID, 11, 7, 0), 146SOC_SINGLE("ALC Max Volume", AC97_PCI_SVID, 11, 7, 0),
diff --git a/sound/soc/fsl/Kconfig b/sound/soc/fsl/Kconfig
index bba9546ba5f5..8d73edc56102 100644
--- a/sound/soc/fsl/Kconfig
+++ b/sound/soc/fsl/Kconfig
@@ -20,7 +20,8 @@ config SND_SOC_MPC8610_HPCD
20 20
21config SND_SOC_MPC5200_I2S 21config SND_SOC_MPC5200_I2S
22 tristate "Freescale MPC5200 PSC in I2S mode driver" 22 tristate "Freescale MPC5200 PSC in I2S mode driver"
23 depends on SND_SOC && PPC_MPC52xx && PPC_BESTCOMM
23 select SND_SOC_OF_SIMPLE 24 select SND_SOC_OF_SIMPLE
24 depends on SND_SOC && PPC_MPC52xx 25 select PPC_BESTCOMM_GEN_BD
25 help 26 help
26 Say Y here to support the MPC5200 PSCs in I2S mode. 27 Say Y here to support the MPC5200 PSCs in I2S mode.
diff --git a/sound/soc/fsl/mpc5200_psc_i2s.c b/sound/soc/fsl/mpc5200_psc_i2s.c
index 86923299bc10..94a02eaa4825 100644
--- a/sound/soc/fsl/mpc5200_psc_i2s.c
+++ b/sound/soc/fsl/mpc5200_psc_i2s.c
@@ -277,7 +277,7 @@ static int psc_i2s_trigger(struct snd_pcm_substream *substream, int cmd)
277 struct mpc52xx_psc __iomem *regs = psc_i2s->psc_regs; 277 struct mpc52xx_psc __iomem *regs = psc_i2s->psc_regs;
278 u16 imr; 278 u16 imr;
279 u8 psc_cmd; 279 u8 psc_cmd;
280 long flags; 280 unsigned long flags;
281 281
282 if (substream->pstr->stream == SNDRV_PCM_STREAM_CAPTURE) 282 if (substream->pstr->stream == SNDRV_PCM_STREAM_CAPTURE)
283 s = &psc_i2s->capture; 283 s = &psc_i2s->capture;
@@ -699,9 +699,11 @@ static ssize_t psc_i2s_stat_store(struct device *dev,
699 return count; 699 return count;
700} 700}
701 701
702DEVICE_ATTR(status, 0644, psc_i2s_status_show, NULL); 702static DEVICE_ATTR(status, 0644, psc_i2s_status_show, NULL);
703DEVICE_ATTR(playback_underrun, 0644, psc_i2s_stat_show, psc_i2s_stat_store); 703static DEVICE_ATTR(playback_underrun, 0644, psc_i2s_stat_show,
704DEVICE_ATTR(capture_overrun, 0644, psc_i2s_stat_show, psc_i2s_stat_store); 704 psc_i2s_stat_store);
705static DEVICE_ATTR(capture_overrun, 0644, psc_i2s_stat_show,
706 psc_i2s_stat_store);
705 707
706/* --------------------------------------------------------------------- 708/* ---------------------------------------------------------------------
707 * OF platform bus binding code: 709 * OF platform bus binding code:
@@ -819,8 +821,8 @@ static int __devinit psc_i2s_of_probe(struct of_device *op,
819 821
820 /* Register the SYSFS files */ 822 /* Register the SYSFS files */
821 rc = device_create_file(psc_i2s->dev, &dev_attr_status); 823 rc = device_create_file(psc_i2s->dev, &dev_attr_status);
822 rc = device_create_file(psc_i2s->dev, &dev_attr_capture_overrun); 824 rc |= device_create_file(psc_i2s->dev, &dev_attr_capture_overrun);
823 rc = device_create_file(psc_i2s->dev, &dev_attr_playback_underrun); 825 rc |= device_create_file(psc_i2s->dev, &dev_attr_playback_underrun);
824 if (rc) 826 if (rc)
825 dev_info(psc_i2s->dev, "error creating sysfs files\n"); 827 dev_info(psc_i2s->dev, "error creating sysfs files\n");
826 828
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index 462e635dfc74..16c7453f4946 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -95,8 +95,8 @@ static int soc_ac97_dev_register(struct snd_soc_codec *codec)
95 codec->ac97->dev.parent = NULL; 95 codec->ac97->dev.parent = NULL;
96 codec->ac97->dev.release = soc_ac97_device_release; 96 codec->ac97->dev.release = soc_ac97_device_release;
97 97
98 snprintf(codec->ac97->dev.bus_id, BUS_ID_SIZE, "%d-%d:%s", 98 dev_set_name(&codec->ac97->dev, "%d-%d:%s",
99 codec->card->number, 0, codec->name); 99 codec->card->number, 0, codec->name);
100 err = device_register(&codec->ac97->dev); 100 err = device_register(&codec->ac97->dev);
101 if (err < 0) { 101 if (err < 0) {
102 snd_printk(KERN_ERR "Can't register ac97 bus\n"); 102 snd_printk(KERN_ERR "Can't register ac97 bus\n");
@@ -1462,7 +1462,7 @@ int snd_soc_info_volsw(struct snd_kcontrol *kcontrol,
1462 struct soc_mixer_control *mc = 1462 struct soc_mixer_control *mc =
1463 (struct soc_mixer_control *)kcontrol->private_value; 1463 (struct soc_mixer_control *)kcontrol->private_value;
1464 int max = mc->max; 1464 int max = mc->max;
1465 unsigned int shift = mc->min; 1465 unsigned int shift = mc->shift;
1466 unsigned int rshift = mc->rshift; 1466 unsigned int rshift = mc->rshift;
1467 1467
1468 if (max == 1) 1468 if (max == 1)
diff --git a/sound/sound_core.c b/sound/sound_core.c
index a75b289a5d78..10ba4218161b 100644
--- a/sound/sound_core.c
+++ b/sound/sound_core.c
@@ -457,7 +457,7 @@ EXPORT_SYMBOL(unregister_sound_mixer);
457 457
458void unregister_sound_midi(int unit) 458void unregister_sound_midi(int unit)
459{ 459{
460 return sound_remove_unit(&chains[2], unit); 460 sound_remove_unit(&chains[2], unit);
461} 461}
462 462
463EXPORT_SYMBOL(unregister_sound_midi); 463EXPORT_SYMBOL(unregister_sound_midi);
@@ -474,7 +474,7 @@ EXPORT_SYMBOL(unregister_sound_midi);
474 474
475void unregister_sound_dsp(int unit) 475void unregister_sound_dsp(int unit)
476{ 476{
477 return sound_remove_unit(&chains[3], unit); 477 sound_remove_unit(&chains[3], unit);
478} 478}
479 479
480 480
@@ -507,7 +507,7 @@ static struct sound_unit *__look_for_unit(int chain, int unit)
507 return NULL; 507 return NULL;
508} 508}
509 509
510int soundcore_open(struct inode *inode, struct file *file) 510static int soundcore_open(struct inode *inode, struct file *file)
511{ 511{
512 int chain; 512 int chain;
513 int unit = iminor(inode); 513 int unit = iminor(inode);
diff --git a/sound/sparc/dbri.c b/sound/sparc/dbri.c
index c257ad8bdfbc..23ed6f04a718 100644
--- a/sound/sparc/dbri.c
+++ b/sound/sparc/dbri.c
@@ -2534,6 +2534,8 @@ static int __devinit snd_dbri_create(struct snd_card *card,
2534 dbri->dma = dma_alloc_coherent(&op->dev, 2534 dbri->dma = dma_alloc_coherent(&op->dev,
2535 sizeof(struct dbri_dma), 2535 sizeof(struct dbri_dma),
2536 &dbri->dma_dvma, GFP_ATOMIC); 2536 &dbri->dma_dvma, GFP_ATOMIC);
2537 if (!dbri->dma)
2538 return -ENOMEM;
2537 memset((void *)dbri->dma, 0, sizeof(struct dbri_dma)); 2539 memset((void *)dbri->dma, 0, sizeof(struct dbri_dma));
2538 2540
2539 dprintk(D_GEN, "DMA Cmd Block 0x%p (0x%08x)\n", 2541 dprintk(D_GEN, "DMA Cmd Block 0x%p (0x%08x)\n",
diff --git a/sound/usb/usbquirks.h b/sound/usb/usbquirks.h
index 69689e79bf79..92115755d98e 100644
--- a/sound/usb/usbquirks.h
+++ b/sound/usb/usbquirks.h
@@ -1480,6 +1480,36 @@ YAMAHA_DEVICE(0x7010, "UB99"),
1480 } 1480 }
1481 } 1481 }
1482}, 1482},
1483{
1484 /* Advanced modes of the Edirol UA-25EX.
1485 * For the standard mode, UA-25EX has ID 0582:00e7, which
1486 * offers only 16-bit PCM at 44.1 kHz and no MIDI.
1487 */
1488 USB_DEVICE_VENDOR_SPEC(0x0582, 0x00e6),
1489 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1490 .vendor_name = "EDIROL",
1491 .product_name = "UA-25EX",
1492 .ifnum = QUIRK_ANY_INTERFACE,
1493 .type = QUIRK_COMPOSITE,
1494 .data = (const struct snd_usb_audio_quirk[]) {
1495 {
1496 .ifnum = 0,
1497 .type = QUIRK_AUDIO_EDIROL_UAXX
1498 },
1499 {
1500 .ifnum = 1,
1501 .type = QUIRK_AUDIO_EDIROL_UAXX
1502 },
1503 {
1504 .ifnum = 2,
1505 .type = QUIRK_AUDIO_EDIROL_UAXX
1506 },
1507 {
1508 .ifnum = -1
1509 }
1510 }
1511 }
1512},
1483 1513
1484/* Guillemot devices */ 1514/* Guillemot devices */
1485{ 1515{