diff options
Diffstat (limited to 'sound')
39 files changed, 543 insertions, 483 deletions
diff --git a/sound/pci/ac97/ac97_codec.c b/sound/pci/ac97/ac97_codec.c index 3020ca2b602b..6108cdc5efb6 100644 --- a/sound/pci/ac97/ac97_codec.c +++ b/sound/pci/ac97/ac97_codec.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <linux/slab.h> | 28 | #include <linux/slab.h> |
29 | #include <linux/pci.h> | 29 | #include <linux/pci.h> |
30 | #include <linux/moduleparam.h> | 30 | #include <linux/moduleparam.h> |
31 | #include <linux/mutex.h> | ||
31 | #include <sound/core.h> | 32 | #include <sound/core.h> |
32 | #include <sound/pcm.h> | 33 | #include <sound/pcm.h> |
33 | #include <sound/ac97_codec.h> | 34 | #include <sound/ac97_codec.h> |
@@ -296,11 +297,11 @@ void snd_ac97_write_cache(struct snd_ac97 *ac97, unsigned short reg, unsigned sh | |||
296 | { | 297 | { |
297 | if (!snd_ac97_valid_reg(ac97, reg)) | 298 | if (!snd_ac97_valid_reg(ac97, reg)) |
298 | return; | 299 | return; |
299 | down(&ac97->reg_mutex); | 300 | mutex_lock(&ac97->reg_mutex); |
300 | ac97->regs[reg] = value; | 301 | ac97->regs[reg] = value; |
301 | ac97->bus->ops->write(ac97, reg, value); | 302 | ac97->bus->ops->write(ac97, reg, value); |
302 | set_bit(reg, ac97->reg_accessed); | 303 | set_bit(reg, ac97->reg_accessed); |
303 | up(&ac97->reg_mutex); | 304 | mutex_unlock(&ac97->reg_mutex); |
304 | } | 305 | } |
305 | 306 | ||
306 | /** | 307 | /** |
@@ -321,14 +322,14 @@ int snd_ac97_update(struct snd_ac97 *ac97, unsigned short reg, unsigned short va | |||
321 | 322 | ||
322 | if (!snd_ac97_valid_reg(ac97, reg)) | 323 | if (!snd_ac97_valid_reg(ac97, reg)) |
323 | return -EINVAL; | 324 | return -EINVAL; |
324 | down(&ac97->reg_mutex); | 325 | mutex_lock(&ac97->reg_mutex); |
325 | change = ac97->regs[reg] != value; | 326 | change = ac97->regs[reg] != value; |
326 | if (change) { | 327 | if (change) { |
327 | ac97->regs[reg] = value; | 328 | ac97->regs[reg] = value; |
328 | ac97->bus->ops->write(ac97, reg, value); | 329 | ac97->bus->ops->write(ac97, reg, value); |
329 | } | 330 | } |
330 | set_bit(reg, ac97->reg_accessed); | 331 | set_bit(reg, ac97->reg_accessed); |
331 | up(&ac97->reg_mutex); | 332 | mutex_unlock(&ac97->reg_mutex); |
332 | return change; | 333 | return change; |
333 | } | 334 | } |
334 | 335 | ||
@@ -351,9 +352,9 @@ int snd_ac97_update_bits(struct snd_ac97 *ac97, unsigned short reg, unsigned sho | |||
351 | 352 | ||
352 | if (!snd_ac97_valid_reg(ac97, reg)) | 353 | if (!snd_ac97_valid_reg(ac97, reg)) |
353 | return -EINVAL; | 354 | return -EINVAL; |
354 | down(&ac97->reg_mutex); | 355 | mutex_lock(&ac97->reg_mutex); |
355 | change = snd_ac97_update_bits_nolock(ac97, reg, mask, value); | 356 | change = snd_ac97_update_bits_nolock(ac97, reg, mask, value); |
356 | up(&ac97->reg_mutex); | 357 | mutex_unlock(&ac97->reg_mutex); |
357 | return change; | 358 | return change; |
358 | } | 359 | } |
359 | 360 | ||
@@ -380,12 +381,12 @@ static int snd_ac97_ad18xx_update_pcm_bits(struct snd_ac97 *ac97, int codec, uns | |||
380 | int change; | 381 | int change; |
381 | unsigned short old, new, cfg; | 382 | unsigned short old, new, cfg; |
382 | 383 | ||
383 | down(&ac97->page_mutex); | 384 | mutex_lock(&ac97->page_mutex); |
384 | old = ac97->spec.ad18xx.pcmreg[codec]; | 385 | old = ac97->spec.ad18xx.pcmreg[codec]; |
385 | new = (old & ~mask) | value; | 386 | new = (old & ~mask) | value; |
386 | change = old != new; | 387 | change = old != new; |
387 | if (change) { | 388 | if (change) { |
388 | down(&ac97->reg_mutex); | 389 | mutex_lock(&ac97->reg_mutex); |
389 | cfg = snd_ac97_read_cache(ac97, AC97_AD_SERIAL_CFG); | 390 | cfg = snd_ac97_read_cache(ac97, AC97_AD_SERIAL_CFG); |
390 | ac97->spec.ad18xx.pcmreg[codec] = new; | 391 | ac97->spec.ad18xx.pcmreg[codec] = new; |
391 | /* select single codec */ | 392 | /* select single codec */ |
@@ -397,9 +398,9 @@ static int snd_ac97_ad18xx_update_pcm_bits(struct snd_ac97 *ac97, int codec, uns | |||
397 | /* select all codecs */ | 398 | /* select all codecs */ |
398 | ac97->bus->ops->write(ac97, AC97_AD_SERIAL_CFG, | 399 | ac97->bus->ops->write(ac97, AC97_AD_SERIAL_CFG, |
399 | cfg | 0x7000); | 400 | cfg | 0x7000); |
400 | up(&ac97->reg_mutex); | 401 | mutex_unlock(&ac97->reg_mutex); |
401 | } | 402 | } |
402 | up(&ac97->page_mutex); | 403 | mutex_unlock(&ac97->page_mutex); |
403 | return change; | 404 | return change; |
404 | } | 405 | } |
405 | 406 | ||
@@ -467,7 +468,7 @@ static int snd_ac97_page_save(struct snd_ac97 *ac97, int reg, struct snd_kcontro | |||
467 | (ac97->ext_id & AC97_EI_REV_MASK) >= AC97_EI_REV_23 && | 468 | (ac97->ext_id & AC97_EI_REV_MASK) >= AC97_EI_REV_23 && |
468 | (reg >= 0x60 && reg < 0x70)) { | 469 | (reg >= 0x60 && reg < 0x70)) { |
469 | unsigned short page = (kcontrol->private_value >> 26) & 0x0f; | 470 | unsigned short page = (kcontrol->private_value >> 26) & 0x0f; |
470 | down(&ac97->page_mutex); /* lock paging */ | 471 | mutex_lock(&ac97->page_mutex); /* lock paging */ |
471 | page_save = snd_ac97_read(ac97, AC97_INT_PAGING) & AC97_PAGE_MASK; | 472 | page_save = snd_ac97_read(ac97, AC97_INT_PAGING) & AC97_PAGE_MASK; |
472 | snd_ac97_update_bits(ac97, AC97_INT_PAGING, AC97_PAGE_MASK, page); | 473 | snd_ac97_update_bits(ac97, AC97_INT_PAGING, AC97_PAGE_MASK, page); |
473 | } | 474 | } |
@@ -478,7 +479,7 @@ static void snd_ac97_page_restore(struct snd_ac97 *ac97, int page_save) | |||
478 | { | 479 | { |
479 | if (page_save >= 0) { | 480 | if (page_save >= 0) { |
480 | snd_ac97_update_bits(ac97, AC97_INT_PAGING, AC97_PAGE_MASK, page_save); | 481 | snd_ac97_update_bits(ac97, AC97_INT_PAGING, AC97_PAGE_MASK, page_save); |
481 | up(&ac97->page_mutex); /* unlock paging */ | 482 | mutex_unlock(&ac97->page_mutex); /* unlock paging */ |
482 | } | 483 | } |
483 | } | 484 | } |
484 | 485 | ||
@@ -674,12 +675,12 @@ static int snd_ac97_spdif_default_get(struct snd_kcontrol *kcontrol, struct snd_ | |||
674 | { | 675 | { |
675 | struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol); | 676 | struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol); |
676 | 677 | ||
677 | down(&ac97->reg_mutex); | 678 | mutex_lock(&ac97->reg_mutex); |
678 | ucontrol->value.iec958.status[0] = ac97->spdif_status & 0xff; | 679 | ucontrol->value.iec958.status[0] = ac97->spdif_status & 0xff; |
679 | ucontrol->value.iec958.status[1] = (ac97->spdif_status >> 8) & 0xff; | 680 | ucontrol->value.iec958.status[1] = (ac97->spdif_status >> 8) & 0xff; |
680 | ucontrol->value.iec958.status[2] = (ac97->spdif_status >> 16) & 0xff; | 681 | ucontrol->value.iec958.status[2] = (ac97->spdif_status >> 16) & 0xff; |
681 | ucontrol->value.iec958.status[3] = (ac97->spdif_status >> 24) & 0xff; | 682 | ucontrol->value.iec958.status[3] = (ac97->spdif_status >> 24) & 0xff; |
682 | up(&ac97->reg_mutex); | 683 | mutex_unlock(&ac97->reg_mutex); |
683 | return 0; | 684 | return 0; |
684 | } | 685 | } |
685 | 686 | ||
@@ -718,7 +719,7 @@ static int snd_ac97_spdif_default_put(struct snd_kcontrol *kcontrol, struct snd_ | |||
718 | } | 719 | } |
719 | } | 720 | } |
720 | 721 | ||
721 | down(&ac97->reg_mutex); | 722 | mutex_lock(&ac97->reg_mutex); |
722 | change = ac97->spdif_status != new; | 723 | change = ac97->spdif_status != new; |
723 | ac97->spdif_status = new; | 724 | ac97->spdif_status = new; |
724 | 725 | ||
@@ -746,7 +747,7 @@ static int snd_ac97_spdif_default_put(struct snd_kcontrol *kcontrol, struct snd_ | |||
746 | snd_ac97_update_bits_nolock(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, AC97_EA_SPDIF); /* turn on again */ | 747 | snd_ac97_update_bits_nolock(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, AC97_EA_SPDIF); /* turn on again */ |
747 | } | 748 | } |
748 | } | 749 | } |
749 | up(&ac97->reg_mutex); | 750 | mutex_unlock(&ac97->reg_mutex); |
750 | 751 | ||
751 | return change; | 752 | return change; |
752 | } | 753 | } |
@@ -763,7 +764,7 @@ static int snd_ac97_put_spsa(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_ | |||
763 | 764 | ||
764 | value = (ucontrol->value.integer.value[0] & mask); | 765 | value = (ucontrol->value.integer.value[0] & mask); |
765 | 766 | ||
766 | down(&ac97->reg_mutex); | 767 | mutex_lock(&ac97->reg_mutex); |
767 | mask <<= shift; | 768 | mask <<= shift; |
768 | value <<= shift; | 769 | value <<= shift; |
769 | old = snd_ac97_read_cache(ac97, reg); | 770 | old = snd_ac97_read_cache(ac97, reg); |
@@ -777,7 +778,7 @@ static int snd_ac97_put_spsa(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_ | |||
777 | if (extst & AC97_EA_SPDIF) | 778 | if (extst & AC97_EA_SPDIF) |
778 | snd_ac97_update_bits_nolock(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, AC97_EA_SPDIF); /* turn on again */ | 779 | snd_ac97_update_bits_nolock(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, AC97_EA_SPDIF); /* turn on again */ |
779 | } | 780 | } |
780 | up(&ac97->reg_mutex); | 781 | mutex_unlock(&ac97->reg_mutex); |
781 | return change; | 782 | return change; |
782 | } | 783 | } |
783 | 784 | ||
@@ -888,10 +889,10 @@ static int snd_ac97_ad18xx_pcm_get_volume(struct snd_kcontrol *kcontrol, struct | |||
888 | struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol); | 889 | struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol); |
889 | int codec = kcontrol->private_value & 3; | 890 | int codec = kcontrol->private_value & 3; |
890 | 891 | ||
891 | down(&ac97->page_mutex); | 892 | mutex_lock(&ac97->page_mutex); |
892 | ucontrol->value.integer.value[0] = 31 - ((ac97->spec.ad18xx.pcmreg[codec] >> 0) & 31); | 893 | ucontrol->value.integer.value[0] = 31 - ((ac97->spec.ad18xx.pcmreg[codec] >> 0) & 31); |
893 | ucontrol->value.integer.value[1] = 31 - ((ac97->spec.ad18xx.pcmreg[codec] >> 8) & 31); | 894 | ucontrol->value.integer.value[1] = 31 - ((ac97->spec.ad18xx.pcmreg[codec] >> 8) & 31); |
894 | up(&ac97->page_mutex); | 895 | mutex_unlock(&ac97->page_mutex); |
895 | return 0; | 896 | return 0; |
896 | } | 897 | } |
897 | 898 | ||
@@ -1856,8 +1857,8 @@ int snd_ac97_mixer(struct snd_ac97_bus *bus, struct snd_ac97_template *template, | |||
1856 | ac97->limited_regs = template->limited_regs; | 1857 | ac97->limited_regs = template->limited_regs; |
1857 | memcpy(ac97->reg_accessed, template->reg_accessed, sizeof(ac97->reg_accessed)); | 1858 | memcpy(ac97->reg_accessed, template->reg_accessed, sizeof(ac97->reg_accessed)); |
1858 | bus->codec[ac97->num] = ac97; | 1859 | bus->codec[ac97->num] = ac97; |
1859 | init_MUTEX(&ac97->reg_mutex); | 1860 | mutex_init(&ac97->reg_mutex); |
1860 | init_MUTEX(&ac97->page_mutex); | 1861 | mutex_init(&ac97->page_mutex); |
1861 | 1862 | ||
1862 | #ifdef CONFIG_PCI | 1863 | #ifdef CONFIG_PCI |
1863 | if (ac97->pci) { | 1864 | if (ac97->pci) { |
diff --git a/sound/pci/ac97/ac97_patch.c b/sound/pci/ac97/ac97_patch.c index a444a78c7c94..8bc79cbe3215 100644 --- a/sound/pci/ac97/ac97_patch.c +++ b/sound/pci/ac97/ac97_patch.c | |||
@@ -27,6 +27,8 @@ | |||
27 | #include <linux/delay.h> | 27 | #include <linux/delay.h> |
28 | #include <linux/init.h> | 28 | #include <linux/init.h> |
29 | #include <linux/slab.h> | 29 | #include <linux/slab.h> |
30 | #include <linux/mutex.h> | ||
31 | |||
30 | #include <sound/core.h> | 32 | #include <sound/core.h> |
31 | #include <sound/pcm.h> | 33 | #include <sound/pcm.h> |
32 | #include <sound/control.h> | 34 | #include <sound/control.h> |
@@ -55,12 +57,12 @@ static int ac97_update_bits_page(struct snd_ac97 *ac97, unsigned short reg, unsi | |||
55 | unsigned short page_save; | 57 | unsigned short page_save; |
56 | int ret; | 58 | int ret; |
57 | 59 | ||
58 | down(&ac97->page_mutex); | 60 | mutex_lock(&ac97->page_mutex); |
59 | page_save = snd_ac97_read(ac97, AC97_INT_PAGING) & AC97_PAGE_MASK; | 61 | page_save = snd_ac97_read(ac97, AC97_INT_PAGING) & AC97_PAGE_MASK; |
60 | snd_ac97_update_bits(ac97, AC97_INT_PAGING, AC97_PAGE_MASK, page); | 62 | snd_ac97_update_bits(ac97, AC97_INT_PAGING, AC97_PAGE_MASK, page); |
61 | ret = snd_ac97_update_bits(ac97, reg, mask, value); | 63 | ret = snd_ac97_update_bits(ac97, reg, mask, value); |
62 | snd_ac97_update_bits(ac97, AC97_INT_PAGING, AC97_PAGE_MASK, page_save); | 64 | snd_ac97_update_bits(ac97, AC97_INT_PAGING, AC97_PAGE_MASK, page_save); |
63 | up(&ac97->page_mutex); /* unlock paging */ | 65 | mutex_unlock(&ac97->page_mutex); /* unlock paging */ |
64 | return ret; | 66 | return ret; |
65 | } | 67 | } |
66 | 68 | ||
@@ -897,12 +899,12 @@ static int snd_ac97_stac9708_put_bias(struct snd_kcontrol *kcontrol, struct snd_ | |||
897 | struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol); | 899 | struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol); |
898 | int err; | 900 | int err; |
899 | 901 | ||
900 | down(&ac97->page_mutex); | 902 | mutex_lock(&ac97->page_mutex); |
901 | snd_ac97_write(ac97, AC97_SIGMATEL_BIAS1, 0xabba); | 903 | snd_ac97_write(ac97, AC97_SIGMATEL_BIAS1, 0xabba); |
902 | err = snd_ac97_update_bits(ac97, AC97_SIGMATEL_BIAS2, 0x0010, | 904 | err = snd_ac97_update_bits(ac97, AC97_SIGMATEL_BIAS2, 0x0010, |
903 | (ucontrol->value.integer.value[0] & 1) << 4); | 905 | (ucontrol->value.integer.value[0] & 1) << 4); |
904 | snd_ac97_write(ac97, AC97_SIGMATEL_BIAS1, 0); | 906 | snd_ac97_write(ac97, AC97_SIGMATEL_BIAS1, 0); |
905 | up(&ac97->page_mutex); | 907 | mutex_unlock(&ac97->page_mutex); |
906 | return err; | 908 | return err; |
907 | } | 909 | } |
908 | 910 | ||
diff --git a/sound/pci/ac97/ac97_pcm.c b/sound/pci/ac97/ac97_pcm.c index c3e590bf7a02..512a3583b0ce 100644 --- a/sound/pci/ac97/ac97_pcm.c +++ b/sound/pci/ac97/ac97_pcm.c | |||
@@ -27,6 +27,8 @@ | |||
27 | #include <linux/delay.h> | 27 | #include <linux/delay.h> |
28 | #include <linux/init.h> | 28 | #include <linux/init.h> |
29 | #include <linux/slab.h> | 29 | #include <linux/slab.h> |
30 | #include <linux/mutex.h> | ||
31 | |||
30 | #include <sound/core.h> | 32 | #include <sound/core.h> |
31 | #include <sound/pcm.h> | 33 | #include <sound/pcm.h> |
32 | #include <sound/control.h> | 34 | #include <sound/control.h> |
@@ -206,7 +208,7 @@ static int set_spdif_rate(struct snd_ac97 *ac97, unsigned short rate) | |||
206 | mask = AC97_SC_SPSR_MASK; | 208 | mask = AC97_SC_SPSR_MASK; |
207 | } | 209 | } |
208 | 210 | ||
209 | down(&ac97->reg_mutex); | 211 | mutex_lock(&ac97->reg_mutex); |
210 | old = snd_ac97_read(ac97, reg) & mask; | 212 | old = snd_ac97_read(ac97, reg) & mask; |
211 | if (old != bits) { | 213 | if (old != bits) { |
212 | snd_ac97_update_bits_nolock(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, 0); | 214 | snd_ac97_update_bits_nolock(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, 0); |
@@ -231,7 +233,7 @@ static int set_spdif_rate(struct snd_ac97 *ac97, unsigned short rate) | |||
231 | ac97->spdif_status = sbits; | 233 | ac97->spdif_status = sbits; |
232 | } | 234 | } |
233 | snd_ac97_update_bits_nolock(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, AC97_EA_SPDIF); | 235 | snd_ac97_update_bits_nolock(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, AC97_EA_SPDIF); |
234 | up(&ac97->reg_mutex); | 236 | mutex_unlock(&ac97->reg_mutex); |
235 | return 0; | 237 | return 0; |
236 | } | 238 | } |
237 | 239 | ||
diff --git a/sound/pci/ac97/ac97_proc.c b/sound/pci/ac97/ac97_proc.c index 7134b3f55fb5..4d523df79cc7 100644 --- a/sound/pci/ac97/ac97_proc.c +++ b/sound/pci/ac97/ac97_proc.c | |||
@@ -24,6 +24,8 @@ | |||
24 | 24 | ||
25 | #include <sound/driver.h> | 25 | #include <sound/driver.h> |
26 | #include <linux/slab.h> | 26 | #include <linux/slab.h> |
27 | #include <linux/mutex.h> | ||
28 | |||
27 | #include <sound/core.h> | 29 | #include <sound/core.h> |
28 | #include <sound/ac97_codec.h> | 30 | #include <sound/ac97_codec.h> |
29 | #include <sound/asoundef.h> | 31 | #include <sound/asoundef.h> |
@@ -338,7 +340,7 @@ static void snd_ac97_proc_read(struct snd_info_entry *entry, struct snd_info_buf | |||
338 | { | 340 | { |
339 | struct snd_ac97 *ac97 = entry->private_data; | 341 | struct snd_ac97 *ac97 = entry->private_data; |
340 | 342 | ||
341 | down(&ac97->page_mutex); | 343 | mutex_lock(&ac97->page_mutex); |
342 | if ((ac97->id & 0xffffff40) == AC97_ID_AD1881) { // Analog Devices AD1881/85/86 | 344 | if ((ac97->id & 0xffffff40) == AC97_ID_AD1881) { // Analog Devices AD1881/85/86 |
343 | int idx; | 345 | int idx; |
344 | for (idx = 0; idx < 3; idx++) | 346 | for (idx = 0; idx < 3; idx++) |
@@ -364,7 +366,7 @@ static void snd_ac97_proc_read(struct snd_info_entry *entry, struct snd_info_buf | |||
364 | } else { | 366 | } else { |
365 | snd_ac97_proc_read_main(ac97, buffer, 0); | 367 | snd_ac97_proc_read_main(ac97, buffer, 0); |
366 | } | 368 | } |
367 | up(&ac97->page_mutex); | 369 | mutex_unlock(&ac97->page_mutex); |
368 | } | 370 | } |
369 | 371 | ||
370 | #ifdef CONFIG_SND_DEBUG | 372 | #ifdef CONFIG_SND_DEBUG |
@@ -374,7 +376,7 @@ static void snd_ac97_proc_regs_write(struct snd_info_entry *entry, struct snd_in | |||
374 | struct snd_ac97 *ac97 = entry->private_data; | 376 | struct snd_ac97 *ac97 = entry->private_data; |
375 | char line[64]; | 377 | char line[64]; |
376 | unsigned int reg, val; | 378 | unsigned int reg, val; |
377 | down(&ac97->page_mutex); | 379 | mutex_lock(&ac97->page_mutex); |
378 | while (!snd_info_get_line(buffer, line, sizeof(line))) { | 380 | while (!snd_info_get_line(buffer, line, sizeof(line))) { |
379 | if (sscanf(line, "%x %x", ®, &val) != 2) | 381 | if (sscanf(line, "%x %x", ®, &val) != 2) |
380 | continue; | 382 | continue; |
@@ -382,7 +384,7 @@ static void snd_ac97_proc_regs_write(struct snd_info_entry *entry, struct snd_in | |||
382 | if (reg < 0x80 && (reg & 1) == 0 && val <= 0xffff) | 384 | if (reg < 0x80 && (reg & 1) == 0 && val <= 0xffff) |
383 | snd_ac97_write_cache(ac97, reg, val); | 385 | snd_ac97_write_cache(ac97, reg, val); |
384 | } | 386 | } |
385 | up(&ac97->page_mutex); | 387 | mutex_unlock(&ac97->page_mutex); |
386 | } | 388 | } |
387 | #endif | 389 | #endif |
388 | 390 | ||
@@ -401,7 +403,7 @@ static void snd_ac97_proc_regs_read(struct snd_info_entry *entry, | |||
401 | { | 403 | { |
402 | struct snd_ac97 *ac97 = entry->private_data; | 404 | struct snd_ac97 *ac97 = entry->private_data; |
403 | 405 | ||
404 | down(&ac97->page_mutex); | 406 | mutex_lock(&ac97->page_mutex); |
405 | if ((ac97->id & 0xffffff40) == AC97_ID_AD1881) { // Analog Devices AD1881/85/86 | 407 | if ((ac97->id & 0xffffff40) == AC97_ID_AD1881) { // Analog Devices AD1881/85/86 |
406 | 408 | ||
407 | int idx; | 409 | int idx; |
@@ -417,7 +419,7 @@ static void snd_ac97_proc_regs_read(struct snd_info_entry *entry, | |||
417 | } else { | 419 | } else { |
418 | snd_ac97_proc_regs_read_main(ac97, buffer, 0); | 420 | snd_ac97_proc_regs_read_main(ac97, buffer, 0); |
419 | } | 421 | } |
420 | up(&ac97->page_mutex); | 422 | mutex_unlock(&ac97->page_mutex); |
421 | } | 423 | } |
422 | 424 | ||
423 | void snd_ac97_proc_init(struct snd_ac97 * ac97) | 425 | void snd_ac97_proc_init(struct snd_ac97 * ac97) |
diff --git a/sound/pci/ac97/ak4531_codec.c b/sound/pci/ac97/ak4531_codec.c index dcfb5036ff8b..0fb7b3407312 100644 --- a/sound/pci/ac97/ak4531_codec.c +++ b/sound/pci/ac97/ak4531_codec.c | |||
@@ -23,6 +23,8 @@ | |||
23 | #include <linux/delay.h> | 23 | #include <linux/delay.h> |
24 | #include <linux/init.h> | 24 | #include <linux/init.h> |
25 | #include <linux/slab.h> | 25 | #include <linux/slab.h> |
26 | #include <linux/mutex.h> | ||
27 | |||
26 | #include <sound/core.h> | 28 | #include <sound/core.h> |
27 | #include <sound/ak4531_codec.h> | 29 | #include <sound/ak4531_codec.h> |
28 | 30 | ||
@@ -82,9 +84,9 @@ static int snd_ak4531_get_single(struct snd_kcontrol *kcontrol, struct snd_ctl_e | |||
82 | int invert = (kcontrol->private_value >> 22) & 1; | 84 | int invert = (kcontrol->private_value >> 22) & 1; |
83 | int val; | 85 | int val; |
84 | 86 | ||
85 | down(&ak4531->reg_mutex); | 87 | mutex_lock(&ak4531->reg_mutex); |
86 | val = (ak4531->regs[reg] >> shift) & mask; | 88 | val = (ak4531->regs[reg] >> shift) & mask; |
87 | up(&ak4531->reg_mutex); | 89 | mutex_unlock(&ak4531->reg_mutex); |
88 | if (invert) { | 90 | if (invert) { |
89 | val = mask - val; | 91 | val = mask - val; |
90 | } | 92 | } |
@@ -107,11 +109,11 @@ static int snd_ak4531_put_single(struct snd_kcontrol *kcontrol, struct snd_ctl_e | |||
107 | val = mask - val; | 109 | val = mask - val; |
108 | } | 110 | } |
109 | val <<= shift; | 111 | val <<= shift; |
110 | down(&ak4531->reg_mutex); | 112 | mutex_lock(&ak4531->reg_mutex); |
111 | val = (ak4531->regs[reg] & ~(mask << shift)) | val; | 113 | val = (ak4531->regs[reg] & ~(mask << shift)) | val; |
112 | change = val != ak4531->regs[reg]; | 114 | change = val != ak4531->regs[reg]; |
113 | ak4531->write(ak4531, reg, ak4531->regs[reg] = val); | 115 | ak4531->write(ak4531, reg, ak4531->regs[reg] = val); |
114 | up(&ak4531->reg_mutex); | 116 | mutex_unlock(&ak4531->reg_mutex); |
115 | return change; | 117 | return change; |
116 | } | 118 | } |
117 | 119 | ||
@@ -143,10 +145,10 @@ static int snd_ak4531_get_double(struct snd_kcontrol *kcontrol, struct snd_ctl_e | |||
143 | int invert = (kcontrol->private_value >> 22) & 1; | 145 | int invert = (kcontrol->private_value >> 22) & 1; |
144 | int left, right; | 146 | int left, right; |
145 | 147 | ||
146 | down(&ak4531->reg_mutex); | 148 | mutex_lock(&ak4531->reg_mutex); |
147 | left = (ak4531->regs[left_reg] >> left_shift) & mask; | 149 | left = (ak4531->regs[left_reg] >> left_shift) & mask; |
148 | right = (ak4531->regs[right_reg] >> right_shift) & mask; | 150 | right = (ak4531->regs[right_reg] >> right_shift) & mask; |
149 | up(&ak4531->reg_mutex); | 151 | mutex_unlock(&ak4531->reg_mutex); |
150 | if (invert) { | 152 | if (invert) { |
151 | left = mask - left; | 153 | left = mask - left; |
152 | right = mask - right; | 154 | right = mask - right; |
@@ -176,7 +178,7 @@ static int snd_ak4531_put_double(struct snd_kcontrol *kcontrol, struct snd_ctl_e | |||
176 | } | 178 | } |
177 | left <<= left_shift; | 179 | left <<= left_shift; |
178 | right <<= right_shift; | 180 | right <<= right_shift; |
179 | down(&ak4531->reg_mutex); | 181 | mutex_lock(&ak4531->reg_mutex); |
180 | if (left_reg == right_reg) { | 182 | if (left_reg == right_reg) { |
181 | left = (ak4531->regs[left_reg] & ~((mask << left_shift) | (mask << right_shift))) | left | right; | 183 | left = (ak4531->regs[left_reg] & ~((mask << left_shift) | (mask << right_shift))) | left | right; |
182 | change = left != ak4531->regs[left_reg]; | 184 | change = left != ak4531->regs[left_reg]; |
@@ -188,7 +190,7 @@ static int snd_ak4531_put_double(struct snd_kcontrol *kcontrol, struct snd_ctl_e | |||
188 | ak4531->write(ak4531, left_reg, ak4531->regs[left_reg] = left); | 190 | ak4531->write(ak4531, left_reg, ak4531->regs[left_reg] = left); |
189 | ak4531->write(ak4531, right_reg, ak4531->regs[right_reg] = right); | 191 | ak4531->write(ak4531, right_reg, ak4531->regs[right_reg] = right); |
190 | } | 192 | } |
191 | up(&ak4531->reg_mutex); | 193 | mutex_unlock(&ak4531->reg_mutex); |
192 | return change; | 194 | return change; |
193 | } | 195 | } |
194 | 196 | ||
@@ -215,12 +217,12 @@ static int snd_ak4531_get_input_sw(struct snd_kcontrol *kcontrol, struct snd_ctl | |||
215 | int left_shift = (kcontrol->private_value >> 16) & 0x0f; | 217 | int left_shift = (kcontrol->private_value >> 16) & 0x0f; |
216 | int right_shift = (kcontrol->private_value >> 24) & 0x0f; | 218 | int right_shift = (kcontrol->private_value >> 24) & 0x0f; |
217 | 219 | ||
218 | down(&ak4531->reg_mutex); | 220 | mutex_lock(&ak4531->reg_mutex); |
219 | ucontrol->value.integer.value[0] = (ak4531->regs[reg1] >> left_shift) & 1; | 221 | ucontrol->value.integer.value[0] = (ak4531->regs[reg1] >> left_shift) & 1; |
220 | ucontrol->value.integer.value[1] = (ak4531->regs[reg2] >> left_shift) & 1; | 222 | ucontrol->value.integer.value[1] = (ak4531->regs[reg2] >> left_shift) & 1; |
221 | ucontrol->value.integer.value[2] = (ak4531->regs[reg1] >> right_shift) & 1; | 223 | ucontrol->value.integer.value[2] = (ak4531->regs[reg1] >> right_shift) & 1; |
222 | ucontrol->value.integer.value[3] = (ak4531->regs[reg2] >> right_shift) & 1; | 224 | ucontrol->value.integer.value[3] = (ak4531->regs[reg2] >> right_shift) & 1; |
223 | up(&ak4531->reg_mutex); | 225 | mutex_unlock(&ak4531->reg_mutex); |
224 | return 0; | 226 | return 0; |
225 | } | 227 | } |
226 | 228 | ||
@@ -234,7 +236,7 @@ static int snd_ak4531_put_input_sw(struct snd_kcontrol *kcontrol, struct snd_ctl | |||
234 | int change; | 236 | int change; |
235 | int val1, val2; | 237 | int val1, val2; |
236 | 238 | ||
237 | down(&ak4531->reg_mutex); | 239 | mutex_lock(&ak4531->reg_mutex); |
238 | val1 = ak4531->regs[reg1] & ~((1 << left_shift) | (1 << right_shift)); | 240 | val1 = ak4531->regs[reg1] & ~((1 << left_shift) | (1 << right_shift)); |
239 | val2 = ak4531->regs[reg2] & ~((1 << left_shift) | (1 << right_shift)); | 241 | val2 = ak4531->regs[reg2] & ~((1 << left_shift) | (1 << right_shift)); |
240 | val1 |= (ucontrol->value.integer.value[0] & 1) << left_shift; | 242 | val1 |= (ucontrol->value.integer.value[0] & 1) << left_shift; |
@@ -244,7 +246,7 @@ static int snd_ak4531_put_input_sw(struct snd_kcontrol *kcontrol, struct snd_ctl | |||
244 | change = val1 != ak4531->regs[reg1] || val2 != ak4531->regs[reg2]; | 246 | change = val1 != ak4531->regs[reg1] || val2 != ak4531->regs[reg2]; |
245 | ak4531->write(ak4531, reg1, ak4531->regs[reg1] = val1); | 247 | ak4531->write(ak4531, reg1, ak4531->regs[reg1] = val1); |
246 | ak4531->write(ak4531, reg2, ak4531->regs[reg2] = val2); | 248 | ak4531->write(ak4531, reg2, ak4531->regs[reg2] = val2); |
247 | up(&ak4531->reg_mutex); | 249 | mutex_unlock(&ak4531->reg_mutex); |
248 | return change; | 250 | return change; |
249 | } | 251 | } |
250 | 252 | ||
@@ -366,7 +368,7 @@ int snd_ak4531_mixer(struct snd_card *card, struct snd_ak4531 *_ak4531, | |||
366 | if (ak4531 == NULL) | 368 | if (ak4531 == NULL) |
367 | return -ENOMEM; | 369 | return -ENOMEM; |
368 | *ak4531 = *_ak4531; | 370 | *ak4531 = *_ak4531; |
369 | init_MUTEX(&ak4531->reg_mutex); | 371 | mutex_init(&ak4531->reg_mutex); |
370 | if ((err = snd_component_add(card, "AK4531")) < 0) { | 372 | if ((err = snd_component_add(card, "AK4531")) < 0) { |
371 | snd_ak4531_free(ak4531); | 373 | snd_ak4531_free(ak4531); |
372 | return err; | 374 | return err; |
diff --git a/sound/pci/atiixp.c b/sound/pci/atiixp.c index b7217adaf1d7..12e618851262 100644 --- a/sound/pci/atiixp.c +++ b/sound/pci/atiixp.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/pci.h> | 27 | #include <linux/pci.h> |
28 | #include <linux/slab.h> | 28 | #include <linux/slab.h> |
29 | #include <linux/moduleparam.h> | 29 | #include <linux/moduleparam.h> |
30 | #include <linux/mutex.h> | ||
30 | #include <sound/core.h> | 31 | #include <sound/core.h> |
31 | #include <sound/pcm.h> | 32 | #include <sound/pcm.h> |
32 | #include <sound/pcm_params.h> | 33 | #include <sound/pcm_params.h> |
@@ -277,7 +278,7 @@ struct atiixp { | |||
277 | unsigned int codec_not_ready_bits; /* for codec detection */ | 278 | unsigned int codec_not_ready_bits; /* for codec detection */ |
278 | 279 | ||
279 | int spdif_over_aclink; /* passed from the module option */ | 280 | int spdif_over_aclink; /* passed from the module option */ |
280 | struct semaphore open_mutex; /* playback open mutex */ | 281 | struct mutex open_mutex; /* playback open mutex */ |
281 | }; | 282 | }; |
282 | 283 | ||
283 | 284 | ||
@@ -1051,9 +1052,9 @@ static int snd_atiixp_playback_open(struct snd_pcm_substream *substream) | |||
1051 | struct atiixp *chip = snd_pcm_substream_chip(substream); | 1052 | struct atiixp *chip = snd_pcm_substream_chip(substream); |
1052 | int err; | 1053 | int err; |
1053 | 1054 | ||
1054 | down(&chip->open_mutex); | 1055 | mutex_lock(&chip->open_mutex); |
1055 | err = snd_atiixp_pcm_open(substream, &chip->dmas[ATI_DMA_PLAYBACK], 0); | 1056 | err = snd_atiixp_pcm_open(substream, &chip->dmas[ATI_DMA_PLAYBACK], 0); |
1056 | up(&chip->open_mutex); | 1057 | mutex_unlock(&chip->open_mutex); |
1057 | if (err < 0) | 1058 | if (err < 0) |
1058 | return err; | 1059 | return err; |
1059 | substream->runtime->hw.channels_max = chip->max_channels; | 1060 | substream->runtime->hw.channels_max = chip->max_channels; |
@@ -1068,9 +1069,9 @@ static int snd_atiixp_playback_close(struct snd_pcm_substream *substream) | |||
1068 | { | 1069 | { |
1069 | struct atiixp *chip = snd_pcm_substream_chip(substream); | 1070 | struct atiixp *chip = snd_pcm_substream_chip(substream); |
1070 | int err; | 1071 | int err; |
1071 | down(&chip->open_mutex); | 1072 | mutex_lock(&chip->open_mutex); |
1072 | err = snd_atiixp_pcm_close(substream, &chip->dmas[ATI_DMA_PLAYBACK]); | 1073 | err = snd_atiixp_pcm_close(substream, &chip->dmas[ATI_DMA_PLAYBACK]); |
1073 | up(&chip->open_mutex); | 1074 | mutex_unlock(&chip->open_mutex); |
1074 | return err; | 1075 | return err; |
1075 | } | 1076 | } |
1076 | 1077 | ||
@@ -1090,12 +1091,12 @@ static int snd_atiixp_spdif_open(struct snd_pcm_substream *substream) | |||
1090 | { | 1091 | { |
1091 | struct atiixp *chip = snd_pcm_substream_chip(substream); | 1092 | struct atiixp *chip = snd_pcm_substream_chip(substream); |
1092 | int err; | 1093 | int err; |
1093 | down(&chip->open_mutex); | 1094 | mutex_lock(&chip->open_mutex); |
1094 | if (chip->spdif_over_aclink) /* share DMA_PLAYBACK */ | 1095 | if (chip->spdif_over_aclink) /* share DMA_PLAYBACK */ |
1095 | err = snd_atiixp_pcm_open(substream, &chip->dmas[ATI_DMA_PLAYBACK], 2); | 1096 | err = snd_atiixp_pcm_open(substream, &chip->dmas[ATI_DMA_PLAYBACK], 2); |
1096 | else | 1097 | else |
1097 | err = snd_atiixp_pcm_open(substream, &chip->dmas[ATI_DMA_SPDIF], -1); | 1098 | err = snd_atiixp_pcm_open(substream, &chip->dmas[ATI_DMA_SPDIF], -1); |
1098 | up(&chip->open_mutex); | 1099 | mutex_unlock(&chip->open_mutex); |
1099 | return err; | 1100 | return err; |
1100 | } | 1101 | } |
1101 | 1102 | ||
@@ -1103,12 +1104,12 @@ static int snd_atiixp_spdif_close(struct snd_pcm_substream *substream) | |||
1103 | { | 1104 | { |
1104 | struct atiixp *chip = snd_pcm_substream_chip(substream); | 1105 | struct atiixp *chip = snd_pcm_substream_chip(substream); |
1105 | int err; | 1106 | int err; |
1106 | down(&chip->open_mutex); | 1107 | mutex_lock(&chip->open_mutex); |
1107 | if (chip->spdif_over_aclink) | 1108 | if (chip->spdif_over_aclink) |
1108 | err = snd_atiixp_pcm_close(substream, &chip->dmas[ATI_DMA_PLAYBACK]); | 1109 | err = snd_atiixp_pcm_close(substream, &chip->dmas[ATI_DMA_PLAYBACK]); |
1109 | else | 1110 | else |
1110 | err = snd_atiixp_pcm_close(substream, &chip->dmas[ATI_DMA_SPDIF]); | 1111 | err = snd_atiixp_pcm_close(substream, &chip->dmas[ATI_DMA_SPDIF]); |
1111 | up(&chip->open_mutex); | 1112 | mutex_unlock(&chip->open_mutex); |
1112 | return err; | 1113 | return err; |
1113 | } | 1114 | } |
1114 | 1115 | ||
@@ -1560,7 +1561,7 @@ static int __devinit snd_atiixp_create(struct snd_card *card, | |||
1560 | } | 1561 | } |
1561 | 1562 | ||
1562 | spin_lock_init(&chip->reg_lock); | 1563 | spin_lock_init(&chip->reg_lock); |
1563 | init_MUTEX(&chip->open_mutex); | 1564 | mutex_init(&chip->open_mutex); |
1564 | chip->card = card; | 1565 | chip->card = card; |
1565 | chip->pci = pci; | 1566 | chip->pci = pci; |
1566 | chip->irq = -1; | 1567 | chip->irq = -1; |
diff --git a/sound/pci/atiixp_modem.c b/sound/pci/atiixp_modem.c index 8d8fd5a4ed35..1d3766044643 100644 --- a/sound/pci/atiixp_modem.c +++ b/sound/pci/atiixp_modem.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/pci.h> | 27 | #include <linux/pci.h> |
28 | #include <linux/slab.h> | 28 | #include <linux/slab.h> |
29 | #include <linux/moduleparam.h> | 29 | #include <linux/moduleparam.h> |
30 | #include <linux/mutex.h> | ||
30 | #include <sound/core.h> | 31 | #include <sound/core.h> |
31 | #include <sound/pcm.h> | 32 | #include <sound/pcm.h> |
32 | #include <sound/pcm_params.h> | 33 | #include <sound/pcm_params.h> |
@@ -255,7 +256,7 @@ struct atiixp_modem { | |||
255 | unsigned int codec_not_ready_bits; /* for codec detection */ | 256 | unsigned int codec_not_ready_bits; /* for codec detection */ |
256 | 257 | ||
257 | int spdif_over_aclink; /* passed from the module option */ | 258 | int spdif_over_aclink; /* passed from the module option */ |
258 | struct semaphore open_mutex; /* playback open mutex */ | 259 | struct mutex open_mutex; /* playback open mutex */ |
259 | }; | 260 | }; |
260 | 261 | ||
261 | 262 | ||
@@ -911,9 +912,9 @@ static int snd_atiixp_playback_open(struct snd_pcm_substream *substream) | |||
911 | struct atiixp_modem *chip = snd_pcm_substream_chip(substream); | 912 | struct atiixp_modem *chip = snd_pcm_substream_chip(substream); |
912 | int err; | 913 | int err; |
913 | 914 | ||
914 | down(&chip->open_mutex); | 915 | mutex_lock(&chip->open_mutex); |
915 | err = snd_atiixp_pcm_open(substream, &chip->dmas[ATI_DMA_PLAYBACK], 0); | 916 | err = snd_atiixp_pcm_open(substream, &chip->dmas[ATI_DMA_PLAYBACK], 0); |
916 | up(&chip->open_mutex); | 917 | mutex_unlock(&chip->open_mutex); |
917 | if (err < 0) | 918 | if (err < 0) |
918 | return err; | 919 | return err; |
919 | return 0; | 920 | return 0; |
@@ -923,9 +924,9 @@ static int snd_atiixp_playback_close(struct snd_pcm_substream *substream) | |||
923 | { | 924 | { |
924 | struct atiixp_modem *chip = snd_pcm_substream_chip(substream); | 925 | struct atiixp_modem *chip = snd_pcm_substream_chip(substream); |
925 | int err; | 926 | int err; |
926 | down(&chip->open_mutex); | 927 | mutex_lock(&chip->open_mutex); |
927 | err = snd_atiixp_pcm_close(substream, &chip->dmas[ATI_DMA_PLAYBACK]); | 928 | err = snd_atiixp_pcm_close(substream, &chip->dmas[ATI_DMA_PLAYBACK]); |
928 | up(&chip->open_mutex); | 929 | mutex_unlock(&chip->open_mutex); |
929 | return err; | 930 | return err; |
930 | } | 931 | } |
931 | 932 | ||
@@ -1233,7 +1234,7 @@ static int __devinit snd_atiixp_create(struct snd_card *card, | |||
1233 | } | 1234 | } |
1234 | 1235 | ||
1235 | spin_lock_init(&chip->reg_lock); | 1236 | spin_lock_init(&chip->reg_lock); |
1236 | init_MUTEX(&chip->open_mutex); | 1237 | mutex_init(&chip->open_mutex); |
1237 | chip->card = card; | 1238 | chip->card = card; |
1238 | chip->pci = pci; | 1239 | chip->pci = pci; |
1239 | chip->irq = -1; | 1240 | chip->irq = -1; |
diff --git a/sound/pci/cmipci.c b/sound/pci/cmipci.c index c03b0a0a3b27..2ecbddbbdcf0 100644 --- a/sound/pci/cmipci.c +++ b/sound/pci/cmipci.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <linux/slab.h> | 29 | #include <linux/slab.h> |
30 | #include <linux/gameport.h> | 30 | #include <linux/gameport.h> |
31 | #include <linux/moduleparam.h> | 31 | #include <linux/moduleparam.h> |
32 | #include <linux/mutex.h> | ||
32 | #include <sound/core.h> | 33 | #include <sound/core.h> |
33 | #include <sound/info.h> | 34 | #include <sound/info.h> |
34 | #include <sound/control.h> | 35 | #include <sound/control.h> |
@@ -439,7 +440,7 @@ struct cmipci { | |||
439 | struct snd_pcm_hardware *hw_info[3]; /* for playbacks */ | 440 | struct snd_pcm_hardware *hw_info[3]; /* for playbacks */ |
440 | 441 | ||
441 | int opened[2]; /* open mode */ | 442 | int opened[2]; /* open mode */ |
442 | struct semaphore open_mutex; | 443 | struct mutex open_mutex; |
443 | 444 | ||
444 | unsigned int mixer_insensitive: 1; | 445 | unsigned int mixer_insensitive: 1; |
445 | struct snd_kcontrol *mixer_res_ctl[CM_SAVED_MIXERS]; | 446 | struct snd_kcontrol *mixer_res_ctl[CM_SAVED_MIXERS]; |
@@ -641,14 +642,14 @@ static int snd_cmipci_playback2_hw_params(struct snd_pcm_substream *substream, | |||
641 | { | 642 | { |
642 | struct cmipci *cm = snd_pcm_substream_chip(substream); | 643 | struct cmipci *cm = snd_pcm_substream_chip(substream); |
643 | if (params_channels(hw_params) > 2) { | 644 | if (params_channels(hw_params) > 2) { |
644 | down(&cm->open_mutex); | 645 | mutex_lock(&cm->open_mutex); |
645 | if (cm->opened[CM_CH_PLAY]) { | 646 | if (cm->opened[CM_CH_PLAY]) { |
646 | up(&cm->open_mutex); | 647 | mutex_unlock(&cm->open_mutex); |
647 | return -EBUSY; | 648 | return -EBUSY; |
648 | } | 649 | } |
649 | /* reserve the channel A */ | 650 | /* reserve the channel A */ |
650 | cm->opened[CM_CH_PLAY] = CM_OPEN_PLAYBACK_MULTI; | 651 | cm->opened[CM_CH_PLAY] = CM_OPEN_PLAYBACK_MULTI; |
651 | up(&cm->open_mutex); | 652 | mutex_unlock(&cm->open_mutex); |
652 | } | 653 | } |
653 | return snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params)); | 654 | return snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params)); |
654 | } | 655 | } |
@@ -1461,9 +1462,9 @@ static int open_device_check(struct cmipci *cm, int mode, struct snd_pcm_substre | |||
1461 | * pcm framework doesn't pass file pointer before actually opened, | 1462 | * pcm framework doesn't pass file pointer before actually opened, |
1462 | * we can't know whether blocking mode or not in open callback.. | 1463 | * we can't know whether blocking mode or not in open callback.. |
1463 | */ | 1464 | */ |
1464 | down(&cm->open_mutex); | 1465 | mutex_lock(&cm->open_mutex); |
1465 | if (cm->opened[ch]) { | 1466 | if (cm->opened[ch]) { |
1466 | up(&cm->open_mutex); | 1467 | mutex_unlock(&cm->open_mutex); |
1467 | return -EBUSY; | 1468 | return -EBUSY; |
1468 | } | 1469 | } |
1469 | cm->opened[ch] = mode; | 1470 | cm->opened[ch] = mode; |
@@ -1475,7 +1476,7 @@ static int open_device_check(struct cmipci *cm, int mode, struct snd_pcm_substre | |||
1475 | snd_cmipci_clear_bit(cm, CM_REG_MISC_CTRL, CM_ENDBDAC); | 1476 | snd_cmipci_clear_bit(cm, CM_REG_MISC_CTRL, CM_ENDBDAC); |
1476 | spin_unlock_irq(&cm->reg_lock); | 1477 | spin_unlock_irq(&cm->reg_lock); |
1477 | } | 1478 | } |
1478 | up(&cm->open_mutex); | 1479 | mutex_unlock(&cm->open_mutex); |
1479 | return 0; | 1480 | return 0; |
1480 | } | 1481 | } |
1481 | 1482 | ||
@@ -1483,7 +1484,7 @@ static void close_device_check(struct cmipci *cm, int mode) | |||
1483 | { | 1484 | { |
1484 | int ch = mode & CM_OPEN_CH_MASK; | 1485 | int ch = mode & CM_OPEN_CH_MASK; |
1485 | 1486 | ||
1486 | down(&cm->open_mutex); | 1487 | mutex_lock(&cm->open_mutex); |
1487 | if (cm->opened[ch] == mode) { | 1488 | if (cm->opened[ch] == mode) { |
1488 | if (cm->channel[ch].substream) { | 1489 | if (cm->channel[ch].substream) { |
1489 | snd_cmipci_ch_reset(cm, ch); | 1490 | snd_cmipci_ch_reset(cm, ch); |
@@ -1499,7 +1500,7 @@ static void close_device_check(struct cmipci *cm, int mode) | |||
1499 | spin_unlock_irq(&cm->reg_lock); | 1500 | spin_unlock_irq(&cm->reg_lock); |
1500 | } | 1501 | } |
1501 | } | 1502 | } |
1502 | up(&cm->open_mutex); | 1503 | mutex_unlock(&cm->open_mutex); |
1503 | } | 1504 | } |
1504 | 1505 | ||
1505 | /* | 1506 | /* |
@@ -1546,7 +1547,7 @@ static int snd_cmipci_playback2_open(struct snd_pcm_substream *substream) | |||
1546 | if ((err = open_device_check(cm, CM_OPEN_PLAYBACK2, substream)) < 0) /* use channel B */ | 1547 | if ((err = open_device_check(cm, CM_OPEN_PLAYBACK2, substream)) < 0) /* use channel B */ |
1547 | return err; | 1548 | return err; |
1548 | runtime->hw = snd_cmipci_playback2; | 1549 | runtime->hw = snd_cmipci_playback2; |
1549 | down(&cm->open_mutex); | 1550 | mutex_lock(&cm->open_mutex); |
1550 | if (! cm->opened[CM_CH_PLAY]) { | 1551 | if (! cm->opened[CM_CH_PLAY]) { |
1551 | if (cm->can_multi_ch) { | 1552 | if (cm->can_multi_ch) { |
1552 | runtime->hw.channels_max = cm->max_channels; | 1553 | runtime->hw.channels_max = cm->max_channels; |
@@ -1559,7 +1560,7 @@ static int snd_cmipci_playback2_open(struct snd_pcm_substream *substream) | |||
1559 | } | 1560 | } |
1560 | snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_SIZE, 0, 0x10000); | 1561 | snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_SIZE, 0, 0x10000); |
1561 | } | 1562 | } |
1562 | up(&cm->open_mutex); | 1563 | mutex_unlock(&cm->open_mutex); |
1563 | return 0; | 1564 | return 0; |
1564 | } | 1565 | } |
1565 | 1566 | ||
@@ -2844,7 +2845,7 @@ static int __devinit snd_cmipci_create(struct snd_card *card, struct pci_dev *pc | |||
2844 | } | 2845 | } |
2845 | 2846 | ||
2846 | spin_lock_init(&cm->reg_lock); | 2847 | spin_lock_init(&cm->reg_lock); |
2847 | init_MUTEX(&cm->open_mutex); | 2848 | mutex_init(&cm->open_mutex); |
2848 | cm->device = pci->device; | 2849 | cm->device = pci->device; |
2849 | cm->card = card; | 2850 | cm->card = card; |
2850 | cm->pci = pci; | 2851 | cm->pci = pci; |
diff --git a/sound/pci/cs46xx/cs46xx_lib.c b/sound/pci/cs46xx/cs46xx_lib.c index 8fb275d6eb77..69dbf542a6de 100644 --- a/sound/pci/cs46xx/cs46xx_lib.c +++ b/sound/pci/cs46xx/cs46xx_lib.c | |||
@@ -53,6 +53,8 @@ | |||
53 | #include <linux/interrupt.h> | 53 | #include <linux/interrupt.h> |
54 | #include <linux/slab.h> | 54 | #include <linux/slab.h> |
55 | #include <linux/gameport.h> | 55 | #include <linux/gameport.h> |
56 | #include <linux/mutex.h> | ||
57 | |||
56 | 58 | ||
57 | #include <sound/core.h> | 59 | #include <sound/core.h> |
58 | #include <sound/control.h> | 60 | #include <sound/control.h> |
@@ -909,22 +911,22 @@ static int snd_cs46xx_playback_hw_params(struct snd_pcm_substream *substream, | |||
909 | #ifdef CONFIG_SND_CS46XX_NEW_DSP | 911 | #ifdef CONFIG_SND_CS46XX_NEW_DSP |
910 | snd_assert (sample_rate != 0, return -ENXIO); | 912 | snd_assert (sample_rate != 0, return -ENXIO); |
911 | 913 | ||
912 | down (&chip->spos_mutex); | 914 | mutex_lock(&chip->spos_mutex); |
913 | 915 | ||
914 | if (_cs46xx_adjust_sample_rate (chip,cpcm,sample_rate)) { | 916 | if (_cs46xx_adjust_sample_rate (chip,cpcm,sample_rate)) { |
915 | up (&chip->spos_mutex); | 917 | mutex_unlock(&chip->spos_mutex); |
916 | return -ENXIO; | 918 | return -ENXIO; |
917 | } | 919 | } |
918 | 920 | ||
919 | snd_assert (cpcm->pcm_channel != NULL); | 921 | snd_assert (cpcm->pcm_channel != NULL); |
920 | if (!cpcm->pcm_channel) { | 922 | if (!cpcm->pcm_channel) { |
921 | up (&chip->spos_mutex); | 923 | mutex_unlock(&chip->spos_mutex); |
922 | return -ENXIO; | 924 | return -ENXIO; |
923 | } | 925 | } |
924 | 926 | ||
925 | 927 | ||
926 | if (cs46xx_dsp_pcm_channel_set_period (chip,cpcm->pcm_channel,period_size)) { | 928 | if (cs46xx_dsp_pcm_channel_set_period (chip,cpcm->pcm_channel,period_size)) { |
927 | up (&chip->spos_mutex); | 929 | mutex_unlock(&chip->spos_mutex); |
928 | return -EINVAL; | 930 | return -EINVAL; |
929 | } | 931 | } |
930 | 932 | ||
@@ -965,7 +967,7 @@ static int snd_cs46xx_playback_hw_params(struct snd_pcm_substream *substream, | |||
965 | } | 967 | } |
966 | if ((err = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params))) < 0) { | 968 | if ((err = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params))) < 0) { |
967 | #ifdef CONFIG_SND_CS46XX_NEW_DSP | 969 | #ifdef CONFIG_SND_CS46XX_NEW_DSP |
968 | up (&chip->spos_mutex); | 970 | mutex_unlock(&chip->spos_mutex); |
969 | #endif | 971 | #endif |
970 | return err; | 972 | return err; |
971 | } | 973 | } |
@@ -989,7 +991,7 @@ static int snd_cs46xx_playback_hw_params(struct snd_pcm_substream *substream, | |||
989 | } | 991 | } |
990 | 992 | ||
991 | #ifdef CONFIG_SND_CS46XX_NEW_DSP | 993 | #ifdef CONFIG_SND_CS46XX_NEW_DSP |
992 | up (&chip->spos_mutex); | 994 | mutex_unlock(&chip->spos_mutex); |
993 | #endif | 995 | #endif |
994 | 996 | ||
995 | return 0; | 997 | return 0; |
@@ -1319,7 +1321,7 @@ static int _cs46xx_playback_open_channel (struct snd_pcm_substream *substream,in | |||
1319 | 1321 | ||
1320 | cpcm->substream = substream; | 1322 | cpcm->substream = substream; |
1321 | #ifdef CONFIG_SND_CS46XX_NEW_DSP | 1323 | #ifdef CONFIG_SND_CS46XX_NEW_DSP |
1322 | down (&chip->spos_mutex); | 1324 | mutex_lock(&chip->spos_mutex); |
1323 | cpcm->pcm_channel = NULL; | 1325 | cpcm->pcm_channel = NULL; |
1324 | cpcm->pcm_channel_id = pcm_channel_id; | 1326 | cpcm->pcm_channel_id = pcm_channel_id; |
1325 | 1327 | ||
@@ -1328,7 +1330,7 @@ static int _cs46xx_playback_open_channel (struct snd_pcm_substream *substream,in | |||
1328 | SNDRV_PCM_HW_PARAM_PERIOD_BYTES, | 1330 | SNDRV_PCM_HW_PARAM_PERIOD_BYTES, |
1329 | &hw_constraints_period_sizes); | 1331 | &hw_constraints_period_sizes); |
1330 | 1332 | ||
1331 | up (&chip->spos_mutex); | 1333 | mutex_unlock(&chip->spos_mutex); |
1332 | #else | 1334 | #else |
1333 | chip->playback_pcm = cpcm; /* HACK */ | 1335 | chip->playback_pcm = cpcm; /* HACK */ |
1334 | #endif | 1336 | #endif |
@@ -1367,9 +1369,9 @@ static int snd_cs46xx_playback_open_iec958(struct snd_pcm_substream *substream) | |||
1367 | 1369 | ||
1368 | snd_printdd("open raw iec958 channel\n"); | 1370 | snd_printdd("open raw iec958 channel\n"); |
1369 | 1371 | ||
1370 | down (&chip->spos_mutex); | 1372 | mutex_lock(&chip->spos_mutex); |
1371 | cs46xx_iec958_pre_open (chip); | 1373 | cs46xx_iec958_pre_open (chip); |
1372 | up (&chip->spos_mutex); | 1374 | mutex_unlock(&chip->spos_mutex); |
1373 | 1375 | ||
1374 | return _cs46xx_playback_open_channel(substream,DSP_IEC958_CHANNEL); | 1376 | return _cs46xx_playback_open_channel(substream,DSP_IEC958_CHANNEL); |
1375 | } | 1377 | } |
@@ -1385,9 +1387,9 @@ static int snd_cs46xx_playback_close_iec958(struct snd_pcm_substream *substream) | |||
1385 | 1387 | ||
1386 | err = snd_cs46xx_playback_close(substream); | 1388 | err = snd_cs46xx_playback_close(substream); |
1387 | 1389 | ||
1388 | down (&chip->spos_mutex); | 1390 | mutex_lock(&chip->spos_mutex); |
1389 | cs46xx_iec958_post_close (chip); | 1391 | cs46xx_iec958_post_close (chip); |
1390 | up (&chip->spos_mutex); | 1392 | mutex_unlock(&chip->spos_mutex); |
1391 | 1393 | ||
1392 | return err; | 1394 | return err; |
1393 | } | 1395 | } |
@@ -1428,12 +1430,12 @@ static int snd_cs46xx_playback_close(struct snd_pcm_substream *substream) | |||
1428 | if (!cpcm) return -ENXIO; | 1430 | if (!cpcm) return -ENXIO; |
1429 | 1431 | ||
1430 | #ifdef CONFIG_SND_CS46XX_NEW_DSP | 1432 | #ifdef CONFIG_SND_CS46XX_NEW_DSP |
1431 | down (&chip->spos_mutex); | 1433 | mutex_lock(&chip->spos_mutex); |
1432 | if (cpcm->pcm_channel) { | 1434 | if (cpcm->pcm_channel) { |
1433 | cs46xx_dsp_destroy_pcm_channel(chip,cpcm->pcm_channel); | 1435 | cs46xx_dsp_destroy_pcm_channel(chip,cpcm->pcm_channel); |
1434 | cpcm->pcm_channel = NULL; | 1436 | cpcm->pcm_channel = NULL; |
1435 | } | 1437 | } |
1436 | up (&chip->spos_mutex); | 1438 | mutex_unlock(&chip->spos_mutex); |
1437 | #else | 1439 | #else |
1438 | chip->playback_pcm = NULL; | 1440 | chip->playback_pcm = NULL; |
1439 | #endif | 1441 | #endif |
@@ -1848,7 +1850,7 @@ static int snd_cs46xx_iec958_put(struct snd_kcontrol *kcontrol, | |||
1848 | 1850 | ||
1849 | switch (kcontrol->private_value) { | 1851 | switch (kcontrol->private_value) { |
1850 | case CS46XX_MIXER_SPDIF_OUTPUT_ELEMENT: | 1852 | case CS46XX_MIXER_SPDIF_OUTPUT_ELEMENT: |
1851 | down (&chip->spos_mutex); | 1853 | mutex_lock(&chip->spos_mutex); |
1852 | change = (chip->dsp_spos_instance->spdif_status_out & DSP_SPDIF_STATUS_OUTPUT_ENABLED); | 1854 | change = (chip->dsp_spos_instance->spdif_status_out & DSP_SPDIF_STATUS_OUTPUT_ENABLED); |
1853 | if (ucontrol->value.integer.value[0] && !change) | 1855 | if (ucontrol->value.integer.value[0] && !change) |
1854 | cs46xx_dsp_enable_spdif_out(chip); | 1856 | cs46xx_dsp_enable_spdif_out(chip); |
@@ -1856,7 +1858,7 @@ static int snd_cs46xx_iec958_put(struct snd_kcontrol *kcontrol, | |||
1856 | cs46xx_dsp_disable_spdif_out(chip); | 1858 | cs46xx_dsp_disable_spdif_out(chip); |
1857 | 1859 | ||
1858 | res = (change != (chip->dsp_spos_instance->spdif_status_out & DSP_SPDIF_STATUS_OUTPUT_ENABLED)); | 1860 | res = (change != (chip->dsp_spos_instance->spdif_status_out & DSP_SPDIF_STATUS_OUTPUT_ENABLED)); |
1859 | up (&chip->spos_mutex); | 1861 | mutex_unlock(&chip->spos_mutex); |
1860 | break; | 1862 | break; |
1861 | case CS46XX_MIXER_SPDIF_INPUT_ELEMENT: | 1863 | case CS46XX_MIXER_SPDIF_INPUT_ELEMENT: |
1862 | change = chip->dsp_spos_instance->spdif_status_in; | 1864 | change = chip->dsp_spos_instance->spdif_status_in; |
@@ -1997,12 +1999,12 @@ static int snd_cs46xx_spdif_default_get(struct snd_kcontrol *kcontrol, | |||
1997 | struct snd_cs46xx *chip = snd_kcontrol_chip(kcontrol); | 1999 | struct snd_cs46xx *chip = snd_kcontrol_chip(kcontrol); |
1998 | struct dsp_spos_instance * ins = chip->dsp_spos_instance; | 2000 | struct dsp_spos_instance * ins = chip->dsp_spos_instance; |
1999 | 2001 | ||
2000 | down (&chip->spos_mutex); | 2002 | mutex_lock(&chip->spos_mutex); |
2001 | ucontrol->value.iec958.status[0] = _wrap_all_bits((ins->spdif_csuv_default >> 24) & 0xff); | 2003 | ucontrol->value.iec958.status[0] = _wrap_all_bits((ins->spdif_csuv_default >> 24) & 0xff); |
2002 | ucontrol->value.iec958.status[1] = _wrap_all_bits((ins->spdif_csuv_default >> 16) & 0xff); | 2004 | ucontrol->value.iec958.status[1] = _wrap_all_bits((ins->spdif_csuv_default >> 16) & 0xff); |
2003 | ucontrol->value.iec958.status[2] = 0; | 2005 | ucontrol->value.iec958.status[2] = 0; |
2004 | ucontrol->value.iec958.status[3] = _wrap_all_bits((ins->spdif_csuv_default) & 0xff); | 2006 | ucontrol->value.iec958.status[3] = _wrap_all_bits((ins->spdif_csuv_default) & 0xff); |
2005 | up (&chip->spos_mutex); | 2007 | mutex_unlock(&chip->spos_mutex); |
2006 | 2008 | ||
2007 | return 0; | 2009 | return 0; |
2008 | } | 2010 | } |
@@ -2015,7 +2017,7 @@ static int snd_cs46xx_spdif_default_put(struct snd_kcontrol *kcontrol, | |||
2015 | unsigned int val; | 2017 | unsigned int val; |
2016 | int change; | 2018 | int change; |
2017 | 2019 | ||
2018 | down (&chip->spos_mutex); | 2020 | mutex_lock(&chip->spos_mutex); |
2019 | val = ((unsigned int)_wrap_all_bits(ucontrol->value.iec958.status[0]) << 24) | | 2021 | val = ((unsigned int)_wrap_all_bits(ucontrol->value.iec958.status[0]) << 24) | |
2020 | ((unsigned int)_wrap_all_bits(ucontrol->value.iec958.status[2]) << 16) | | 2022 | ((unsigned int)_wrap_all_bits(ucontrol->value.iec958.status[2]) << 16) | |
2021 | ((unsigned int)_wrap_all_bits(ucontrol->value.iec958.status[3])) | | 2023 | ((unsigned int)_wrap_all_bits(ucontrol->value.iec958.status[3])) | |
@@ -2029,7 +2031,7 @@ static int snd_cs46xx_spdif_default_put(struct snd_kcontrol *kcontrol, | |||
2029 | if ( !(ins->spdif_status_out & DSP_SPDIF_STATUS_PLAYBACK_OPEN) ) | 2031 | if ( !(ins->spdif_status_out & DSP_SPDIF_STATUS_PLAYBACK_OPEN) ) |
2030 | cs46xx_poke_via_dsp (chip,SP_SPDOUT_CSUV,val); | 2032 | cs46xx_poke_via_dsp (chip,SP_SPDOUT_CSUV,val); |
2031 | 2033 | ||
2032 | up (&chip->spos_mutex); | 2034 | mutex_unlock(&chip->spos_mutex); |
2033 | 2035 | ||
2034 | return change; | 2036 | return change; |
2035 | } | 2037 | } |
@@ -2050,12 +2052,12 @@ static int snd_cs46xx_spdif_stream_get(struct snd_kcontrol *kcontrol, | |||
2050 | struct snd_cs46xx *chip = snd_kcontrol_chip(kcontrol); | 2052 | struct snd_cs46xx *chip = snd_kcontrol_chip(kcontrol); |
2051 | struct dsp_spos_instance * ins = chip->dsp_spos_instance; | 2053 | struct dsp_spos_instance * ins = chip->dsp_spos_instance; |
2052 | 2054 | ||
2053 | down (&chip->spos_mutex); | 2055 | mutex_lock(&chip->spos_mutex); |
2054 | ucontrol->value.iec958.status[0] = _wrap_all_bits((ins->spdif_csuv_stream >> 24) & 0xff); | 2056 | ucontrol->value.iec958.status[0] = _wrap_all_bits((ins->spdif_csuv_stream >> 24) & 0xff); |
2055 | ucontrol->value.iec958.status[1] = _wrap_all_bits((ins->spdif_csuv_stream >> 16) & 0xff); | 2057 | ucontrol->value.iec958.status[1] = _wrap_all_bits((ins->spdif_csuv_stream >> 16) & 0xff); |
2056 | ucontrol->value.iec958.status[2] = 0; | 2058 | ucontrol->value.iec958.status[2] = 0; |
2057 | ucontrol->value.iec958.status[3] = _wrap_all_bits((ins->spdif_csuv_stream) & 0xff); | 2059 | ucontrol->value.iec958.status[3] = _wrap_all_bits((ins->spdif_csuv_stream) & 0xff); |
2058 | up (&chip->spos_mutex); | 2060 | mutex_unlock(&chip->spos_mutex); |
2059 | 2061 | ||
2060 | return 0; | 2062 | return 0; |
2061 | } | 2063 | } |
@@ -2068,7 +2070,7 @@ static int snd_cs46xx_spdif_stream_put(struct snd_kcontrol *kcontrol, | |||
2068 | unsigned int val; | 2070 | unsigned int val; |
2069 | int change; | 2071 | int change; |
2070 | 2072 | ||
2071 | down (&chip->spos_mutex); | 2073 | mutex_lock(&chip->spos_mutex); |
2072 | val = ((unsigned int)_wrap_all_bits(ucontrol->value.iec958.status[0]) << 24) | | 2074 | val = ((unsigned int)_wrap_all_bits(ucontrol->value.iec958.status[0]) << 24) | |
2073 | ((unsigned int)_wrap_all_bits(ucontrol->value.iec958.status[1]) << 16) | | 2075 | ((unsigned int)_wrap_all_bits(ucontrol->value.iec958.status[1]) << 16) | |
2074 | ((unsigned int)_wrap_all_bits(ucontrol->value.iec958.status[3])) | | 2076 | ((unsigned int)_wrap_all_bits(ucontrol->value.iec958.status[3])) | |
@@ -2082,7 +2084,7 @@ static int snd_cs46xx_spdif_stream_put(struct snd_kcontrol *kcontrol, | |||
2082 | if ( ins->spdif_status_out & DSP_SPDIF_STATUS_PLAYBACK_OPEN ) | 2084 | if ( ins->spdif_status_out & DSP_SPDIF_STATUS_PLAYBACK_OPEN ) |
2083 | cs46xx_poke_via_dsp (chip,SP_SPDOUT_CSUV,val); | 2085 | cs46xx_poke_via_dsp (chip,SP_SPDOUT_CSUV,val); |
2084 | 2086 | ||
2085 | up (&chip->spos_mutex); | 2087 | mutex_unlock(&chip->spos_mutex); |
2086 | 2088 | ||
2087 | return change; | 2089 | return change; |
2088 | } | 2090 | } |
@@ -3755,7 +3757,7 @@ int __devinit snd_cs46xx_create(struct snd_card *card, | |||
3755 | } | 3757 | } |
3756 | spin_lock_init(&chip->reg_lock); | 3758 | spin_lock_init(&chip->reg_lock); |
3757 | #ifdef CONFIG_SND_CS46XX_NEW_DSP | 3759 | #ifdef CONFIG_SND_CS46XX_NEW_DSP |
3758 | init_MUTEX(&chip->spos_mutex); | 3760 | mutex_init(&chip->spos_mutex); |
3759 | #endif | 3761 | #endif |
3760 | chip->card = card; | 3762 | chip->card = card; |
3761 | chip->pci = pci; | 3763 | chip->pci = pci; |
diff --git a/sound/pci/cs46xx/dsp_spos.c b/sound/pci/cs46xx/dsp_spos.c index 445a448949e7..8726a68051e7 100644 --- a/sound/pci/cs46xx/dsp_spos.c +++ b/sound/pci/cs46xx/dsp_spos.c | |||
@@ -28,6 +28,8 @@ | |||
28 | #include <linux/init.h> | 28 | #include <linux/init.h> |
29 | #include <linux/slab.h> | 29 | #include <linux/slab.h> |
30 | #include <linux/vmalloc.h> | 30 | #include <linux/vmalloc.h> |
31 | #include <linux/mutex.h> | ||
32 | |||
31 | #include <sound/core.h> | 33 | #include <sound/core.h> |
32 | #include <sound/control.h> | 34 | #include <sound/control.h> |
33 | #include <sound/info.h> | 35 | #include <sound/info.h> |
@@ -287,7 +289,7 @@ void cs46xx_dsp_spos_destroy (struct snd_cs46xx * chip) | |||
287 | 289 | ||
288 | snd_assert(ins != NULL, return); | 290 | snd_assert(ins != NULL, return); |
289 | 291 | ||
290 | down(&chip->spos_mutex); | 292 | mutex_lock(&chip->spos_mutex); |
291 | for (i = 0; i < ins->nscb; ++i) { | 293 | for (i = 0; i < ins->nscb; ++i) { |
292 | if (ins->scbs[i].deleted) continue; | 294 | if (ins->scbs[i].deleted) continue; |
293 | 295 | ||
@@ -298,7 +300,7 @@ void cs46xx_dsp_spos_destroy (struct snd_cs46xx * chip) | |||
298 | vfree(ins->symbol_table.symbols); | 300 | vfree(ins->symbol_table.symbols); |
299 | kfree(ins->modules); | 301 | kfree(ins->modules); |
300 | kfree(ins); | 302 | kfree(ins); |
301 | up(&chip->spos_mutex); | 303 | mutex_unlock(&chip->spos_mutex); |
302 | } | 304 | } |
303 | 305 | ||
304 | int cs46xx_dsp_load_module (struct snd_cs46xx * chip, struct dsp_module_desc * module) | 306 | int cs46xx_dsp_load_module (struct snd_cs46xx * chip, struct dsp_module_desc * module) |
@@ -497,7 +499,7 @@ static void cs46xx_dsp_proc_modules_read (struct snd_info_entry *entry, | |||
497 | struct dsp_spos_instance * ins = chip->dsp_spos_instance; | 499 | struct dsp_spos_instance * ins = chip->dsp_spos_instance; |
498 | int i,j; | 500 | int i,j; |
499 | 501 | ||
500 | down(&chip->spos_mutex); | 502 | mutex_lock(&chip->spos_mutex); |
501 | snd_iprintf(buffer, "MODULES:\n"); | 503 | snd_iprintf(buffer, "MODULES:\n"); |
502 | for ( i = 0; i < ins->nmodules; ++i ) { | 504 | for ( i = 0; i < ins->nmodules; ++i ) { |
503 | snd_iprintf(buffer, "\n%s:\n", ins->modules[i].module_name); | 505 | snd_iprintf(buffer, "\n%s:\n", ins->modules[i].module_name); |
@@ -510,7 +512,7 @@ static void cs46xx_dsp_proc_modules_read (struct snd_info_entry *entry, | |||
510 | desc->segment_type,desc->offset, desc->size); | 512 | desc->segment_type,desc->offset, desc->size); |
511 | } | 513 | } |
512 | } | 514 | } |
513 | up(&chip->spos_mutex); | 515 | mutex_unlock(&chip->spos_mutex); |
514 | } | 516 | } |
515 | 517 | ||
516 | static void cs46xx_dsp_proc_task_tree_read (struct snd_info_entry *entry, | 518 | static void cs46xx_dsp_proc_task_tree_read (struct snd_info_entry *entry, |
@@ -521,7 +523,7 @@ static void cs46xx_dsp_proc_task_tree_read (struct snd_info_entry *entry, | |||
521 | int i, j, col; | 523 | int i, j, col; |
522 | void __iomem *dst = chip->region.idx[1].remap_addr + DSP_PARAMETER_BYTE_OFFSET; | 524 | void __iomem *dst = chip->region.idx[1].remap_addr + DSP_PARAMETER_BYTE_OFFSET; |
523 | 525 | ||
524 | down(&chip->spos_mutex); | 526 | mutex_lock(&chip->spos_mutex); |
525 | snd_iprintf(buffer, "TASK TREES:\n"); | 527 | snd_iprintf(buffer, "TASK TREES:\n"); |
526 | for ( i = 0; i < ins->ntask; ++i) { | 528 | for ( i = 0; i < ins->ntask; ++i) { |
527 | snd_iprintf(buffer,"\n%04x %s:\n",ins->tasks[i].address,ins->tasks[i].task_name); | 529 | snd_iprintf(buffer,"\n%04x %s:\n",ins->tasks[i].address,ins->tasks[i].task_name); |
@@ -538,7 +540,7 @@ static void cs46xx_dsp_proc_task_tree_read (struct snd_info_entry *entry, | |||
538 | } | 540 | } |
539 | 541 | ||
540 | snd_iprintf(buffer,"\n"); | 542 | snd_iprintf(buffer,"\n"); |
541 | up(&chip->spos_mutex); | 543 | mutex_unlock(&chip->spos_mutex); |
542 | } | 544 | } |
543 | 545 | ||
544 | static void cs46xx_dsp_proc_scb_read (struct snd_info_entry *entry, | 546 | static void cs46xx_dsp_proc_scb_read (struct snd_info_entry *entry, |
@@ -548,7 +550,7 @@ static void cs46xx_dsp_proc_scb_read (struct snd_info_entry *entry, | |||
548 | struct dsp_spos_instance * ins = chip->dsp_spos_instance; | 550 | struct dsp_spos_instance * ins = chip->dsp_spos_instance; |
549 | int i; | 551 | int i; |
550 | 552 | ||
551 | down(&chip->spos_mutex); | 553 | mutex_lock(&chip->spos_mutex); |
552 | snd_iprintf(buffer, "SCB's:\n"); | 554 | snd_iprintf(buffer, "SCB's:\n"); |
553 | for ( i = 0; i < ins->nscb; ++i) { | 555 | for ( i = 0; i < ins->nscb; ++i) { |
554 | if (ins->scbs[i].deleted) | 556 | if (ins->scbs[i].deleted) |
@@ -571,7 +573,7 @@ static void cs46xx_dsp_proc_scb_read (struct snd_info_entry *entry, | |||
571 | } | 573 | } |
572 | 574 | ||
573 | snd_iprintf(buffer,"\n"); | 575 | snd_iprintf(buffer,"\n"); |
574 | up(&chip->spos_mutex); | 576 | mutex_unlock(&chip->spos_mutex); |
575 | } | 577 | } |
576 | 578 | ||
577 | static void cs46xx_dsp_proc_parameter_dump_read (struct snd_info_entry *entry, | 579 | static void cs46xx_dsp_proc_parameter_dump_read (struct snd_info_entry *entry, |
@@ -852,14 +854,14 @@ int cs46xx_dsp_proc_init (struct snd_card *card, struct snd_cs46xx *chip) | |||
852 | } | 854 | } |
853 | ins->proc_scb_info_entry = entry; | 855 | ins->proc_scb_info_entry = entry; |
854 | 856 | ||
855 | down(&chip->spos_mutex); | 857 | mutex_lock(&chip->spos_mutex); |
856 | /* register/update SCB's entries on proc */ | 858 | /* register/update SCB's entries on proc */ |
857 | for (i = 0; i < ins->nscb; ++i) { | 859 | for (i = 0; i < ins->nscb; ++i) { |
858 | if (ins->scbs[i].deleted) continue; | 860 | if (ins->scbs[i].deleted) continue; |
859 | 861 | ||
860 | cs46xx_dsp_proc_register_scb_desc (chip, (ins->scbs + i)); | 862 | cs46xx_dsp_proc_register_scb_desc (chip, (ins->scbs + i)); |
861 | } | 863 | } |
862 | up(&chip->spos_mutex); | 864 | mutex_unlock(&chip->spos_mutex); |
863 | 865 | ||
864 | return 0; | 866 | return 0; |
865 | } | 867 | } |
@@ -899,12 +901,12 @@ int cs46xx_dsp_proc_done (struct snd_cs46xx *chip) | |||
899 | ins->proc_task_info_entry = NULL; | 901 | ins->proc_task_info_entry = NULL; |
900 | } | 902 | } |
901 | 903 | ||
902 | down(&chip->spos_mutex); | 904 | mutex_lock(&chip->spos_mutex); |
903 | for (i = 0; i < ins->nscb; ++i) { | 905 | for (i = 0; i < ins->nscb; ++i) { |
904 | if (ins->scbs[i].deleted) continue; | 906 | if (ins->scbs[i].deleted) continue; |
905 | cs46xx_dsp_proc_free_scb_desc ( (ins->scbs + i) ); | 907 | cs46xx_dsp_proc_free_scb_desc ( (ins->scbs + i) ); |
906 | } | 908 | } |
907 | up(&chip->spos_mutex); | 909 | mutex_unlock(&chip->spos_mutex); |
908 | 910 | ||
909 | if (ins->proc_dsp_dir) { | 911 | if (ins->proc_dsp_dir) { |
910 | snd_info_unregister (ins->proc_dsp_dir); | 912 | snd_info_unregister (ins->proc_dsp_dir); |
@@ -1694,7 +1696,7 @@ int cs46xx_dsp_enable_spdif_in (struct snd_cs46xx *chip) | |||
1694 | snd_assert (ins->asynch_rx_scb == NULL,return -EINVAL); | 1696 | snd_assert (ins->asynch_rx_scb == NULL,return -EINVAL); |
1695 | snd_assert (ins->spdif_in_src != NULL,return -EINVAL); | 1697 | snd_assert (ins->spdif_in_src != NULL,return -EINVAL); |
1696 | 1698 | ||
1697 | down(&chip->spos_mutex); | 1699 | mutex_lock(&chip->spos_mutex); |
1698 | 1700 | ||
1699 | if ( ! (ins->spdif_status_out & DSP_SPDIF_STATUS_INPUT_CTRL_ENABLED) ) { | 1701 | if ( ! (ins->spdif_status_out & DSP_SPDIF_STATUS_INPUT_CTRL_ENABLED) ) { |
1700 | /* time countdown enable */ | 1702 | /* time countdown enable */ |
@@ -1738,7 +1740,7 @@ int cs46xx_dsp_enable_spdif_in (struct snd_cs46xx *chip) | |||
1738 | 1740 | ||
1739 | /* monitor state */ | 1741 | /* monitor state */ |
1740 | ins->spdif_status_in = 1; | 1742 | ins->spdif_status_in = 1; |
1741 | up(&chip->spos_mutex); | 1743 | mutex_unlock(&chip->spos_mutex); |
1742 | 1744 | ||
1743 | return 0; | 1745 | return 0; |
1744 | } | 1746 | } |
@@ -1750,7 +1752,7 @@ int cs46xx_dsp_disable_spdif_in (struct snd_cs46xx *chip) | |||
1750 | snd_assert (ins->asynch_rx_scb != NULL, return -EINVAL); | 1752 | snd_assert (ins->asynch_rx_scb != NULL, return -EINVAL); |
1751 | snd_assert (ins->spdif_in_src != NULL,return -EINVAL); | 1753 | snd_assert (ins->spdif_in_src != NULL,return -EINVAL); |
1752 | 1754 | ||
1753 | down(&chip->spos_mutex); | 1755 | mutex_lock(&chip->spos_mutex); |
1754 | 1756 | ||
1755 | /* Remove the asynchronous receiver SCB */ | 1757 | /* Remove the asynchronous receiver SCB */ |
1756 | cs46xx_dsp_remove_scb (chip,ins->asynch_rx_scb); | 1758 | cs46xx_dsp_remove_scb (chip,ins->asynch_rx_scb); |
@@ -1760,7 +1762,7 @@ int cs46xx_dsp_disable_spdif_in (struct snd_cs46xx *chip) | |||
1760 | 1762 | ||
1761 | /* monitor state */ | 1763 | /* monitor state */ |
1762 | ins->spdif_status_in = 0; | 1764 | ins->spdif_status_in = 0; |
1763 | up(&chip->spos_mutex); | 1765 | mutex_unlock(&chip->spos_mutex); |
1764 | 1766 | ||
1765 | /* restore amplifier */ | 1767 | /* restore amplifier */ |
1766 | chip->active_ctrl(chip, -1); | 1768 | chip->active_ctrl(chip, -1); |
@@ -1776,10 +1778,10 @@ int cs46xx_dsp_enable_pcm_capture (struct snd_cs46xx *chip) | |||
1776 | snd_assert (ins->pcm_input == NULL,return -EINVAL); | 1778 | snd_assert (ins->pcm_input == NULL,return -EINVAL); |
1777 | snd_assert (ins->ref_snoop_scb != NULL,return -EINVAL); | 1779 | snd_assert (ins->ref_snoop_scb != NULL,return -EINVAL); |
1778 | 1780 | ||
1779 | down(&chip->spos_mutex); | 1781 | mutex_lock(&chip->spos_mutex); |
1780 | ins->pcm_input = cs46xx_add_record_source(chip,ins->ref_snoop_scb,PCMSERIALIN_PCM_SCB_ADDR, | 1782 | ins->pcm_input = cs46xx_add_record_source(chip,ins->ref_snoop_scb,PCMSERIALIN_PCM_SCB_ADDR, |
1781 | "PCMSerialInput_Wave"); | 1783 | "PCMSerialInput_Wave"); |
1782 | up(&chip->spos_mutex); | 1784 | mutex_unlock(&chip->spos_mutex); |
1783 | 1785 | ||
1784 | return 0; | 1786 | return 0; |
1785 | } | 1787 | } |
@@ -1790,10 +1792,10 @@ int cs46xx_dsp_disable_pcm_capture (struct snd_cs46xx *chip) | |||
1790 | 1792 | ||
1791 | snd_assert (ins->pcm_input != NULL,return -EINVAL); | 1793 | snd_assert (ins->pcm_input != NULL,return -EINVAL); |
1792 | 1794 | ||
1793 | down(&chip->spos_mutex); | 1795 | mutex_lock(&chip->spos_mutex); |
1794 | cs46xx_dsp_remove_scb (chip,ins->pcm_input); | 1796 | cs46xx_dsp_remove_scb (chip,ins->pcm_input); |
1795 | ins->pcm_input = NULL; | 1797 | ins->pcm_input = NULL; |
1796 | up(&chip->spos_mutex); | 1798 | mutex_unlock(&chip->spos_mutex); |
1797 | 1799 | ||
1798 | return 0; | 1800 | return 0; |
1799 | } | 1801 | } |
@@ -1805,10 +1807,10 @@ int cs46xx_dsp_enable_adc_capture (struct snd_cs46xx *chip) | |||
1805 | snd_assert (ins->adc_input == NULL,return -EINVAL); | 1807 | snd_assert (ins->adc_input == NULL,return -EINVAL); |
1806 | snd_assert (ins->codec_in_scb != NULL,return -EINVAL); | 1808 | snd_assert (ins->codec_in_scb != NULL,return -EINVAL); |
1807 | 1809 | ||
1808 | down(&chip->spos_mutex); | 1810 | mutex_lock(&chip->spos_mutex); |
1809 | ins->adc_input = cs46xx_add_record_source(chip,ins->codec_in_scb,PCMSERIALIN_SCB_ADDR, | 1811 | ins->adc_input = cs46xx_add_record_source(chip,ins->codec_in_scb,PCMSERIALIN_SCB_ADDR, |
1810 | "PCMSerialInput_ADC"); | 1812 | "PCMSerialInput_ADC"); |
1811 | up(&chip->spos_mutex); | 1813 | mutex_unlock(&chip->spos_mutex); |
1812 | 1814 | ||
1813 | return 0; | 1815 | return 0; |
1814 | } | 1816 | } |
@@ -1819,10 +1821,10 @@ int cs46xx_dsp_disable_adc_capture (struct snd_cs46xx *chip) | |||
1819 | 1821 | ||
1820 | snd_assert (ins->adc_input != NULL,return -EINVAL); | 1822 | snd_assert (ins->adc_input != NULL,return -EINVAL); |
1821 | 1823 | ||
1822 | down(&chip->spos_mutex); | 1824 | mutex_lock(&chip->spos_mutex); |
1823 | cs46xx_dsp_remove_scb (chip,ins->adc_input); | 1825 | cs46xx_dsp_remove_scb (chip,ins->adc_input); |
1824 | ins->adc_input = NULL; | 1826 | ins->adc_input = NULL; |
1825 | up(&chip->spos_mutex); | 1827 | mutex_unlock(&chip->spos_mutex); |
1826 | 1828 | ||
1827 | return 0; | 1829 | return 0; |
1828 | } | 1830 | } |
@@ -1869,7 +1871,7 @@ int cs46xx_dsp_set_dac_volume (struct snd_cs46xx * chip, u16 left, u16 right) | |||
1869 | struct dsp_spos_instance * ins = chip->dsp_spos_instance; | 1871 | struct dsp_spos_instance * ins = chip->dsp_spos_instance; |
1870 | struct dsp_scb_descriptor * scb; | 1872 | struct dsp_scb_descriptor * scb; |
1871 | 1873 | ||
1872 | down(&chip->spos_mutex); | 1874 | mutex_lock(&chip->spos_mutex); |
1873 | 1875 | ||
1874 | /* main output */ | 1876 | /* main output */ |
1875 | scb = ins->master_mix_scb->sub_list_ptr; | 1877 | scb = ins->master_mix_scb->sub_list_ptr; |
@@ -1888,7 +1890,7 @@ int cs46xx_dsp_set_dac_volume (struct snd_cs46xx * chip, u16 left, u16 right) | |||
1888 | ins->dac_volume_left = left; | 1890 | ins->dac_volume_left = left; |
1889 | ins->dac_volume_right = right; | 1891 | ins->dac_volume_right = right; |
1890 | 1892 | ||
1891 | up(&chip->spos_mutex); | 1893 | mutex_unlock(&chip->spos_mutex); |
1892 | 1894 | ||
1893 | return 0; | 1895 | return 0; |
1894 | } | 1896 | } |
@@ -1897,7 +1899,7 @@ int cs46xx_dsp_set_iec958_volume (struct snd_cs46xx * chip, u16 left, u16 right) | |||
1897 | { | 1899 | { |
1898 | struct dsp_spos_instance * ins = chip->dsp_spos_instance; | 1900 | struct dsp_spos_instance * ins = chip->dsp_spos_instance; |
1899 | 1901 | ||
1900 | down(&chip->spos_mutex); | 1902 | mutex_lock(&chip->spos_mutex); |
1901 | 1903 | ||
1902 | if (ins->asynch_rx_scb != NULL) | 1904 | if (ins->asynch_rx_scb != NULL) |
1903 | cs46xx_dsp_scb_set_volume (chip,ins->asynch_rx_scb, | 1905 | cs46xx_dsp_scb_set_volume (chip,ins->asynch_rx_scb, |
@@ -1906,7 +1908,7 @@ int cs46xx_dsp_set_iec958_volume (struct snd_cs46xx * chip, u16 left, u16 right) | |||
1906 | ins->spdif_input_volume_left = left; | 1908 | ins->spdif_input_volume_left = left; |
1907 | ins->spdif_input_volume_right = right; | 1909 | ins->spdif_input_volume_right = right; |
1908 | 1910 | ||
1909 | up(&chip->spos_mutex); | 1911 | mutex_unlock(&chip->spos_mutex); |
1910 | 1912 | ||
1911 | return 0; | 1913 | return 0; |
1912 | } | 1914 | } |
diff --git a/sound/pci/cs46xx/dsp_spos_scb_lib.c b/sound/pci/cs46xx/dsp_spos_scb_lib.c index d4e0fb39bd06..2c4ee45fe10c 100644 --- a/sound/pci/cs46xx/dsp_spos_scb_lib.c +++ b/sound/pci/cs46xx/dsp_spos_scb_lib.c | |||
@@ -28,6 +28,8 @@ | |||
28 | #include <linux/pm.h> | 28 | #include <linux/pm.h> |
29 | #include <linux/init.h> | 29 | #include <linux/init.h> |
30 | #include <linux/slab.h> | 30 | #include <linux/slab.h> |
31 | #include <linux/mutex.h> | ||
32 | |||
31 | #include <sound/core.h> | 33 | #include <sound/core.h> |
32 | #include <sound/control.h> | 34 | #include <sound/control.h> |
33 | #include <sound/info.h> | 35 | #include <sound/info.h> |
@@ -77,7 +79,7 @@ static void cs46xx_dsp_proc_scb_info_read (struct snd_info_entry *entry, | |||
77 | 79 | ||
78 | ins = chip->dsp_spos_instance; | 80 | ins = chip->dsp_spos_instance; |
79 | 81 | ||
80 | down(&chip->spos_mutex); | 82 | mutex_lock(&chip->spos_mutex); |
81 | snd_iprintf(buffer,"%04x %s:\n",scb->address,scb->scb_name); | 83 | snd_iprintf(buffer,"%04x %s:\n",scb->address,scb->scb_name); |
82 | 84 | ||
83 | for (col = 0,j = 0;j < 0x10; j++,col++) { | 85 | for (col = 0,j = 0;j < 0x10; j++,col++) { |
@@ -105,7 +107,7 @@ static void cs46xx_dsp_proc_scb_info_read (struct snd_info_entry *entry, | |||
105 | scb->task_entry->address); | 107 | scb->task_entry->address); |
106 | 108 | ||
107 | snd_iprintf(buffer,"index [%d] ref_count [%d]\n",scb->index,scb->ref_count); | 109 | snd_iprintf(buffer,"index [%d] ref_count [%d]\n",scb->index,scb->ref_count); |
108 | up(&chip->spos_mutex); | 110 | mutex_unlock(&chip->spos_mutex); |
109 | } | 111 | } |
110 | #endif | 112 | #endif |
111 | 113 | ||
diff --git a/sound/pci/emu10k1/emu10k1_main.c b/sound/pci/emu10k1/emu10k1_main.c index 3c7043b7d4c9..103a3f7708b7 100644 --- a/sound/pci/emu10k1/emu10k1_main.c +++ b/sound/pci/emu10k1/emu10k1_main.c | |||
@@ -36,6 +36,8 @@ | |||
36 | #include <linux/pci.h> | 36 | #include <linux/pci.h> |
37 | #include <linux/slab.h> | 37 | #include <linux/slab.h> |
38 | #include <linux/vmalloc.h> | 38 | #include <linux/vmalloc.h> |
39 | #include <linux/mutex.h> | ||
40 | |||
39 | 41 | ||
40 | #include <sound/core.h> | 42 | #include <sound/core.h> |
41 | #include <sound/emu10k1.h> | 43 | #include <sound/emu10k1.h> |
@@ -1097,8 +1099,7 @@ int __devinit snd_emu10k1_create(struct snd_card *card, | |||
1097 | spin_lock_init(&emu->voice_lock); | 1099 | spin_lock_init(&emu->voice_lock); |
1098 | spin_lock_init(&emu->synth_lock); | 1100 | spin_lock_init(&emu->synth_lock); |
1099 | spin_lock_init(&emu->memblk_lock); | 1101 | spin_lock_init(&emu->memblk_lock); |
1100 | init_MUTEX(&emu->ptb_lock); | 1102 | mutex_init(&emu->fx8010.lock); |
1101 | init_MUTEX(&emu->fx8010.lock); | ||
1102 | INIT_LIST_HEAD(&emu->mapped_link_head); | 1103 | INIT_LIST_HEAD(&emu->mapped_link_head); |
1103 | INIT_LIST_HEAD(&emu->mapped_order_link_head); | 1104 | INIT_LIST_HEAD(&emu->mapped_order_link_head); |
1104 | emu->pci = pci; | 1105 | emu->pci = pci; |
diff --git a/sound/pci/emu10k1/emufx.c b/sound/pci/emu10k1/emufx.c index 509837252735..dfba00230d4d 100644 --- a/sound/pci/emu10k1/emufx.c +++ b/sound/pci/emu10k1/emufx.c | |||
@@ -32,6 +32,8 @@ | |||
32 | #include <linux/slab.h> | 32 | #include <linux/slab.h> |
33 | #include <linux/vmalloc.h> | 33 | #include <linux/vmalloc.h> |
34 | #include <linux/init.h> | 34 | #include <linux/init.h> |
35 | #include <linux/mutex.h> | ||
36 | |||
35 | #include <sound/core.h> | 37 | #include <sound/core.h> |
36 | #include <sound/emu10k1.h> | 38 | #include <sound/emu10k1.h> |
37 | 39 | ||
@@ -874,7 +876,7 @@ static int snd_emu10k1_icode_poke(struct snd_emu10k1 *emu, | |||
874 | { | 876 | { |
875 | int err = 0; | 877 | int err = 0; |
876 | 878 | ||
877 | down(&emu->fx8010.lock); | 879 | mutex_lock(&emu->fx8010.lock); |
878 | if ((err = snd_emu10k1_verify_controls(emu, icode)) < 0) | 880 | if ((err = snd_emu10k1_verify_controls(emu, icode)) < 0) |
879 | goto __error; | 881 | goto __error; |
880 | strlcpy(emu->fx8010.name, icode->name, sizeof(emu->fx8010.name)); | 882 | strlcpy(emu->fx8010.name, icode->name, sizeof(emu->fx8010.name)); |
@@ -897,7 +899,7 @@ static int snd_emu10k1_icode_poke(struct snd_emu10k1 *emu, | |||
897 | else | 899 | else |
898 | snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg); | 900 | snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg); |
899 | __error: | 901 | __error: |
900 | up(&emu->fx8010.lock); | 902 | mutex_unlock(&emu->fx8010.lock); |
901 | return err; | 903 | return err; |
902 | } | 904 | } |
903 | 905 | ||
@@ -906,7 +908,7 @@ static int snd_emu10k1_icode_peek(struct snd_emu10k1 *emu, | |||
906 | { | 908 | { |
907 | int err; | 909 | int err; |
908 | 910 | ||
909 | down(&emu->fx8010.lock); | 911 | mutex_lock(&emu->fx8010.lock); |
910 | strlcpy(icode->name, emu->fx8010.name, sizeof(icode->name)); | 912 | strlcpy(icode->name, emu->fx8010.name, sizeof(icode->name)); |
911 | /* ok, do the main job */ | 913 | /* ok, do the main job */ |
912 | err = snd_emu10k1_gpr_peek(emu, icode); | 914 | err = snd_emu10k1_gpr_peek(emu, icode); |
@@ -916,7 +918,7 @@ static int snd_emu10k1_icode_peek(struct snd_emu10k1 *emu, | |||
916 | err = snd_emu10k1_code_peek(emu, icode); | 918 | err = snd_emu10k1_code_peek(emu, icode); |
917 | if (err >= 0) | 919 | if (err >= 0) |
918 | err = snd_emu10k1_list_controls(emu, icode); | 920 | err = snd_emu10k1_list_controls(emu, icode); |
919 | up(&emu->fx8010.lock); | 921 | mutex_unlock(&emu->fx8010.lock); |
920 | return err; | 922 | return err; |
921 | } | 923 | } |
922 | 924 | ||
@@ -932,7 +934,7 @@ static int snd_emu10k1_ipcm_poke(struct snd_emu10k1 *emu, | |||
932 | if (ipcm->channels > 32) | 934 | if (ipcm->channels > 32) |
933 | return -EINVAL; | 935 | return -EINVAL; |
934 | pcm = &emu->fx8010.pcm[ipcm->substream]; | 936 | pcm = &emu->fx8010.pcm[ipcm->substream]; |
935 | down(&emu->fx8010.lock); | 937 | mutex_lock(&emu->fx8010.lock); |
936 | spin_lock_irq(&emu->reg_lock); | 938 | spin_lock_irq(&emu->reg_lock); |
937 | if (pcm->opened) { | 939 | if (pcm->opened) { |
938 | err = -EBUSY; | 940 | err = -EBUSY; |
@@ -962,7 +964,7 @@ static int snd_emu10k1_ipcm_poke(struct snd_emu10k1 *emu, | |||
962 | } | 964 | } |
963 | __error: | 965 | __error: |
964 | spin_unlock_irq(&emu->reg_lock); | 966 | spin_unlock_irq(&emu->reg_lock); |
965 | up(&emu->fx8010.lock); | 967 | mutex_unlock(&emu->fx8010.lock); |
966 | return err; | 968 | return err; |
967 | } | 969 | } |
968 | 970 | ||
@@ -976,7 +978,7 @@ static int snd_emu10k1_ipcm_peek(struct snd_emu10k1 *emu, | |||
976 | if (ipcm->substream >= EMU10K1_FX8010_PCM_COUNT) | 978 | if (ipcm->substream >= EMU10K1_FX8010_PCM_COUNT) |
977 | return -EINVAL; | 979 | return -EINVAL; |
978 | pcm = &emu->fx8010.pcm[ipcm->substream]; | 980 | pcm = &emu->fx8010.pcm[ipcm->substream]; |
979 | down(&emu->fx8010.lock); | 981 | mutex_lock(&emu->fx8010.lock); |
980 | spin_lock_irq(&emu->reg_lock); | 982 | spin_lock_irq(&emu->reg_lock); |
981 | ipcm->channels = pcm->channels; | 983 | ipcm->channels = pcm->channels; |
982 | ipcm->tram_start = pcm->tram_start; | 984 | ipcm->tram_start = pcm->tram_start; |
@@ -992,7 +994,7 @@ static int snd_emu10k1_ipcm_peek(struct snd_emu10k1 *emu, | |||
992 | ipcm->res1 = ipcm->res2 = 0; | 994 | ipcm->res1 = ipcm->res2 = 0; |
993 | ipcm->pad = 0; | 995 | ipcm->pad = 0; |
994 | spin_unlock_irq(&emu->reg_lock); | 996 | spin_unlock_irq(&emu->reg_lock); |
995 | up(&emu->fx8010.lock); | 997 | mutex_unlock(&emu->fx8010.lock); |
996 | return err; | 998 | return err; |
997 | } | 999 | } |
998 | 1000 | ||
@@ -2308,9 +2310,9 @@ static int snd_emu10k1_fx8010_ioctl(struct snd_hwdep * hw, struct file *file, un | |||
2308 | return -EPERM; | 2310 | return -EPERM; |
2309 | if (get_user(addr, (unsigned int __user *)argp)) | 2311 | if (get_user(addr, (unsigned int __user *)argp)) |
2310 | return -EFAULT; | 2312 | return -EFAULT; |
2311 | down(&emu->fx8010.lock); | 2313 | mutex_lock(&emu->fx8010.lock); |
2312 | res = snd_emu10k1_fx8010_tram_setup(emu, addr); | 2314 | res = snd_emu10k1_fx8010_tram_setup(emu, addr); |
2313 | up(&emu->fx8010.lock); | 2315 | mutex_unlock(&emu->fx8010.lock); |
2314 | return res; | 2316 | return res; |
2315 | case SNDRV_EMU10K1_IOCTL_STOP: | 2317 | case SNDRV_EMU10K1_IOCTL_STOP: |
2316 | if (!capable(CAP_SYS_ADMIN)) | 2318 | if (!capable(CAP_SYS_ADMIN)) |
diff --git a/sound/pci/emu10k1/memory.c b/sound/pci/emu10k1/memory.c index 68c795c03109..e7ec98649f04 100644 --- a/sound/pci/emu10k1/memory.c +++ b/sound/pci/emu10k1/memory.c | |||
@@ -24,6 +24,8 @@ | |||
24 | #include <sound/driver.h> | 24 | #include <sound/driver.h> |
25 | #include <linux/pci.h> | 25 | #include <linux/pci.h> |
26 | #include <linux/time.h> | 26 | #include <linux/time.h> |
27 | #include <linux/mutex.h> | ||
28 | |||
27 | #include <sound/core.h> | 29 | #include <sound/core.h> |
28 | #include <sound/emu10k1.h> | 30 | #include <sound/emu10k1.h> |
29 | 31 | ||
@@ -302,10 +304,10 @@ snd_emu10k1_alloc_pages(struct snd_emu10k1 *emu, struct snd_pcm_substream *subst | |||
302 | hdr = emu->memhdr; | 304 | hdr = emu->memhdr; |
303 | snd_assert(hdr, return NULL); | 305 | snd_assert(hdr, return NULL); |
304 | 306 | ||
305 | down(&hdr->block_mutex); | 307 | mutex_lock(&hdr->block_mutex); |
306 | blk = search_empty(emu, runtime->dma_bytes); | 308 | blk = search_empty(emu, runtime->dma_bytes); |
307 | if (blk == NULL) { | 309 | if (blk == NULL) { |
308 | up(&hdr->block_mutex); | 310 | mutex_unlock(&hdr->block_mutex); |
309 | return NULL; | 311 | return NULL; |
310 | } | 312 | } |
311 | /* fill buffer addresses but pointers are not stored so that | 313 | /* fill buffer addresses but pointers are not stored so that |
@@ -318,14 +320,14 @@ snd_emu10k1_alloc_pages(struct snd_emu10k1 *emu, struct snd_pcm_substream *subst | |||
318 | if (idx >= sgbuf->pages) { | 320 | if (idx >= sgbuf->pages) { |
319 | printk(KERN_ERR "emu: pages overflow! (%d-%d) for %d\n", | 321 | printk(KERN_ERR "emu: pages overflow! (%d-%d) for %d\n", |
320 | blk->first_page, blk->last_page, sgbuf->pages); | 322 | blk->first_page, blk->last_page, sgbuf->pages); |
321 | up(&hdr->block_mutex); | 323 | mutex_unlock(&hdr->block_mutex); |
322 | return NULL; | 324 | return NULL; |
323 | } | 325 | } |
324 | #endif | 326 | #endif |
325 | addr = sgbuf->table[idx].addr; | 327 | addr = sgbuf->table[idx].addr; |
326 | if (! is_valid_page(emu, addr)) { | 328 | if (! is_valid_page(emu, addr)) { |
327 | printk(KERN_ERR "emu: failure page = %d\n", idx); | 329 | printk(KERN_ERR "emu: failure page = %d\n", idx); |
328 | up(&hdr->block_mutex); | 330 | mutex_unlock(&hdr->block_mutex); |
329 | return NULL; | 331 | return NULL; |
330 | } | 332 | } |
331 | emu->page_addr_table[page] = addr; | 333 | emu->page_addr_table[page] = addr; |
@@ -337,10 +339,10 @@ snd_emu10k1_alloc_pages(struct snd_emu10k1 *emu, struct snd_pcm_substream *subst | |||
337 | err = snd_emu10k1_memblk_map(emu, blk); | 339 | err = snd_emu10k1_memblk_map(emu, blk); |
338 | if (err < 0) { | 340 | if (err < 0) { |
339 | __snd_util_mem_free(hdr, (struct snd_util_memblk *)blk); | 341 | __snd_util_mem_free(hdr, (struct snd_util_memblk *)blk); |
340 | up(&hdr->block_mutex); | 342 | mutex_unlock(&hdr->block_mutex); |
341 | return NULL; | 343 | return NULL; |
342 | } | 344 | } |
343 | up(&hdr->block_mutex); | 345 | mutex_unlock(&hdr->block_mutex); |
344 | return (struct snd_util_memblk *)blk; | 346 | return (struct snd_util_memblk *)blk; |
345 | } | 347 | } |
346 | 348 | ||
@@ -369,19 +371,19 @@ snd_emu10k1_synth_alloc(struct snd_emu10k1 *hw, unsigned int size) | |||
369 | struct snd_emu10k1_memblk *blk; | 371 | struct snd_emu10k1_memblk *blk; |
370 | struct snd_util_memhdr *hdr = hw->memhdr; | 372 | struct snd_util_memhdr *hdr = hw->memhdr; |
371 | 373 | ||
372 | down(&hdr->block_mutex); | 374 | mutex_lock(&hdr->block_mutex); |
373 | blk = (struct snd_emu10k1_memblk *)__snd_util_mem_alloc(hdr, size); | 375 | blk = (struct snd_emu10k1_memblk *)__snd_util_mem_alloc(hdr, size); |
374 | if (blk == NULL) { | 376 | if (blk == NULL) { |
375 | up(&hdr->block_mutex); | 377 | mutex_unlock(&hdr->block_mutex); |
376 | return NULL; | 378 | return NULL; |
377 | } | 379 | } |
378 | if (synth_alloc_pages(hw, blk)) { | 380 | if (synth_alloc_pages(hw, blk)) { |
379 | __snd_util_mem_free(hdr, (struct snd_util_memblk *)blk); | 381 | __snd_util_mem_free(hdr, (struct snd_util_memblk *)blk); |
380 | up(&hdr->block_mutex); | 382 | mutex_unlock(&hdr->block_mutex); |
381 | return NULL; | 383 | return NULL; |
382 | } | 384 | } |
383 | snd_emu10k1_memblk_map(hw, blk); | 385 | snd_emu10k1_memblk_map(hw, blk); |
384 | up(&hdr->block_mutex); | 386 | mutex_unlock(&hdr->block_mutex); |
385 | return (struct snd_util_memblk *)blk; | 387 | return (struct snd_util_memblk *)blk; |
386 | } | 388 | } |
387 | 389 | ||
@@ -396,14 +398,14 @@ snd_emu10k1_synth_free(struct snd_emu10k1 *emu, struct snd_util_memblk *memblk) | |||
396 | struct snd_emu10k1_memblk *blk = (struct snd_emu10k1_memblk *)memblk; | 398 | struct snd_emu10k1_memblk *blk = (struct snd_emu10k1_memblk *)memblk; |
397 | unsigned long flags; | 399 | unsigned long flags; |
398 | 400 | ||
399 | down(&hdr->block_mutex); | 401 | mutex_lock(&hdr->block_mutex); |
400 | spin_lock_irqsave(&emu->memblk_lock, flags); | 402 | spin_lock_irqsave(&emu->memblk_lock, flags); |
401 | if (blk->mapped_page >= 0) | 403 | if (blk->mapped_page >= 0) |
402 | unmap_memblk(emu, blk); | 404 | unmap_memblk(emu, blk); |
403 | spin_unlock_irqrestore(&emu->memblk_lock, flags); | 405 | spin_unlock_irqrestore(&emu->memblk_lock, flags); |
404 | synth_free_pages(emu, blk); | 406 | synth_free_pages(emu, blk); |
405 | __snd_util_mem_free(hdr, memblk); | 407 | __snd_util_mem_free(hdr, memblk); |
406 | up(&hdr->block_mutex); | 408 | mutex_unlock(&hdr->block_mutex); |
407 | return 0; | 409 | return 0; |
408 | } | 410 | } |
409 | 411 | ||
diff --git a/sound/pci/ens1370.c b/sound/pci/ens1370.c index bee382995fe9..a5533c86b0b6 100644 --- a/sound/pci/ens1370.c +++ b/sound/pci/ens1370.c | |||
@@ -35,6 +35,8 @@ | |||
35 | #include <linux/slab.h> | 35 | #include <linux/slab.h> |
36 | #include <linux/gameport.h> | 36 | #include <linux/gameport.h> |
37 | #include <linux/moduleparam.h> | 37 | #include <linux/moduleparam.h> |
38 | #include <linux/mutex.h> | ||
39 | |||
38 | #include <sound/core.h> | 40 | #include <sound/core.h> |
39 | #include <sound/control.h> | 41 | #include <sound/control.h> |
40 | #include <sound/pcm.h> | 42 | #include <sound/pcm.h> |
@@ -379,7 +381,7 @@ MODULE_PARM_DESC(lineio, "Line In to Rear Out (0 = auto, 1 = force)."); | |||
379 | 381 | ||
380 | struct ensoniq { | 382 | struct ensoniq { |
381 | spinlock_t reg_lock; | 383 | spinlock_t reg_lock; |
382 | struct semaphore src_mutex; | 384 | struct mutex src_mutex; |
383 | 385 | ||
384 | int irq; | 386 | int irq; |
385 | 387 | ||
@@ -609,7 +611,7 @@ static void snd_es1371_codec_write(struct snd_ac97 *ac97, | |||
609 | struct ensoniq *ensoniq = ac97->private_data; | 611 | struct ensoniq *ensoniq = ac97->private_data; |
610 | unsigned int t, x; | 612 | unsigned int t, x; |
611 | 613 | ||
612 | down(&ensoniq->src_mutex); | 614 | mutex_lock(&ensoniq->src_mutex); |
613 | for (t = 0; t < POLL_COUNT; t++) { | 615 | for (t = 0; t < POLL_COUNT; t++) { |
614 | if (!(inl(ES_REG(ensoniq, 1371_CODEC)) & ES_1371_CODEC_WIP)) { | 616 | if (!(inl(ES_REG(ensoniq, 1371_CODEC)) & ES_1371_CODEC_WIP)) { |
615 | /* save the current state for latter */ | 617 | /* save the current state for latter */ |
@@ -634,11 +636,11 @@ static void snd_es1371_codec_write(struct snd_ac97 *ac97, | |||
634 | /* restore SRC reg */ | 636 | /* restore SRC reg */ |
635 | snd_es1371_wait_src_ready(ensoniq); | 637 | snd_es1371_wait_src_ready(ensoniq); |
636 | outl(x, ES_REG(ensoniq, 1371_SMPRATE)); | 638 | outl(x, ES_REG(ensoniq, 1371_SMPRATE)); |
637 | up(&ensoniq->src_mutex); | 639 | mutex_unlock(&ensoniq->src_mutex); |
638 | return; | 640 | return; |
639 | } | 641 | } |
640 | } | 642 | } |
641 | up(&ensoniq->src_mutex); | 643 | mutex_unlock(&ensoniq->src_mutex); |
642 | snd_printk(KERN_ERR "codec write timeout at 0x%lx [0x%x]\n", | 644 | snd_printk(KERN_ERR "codec write timeout at 0x%lx [0x%x]\n", |
643 | ES_REG(ensoniq, 1371_CODEC), inl(ES_REG(ensoniq, 1371_CODEC))); | 645 | ES_REG(ensoniq, 1371_CODEC), inl(ES_REG(ensoniq, 1371_CODEC))); |
644 | } | 646 | } |
@@ -650,7 +652,7 @@ static unsigned short snd_es1371_codec_read(struct snd_ac97 *ac97, | |||
650 | unsigned int t, x, fail = 0; | 652 | unsigned int t, x, fail = 0; |
651 | 653 | ||
652 | __again: | 654 | __again: |
653 | down(&ensoniq->src_mutex); | 655 | mutex_lock(&ensoniq->src_mutex); |
654 | for (t = 0; t < POLL_COUNT; t++) { | 656 | for (t = 0; t < POLL_COUNT; t++) { |
655 | if (!(inl(ES_REG(ensoniq, 1371_CODEC)) & ES_1371_CODEC_WIP)) { | 657 | if (!(inl(ES_REG(ensoniq, 1371_CODEC)) & ES_1371_CODEC_WIP)) { |
656 | /* save the current state for latter */ | 658 | /* save the current state for latter */ |
@@ -683,11 +685,11 @@ static unsigned short snd_es1371_codec_read(struct snd_ac97 *ac97, | |||
683 | /* now wait for the stinkin' data (RDY) */ | 685 | /* now wait for the stinkin' data (RDY) */ |
684 | for (t = 0; t < POLL_COUNT; t++) { | 686 | for (t = 0; t < POLL_COUNT; t++) { |
685 | if ((x = inl(ES_REG(ensoniq, 1371_CODEC))) & ES_1371_CODEC_RDY) { | 687 | if ((x = inl(ES_REG(ensoniq, 1371_CODEC))) & ES_1371_CODEC_RDY) { |
686 | up(&ensoniq->src_mutex); | 688 | mutex_unlock(&ensoniq->src_mutex); |
687 | return ES_1371_CODEC_READ(x); | 689 | return ES_1371_CODEC_READ(x); |
688 | } | 690 | } |
689 | } | 691 | } |
690 | up(&ensoniq->src_mutex); | 692 | mutex_unlock(&ensoniq->src_mutex); |
691 | if (++fail > 10) { | 693 | if (++fail > 10) { |
692 | snd_printk(KERN_ERR "codec read timeout (final) " | 694 | snd_printk(KERN_ERR "codec read timeout (final) " |
693 | "at 0x%lx, reg = 0x%x [0x%x]\n", | 695 | "at 0x%lx, reg = 0x%x [0x%x]\n", |
@@ -698,7 +700,7 @@ static unsigned short snd_es1371_codec_read(struct snd_ac97 *ac97, | |||
698 | goto __again; | 700 | goto __again; |
699 | } | 701 | } |
700 | } | 702 | } |
701 | up(&ensoniq->src_mutex); | 703 | mutex_unlock(&ensoniq->src_mutex); |
702 | snd_printk(KERN_ERR "es1371: codec read timeout at 0x%lx [0x%x]\n", | 704 | snd_printk(KERN_ERR "es1371: codec read timeout at 0x%lx [0x%x]\n", |
703 | ES_REG(ensoniq, 1371_CODEC), inl(ES_REG(ensoniq, 1371_CODEC))); | 705 | ES_REG(ensoniq, 1371_CODEC), inl(ES_REG(ensoniq, 1371_CODEC))); |
704 | return 0; | 706 | return 0; |
@@ -717,7 +719,7 @@ static void snd_es1371_adc_rate(struct ensoniq * ensoniq, unsigned int rate) | |||
717 | { | 719 | { |
718 | unsigned int n, truncm, freq, result; | 720 | unsigned int n, truncm, freq, result; |
719 | 721 | ||
720 | down(&ensoniq->src_mutex); | 722 | mutex_lock(&ensoniq->src_mutex); |
721 | n = rate / 3000; | 723 | n = rate / 3000; |
722 | if ((1 << n) & ((1 << 15) | (1 << 13) | (1 << 11) | (1 << 9))) | 724 | if ((1 << n) & ((1 << 15) | (1 << 13) | (1 << 11) | (1 << 9))) |
723 | n--; | 725 | n--; |
@@ -742,14 +744,14 @@ static void snd_es1371_adc_rate(struct ensoniq * ensoniq, unsigned int rate) | |||
742 | snd_es1371_src_write(ensoniq, ES_SMPREG_ADC + ES_SMPREG_VFREQ_FRAC, freq & 0x7fff); | 744 | snd_es1371_src_write(ensoniq, ES_SMPREG_ADC + ES_SMPREG_VFREQ_FRAC, freq & 0x7fff); |
743 | snd_es1371_src_write(ensoniq, ES_SMPREG_VOL_ADC, n << 8); | 745 | snd_es1371_src_write(ensoniq, ES_SMPREG_VOL_ADC, n << 8); |
744 | snd_es1371_src_write(ensoniq, ES_SMPREG_VOL_ADC + 1, n << 8); | 746 | snd_es1371_src_write(ensoniq, ES_SMPREG_VOL_ADC + 1, n << 8); |
745 | up(&ensoniq->src_mutex); | 747 | mutex_unlock(&ensoniq->src_mutex); |
746 | } | 748 | } |
747 | 749 | ||
748 | static void snd_es1371_dac1_rate(struct ensoniq * ensoniq, unsigned int rate) | 750 | static void snd_es1371_dac1_rate(struct ensoniq * ensoniq, unsigned int rate) |
749 | { | 751 | { |
750 | unsigned int freq, r; | 752 | unsigned int freq, r; |
751 | 753 | ||
752 | down(&ensoniq->src_mutex); | 754 | mutex_lock(&ensoniq->src_mutex); |
753 | freq = ((rate << 15) + 1500) / 3000; | 755 | freq = ((rate << 15) + 1500) / 3000; |
754 | r = (snd_es1371_wait_src_ready(ensoniq) & (ES_1371_SRC_DISABLE | | 756 | r = (snd_es1371_wait_src_ready(ensoniq) & (ES_1371_SRC_DISABLE | |
755 | ES_1371_DIS_P2 | ES_1371_DIS_R1)) | | 757 | ES_1371_DIS_P2 | ES_1371_DIS_R1)) | |
@@ -763,14 +765,14 @@ static void snd_es1371_dac1_rate(struct ensoniq * ensoniq, unsigned int rate) | |||
763 | r = (snd_es1371_wait_src_ready(ensoniq) & (ES_1371_SRC_DISABLE | | 765 | r = (snd_es1371_wait_src_ready(ensoniq) & (ES_1371_SRC_DISABLE | |
764 | ES_1371_DIS_P2 | ES_1371_DIS_R1)); | 766 | ES_1371_DIS_P2 | ES_1371_DIS_R1)); |
765 | outl(r, ES_REG(ensoniq, 1371_SMPRATE)); | 767 | outl(r, ES_REG(ensoniq, 1371_SMPRATE)); |
766 | up(&ensoniq->src_mutex); | 768 | mutex_unlock(&ensoniq->src_mutex); |
767 | } | 769 | } |
768 | 770 | ||
769 | static void snd_es1371_dac2_rate(struct ensoniq * ensoniq, unsigned int rate) | 771 | static void snd_es1371_dac2_rate(struct ensoniq * ensoniq, unsigned int rate) |
770 | { | 772 | { |
771 | unsigned int freq, r; | 773 | unsigned int freq, r; |
772 | 774 | ||
773 | down(&ensoniq->src_mutex); | 775 | mutex_lock(&ensoniq->src_mutex); |
774 | freq = ((rate << 15) + 1500) / 3000; | 776 | freq = ((rate << 15) + 1500) / 3000; |
775 | r = (snd_es1371_wait_src_ready(ensoniq) & (ES_1371_SRC_DISABLE | | 777 | r = (snd_es1371_wait_src_ready(ensoniq) & (ES_1371_SRC_DISABLE | |
776 | ES_1371_DIS_P1 | ES_1371_DIS_R1)) | | 778 | ES_1371_DIS_P1 | ES_1371_DIS_R1)) | |
@@ -785,7 +787,7 @@ static void snd_es1371_dac2_rate(struct ensoniq * ensoniq, unsigned int rate) | |||
785 | r = (snd_es1371_wait_src_ready(ensoniq) & (ES_1371_SRC_DISABLE | | 787 | r = (snd_es1371_wait_src_ready(ensoniq) & (ES_1371_SRC_DISABLE | |
786 | ES_1371_DIS_P1 | ES_1371_DIS_R1)); | 788 | ES_1371_DIS_P1 | ES_1371_DIS_R1)); |
787 | outl(r, ES_REG(ensoniq, 1371_SMPRATE)); | 789 | outl(r, ES_REG(ensoniq, 1371_SMPRATE)); |
788 | up(&ensoniq->src_mutex); | 790 | mutex_unlock(&ensoniq->src_mutex); |
789 | } | 791 | } |
790 | 792 | ||
791 | #endif /* CHIP1371 */ | 793 | #endif /* CHIP1371 */ |
@@ -2123,7 +2125,7 @@ static int __devinit snd_ensoniq_create(struct snd_card *card, | |||
2123 | return -ENOMEM; | 2125 | return -ENOMEM; |
2124 | } | 2126 | } |
2125 | spin_lock_init(&ensoniq->reg_lock); | 2127 | spin_lock_init(&ensoniq->reg_lock); |
2126 | init_MUTEX(&ensoniq->src_mutex); | 2128 | mutex_init(&ensoniq->src_mutex); |
2127 | ensoniq->card = card; | 2129 | ensoniq->card = card; |
2128 | ensoniq->pci = pci; | 2130 | ensoniq->pci = pci; |
2129 | ensoniq->irq = -1; | 2131 | ensoniq->irq = -1; |
diff --git a/sound/pci/es1968.c b/sound/pci/es1968.c index 3747a436f0cd..6a265ab3894e 100644 --- a/sound/pci/es1968.c +++ b/sound/pci/es1968.c | |||
@@ -103,6 +103,8 @@ | |||
103 | #include <linux/slab.h> | 103 | #include <linux/slab.h> |
104 | #include <linux/gameport.h> | 104 | #include <linux/gameport.h> |
105 | #include <linux/moduleparam.h> | 105 | #include <linux/moduleparam.h> |
106 | #include <linux/mutex.h> | ||
107 | |||
106 | #include <sound/core.h> | 108 | #include <sound/core.h> |
107 | #include <sound/pcm.h> | 109 | #include <sound/pcm.h> |
108 | #include <sound/mpu401.h> | 110 | #include <sound/mpu401.h> |
@@ -569,7 +571,7 @@ struct es1968 { | |||
569 | u16 maestro_map[32]; | 571 | u16 maestro_map[32]; |
570 | int bobclient; /* active timer instancs */ | 572 | int bobclient; /* active timer instancs */ |
571 | int bob_freq; /* timer frequency */ | 573 | int bob_freq; /* timer frequency */ |
572 | struct semaphore memory_mutex; /* memory lock */ | 574 | struct mutex memory_mutex; /* memory lock */ |
573 | 575 | ||
574 | /* APU states */ | 576 | /* APU states */ |
575 | unsigned char apu[NR_APUS]; | 577 | unsigned char apu[NR_APUS]; |
@@ -1356,13 +1358,13 @@ static int calc_available_memory_size(struct es1968 *chip) | |||
1356 | struct list_head *p; | 1358 | struct list_head *p; |
1357 | int max_size = 0; | 1359 | int max_size = 0; |
1358 | 1360 | ||
1359 | down(&chip->memory_mutex); | 1361 | mutex_lock(&chip->memory_mutex); |
1360 | list_for_each(p, &chip->buf_list) { | 1362 | list_for_each(p, &chip->buf_list) { |
1361 | struct esm_memory *buf = list_entry(p, struct esm_memory, list); | 1363 | struct esm_memory *buf = list_entry(p, struct esm_memory, list); |
1362 | if (buf->empty && buf->buf.bytes > max_size) | 1364 | if (buf->empty && buf->buf.bytes > max_size) |
1363 | max_size = buf->buf.bytes; | 1365 | max_size = buf->buf.bytes; |
1364 | } | 1366 | } |
1365 | up(&chip->memory_mutex); | 1367 | mutex_unlock(&chip->memory_mutex); |
1366 | if (max_size >= 128*1024) | 1368 | if (max_size >= 128*1024) |
1367 | max_size = 127*1024; | 1369 | max_size = 127*1024; |
1368 | return max_size; | 1370 | return max_size; |
@@ -1375,20 +1377,20 @@ static struct esm_memory *snd_es1968_new_memory(struct es1968 *chip, int size) | |||
1375 | struct list_head *p; | 1377 | struct list_head *p; |
1376 | 1378 | ||
1377 | size = ((size + ESM_MEM_ALIGN - 1) / ESM_MEM_ALIGN) * ESM_MEM_ALIGN; | 1379 | size = ((size + ESM_MEM_ALIGN - 1) / ESM_MEM_ALIGN) * ESM_MEM_ALIGN; |
1378 | down(&chip->memory_mutex); | 1380 | mutex_lock(&chip->memory_mutex); |
1379 | list_for_each(p, &chip->buf_list) { | 1381 | list_for_each(p, &chip->buf_list) { |
1380 | buf = list_entry(p, struct esm_memory, list); | 1382 | buf = list_entry(p, struct esm_memory, list); |
1381 | if (buf->empty && buf->buf.bytes >= size) | 1383 | if (buf->empty && buf->buf.bytes >= size) |
1382 | goto __found; | 1384 | goto __found; |
1383 | } | 1385 | } |
1384 | up(&chip->memory_mutex); | 1386 | mutex_unlock(&chip->memory_mutex); |
1385 | return NULL; | 1387 | return NULL; |
1386 | 1388 | ||
1387 | __found: | 1389 | __found: |
1388 | if (buf->buf.bytes > size) { | 1390 | if (buf->buf.bytes > size) { |
1389 | struct esm_memory *chunk = kmalloc(sizeof(*chunk), GFP_KERNEL); | 1391 | struct esm_memory *chunk = kmalloc(sizeof(*chunk), GFP_KERNEL); |
1390 | if (chunk == NULL) { | 1392 | if (chunk == NULL) { |
1391 | up(&chip->memory_mutex); | 1393 | mutex_unlock(&chip->memory_mutex); |
1392 | return NULL; | 1394 | return NULL; |
1393 | } | 1395 | } |
1394 | chunk->buf = buf->buf; | 1396 | chunk->buf = buf->buf; |
@@ -1400,7 +1402,7 @@ __found: | |||
1400 | list_add(&chunk->list, &buf->list); | 1402 | list_add(&chunk->list, &buf->list); |
1401 | } | 1403 | } |
1402 | buf->empty = 0; | 1404 | buf->empty = 0; |
1403 | up(&chip->memory_mutex); | 1405 | mutex_unlock(&chip->memory_mutex); |
1404 | return buf; | 1406 | return buf; |
1405 | } | 1407 | } |
1406 | 1408 | ||
@@ -1409,7 +1411,7 @@ static void snd_es1968_free_memory(struct es1968 *chip, struct esm_memory *buf) | |||
1409 | { | 1411 | { |
1410 | struct esm_memory *chunk; | 1412 | struct esm_memory *chunk; |
1411 | 1413 | ||
1412 | down(&chip->memory_mutex); | 1414 | mutex_lock(&chip->memory_mutex); |
1413 | buf->empty = 1; | 1415 | buf->empty = 1; |
1414 | if (buf->list.prev != &chip->buf_list) { | 1416 | if (buf->list.prev != &chip->buf_list) { |
1415 | chunk = list_entry(buf->list.prev, struct esm_memory, list); | 1417 | chunk = list_entry(buf->list.prev, struct esm_memory, list); |
@@ -1428,7 +1430,7 @@ static void snd_es1968_free_memory(struct es1968 *chip, struct esm_memory *buf) | |||
1428 | kfree(chunk); | 1430 | kfree(chunk); |
1429 | } | 1431 | } |
1430 | } | 1432 | } |
1431 | up(&chip->memory_mutex); | 1433 | mutex_unlock(&chip->memory_mutex); |
1432 | } | 1434 | } |
1433 | 1435 | ||
1434 | static void snd_es1968_free_dmabuf(struct es1968 *chip) | 1436 | static void snd_es1968_free_dmabuf(struct es1968 *chip) |
@@ -2579,7 +2581,7 @@ static int __devinit snd_es1968_create(struct snd_card *card, | |||
2579 | INIT_LIST_HEAD(&chip->buf_list); | 2581 | INIT_LIST_HEAD(&chip->buf_list); |
2580 | INIT_LIST_HEAD(&chip->substream_list); | 2582 | INIT_LIST_HEAD(&chip->substream_list); |
2581 | spin_lock_init(&chip->ac97_lock); | 2583 | spin_lock_init(&chip->ac97_lock); |
2582 | init_MUTEX(&chip->memory_mutex); | 2584 | mutex_init(&chip->memory_mutex); |
2583 | tasklet_init(&chip->hwvol_tq, es1968_update_hw_volume, (unsigned long)chip); | 2585 | tasklet_init(&chip->hwvol_tq, es1968_update_hw_volume, (unsigned long)chip); |
2584 | chip->card = card; | 2586 | chip->card = card; |
2585 | chip->pci = pci; | 2587 | chip->pci = pci; |
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index 4a6dd97deba6..208a3341ec20 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/slab.h> | 25 | #include <linux/slab.h> |
26 | #include <linux/pci.h> | 26 | #include <linux/pci.h> |
27 | #include <linux/moduleparam.h> | 27 | #include <linux/moduleparam.h> |
28 | #include <linux/mutex.h> | ||
28 | #include <sound/core.h> | 29 | #include <sound/core.h> |
29 | #include "hda_codec.h" | 30 | #include "hda_codec.h" |
30 | #include <sound/asoundef.h> | 31 | #include <sound/asoundef.h> |
@@ -76,12 +77,12 @@ unsigned int snd_hda_codec_read(struct hda_codec *codec, hda_nid_t nid, int dire | |||
76 | unsigned int verb, unsigned int parm) | 77 | unsigned int verb, unsigned int parm) |
77 | { | 78 | { |
78 | unsigned int res; | 79 | unsigned int res; |
79 | down(&codec->bus->cmd_mutex); | 80 | mutex_lock(&codec->bus->cmd_mutex); |
80 | if (! codec->bus->ops.command(codec, nid, direct, verb, parm)) | 81 | if (! codec->bus->ops.command(codec, nid, direct, verb, parm)) |
81 | res = codec->bus->ops.get_response(codec); | 82 | res = codec->bus->ops.get_response(codec); |
82 | else | 83 | else |
83 | res = (unsigned int)-1; | 84 | res = (unsigned int)-1; |
84 | up(&codec->bus->cmd_mutex); | 85 | mutex_unlock(&codec->bus->cmd_mutex); |
85 | return res; | 86 | return res; |
86 | } | 87 | } |
87 | 88 | ||
@@ -101,9 +102,9 @@ int snd_hda_codec_write(struct hda_codec *codec, hda_nid_t nid, int direct, | |||
101 | unsigned int verb, unsigned int parm) | 102 | unsigned int verb, unsigned int parm) |
102 | { | 103 | { |
103 | int err; | 104 | int err; |
104 | down(&codec->bus->cmd_mutex); | 105 | mutex_lock(&codec->bus->cmd_mutex); |
105 | err = codec->bus->ops.command(codec, nid, direct, verb, parm); | 106 | err = codec->bus->ops.command(codec, nid, direct, verb, parm); |
106 | up(&codec->bus->cmd_mutex); | 107 | mutex_unlock(&codec->bus->cmd_mutex); |
107 | return err; | 108 | return err; |
108 | } | 109 | } |
109 | 110 | ||
@@ -371,7 +372,7 @@ int snd_hda_bus_new(struct snd_card *card, const struct hda_bus_template *temp, | |||
371 | bus->modelname = temp->modelname; | 372 | bus->modelname = temp->modelname; |
372 | bus->ops = temp->ops; | 373 | bus->ops = temp->ops; |
373 | 374 | ||
374 | init_MUTEX(&bus->cmd_mutex); | 375 | mutex_init(&bus->cmd_mutex); |
375 | INIT_LIST_HEAD(&bus->codec_list); | 376 | INIT_LIST_HEAD(&bus->codec_list); |
376 | 377 | ||
377 | if ((err = snd_device_new(card, SNDRV_DEV_BUS, bus, &dev_ops)) < 0) { | 378 | if ((err = snd_device_new(card, SNDRV_DEV_BUS, bus, &dev_ops)) < 0) { |
@@ -523,7 +524,7 @@ int snd_hda_codec_new(struct hda_bus *bus, unsigned int codec_addr, | |||
523 | 524 | ||
524 | codec->bus = bus; | 525 | codec->bus = bus; |
525 | codec->addr = codec_addr; | 526 | codec->addr = codec_addr; |
526 | init_MUTEX(&codec->spdif_mutex); | 527 | mutex_init(&codec->spdif_mutex); |
527 | init_amp_hash(codec); | 528 | init_amp_hash(codec); |
528 | 529 | ||
529 | list_add_tail(&codec->list, &bus->codec_list); | 530 | list_add_tail(&codec->list, &bus->codec_list); |
@@ -881,12 +882,12 @@ int snd_hda_mixer_bind_switch_get(struct snd_kcontrol *kcontrol, struct snd_ctl_ | |||
881 | unsigned long pval; | 882 | unsigned long pval; |
882 | int err; | 883 | int err; |
883 | 884 | ||
884 | down(&codec->spdif_mutex); /* reuse spdif_mutex */ | 885 | mutex_lock(&codec->spdif_mutex); /* reuse spdif_mutex */ |
885 | pval = kcontrol->private_value; | 886 | pval = kcontrol->private_value; |
886 | kcontrol->private_value = pval & ~AMP_VAL_IDX_MASK; /* index 0 */ | 887 | kcontrol->private_value = pval & ~AMP_VAL_IDX_MASK; /* index 0 */ |
887 | err = snd_hda_mixer_amp_switch_get(kcontrol, ucontrol); | 888 | err = snd_hda_mixer_amp_switch_get(kcontrol, ucontrol); |
888 | kcontrol->private_value = pval; | 889 | kcontrol->private_value = pval; |
889 | up(&codec->spdif_mutex); | 890 | mutex_unlock(&codec->spdif_mutex); |
890 | return err; | 891 | return err; |
891 | } | 892 | } |
892 | 893 | ||
@@ -896,7 +897,7 @@ int snd_hda_mixer_bind_switch_put(struct snd_kcontrol *kcontrol, struct snd_ctl_ | |||
896 | unsigned long pval; | 897 | unsigned long pval; |
897 | int i, indices, err = 0, change = 0; | 898 | int i, indices, err = 0, change = 0; |
898 | 899 | ||
899 | down(&codec->spdif_mutex); /* reuse spdif_mutex */ | 900 | mutex_lock(&codec->spdif_mutex); /* reuse spdif_mutex */ |
900 | pval = kcontrol->private_value; | 901 | pval = kcontrol->private_value; |
901 | indices = (pval & AMP_VAL_IDX_MASK) >> AMP_VAL_IDX_SHIFT; | 902 | indices = (pval & AMP_VAL_IDX_MASK) >> AMP_VAL_IDX_SHIFT; |
902 | for (i = 0; i < indices; i++) { | 903 | for (i = 0; i < indices; i++) { |
@@ -907,7 +908,7 @@ int snd_hda_mixer_bind_switch_put(struct snd_kcontrol *kcontrol, struct snd_ctl_ | |||
907 | change |= err; | 908 | change |= err; |
908 | } | 909 | } |
909 | kcontrol->private_value = pval; | 910 | kcontrol->private_value = pval; |
910 | up(&codec->spdif_mutex); | 911 | mutex_unlock(&codec->spdif_mutex); |
911 | return err < 0 ? err : change; | 912 | return err < 0 ? err : change; |
912 | } | 913 | } |
913 | 914 | ||
@@ -1011,7 +1012,7 @@ static int snd_hda_spdif_default_put(struct snd_kcontrol *kcontrol, struct snd_c | |||
1011 | unsigned short val; | 1012 | unsigned short val; |
1012 | int change; | 1013 | int change; |
1013 | 1014 | ||
1014 | down(&codec->spdif_mutex); | 1015 | mutex_lock(&codec->spdif_mutex); |
1015 | codec->spdif_status = ucontrol->value.iec958.status[0] | | 1016 | codec->spdif_status = ucontrol->value.iec958.status[0] | |
1016 | ((unsigned int)ucontrol->value.iec958.status[1] << 8) | | 1017 | ((unsigned int)ucontrol->value.iec958.status[1] << 8) | |
1017 | ((unsigned int)ucontrol->value.iec958.status[2] << 16) | | 1018 | ((unsigned int)ucontrol->value.iec958.status[2] << 16) | |
@@ -1026,7 +1027,7 @@ static int snd_hda_spdif_default_put(struct snd_kcontrol *kcontrol, struct snd_c | |||
1026 | snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_2, val >> 8); | 1027 | snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_2, val >> 8); |
1027 | } | 1028 | } |
1028 | 1029 | ||
1029 | up(&codec->spdif_mutex); | 1030 | mutex_unlock(&codec->spdif_mutex); |
1030 | return change; | 1031 | return change; |
1031 | } | 1032 | } |
1032 | 1033 | ||
@@ -1054,7 +1055,7 @@ static int snd_hda_spdif_out_switch_put(struct snd_kcontrol *kcontrol, struct sn | |||
1054 | unsigned short val; | 1055 | unsigned short val; |
1055 | int change; | 1056 | int change; |
1056 | 1057 | ||
1057 | down(&codec->spdif_mutex); | 1058 | mutex_lock(&codec->spdif_mutex); |
1058 | val = codec->spdif_ctls & ~1; | 1059 | val = codec->spdif_ctls & ~1; |
1059 | if (ucontrol->value.integer.value[0]) | 1060 | if (ucontrol->value.integer.value[0]) |
1060 | val |= 1; | 1061 | val |= 1; |
@@ -1066,7 +1067,7 @@ static int snd_hda_spdif_out_switch_put(struct snd_kcontrol *kcontrol, struct sn | |||
1066 | AC_AMP_SET_RIGHT | AC_AMP_SET_LEFT | | 1067 | AC_AMP_SET_RIGHT | AC_AMP_SET_LEFT | |
1067 | AC_AMP_SET_OUTPUT | ((val & 1) ? 0 : 0x80)); | 1068 | AC_AMP_SET_OUTPUT | ((val & 1) ? 0 : 0x80)); |
1068 | } | 1069 | } |
1069 | up(&codec->spdif_mutex); | 1070 | mutex_unlock(&codec->spdif_mutex); |
1070 | return change; | 1071 | return change; |
1071 | } | 1072 | } |
1072 | 1073 | ||
@@ -1150,13 +1151,13 @@ static int snd_hda_spdif_in_switch_put(struct snd_kcontrol *kcontrol, struct snd | |||
1150 | unsigned int val = !!ucontrol->value.integer.value[0]; | 1151 | unsigned int val = !!ucontrol->value.integer.value[0]; |
1151 | int change; | 1152 | int change; |
1152 | 1153 | ||
1153 | down(&codec->spdif_mutex); | 1154 | mutex_lock(&codec->spdif_mutex); |
1154 | change = codec->spdif_in_enable != val; | 1155 | change = codec->spdif_in_enable != val; |
1155 | if (change || codec->in_resume) { | 1156 | if (change || codec->in_resume) { |
1156 | codec->spdif_in_enable = val; | 1157 | codec->spdif_in_enable = val; |
1157 | snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_1, val); | 1158 | snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_1, val); |
1158 | } | 1159 | } |
1159 | up(&codec->spdif_mutex); | 1160 | mutex_unlock(&codec->spdif_mutex); |
1160 | return change; | 1161 | return change; |
1161 | } | 1162 | } |
1162 | 1163 | ||
@@ -1824,13 +1825,13 @@ int snd_hda_input_mux_put(struct hda_codec *codec, const struct hda_input_mux *i | |||
1824 | */ | 1825 | */ |
1825 | int snd_hda_multi_out_dig_open(struct hda_codec *codec, struct hda_multi_out *mout) | 1826 | int snd_hda_multi_out_dig_open(struct hda_codec *codec, struct hda_multi_out *mout) |
1826 | { | 1827 | { |
1827 | down(&codec->spdif_mutex); | 1828 | mutex_lock(&codec->spdif_mutex); |
1828 | if (mout->dig_out_used) { | 1829 | if (mout->dig_out_used) { |
1829 | up(&codec->spdif_mutex); | 1830 | mutex_unlock(&codec->spdif_mutex); |
1830 | return -EBUSY; /* already being used */ | 1831 | return -EBUSY; /* already being used */ |
1831 | } | 1832 | } |
1832 | mout->dig_out_used = HDA_DIG_EXCLUSIVE; | 1833 | mout->dig_out_used = HDA_DIG_EXCLUSIVE; |
1833 | up(&codec->spdif_mutex); | 1834 | mutex_unlock(&codec->spdif_mutex); |
1834 | return 0; | 1835 | return 0; |
1835 | } | 1836 | } |
1836 | 1837 | ||
@@ -1839,9 +1840,9 @@ int snd_hda_multi_out_dig_open(struct hda_codec *codec, struct hda_multi_out *mo | |||
1839 | */ | 1840 | */ |
1840 | int snd_hda_multi_out_dig_close(struct hda_codec *codec, struct hda_multi_out *mout) | 1841 | int snd_hda_multi_out_dig_close(struct hda_codec *codec, struct hda_multi_out *mout) |
1841 | { | 1842 | { |
1842 | down(&codec->spdif_mutex); | 1843 | mutex_lock(&codec->spdif_mutex); |
1843 | mout->dig_out_used = 0; | 1844 | mout->dig_out_used = 0; |
1844 | up(&codec->spdif_mutex); | 1845 | mutex_unlock(&codec->spdif_mutex); |
1845 | return 0; | 1846 | return 0; |
1846 | } | 1847 | } |
1847 | 1848 | ||
@@ -1869,7 +1870,7 @@ int snd_hda_multi_out_analog_prepare(struct hda_codec *codec, struct hda_multi_o | |||
1869 | int chs = substream->runtime->channels; | 1870 | int chs = substream->runtime->channels; |
1870 | int i; | 1871 | int i; |
1871 | 1872 | ||
1872 | down(&codec->spdif_mutex); | 1873 | mutex_lock(&codec->spdif_mutex); |
1873 | if (mout->dig_out_nid && mout->dig_out_used != HDA_DIG_EXCLUSIVE) { | 1874 | if (mout->dig_out_nid && mout->dig_out_used != HDA_DIG_EXCLUSIVE) { |
1874 | if (chs == 2 && | 1875 | if (chs == 2 && |
1875 | snd_hda_is_supported_format(codec, mout->dig_out_nid, format) && | 1876 | snd_hda_is_supported_format(codec, mout->dig_out_nid, format) && |
@@ -1883,7 +1884,7 @@ int snd_hda_multi_out_analog_prepare(struct hda_codec *codec, struct hda_multi_o | |||
1883 | snd_hda_codec_setup_stream(codec, mout->dig_out_nid, 0, 0, 0); | 1884 | snd_hda_codec_setup_stream(codec, mout->dig_out_nid, 0, 0, 0); |
1884 | } | 1885 | } |
1885 | } | 1886 | } |
1886 | up(&codec->spdif_mutex); | 1887 | mutex_unlock(&codec->spdif_mutex); |
1887 | 1888 | ||
1888 | /* front */ | 1889 | /* front */ |
1889 | snd_hda_codec_setup_stream(codec, nids[HDA_FRONT], stream_tag, 0, format); | 1890 | snd_hda_codec_setup_stream(codec, nids[HDA_FRONT], stream_tag, 0, format); |
@@ -1914,12 +1915,12 @@ int snd_hda_multi_out_analog_cleanup(struct hda_codec *codec, struct hda_multi_o | |||
1914 | snd_hda_codec_setup_stream(codec, nids[i], 0, 0, 0); | 1915 | snd_hda_codec_setup_stream(codec, nids[i], 0, 0, 0); |
1915 | if (mout->hp_nid) | 1916 | if (mout->hp_nid) |
1916 | snd_hda_codec_setup_stream(codec, mout->hp_nid, 0, 0, 0); | 1917 | snd_hda_codec_setup_stream(codec, mout->hp_nid, 0, 0, 0); |
1917 | down(&codec->spdif_mutex); | 1918 | mutex_lock(&codec->spdif_mutex); |
1918 | if (mout->dig_out_nid && mout->dig_out_used == HDA_DIG_ANALOG_DUP) { | 1919 | if (mout->dig_out_nid && mout->dig_out_used == HDA_DIG_ANALOG_DUP) { |
1919 | snd_hda_codec_setup_stream(codec, mout->dig_out_nid, 0, 0, 0); | 1920 | snd_hda_codec_setup_stream(codec, mout->dig_out_nid, 0, 0, 0); |
1920 | mout->dig_out_used = 0; | 1921 | mout->dig_out_used = 0; |
1921 | } | 1922 | } |
1922 | up(&codec->spdif_mutex); | 1923 | mutex_unlock(&codec->spdif_mutex); |
1923 | return 0; | 1924 | return 0; |
1924 | } | 1925 | } |
1925 | 1926 | ||
diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h index 63e26c7a2b7a..40520e9d5a4b 100644 --- a/sound/pci/hda/hda_codec.h +++ b/sound/pci/hda/hda_codec.h | |||
@@ -438,7 +438,7 @@ struct hda_bus { | |||
438 | struct list_head codec_list; | 438 | struct list_head codec_list; |
439 | struct hda_codec *caddr_tbl[HDA_MAX_CODEC_ADDRESS + 1]; /* caddr -> codec */ | 439 | struct hda_codec *caddr_tbl[HDA_MAX_CODEC_ADDRESS + 1]; /* caddr -> codec */ |
440 | 440 | ||
441 | struct semaphore cmd_mutex; | 441 | struct mutex cmd_mutex; |
442 | 442 | ||
443 | /* unsolicited event queue */ | 443 | /* unsolicited event queue */ |
444 | struct hda_bus_unsolicited *unsol; | 444 | struct hda_bus_unsolicited *unsol; |
@@ -559,7 +559,7 @@ struct hda_codec { | |||
559 | int amp_info_size; | 559 | int amp_info_size; |
560 | struct hda_amp_info *amp_info; | 560 | struct hda_amp_info *amp_info; |
561 | 561 | ||
562 | struct semaphore spdif_mutex; | 562 | struct mutex spdif_mutex; |
563 | unsigned int spdif_status; /* IEC958 status bits */ | 563 | unsigned int spdif_status; /* IEC958 status bits */ |
564 | unsigned short spdif_ctls; /* SPDIF control bits */ | 564 | unsigned short spdif_ctls; /* SPDIF control bits */ |
565 | unsigned int spdif_in_enable; /* SPDIF input enable? */ | 565 | unsigned int spdif_in_enable; /* SPDIF input enable? */ |
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index b3f37e7b33c0..dbed2644a192 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
@@ -43,6 +43,7 @@ | |||
43 | #include <linux/init.h> | 43 | #include <linux/init.h> |
44 | #include <linux/slab.h> | 44 | #include <linux/slab.h> |
45 | #include <linux/pci.h> | 45 | #include <linux/pci.h> |
46 | #include <linux/mutex.h> | ||
46 | #include <sound/core.h> | 47 | #include <sound/core.h> |
47 | #include <sound/initval.h> | 48 | #include <sound/initval.h> |
48 | #include "hda_codec.h" | 49 | #include "hda_codec.h" |
@@ -297,7 +298,7 @@ struct azx { | |||
297 | 298 | ||
298 | /* locks */ | 299 | /* locks */ |
299 | spinlock_t reg_lock; | 300 | spinlock_t reg_lock; |
300 | struct semaphore open_mutex; | 301 | struct mutex open_mutex; |
301 | 302 | ||
302 | /* streams (x num_streams) */ | 303 | /* streams (x num_streams) */ |
303 | struct azx_dev *azx_dev; | 304 | struct azx_dev *azx_dev; |
@@ -993,10 +994,10 @@ static int azx_pcm_open(struct snd_pcm_substream *substream) | |||
993 | unsigned long flags; | 994 | unsigned long flags; |
994 | int err; | 995 | int err; |
995 | 996 | ||
996 | down(&chip->open_mutex); | 997 | mutex_lock(&chip->open_mutex); |
997 | azx_dev = azx_assign_device(chip, substream->stream); | 998 | azx_dev = azx_assign_device(chip, substream->stream); |
998 | if (azx_dev == NULL) { | 999 | if (azx_dev == NULL) { |
999 | up(&chip->open_mutex); | 1000 | mutex_unlock(&chip->open_mutex); |
1000 | return -EBUSY; | 1001 | return -EBUSY; |
1001 | } | 1002 | } |
1002 | runtime->hw = azx_pcm_hw; | 1003 | runtime->hw = azx_pcm_hw; |
@@ -1008,7 +1009,7 @@ static int azx_pcm_open(struct snd_pcm_substream *substream) | |||
1008 | snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS); | 1009 | snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS); |
1009 | if ((err = hinfo->ops.open(hinfo, apcm->codec, substream)) < 0) { | 1010 | if ((err = hinfo->ops.open(hinfo, apcm->codec, substream)) < 0) { |
1010 | azx_release_device(azx_dev); | 1011 | azx_release_device(azx_dev); |
1011 | up(&chip->open_mutex); | 1012 | mutex_unlock(&chip->open_mutex); |
1012 | return err; | 1013 | return err; |
1013 | } | 1014 | } |
1014 | spin_lock_irqsave(&chip->reg_lock, flags); | 1015 | spin_lock_irqsave(&chip->reg_lock, flags); |
@@ -1017,7 +1018,7 @@ static int azx_pcm_open(struct snd_pcm_substream *substream) | |||
1017 | spin_unlock_irqrestore(&chip->reg_lock, flags); | 1018 | spin_unlock_irqrestore(&chip->reg_lock, flags); |
1018 | 1019 | ||
1019 | runtime->private_data = azx_dev; | 1020 | runtime->private_data = azx_dev; |
1020 | up(&chip->open_mutex); | 1021 | mutex_unlock(&chip->open_mutex); |
1021 | return 0; | 1022 | return 0; |
1022 | } | 1023 | } |
1023 | 1024 | ||
@@ -1029,14 +1030,14 @@ static int azx_pcm_close(struct snd_pcm_substream *substream) | |||
1029 | struct azx_dev *azx_dev = get_azx_dev(substream); | 1030 | struct azx_dev *azx_dev = get_azx_dev(substream); |
1030 | unsigned long flags; | 1031 | unsigned long flags; |
1031 | 1032 | ||
1032 | down(&chip->open_mutex); | 1033 | mutex_lock(&chip->open_mutex); |
1033 | spin_lock_irqsave(&chip->reg_lock, flags); | 1034 | spin_lock_irqsave(&chip->reg_lock, flags); |
1034 | azx_dev->substream = NULL; | 1035 | azx_dev->substream = NULL; |
1035 | azx_dev->running = 0; | 1036 | azx_dev->running = 0; |
1036 | spin_unlock_irqrestore(&chip->reg_lock, flags); | 1037 | spin_unlock_irqrestore(&chip->reg_lock, flags); |
1037 | azx_release_device(azx_dev); | 1038 | azx_release_device(azx_dev); |
1038 | hinfo->ops.close(hinfo, apcm->codec, substream); | 1039 | hinfo->ops.close(hinfo, apcm->codec, substream); |
1039 | up(&chip->open_mutex); | 1040 | mutex_unlock(&chip->open_mutex); |
1040 | return 0; | 1041 | return 0; |
1041 | } | 1042 | } |
1042 | 1043 | ||
@@ -1408,7 +1409,7 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci, | |||
1408 | } | 1409 | } |
1409 | 1410 | ||
1410 | spin_lock_init(&chip->reg_lock); | 1411 | spin_lock_init(&chip->reg_lock); |
1411 | init_MUTEX(&chip->open_mutex); | 1412 | mutex_init(&chip->open_mutex); |
1412 | chip->card = card; | 1413 | chip->card = card; |
1413 | chip->pci = pci; | 1414 | chip->pci = pci; |
1414 | chip->irq = -1; | 1415 | chip->irq = -1; |
diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c index 1ada1b075c9a..5a3821ae93a8 100644 --- a/sound/pci/hda/patch_analog.c +++ b/sound/pci/hda/patch_analog.c | |||
@@ -23,6 +23,8 @@ | |||
23 | #include <linux/delay.h> | 23 | #include <linux/delay.h> |
24 | #include <linux/slab.h> | 24 | #include <linux/slab.h> |
25 | #include <linux/pci.h> | 25 | #include <linux/pci.h> |
26 | #include <linux/mutex.h> | ||
27 | |||
26 | #include <sound/core.h> | 28 | #include <sound/core.h> |
27 | #include "hda_codec.h" | 29 | #include "hda_codec.h" |
28 | #include "hda_local.h" | 30 | #include "hda_local.h" |
@@ -60,7 +62,7 @@ struct ad198x_spec { | |||
60 | /* PCM information */ | 62 | /* PCM information */ |
61 | struct hda_pcm pcm_rec[2]; /* used in alc_build_pcms() */ | 63 | struct hda_pcm pcm_rec[2]; /* used in alc_build_pcms() */ |
62 | 64 | ||
63 | struct semaphore amp_mutex; /* PCM volume/mute control mutex */ | 65 | struct mutex amp_mutex; /* PCM volume/mute control mutex */ |
64 | unsigned int spdif_route; | 66 | unsigned int spdif_route; |
65 | 67 | ||
66 | /* dynamic controls, init_verbs and input_mux */ | 68 | /* dynamic controls, init_verbs and input_mux */ |
@@ -371,9 +373,9 @@ static int ad1986a_pcm_amp_vol_get(struct snd_kcontrol *kcontrol, struct snd_ctl | |||
371 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); | 373 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); |
372 | struct ad198x_spec *ad = codec->spec; | 374 | struct ad198x_spec *ad = codec->spec; |
373 | 375 | ||
374 | down(&ad->amp_mutex); | 376 | mutex_lock(&ad->amp_mutex); |
375 | snd_hda_mixer_amp_volume_get(kcontrol, ucontrol); | 377 | snd_hda_mixer_amp_volume_get(kcontrol, ucontrol); |
376 | up(&ad->amp_mutex); | 378 | mutex_unlock(&ad->amp_mutex); |
377 | return 0; | 379 | return 0; |
378 | } | 380 | } |
379 | 381 | ||
@@ -383,13 +385,13 @@ static int ad1986a_pcm_amp_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl | |||
383 | struct ad198x_spec *ad = codec->spec; | 385 | struct ad198x_spec *ad = codec->spec; |
384 | int i, change = 0; | 386 | int i, change = 0; |
385 | 387 | ||
386 | down(&ad->amp_mutex); | 388 | mutex_lock(&ad->amp_mutex); |
387 | for (i = 0; i < ARRAY_SIZE(ad1986a_dac_nids); i++) { | 389 | for (i = 0; i < ARRAY_SIZE(ad1986a_dac_nids); i++) { |
388 | kcontrol->private_value = HDA_COMPOSE_AMP_VAL(ad1986a_dac_nids[i], 3, 0, HDA_OUTPUT); | 390 | kcontrol->private_value = HDA_COMPOSE_AMP_VAL(ad1986a_dac_nids[i], 3, 0, HDA_OUTPUT); |
389 | change |= snd_hda_mixer_amp_volume_put(kcontrol, ucontrol); | 391 | change |= snd_hda_mixer_amp_volume_put(kcontrol, ucontrol); |
390 | } | 392 | } |
391 | kcontrol->private_value = HDA_COMPOSE_AMP_VAL(AD1986A_FRONT_DAC, 3, 0, HDA_OUTPUT); | 393 | kcontrol->private_value = HDA_COMPOSE_AMP_VAL(AD1986A_FRONT_DAC, 3, 0, HDA_OUTPUT); |
392 | up(&ad->amp_mutex); | 394 | mutex_unlock(&ad->amp_mutex); |
393 | return change; | 395 | return change; |
394 | } | 396 | } |
395 | 397 | ||
@@ -400,9 +402,9 @@ static int ad1986a_pcm_amp_sw_get(struct snd_kcontrol *kcontrol, struct snd_ctl_ | |||
400 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); | 402 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); |
401 | struct ad198x_spec *ad = codec->spec; | 403 | struct ad198x_spec *ad = codec->spec; |
402 | 404 | ||
403 | down(&ad->amp_mutex); | 405 | mutex_lock(&ad->amp_mutex); |
404 | snd_hda_mixer_amp_switch_get(kcontrol, ucontrol); | 406 | snd_hda_mixer_amp_switch_get(kcontrol, ucontrol); |
405 | up(&ad->amp_mutex); | 407 | mutex_unlock(&ad->amp_mutex); |
406 | return 0; | 408 | return 0; |
407 | } | 409 | } |
408 | 410 | ||
@@ -412,13 +414,13 @@ static int ad1986a_pcm_amp_sw_put(struct snd_kcontrol *kcontrol, struct snd_ctl_ | |||
412 | struct ad198x_spec *ad = codec->spec; | 414 | struct ad198x_spec *ad = codec->spec; |
413 | int i, change = 0; | 415 | int i, change = 0; |
414 | 416 | ||
415 | down(&ad->amp_mutex); | 417 | mutex_lock(&ad->amp_mutex); |
416 | for (i = 0; i < ARRAY_SIZE(ad1986a_dac_nids); i++) { | 418 | for (i = 0; i < ARRAY_SIZE(ad1986a_dac_nids); i++) { |
417 | kcontrol->private_value = HDA_COMPOSE_AMP_VAL(ad1986a_dac_nids[i], 3, 0, HDA_OUTPUT); | 419 | kcontrol->private_value = HDA_COMPOSE_AMP_VAL(ad1986a_dac_nids[i], 3, 0, HDA_OUTPUT); |
418 | change |= snd_hda_mixer_amp_switch_put(kcontrol, ucontrol); | 420 | change |= snd_hda_mixer_amp_switch_put(kcontrol, ucontrol); |
419 | } | 421 | } |
420 | kcontrol->private_value = HDA_COMPOSE_AMP_VAL(AD1986A_FRONT_DAC, 3, 0, HDA_OUTPUT); | 422 | kcontrol->private_value = HDA_COMPOSE_AMP_VAL(AD1986A_FRONT_DAC, 3, 0, HDA_OUTPUT); |
421 | up(&ad->amp_mutex); | 423 | mutex_unlock(&ad->amp_mutex); |
422 | return change; | 424 | return change; |
423 | } | 425 | } |
424 | 426 | ||
@@ -544,7 +546,7 @@ static int patch_ad1986a(struct hda_codec *codec) | |||
544 | if (spec == NULL) | 546 | if (spec == NULL) |
545 | return -ENOMEM; | 547 | return -ENOMEM; |
546 | 548 | ||
547 | init_MUTEX(&spec->amp_mutex); | 549 | mutex_init(&spec->amp_mutex); |
548 | codec->spec = spec; | 550 | codec->spec = spec; |
549 | 551 | ||
550 | spec->multiout.max_channels = 6; | 552 | spec->multiout.max_channels = 6; |
@@ -708,7 +710,7 @@ static int patch_ad1983(struct hda_codec *codec) | |||
708 | if (spec == NULL) | 710 | if (spec == NULL) |
709 | return -ENOMEM; | 711 | return -ENOMEM; |
710 | 712 | ||
711 | init_MUTEX(&spec->amp_mutex); | 713 | mutex_init(&spec->amp_mutex); |
712 | codec->spec = spec; | 714 | codec->spec = spec; |
713 | 715 | ||
714 | spec->multiout.max_channels = 2; | 716 | spec->multiout.max_channels = 2; |
@@ -854,7 +856,7 @@ static int patch_ad1981(struct hda_codec *codec) | |||
854 | if (spec == NULL) | 856 | if (spec == NULL) |
855 | return -ENOMEM; | 857 | return -ENOMEM; |
856 | 858 | ||
857 | init_MUTEX(&spec->amp_mutex); | 859 | mutex_init(&spec->amp_mutex); |
858 | codec->spec = spec; | 860 | codec->spec = spec; |
859 | 861 | ||
860 | spec->multiout.max_channels = 2; | 862 | spec->multiout.max_channels = 2; |
@@ -2032,7 +2034,7 @@ static int patch_ad1988(struct hda_codec *codec) | |||
2032 | if (spec == NULL) | 2034 | if (spec == NULL) |
2033 | return -ENOMEM; | 2035 | return -ENOMEM; |
2034 | 2036 | ||
2035 | init_MUTEX(&spec->amp_mutex); | 2037 | mutex_init(&spec->amp_mutex); |
2036 | codec->spec = spec; | 2038 | codec->spec = spec; |
2037 | 2039 | ||
2038 | if (codec->revision_id == AD1988A_REV2) | 2040 | if (codec->revision_id == AD1988A_REV2) |
diff --git a/sound/pci/ice1712/aureon.c b/sound/pci/ice1712/aureon.c index 2175f6721347..0f7f4d8263c0 100644 --- a/sound/pci/ice1712/aureon.c +++ b/sound/pci/ice1712/aureon.c | |||
@@ -53,6 +53,8 @@ | |||
53 | #include <linux/interrupt.h> | 53 | #include <linux/interrupt.h> |
54 | #include <linux/init.h> | 54 | #include <linux/init.h> |
55 | #include <linux/slab.h> | 55 | #include <linux/slab.h> |
56 | #include <linux/mutex.h> | ||
57 | |||
56 | #include <sound/core.h> | 58 | #include <sound/core.h> |
57 | 59 | ||
58 | #include "ice1712.h" | 60 | #include "ice1712.h" |
@@ -210,14 +212,14 @@ static int aureon_ac97_vol_get(struct snd_kcontrol *kcontrol, struct snd_ctl_ele | |||
210 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); | 212 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); |
211 | unsigned short vol; | 213 | unsigned short vol; |
212 | 214 | ||
213 | down(&ice->gpio_mutex); | 215 | mutex_lock(&ice->gpio_mutex); |
214 | 216 | ||
215 | vol = aureon_ac97_read(ice, kcontrol->private_value & 0x7F); | 217 | vol = aureon_ac97_read(ice, kcontrol->private_value & 0x7F); |
216 | ucontrol->value.integer.value[0] = 0x1F - (vol & 0x1F); | 218 | ucontrol->value.integer.value[0] = 0x1F - (vol & 0x1F); |
217 | if (kcontrol->private_value & AUREON_AC97_STEREO) | 219 | if (kcontrol->private_value & AUREON_AC97_STEREO) |
218 | ucontrol->value.integer.value[1] = 0x1F - ((vol >> 8) & 0x1F); | 220 | ucontrol->value.integer.value[1] = 0x1F - ((vol >> 8) & 0x1F); |
219 | 221 | ||
220 | up(&ice->gpio_mutex); | 222 | mutex_unlock(&ice->gpio_mutex); |
221 | return 0; | 223 | return 0; |
222 | } | 224 | } |
223 | 225 | ||
@@ -252,11 +254,11 @@ static int aureon_ac97_mute_get(struct snd_kcontrol *kcontrol, struct snd_ctl_el | |||
252 | { | 254 | { |
253 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); | 255 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); |
254 | 256 | ||
255 | down(&ice->gpio_mutex); | 257 | mutex_lock(&ice->gpio_mutex); |
256 | 258 | ||
257 | ucontrol->value.integer.value[0] = aureon_ac97_read(ice, kcontrol->private_value & 0x7F) & 0x8000 ? 0 : 1; | 259 | ucontrol->value.integer.value[0] = aureon_ac97_read(ice, kcontrol->private_value & 0x7F) & 0x8000 ? 0 : 1; |
258 | 260 | ||
259 | up(&ice->gpio_mutex); | 261 | mutex_unlock(&ice->gpio_mutex); |
260 | return 0; | 262 | return 0; |
261 | } | 263 | } |
262 | 264 | ||
@@ -288,11 +290,11 @@ static int aureon_ac97_micboost_get(struct snd_kcontrol *kcontrol, struct snd_ct | |||
288 | { | 290 | { |
289 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); | 291 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); |
290 | 292 | ||
291 | down(&ice->gpio_mutex); | 293 | mutex_lock(&ice->gpio_mutex); |
292 | 294 | ||
293 | ucontrol->value.integer.value[0] = aureon_ac97_read(ice, AC97_MIC) & 0x0020 ? 0 : 1; | 295 | ucontrol->value.integer.value[0] = aureon_ac97_read(ice, AC97_MIC) & 0x0020 ? 0 : 1; |
294 | 296 | ||
295 | up(&ice->gpio_mutex); | 297 | mutex_unlock(&ice->gpio_mutex); |
296 | return 0; | 298 | return 0; |
297 | } | 299 | } |
298 | 300 | ||
@@ -488,11 +490,11 @@ static int aureon_ac97_mmute_get(struct snd_kcontrol *kcontrol, struct snd_ctl_e | |||
488 | { | 490 | { |
489 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); | 491 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); |
490 | 492 | ||
491 | down(&ice->gpio_mutex); | 493 | mutex_lock(&ice->gpio_mutex); |
492 | 494 | ||
493 | ucontrol->value.integer.value[0] = (wm_get(ice, WM_OUT_MUX1) >> 1) & 0x01; | 495 | ucontrol->value.integer.value[0] = (wm_get(ice, WM_OUT_MUX1) >> 1) & 0x01; |
494 | 496 | ||
495 | up(&ice->gpio_mutex); | 497 | mutex_unlock(&ice->gpio_mutex); |
496 | return 0; | 498 | return 0; |
497 | } | 499 | } |
498 | 500 | ||
@@ -557,9 +559,9 @@ static int wm_pcm_mute_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_va | |||
557 | { | 559 | { |
558 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); | 560 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); |
559 | 561 | ||
560 | down(&ice->gpio_mutex); | 562 | mutex_lock(&ice->gpio_mutex); |
561 | ucontrol->value.integer.value[0] = (wm_get(ice, WM_MUTE) & 0x10) ? 0 : 1; | 563 | ucontrol->value.integer.value[0] = (wm_get(ice, WM_MUTE) & 0x10) ? 0 : 1; |
562 | up(&ice->gpio_mutex); | 564 | mutex_unlock(&ice->gpio_mutex); |
563 | return 0; | 565 | return 0; |
564 | } | 566 | } |
565 | 567 | ||
@@ -782,11 +784,11 @@ static int wm_pcm_vol_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_val | |||
782 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); | 784 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); |
783 | unsigned short val; | 785 | unsigned short val; |
784 | 786 | ||
785 | down(&ice->gpio_mutex); | 787 | mutex_lock(&ice->gpio_mutex); |
786 | val = wm_get(ice, WM_DAC_DIG_MASTER_ATTEN) & 0xff; | 788 | val = wm_get(ice, WM_DAC_DIG_MASTER_ATTEN) & 0xff; |
787 | val = val > PCM_MIN ? (val - PCM_MIN) : 0; | 789 | val = val > PCM_MIN ? (val - PCM_MIN) : 0; |
788 | ucontrol->value.integer.value[0] = val; | 790 | ucontrol->value.integer.value[0] = val; |
789 | up(&ice->gpio_mutex); | 791 | mutex_unlock(&ice->gpio_mutex); |
790 | return 0; | 792 | return 0; |
791 | } | 793 | } |
792 | 794 | ||
@@ -827,12 +829,12 @@ static int wm_adc_mute_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_va | |||
827 | unsigned short val; | 829 | unsigned short val; |
828 | int i; | 830 | int i; |
829 | 831 | ||
830 | down(&ice->gpio_mutex); | 832 | mutex_lock(&ice->gpio_mutex); |
831 | for (i = 0; i < 2; i++) { | 833 | for (i = 0; i < 2; i++) { |
832 | val = wm_get(ice, WM_ADC_GAIN + i); | 834 | val = wm_get(ice, WM_ADC_GAIN + i); |
833 | ucontrol->value.integer.value[i] = ~val>>5 & 0x1; | 835 | ucontrol->value.integer.value[i] = ~val>>5 & 0x1; |
834 | } | 836 | } |
835 | up(&ice->gpio_mutex); | 837 | mutex_unlock(&ice->gpio_mutex); |
836 | return 0; | 838 | return 0; |
837 | } | 839 | } |
838 | 840 | ||
@@ -874,13 +876,13 @@ static int wm_adc_vol_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_val | |||
874 | int i, idx; | 876 | int i, idx; |
875 | unsigned short vol; | 877 | unsigned short vol; |
876 | 878 | ||
877 | down(&ice->gpio_mutex); | 879 | mutex_lock(&ice->gpio_mutex); |
878 | for (i = 0; i < 2; i++) { | 880 | for (i = 0; i < 2; i++) { |
879 | idx = WM_ADC_GAIN + i; | 881 | idx = WM_ADC_GAIN + i; |
880 | vol = wm_get(ice, idx) & 0x1f; | 882 | vol = wm_get(ice, idx) & 0x1f; |
881 | ucontrol->value.integer.value[i] = vol; | 883 | ucontrol->value.integer.value[i] = vol; |
882 | } | 884 | } |
883 | up(&ice->gpio_mutex); | 885 | mutex_unlock(&ice->gpio_mutex); |
884 | return 0; | 886 | return 0; |
885 | } | 887 | } |
886 | 888 | ||
@@ -951,11 +953,11 @@ static int wm_adc_mux_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_val | |||
951 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); | 953 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); |
952 | unsigned short val; | 954 | unsigned short val; |
953 | 955 | ||
954 | down(&ice->gpio_mutex); | 956 | mutex_lock(&ice->gpio_mutex); |
955 | val = wm_get(ice, WM_ADC_MUX); | 957 | val = wm_get(ice, WM_ADC_MUX); |
956 | ucontrol->value.integer.value[0] = val & 7; | 958 | ucontrol->value.integer.value[0] = val & 7; |
957 | ucontrol->value.integer.value[1] = (val >> 4) & 7; | 959 | ucontrol->value.integer.value[1] = (val >> 4) & 7; |
958 | up(&ice->gpio_mutex); | 960 | mutex_unlock(&ice->gpio_mutex); |
959 | return 0; | 961 | return 0; |
960 | } | 962 | } |
961 | 963 | ||
diff --git a/sound/pci/ice1712/delta.c b/sound/pci/ice1712/delta.c index 9a51d34e6817..4bbf1e2ae653 100644 --- a/sound/pci/ice1712/delta.c +++ b/sound/pci/ice1712/delta.c | |||
@@ -28,6 +28,8 @@ | |||
28 | #include <linux/interrupt.h> | 28 | #include <linux/interrupt.h> |
29 | #include <linux/init.h> | 29 | #include <linux/init.h> |
30 | #include <linux/slab.h> | 30 | #include <linux/slab.h> |
31 | #include <linux/mutex.h> | ||
32 | |||
31 | #include <sound/core.h> | 33 | #include <sound/core.h> |
32 | #include <sound/cs8427.h> | 34 | #include <sound/cs8427.h> |
33 | #include <sound/asoundef.h> | 35 | #include <sound/asoundef.h> |
@@ -130,13 +132,13 @@ static int ap_cs8427_sendbytes(struct snd_i2c_device *device, unsigned char *byt | |||
130 | int res = count; | 132 | int res = count; |
131 | unsigned char tmp; | 133 | unsigned char tmp; |
132 | 134 | ||
133 | down(&ice->gpio_mutex); | 135 | mutex_lock(&ice->gpio_mutex); |
134 | tmp = ap_cs8427_codec_select(ice); | 136 | tmp = ap_cs8427_codec_select(ice); |
135 | ap_cs8427_write_byte(ice, (device->addr << 1) | 0, tmp); /* address + write mode */ | 137 | ap_cs8427_write_byte(ice, (device->addr << 1) | 0, tmp); /* address + write mode */ |
136 | while (count-- > 0) | 138 | while (count-- > 0) |
137 | ap_cs8427_write_byte(ice, *bytes++, tmp); | 139 | ap_cs8427_write_byte(ice, *bytes++, tmp); |
138 | ap_cs8427_codec_deassert(ice, tmp); | 140 | ap_cs8427_codec_deassert(ice, tmp); |
139 | up(&ice->gpio_mutex); | 141 | mutex_unlock(&ice->gpio_mutex); |
140 | return res; | 142 | return res; |
141 | } | 143 | } |
142 | 144 | ||
@@ -147,13 +149,13 @@ static int ap_cs8427_readbytes(struct snd_i2c_device *device, unsigned char *byt | |||
147 | int res = count; | 149 | int res = count; |
148 | unsigned char tmp; | 150 | unsigned char tmp; |
149 | 151 | ||
150 | down(&ice->gpio_mutex); | 152 | mutex_lock(&ice->gpio_mutex); |
151 | tmp = ap_cs8427_codec_select(ice); | 153 | tmp = ap_cs8427_codec_select(ice); |
152 | ap_cs8427_write_byte(ice, (device->addr << 1) | 1, tmp); /* address + read mode */ | 154 | ap_cs8427_write_byte(ice, (device->addr << 1) | 1, tmp); /* address + read mode */ |
153 | while (count-- > 0) | 155 | while (count-- > 0) |
154 | *bytes++ = ap_cs8427_read_byte(ice, tmp); | 156 | *bytes++ = ap_cs8427_read_byte(ice, tmp); |
155 | ap_cs8427_codec_deassert(ice, tmp); | 157 | ap_cs8427_codec_deassert(ice, tmp); |
156 | up(&ice->gpio_mutex); | 158 | mutex_unlock(&ice->gpio_mutex); |
157 | return res; | 159 | return res; |
158 | } | 160 | } |
159 | 161 | ||
@@ -180,7 +182,7 @@ static void snd_ice1712_delta_cs8403_spdif_write(struct snd_ice1712 *ice, unsign | |||
180 | /* send byte to transmitter */ | 182 | /* send byte to transmitter */ |
181 | mask1 = ICE1712_DELTA_SPDIF_OUT_STAT_CLOCK; | 183 | mask1 = ICE1712_DELTA_SPDIF_OUT_STAT_CLOCK; |
182 | mask2 = ICE1712_DELTA_SPDIF_OUT_STAT_DATA; | 184 | mask2 = ICE1712_DELTA_SPDIF_OUT_STAT_DATA; |
183 | down(&ice->gpio_mutex); | 185 | mutex_lock(&ice->gpio_mutex); |
184 | tmp = snd_ice1712_read(ice, ICE1712_IREG_GPIO_DATA); | 186 | tmp = snd_ice1712_read(ice, ICE1712_IREG_GPIO_DATA); |
185 | for (idx = 7; idx >= 0; idx--) { | 187 | for (idx = 7; idx >= 0; idx--) { |
186 | tmp &= ~(mask1 | mask2); | 188 | tmp &= ~(mask1 | mask2); |
@@ -194,7 +196,7 @@ static void snd_ice1712_delta_cs8403_spdif_write(struct snd_ice1712 *ice, unsign | |||
194 | } | 196 | } |
195 | tmp &= ~mask1; | 197 | tmp &= ~mask1; |
196 | snd_ice1712_write(ice, ICE1712_IREG_GPIO_DATA, tmp); | 198 | snd_ice1712_write(ice, ICE1712_IREG_GPIO_DATA, tmp); |
197 | up(&ice->gpio_mutex); | 199 | mutex_unlock(&ice->gpio_mutex); |
198 | } | 200 | } |
199 | 201 | ||
200 | 202 | ||
@@ -296,14 +298,14 @@ static void delta_1010_set_rate_val(struct snd_ice1712 *ice, unsigned int rate) | |||
296 | if (rate == 0) /* no hint - S/PDIF input is master, simply return */ | 298 | if (rate == 0) /* no hint - S/PDIF input is master, simply return */ |
297 | return; | 299 | return; |
298 | 300 | ||
299 | down(&ice->gpio_mutex); | 301 | mutex_lock(&ice->gpio_mutex); |
300 | tmp = snd_ice1712_read(ice, ICE1712_IREG_GPIO_DATA); | 302 | tmp = snd_ice1712_read(ice, ICE1712_IREG_GPIO_DATA); |
301 | tmp2 = tmp & ~ICE1712_DELTA_DFS; | 303 | tmp2 = tmp & ~ICE1712_DELTA_DFS; |
302 | if (rate > 48000) | 304 | if (rate > 48000) |
303 | tmp2 |= ICE1712_DELTA_DFS; | 305 | tmp2 |= ICE1712_DELTA_DFS; |
304 | if (tmp != tmp2) | 306 | if (tmp != tmp2) |
305 | snd_ice1712_write(ice, ICE1712_IREG_GPIO_DATA, tmp2); | 307 | snd_ice1712_write(ice, ICE1712_IREG_GPIO_DATA, tmp2); |
306 | up(&ice->gpio_mutex); | 308 | mutex_unlock(&ice->gpio_mutex); |
307 | } | 309 | } |
308 | 310 | ||
309 | /* | 311 | /* |
@@ -318,9 +320,9 @@ static void delta_ak4524_set_rate_val(struct snd_akm4xxx *ak, unsigned int rate) | |||
318 | return; | 320 | return; |
319 | 321 | ||
320 | /* check before reset ak4524 to avoid unnecessary clicks */ | 322 | /* check before reset ak4524 to avoid unnecessary clicks */ |
321 | down(&ice->gpio_mutex); | 323 | mutex_lock(&ice->gpio_mutex); |
322 | tmp = snd_ice1712_read(ice, ICE1712_IREG_GPIO_DATA); | 324 | tmp = snd_ice1712_read(ice, ICE1712_IREG_GPIO_DATA); |
323 | up(&ice->gpio_mutex); | 325 | mutex_unlock(&ice->gpio_mutex); |
324 | tmp2 = tmp & ~ICE1712_DELTA_DFS; | 326 | tmp2 = tmp & ~ICE1712_DELTA_DFS; |
325 | if (rate > 48000) | 327 | if (rate > 48000) |
326 | tmp2 |= ICE1712_DELTA_DFS; | 328 | tmp2 |= ICE1712_DELTA_DFS; |
@@ -329,12 +331,12 @@ static void delta_ak4524_set_rate_val(struct snd_akm4xxx *ak, unsigned int rate) | |||
329 | 331 | ||
330 | /* do it again */ | 332 | /* do it again */ |
331 | snd_akm4xxx_reset(ak, 1); | 333 | snd_akm4xxx_reset(ak, 1); |
332 | down(&ice->gpio_mutex); | 334 | mutex_lock(&ice->gpio_mutex); |
333 | tmp = snd_ice1712_read(ice, ICE1712_IREG_GPIO_DATA) & ~ICE1712_DELTA_DFS; | 335 | tmp = snd_ice1712_read(ice, ICE1712_IREG_GPIO_DATA) & ~ICE1712_DELTA_DFS; |
334 | if (rate > 48000) | 336 | if (rate > 48000) |
335 | tmp |= ICE1712_DELTA_DFS; | 337 | tmp |= ICE1712_DELTA_DFS; |
336 | snd_ice1712_write(ice, ICE1712_IREG_GPIO_DATA, tmp); | 338 | snd_ice1712_write(ice, ICE1712_IREG_GPIO_DATA, tmp); |
337 | up(&ice->gpio_mutex); | 339 | mutex_unlock(&ice->gpio_mutex); |
338 | snd_akm4xxx_reset(ak, 0); | 340 | snd_akm4xxx_reset(ak, 0); |
339 | } | 341 | } |
340 | 342 | ||
diff --git a/sound/pci/ice1712/hoontech.c b/sound/pci/ice1712/hoontech.c index 3f2f918536f5..3f27d04e7d3c 100644 --- a/sound/pci/ice1712/hoontech.c +++ b/sound/pci/ice1712/hoontech.c | |||
@@ -27,6 +27,8 @@ | |||
27 | #include <linux/interrupt.h> | 27 | #include <linux/interrupt.h> |
28 | #include <linux/init.h> | 28 | #include <linux/init.h> |
29 | #include <linux/slab.h> | 29 | #include <linux/slab.h> |
30 | #include <linux/mutex.h> | ||
31 | |||
30 | #include <sound/core.h> | 32 | #include <sound/core.h> |
31 | 33 | ||
32 | #include "ice1712.h" | 34 | #include "ice1712.h" |
@@ -48,31 +50,31 @@ static void __devinit snd_ice1712_stdsp24_gpio_write(struct snd_ice1712 *ice, un | |||
48 | 50 | ||
49 | static void __devinit snd_ice1712_stdsp24_darear(struct snd_ice1712 *ice, int activate) | 51 | static void __devinit snd_ice1712_stdsp24_darear(struct snd_ice1712 *ice, int activate) |
50 | { | 52 | { |
51 | down(&ice->gpio_mutex); | 53 | mutex_lock(&ice->gpio_mutex); |
52 | ICE1712_STDSP24_0_DAREAR(ice->spec.hoontech.boxbits, activate); | 54 | ICE1712_STDSP24_0_DAREAR(ice->spec.hoontech.boxbits, activate); |
53 | snd_ice1712_stdsp24_gpio_write(ice, ice->spec.hoontech.boxbits[0]); | 55 | snd_ice1712_stdsp24_gpio_write(ice, ice->spec.hoontech.boxbits[0]); |
54 | up(&ice->gpio_mutex); | 56 | mutex_unlock(&ice->gpio_mutex); |
55 | } | 57 | } |
56 | 58 | ||
57 | static void __devinit snd_ice1712_stdsp24_mute(struct snd_ice1712 *ice, int activate) | 59 | static void __devinit snd_ice1712_stdsp24_mute(struct snd_ice1712 *ice, int activate) |
58 | { | 60 | { |
59 | down(&ice->gpio_mutex); | 61 | mutex_lock(&ice->gpio_mutex); |
60 | ICE1712_STDSP24_3_MUTE(ice->spec.hoontech.boxbits, activate); | 62 | ICE1712_STDSP24_3_MUTE(ice->spec.hoontech.boxbits, activate); |
61 | snd_ice1712_stdsp24_gpio_write(ice, ice->spec.hoontech.boxbits[3]); | 63 | snd_ice1712_stdsp24_gpio_write(ice, ice->spec.hoontech.boxbits[3]); |
62 | up(&ice->gpio_mutex); | 64 | mutex_unlock(&ice->gpio_mutex); |
63 | } | 65 | } |
64 | 66 | ||
65 | static void __devinit snd_ice1712_stdsp24_insel(struct snd_ice1712 *ice, int activate) | 67 | static void __devinit snd_ice1712_stdsp24_insel(struct snd_ice1712 *ice, int activate) |
66 | { | 68 | { |
67 | down(&ice->gpio_mutex); | 69 | mutex_lock(&ice->gpio_mutex); |
68 | ICE1712_STDSP24_3_INSEL(ice->spec.hoontech.boxbits, activate); | 70 | ICE1712_STDSP24_3_INSEL(ice->spec.hoontech.boxbits, activate); |
69 | snd_ice1712_stdsp24_gpio_write(ice, ice->spec.hoontech.boxbits[3]); | 71 | snd_ice1712_stdsp24_gpio_write(ice, ice->spec.hoontech.boxbits[3]); |
70 | up(&ice->gpio_mutex); | 72 | mutex_unlock(&ice->gpio_mutex); |
71 | } | 73 | } |
72 | 74 | ||
73 | static void __devinit snd_ice1712_stdsp24_box_channel(struct snd_ice1712 *ice, int box, int chn, int activate) | 75 | static void __devinit snd_ice1712_stdsp24_box_channel(struct snd_ice1712 *ice, int box, int chn, int activate) |
74 | { | 76 | { |
75 | down(&ice->gpio_mutex); | 77 | mutex_lock(&ice->gpio_mutex); |
76 | 78 | ||
77 | /* select box */ | 79 | /* select box */ |
78 | ICE1712_STDSP24_0_BOX(ice->spec.hoontech.boxbits, box); | 80 | ICE1712_STDSP24_0_BOX(ice->spec.hoontech.boxbits, box); |
@@ -115,12 +117,12 @@ static void __devinit snd_ice1712_stdsp24_box_channel(struct snd_ice1712 *ice, i | |||
115 | ICE1712_STDSP24_2_MIDI1(ice->spec.hoontech.boxbits, 0); | 117 | ICE1712_STDSP24_2_MIDI1(ice->spec.hoontech.boxbits, 0); |
116 | snd_ice1712_stdsp24_gpio_write(ice, ice->spec.hoontech.boxbits[2]); | 118 | snd_ice1712_stdsp24_gpio_write(ice, ice->spec.hoontech.boxbits[2]); |
117 | 119 | ||
118 | up(&ice->gpio_mutex); | 120 | mutex_unlock(&ice->gpio_mutex); |
119 | } | 121 | } |
120 | 122 | ||
121 | static void __devinit snd_ice1712_stdsp24_box_midi(struct snd_ice1712 *ice, int box, int master) | 123 | static void __devinit snd_ice1712_stdsp24_box_midi(struct snd_ice1712 *ice, int box, int master) |
122 | { | 124 | { |
123 | down(&ice->gpio_mutex); | 125 | mutex_lock(&ice->gpio_mutex); |
124 | 126 | ||
125 | /* select box */ | 127 | /* select box */ |
126 | ICE1712_STDSP24_0_BOX(ice->spec.hoontech.boxbits, box); | 128 | ICE1712_STDSP24_0_BOX(ice->spec.hoontech.boxbits, box); |
@@ -141,15 +143,15 @@ static void __devinit snd_ice1712_stdsp24_box_midi(struct snd_ice1712 *ice, int | |||
141 | ICE1712_STDSP24_2_MIDIIN(ice->spec.hoontech.boxbits, 1); | 143 | ICE1712_STDSP24_2_MIDIIN(ice->spec.hoontech.boxbits, 1); |
142 | snd_ice1712_stdsp24_gpio_write(ice, ice->spec.hoontech.boxbits[2]); | 144 | snd_ice1712_stdsp24_gpio_write(ice, ice->spec.hoontech.boxbits[2]); |
143 | 145 | ||
144 | up(&ice->gpio_mutex); | 146 | mutex_unlock(&ice->gpio_mutex); |
145 | } | 147 | } |
146 | 148 | ||
147 | static void __devinit snd_ice1712_stdsp24_midi2(struct snd_ice1712 *ice, int activate) | 149 | static void __devinit snd_ice1712_stdsp24_midi2(struct snd_ice1712 *ice, int activate) |
148 | { | 150 | { |
149 | down(&ice->gpio_mutex); | 151 | mutex_lock(&ice->gpio_mutex); |
150 | ICE1712_STDSP24_3_MIDI2(ice->spec.hoontech.boxbits, activate); | 152 | ICE1712_STDSP24_3_MIDI2(ice->spec.hoontech.boxbits, activate); |
151 | snd_ice1712_stdsp24_gpio_write(ice, ice->spec.hoontech.boxbits[3]); | 153 | snd_ice1712_stdsp24_gpio_write(ice, ice->spec.hoontech.boxbits[3]); |
152 | up(&ice->gpio_mutex); | 154 | mutex_unlock(&ice->gpio_mutex); |
153 | } | 155 | } |
154 | 156 | ||
155 | static int __devinit snd_ice1712_hoontech_init(struct snd_ice1712 *ice) | 157 | static int __devinit snd_ice1712_hoontech_init(struct snd_ice1712 *ice) |
diff --git a/sound/pci/ice1712/ice1712.c b/sound/pci/ice1712/ice1712.c index ef6f18558c95..3156a3132990 100644 --- a/sound/pci/ice1712/ice1712.c +++ b/sound/pci/ice1712/ice1712.c | |||
@@ -55,6 +55,7 @@ | |||
55 | #include <linux/pci.h> | 55 | #include <linux/pci.h> |
56 | #include <linux/slab.h> | 56 | #include <linux/slab.h> |
57 | #include <linux/moduleparam.h> | 57 | #include <linux/moduleparam.h> |
58 | #include <linux/mutex.h> | ||
58 | #include <sound/core.h> | 59 | #include <sound/core.h> |
59 | #include <sound/cs8427.h> | 60 | #include <sound/cs8427.h> |
60 | #include <sound/info.h> | 61 | #include <sound/info.h> |
@@ -2557,9 +2558,9 @@ static int __devinit snd_ice1712_create(struct snd_card *card, | |||
2557 | cs8427_timeout = 1000; | 2558 | cs8427_timeout = 1000; |
2558 | ice->cs8427_timeout = cs8427_timeout; | 2559 | ice->cs8427_timeout = cs8427_timeout; |
2559 | spin_lock_init(&ice->reg_lock); | 2560 | spin_lock_init(&ice->reg_lock); |
2560 | init_MUTEX(&ice->gpio_mutex); | 2561 | mutex_init(&ice->gpio_mutex); |
2561 | init_MUTEX(&ice->i2c_mutex); | 2562 | mutex_init(&ice->i2c_mutex); |
2562 | init_MUTEX(&ice->open_mutex); | 2563 | mutex_init(&ice->open_mutex); |
2563 | ice->gpio.set_mask = snd_ice1712_set_gpio_mask; | 2564 | ice->gpio.set_mask = snd_ice1712_set_gpio_mask; |
2564 | ice->gpio.set_dir = snd_ice1712_set_gpio_dir; | 2565 | ice->gpio.set_dir = snd_ice1712_set_gpio_dir; |
2565 | ice->gpio.set_data = snd_ice1712_set_gpio_data; | 2566 | ice->gpio.set_data = snd_ice1712_set_gpio_data; |
diff --git a/sound/pci/ice1712/ice1712.h b/sound/pci/ice1712/ice1712.h index ce96b3bb6531..d7416a83fcac 100644 --- a/sound/pci/ice1712/ice1712.h +++ b/sound/pci/ice1712/ice1712.h | |||
@@ -334,7 +334,7 @@ struct snd_ice1712 { | |||
334 | unsigned int num_total_adcs; /* total ADCs */ | 334 | unsigned int num_total_adcs; /* total ADCs */ |
335 | unsigned int cur_rate; /* current rate */ | 335 | unsigned int cur_rate; /* current rate */ |
336 | 336 | ||
337 | struct semaphore open_mutex; | 337 | struct mutex open_mutex; |
338 | struct snd_pcm_substream *pcm_reserved[4]; | 338 | struct snd_pcm_substream *pcm_reserved[4]; |
339 | struct snd_pcm_hw_constraint_list *hw_rates; /* card-specific rate constraints */ | 339 | struct snd_pcm_hw_constraint_list *hw_rates; /* card-specific rate constraints */ |
340 | 340 | ||
@@ -342,7 +342,7 @@ struct snd_ice1712 { | |||
342 | struct snd_akm4xxx *akm; | 342 | struct snd_akm4xxx *akm; |
343 | struct snd_ice1712_spdif spdif; | 343 | struct snd_ice1712_spdif spdif; |
344 | 344 | ||
345 | struct semaphore i2c_mutex; /* I2C mutex for ICE1724 registers */ | 345 | struct mutex i2c_mutex; /* I2C mutex for ICE1724 registers */ |
346 | struct snd_i2c_bus *i2c; /* I2C bus */ | 346 | struct snd_i2c_bus *i2c; /* I2C bus */ |
347 | struct snd_i2c_device *cs8427; /* CS8427 I2C device */ | 347 | struct snd_i2c_device *cs8427; /* CS8427 I2C device */ |
348 | unsigned int cs8427_timeout; /* CS8427 reset timeout in HZ/100 */ | 348 | unsigned int cs8427_timeout; /* CS8427 reset timeout in HZ/100 */ |
@@ -360,7 +360,7 @@ struct snd_ice1712 { | |||
360 | void (*set_pro_rate)(struct snd_ice1712 *ice, unsigned int rate); | 360 | void (*set_pro_rate)(struct snd_ice1712 *ice, unsigned int rate); |
361 | void (*i2s_mclk_changed)(struct snd_ice1712 *ice); | 361 | void (*i2s_mclk_changed)(struct snd_ice1712 *ice); |
362 | } gpio; | 362 | } gpio; |
363 | struct semaphore gpio_mutex; | 363 | struct mutex gpio_mutex; |
364 | 364 | ||
365 | /* other board-specific data */ | 365 | /* other board-specific data */ |
366 | union { | 366 | union { |
@@ -423,7 +423,7 @@ static inline unsigned int snd_ice1712_gpio_read(struct snd_ice1712 *ice) | |||
423 | */ | 423 | */ |
424 | static inline void snd_ice1712_save_gpio_status(struct snd_ice1712 *ice) | 424 | static inline void snd_ice1712_save_gpio_status(struct snd_ice1712 *ice) |
425 | { | 425 | { |
426 | down(&ice->gpio_mutex); | 426 | mutex_lock(&ice->gpio_mutex); |
427 | ice->gpio.saved[0] = ice->gpio.direction; | 427 | ice->gpio.saved[0] = ice->gpio.direction; |
428 | ice->gpio.saved[1] = ice->gpio.write_mask; | 428 | ice->gpio.saved[1] = ice->gpio.write_mask; |
429 | } | 429 | } |
@@ -434,7 +434,7 @@ static inline void snd_ice1712_restore_gpio_status(struct snd_ice1712 *ice) | |||
434 | ice->gpio.set_mask(ice, ice->gpio.saved[1]); | 434 | ice->gpio.set_mask(ice, ice->gpio.saved[1]); |
435 | ice->gpio.direction = ice->gpio.saved[0]; | 435 | ice->gpio.direction = ice->gpio.saved[0]; |
436 | ice->gpio.write_mask = ice->gpio.saved[1]; | 436 | ice->gpio.write_mask = ice->gpio.saved[1]; |
437 | up(&ice->gpio_mutex); | 437 | mutex_unlock(&ice->gpio_mutex); |
438 | } | 438 | } |
439 | 439 | ||
440 | /* for bit controls */ | 440 | /* for bit controls */ |
diff --git a/sound/pci/ice1712/ice1724.c b/sound/pci/ice1712/ice1724.c index 71f08c036019..fce616c2761f 100644 --- a/sound/pci/ice1712/ice1724.c +++ b/sound/pci/ice1712/ice1724.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <linux/pci.h> | 30 | #include <linux/pci.h> |
31 | #include <linux/slab.h> | 31 | #include <linux/slab.h> |
32 | #include <linux/moduleparam.h> | 32 | #include <linux/moduleparam.h> |
33 | #include <linux/mutex.h> | ||
33 | #include <sound/core.h> | 34 | #include <sound/core.h> |
34 | #include <sound/info.h> | 35 | #include <sound/info.h> |
35 | #include <sound/mpu401.h> | 36 | #include <sound/mpu401.h> |
@@ -487,7 +488,7 @@ static int snd_vt1724_pcm_hw_params(struct snd_pcm_substream *substream, | |||
487 | int i, chs; | 488 | int i, chs; |
488 | 489 | ||
489 | chs = params_channels(hw_params); | 490 | chs = params_channels(hw_params); |
490 | down(&ice->open_mutex); | 491 | mutex_lock(&ice->open_mutex); |
491 | /* mark surround channels */ | 492 | /* mark surround channels */ |
492 | if (substream == ice->playback_pro_substream) { | 493 | if (substream == ice->playback_pro_substream) { |
493 | /* PDMA0 can be multi-channel up to 8 */ | 494 | /* PDMA0 can be multi-channel up to 8 */ |
@@ -495,7 +496,7 @@ static int snd_vt1724_pcm_hw_params(struct snd_pcm_substream *substream, | |||
495 | for (i = 0; i < chs; i++) { | 496 | for (i = 0; i < chs; i++) { |
496 | if (ice->pcm_reserved[i] && | 497 | if (ice->pcm_reserved[i] && |
497 | ice->pcm_reserved[i] != substream) { | 498 | ice->pcm_reserved[i] != substream) { |
498 | up(&ice->open_mutex); | 499 | mutex_unlock(&ice->open_mutex); |
499 | return -EBUSY; | 500 | return -EBUSY; |
500 | } | 501 | } |
501 | ice->pcm_reserved[i] = substream; | 502 | ice->pcm_reserved[i] = substream; |
@@ -510,7 +511,7 @@ static int snd_vt1724_pcm_hw_params(struct snd_pcm_substream *substream, | |||
510 | if (ice->playback_con_substream_ds[i] == substream) { | 511 | if (ice->playback_con_substream_ds[i] == substream) { |
511 | if (ice->pcm_reserved[i] && | 512 | if (ice->pcm_reserved[i] && |
512 | ice->pcm_reserved[i] != substream) { | 513 | ice->pcm_reserved[i] != substream) { |
513 | up(&ice->open_mutex); | 514 | mutex_unlock(&ice->open_mutex); |
514 | return -EBUSY; | 515 | return -EBUSY; |
515 | } | 516 | } |
516 | ice->pcm_reserved[i] = substream; | 517 | ice->pcm_reserved[i] = substream; |
@@ -518,7 +519,7 @@ static int snd_vt1724_pcm_hw_params(struct snd_pcm_substream *substream, | |||
518 | } | 519 | } |
519 | } | 520 | } |
520 | } | 521 | } |
521 | up(&ice->open_mutex); | 522 | mutex_unlock(&ice->open_mutex); |
522 | snd_vt1724_set_pro_rate(ice, params_rate(hw_params), 0); | 523 | snd_vt1724_set_pro_rate(ice, params_rate(hw_params), 0); |
523 | return snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params)); | 524 | return snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params)); |
524 | } | 525 | } |
@@ -528,12 +529,12 @@ static int snd_vt1724_pcm_hw_free(struct snd_pcm_substream *substream) | |||
528 | struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); | 529 | struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); |
529 | int i; | 530 | int i; |
530 | 531 | ||
531 | down(&ice->open_mutex); | 532 | mutex_lock(&ice->open_mutex); |
532 | /* unmark surround channels */ | 533 | /* unmark surround channels */ |
533 | for (i = 0; i < 3; i++) | 534 | for (i = 0; i < 3; i++) |
534 | if (ice->pcm_reserved[i] == substream) | 535 | if (ice->pcm_reserved[i] == substream) |
535 | ice->pcm_reserved[i] = NULL; | 536 | ice->pcm_reserved[i] = NULL; |
536 | up(&ice->open_mutex); | 537 | mutex_unlock(&ice->open_mutex); |
537 | return snd_pcm_lib_free_pages(substream); | 538 | return snd_pcm_lib_free_pages(substream); |
538 | } | 539 | } |
539 | 540 | ||
@@ -778,7 +779,7 @@ static int snd_vt1724_playback_pro_open(struct snd_pcm_substream *substream) | |||
778 | snd_pcm_set_sync(substream); | 779 | snd_pcm_set_sync(substream); |
779 | snd_pcm_hw_constraint_msbits(runtime, 0, 32, 24); | 780 | snd_pcm_hw_constraint_msbits(runtime, 0, 32, 24); |
780 | set_rate_constraints(ice, substream); | 781 | set_rate_constraints(ice, substream); |
781 | down(&ice->open_mutex); | 782 | mutex_lock(&ice->open_mutex); |
782 | /* calculate the currently available channels */ | 783 | /* calculate the currently available channels */ |
783 | for (chs = 0; chs < 3; chs++) { | 784 | for (chs = 0; chs < 3; chs++) { |
784 | if (ice->pcm_reserved[chs]) | 785 | if (ice->pcm_reserved[chs]) |
@@ -788,7 +789,7 @@ static int snd_vt1724_playback_pro_open(struct snd_pcm_substream *substream) | |||
788 | runtime->hw.channels_max = chs; | 789 | runtime->hw.channels_max = chs; |
789 | if (chs > 2) /* channels must be even */ | 790 | if (chs > 2) /* channels must be even */ |
790 | snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS, 2); | 791 | snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS, 2); |
791 | up(&ice->open_mutex); | 792 | mutex_unlock(&ice->open_mutex); |
792 | snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES, | 793 | snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES, |
793 | VT1724_BUFFER_ALIGN); | 794 | VT1724_BUFFER_ALIGN); |
794 | snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES, | 795 | snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES, |
@@ -1128,13 +1129,13 @@ static int snd_vt1724_playback_indep_open(struct snd_pcm_substream *substream) | |||
1128 | struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); | 1129 | struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); |
1129 | struct snd_pcm_runtime *runtime = substream->runtime; | 1130 | struct snd_pcm_runtime *runtime = substream->runtime; |
1130 | 1131 | ||
1131 | down(&ice->open_mutex); | 1132 | mutex_lock(&ice->open_mutex); |
1132 | /* already used by PDMA0? */ | 1133 | /* already used by PDMA0? */ |
1133 | if (ice->pcm_reserved[substream->number]) { | 1134 | if (ice->pcm_reserved[substream->number]) { |
1134 | up(&ice->open_mutex); | 1135 | mutex_unlock(&ice->open_mutex); |
1135 | return -EBUSY; /* FIXME: should handle blocking mode properly */ | 1136 | return -EBUSY; /* FIXME: should handle blocking mode properly */ |
1136 | } | 1137 | } |
1137 | up(&ice->open_mutex); | 1138 | mutex_unlock(&ice->open_mutex); |
1138 | runtime->private_data = &vt1724_playback_dma_regs[substream->number]; | 1139 | runtime->private_data = &vt1724_playback_dma_regs[substream->number]; |
1139 | ice->playback_con_substream_ds[substream->number] = substream; | 1140 | ice->playback_con_substream_ds[substream->number] = substream; |
1140 | runtime->hw = snd_vt1724_2ch_stereo; | 1141 | runtime->hw = snd_vt1724_2ch_stereo; |
@@ -1978,12 +1979,12 @@ unsigned char snd_vt1724_read_i2c(struct snd_ice1712 *ice, | |||
1978 | { | 1979 | { |
1979 | unsigned char val; | 1980 | unsigned char val; |
1980 | 1981 | ||
1981 | down(&ice->i2c_mutex); | 1982 | mutex_lock(&ice->i2c_mutex); |
1982 | outb(addr, ICEREG1724(ice, I2C_BYTE_ADDR)); | 1983 | outb(addr, ICEREG1724(ice, I2C_BYTE_ADDR)); |
1983 | outb(dev & ~VT1724_I2C_WRITE, ICEREG1724(ice, I2C_DEV_ADDR)); | 1984 | outb(dev & ~VT1724_I2C_WRITE, ICEREG1724(ice, I2C_DEV_ADDR)); |
1984 | wait_i2c_busy(ice); | 1985 | wait_i2c_busy(ice); |
1985 | val = inb(ICEREG1724(ice, I2C_DATA)); | 1986 | val = inb(ICEREG1724(ice, I2C_DATA)); |
1986 | up(&ice->i2c_mutex); | 1987 | mutex_unlock(&ice->i2c_mutex); |
1987 | //printk("i2c_read: [0x%x,0x%x] = 0x%x\n", dev, addr, val); | 1988 | //printk("i2c_read: [0x%x,0x%x] = 0x%x\n", dev, addr, val); |
1988 | return val; | 1989 | return val; |
1989 | } | 1990 | } |
@@ -1991,14 +1992,14 @@ unsigned char snd_vt1724_read_i2c(struct snd_ice1712 *ice, | |||
1991 | void snd_vt1724_write_i2c(struct snd_ice1712 *ice, | 1992 | void snd_vt1724_write_i2c(struct snd_ice1712 *ice, |
1992 | unsigned char dev, unsigned char addr, unsigned char data) | 1993 | unsigned char dev, unsigned char addr, unsigned char data) |
1993 | { | 1994 | { |
1994 | down(&ice->i2c_mutex); | 1995 | mutex_lock(&ice->i2c_mutex); |
1995 | wait_i2c_busy(ice); | 1996 | wait_i2c_busy(ice); |
1996 | //printk("i2c_write: [0x%x,0x%x] = 0x%x\n", dev, addr, data); | 1997 | //printk("i2c_write: [0x%x,0x%x] = 0x%x\n", dev, addr, data); |
1997 | outb(addr, ICEREG1724(ice, I2C_BYTE_ADDR)); | 1998 | outb(addr, ICEREG1724(ice, I2C_BYTE_ADDR)); |
1998 | outb(data, ICEREG1724(ice, I2C_DATA)); | 1999 | outb(data, ICEREG1724(ice, I2C_DATA)); |
1999 | outb(dev | VT1724_I2C_WRITE, ICEREG1724(ice, I2C_DEV_ADDR)); | 2000 | outb(dev | VT1724_I2C_WRITE, ICEREG1724(ice, I2C_DEV_ADDR)); |
2000 | wait_i2c_busy(ice); | 2001 | wait_i2c_busy(ice); |
2001 | up(&ice->i2c_mutex); | 2002 | mutex_unlock(&ice->i2c_mutex); |
2002 | } | 2003 | } |
2003 | 2004 | ||
2004 | static int __devinit snd_vt1724_read_eeprom(struct snd_ice1712 *ice, | 2005 | static int __devinit snd_vt1724_read_eeprom(struct snd_ice1712 *ice, |
@@ -2229,9 +2230,9 @@ static int __devinit snd_vt1724_create(struct snd_card *card, | |||
2229 | } | 2230 | } |
2230 | ice->vt1724 = 1; | 2231 | ice->vt1724 = 1; |
2231 | spin_lock_init(&ice->reg_lock); | 2232 | spin_lock_init(&ice->reg_lock); |
2232 | init_MUTEX(&ice->gpio_mutex); | 2233 | mutex_init(&ice->gpio_mutex); |
2233 | init_MUTEX(&ice->open_mutex); | 2234 | mutex_init(&ice->open_mutex); |
2234 | init_MUTEX(&ice->i2c_mutex); | 2235 | mutex_init(&ice->i2c_mutex); |
2235 | ice->gpio.set_mask = snd_vt1724_set_gpio_mask; | 2236 | ice->gpio.set_mask = snd_vt1724_set_gpio_mask; |
2236 | ice->gpio.set_dir = snd_vt1724_set_gpio_dir; | 2237 | ice->gpio.set_dir = snd_vt1724_set_gpio_dir; |
2237 | ice->gpio.set_data = snd_vt1724_set_gpio_data; | 2238 | ice->gpio.set_data = snd_vt1724_set_gpio_data; |
diff --git a/sound/pci/ice1712/phase.c b/sound/pci/ice1712/phase.c index ec3757834b93..502da1c8b5f7 100644 --- a/sound/pci/ice1712/phase.c +++ b/sound/pci/ice1712/phase.c | |||
@@ -39,6 +39,8 @@ | |||
39 | #include <linux/interrupt.h> | 39 | #include <linux/interrupt.h> |
40 | #include <linux/init.h> | 40 | #include <linux/init.h> |
41 | #include <linux/slab.h> | 41 | #include <linux/slab.h> |
42 | #include <linux/mutex.h> | ||
43 | |||
42 | #include <sound/core.h> | 44 | #include <sound/core.h> |
43 | 45 | ||
44 | #include "ice1712.h" | 46 | #include "ice1712.h" |
@@ -273,9 +275,9 @@ static int wm_pcm_mute_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_va | |||
273 | { | 275 | { |
274 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); | 276 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); |
275 | 277 | ||
276 | down(&ice->gpio_mutex); | 278 | mutex_lock(&ice->gpio_mutex); |
277 | ucontrol->value.integer.value[0] = (wm_get(ice, WM_MUTE) & 0x10) ? 0 : 1; | 279 | ucontrol->value.integer.value[0] = (wm_get(ice, WM_MUTE) & 0x10) ? 0 : 1; |
278 | up(&ice->gpio_mutex); | 280 | mutex_unlock(&ice->gpio_mutex); |
279 | return 0; | 281 | return 0; |
280 | } | 282 | } |
281 | 283 | ||
@@ -584,11 +586,11 @@ static int wm_pcm_vol_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_val | |||
584 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); | 586 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); |
585 | unsigned short val; | 587 | unsigned short val; |
586 | 588 | ||
587 | down(&ice->gpio_mutex); | 589 | mutex_lock(&ice->gpio_mutex); |
588 | val = wm_get(ice, WM_DAC_DIG_MASTER_ATTEN) & 0xff; | 590 | val = wm_get(ice, WM_DAC_DIG_MASTER_ATTEN) & 0xff; |
589 | val = val > PCM_MIN ? (val - PCM_MIN) : 0; | 591 | val = val > PCM_MIN ? (val - PCM_MIN) : 0; |
590 | ucontrol->value.integer.value[0] = val; | 592 | ucontrol->value.integer.value[0] = val; |
591 | up(&ice->gpio_mutex); | 593 | mutex_unlock(&ice->gpio_mutex); |
592 | return 0; | 594 | return 0; |
593 | } | 595 | } |
594 | 596 | ||
diff --git a/sound/pci/ice1712/pontis.c b/sound/pci/ice1712/pontis.c index 0dccd7707a4b..d23fb3fc2133 100644 --- a/sound/pci/ice1712/pontis.c +++ b/sound/pci/ice1712/pontis.c | |||
@@ -27,6 +27,8 @@ | |||
27 | #include <linux/interrupt.h> | 27 | #include <linux/interrupt.h> |
28 | #include <linux/init.h> | 28 | #include <linux/init.h> |
29 | #include <linux/slab.h> | 29 | #include <linux/slab.h> |
30 | #include <linux/mutex.h> | ||
31 | |||
30 | #include <sound/core.h> | 32 | #include <sound/core.h> |
31 | #include <sound/info.h> | 33 | #include <sound/info.h> |
32 | 34 | ||
@@ -124,13 +126,13 @@ static int wm_dac_vol_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_val | |||
124 | unsigned short val; | 126 | unsigned short val; |
125 | int i; | 127 | int i; |
126 | 128 | ||
127 | down(&ice->gpio_mutex); | 129 | mutex_lock(&ice->gpio_mutex); |
128 | for (i = 0; i < 2; i++) { | 130 | for (i = 0; i < 2; i++) { |
129 | val = wm_get(ice, WM_DAC_ATTEN_L + i) & 0xff; | 131 | val = wm_get(ice, WM_DAC_ATTEN_L + i) & 0xff; |
130 | val = val > DAC_MIN ? (val - DAC_MIN) : 0; | 132 | val = val > DAC_MIN ? (val - DAC_MIN) : 0; |
131 | ucontrol->value.integer.value[i] = val; | 133 | ucontrol->value.integer.value[i] = val; |
132 | } | 134 | } |
133 | up(&ice->gpio_mutex); | 135 | mutex_unlock(&ice->gpio_mutex); |
134 | return 0; | 136 | return 0; |
135 | } | 137 | } |
136 | 138 | ||
@@ -140,7 +142,7 @@ static int wm_dac_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_val | |||
140 | unsigned short oval, nval; | 142 | unsigned short oval, nval; |
141 | int i, idx, change = 0; | 143 | int i, idx, change = 0; |
142 | 144 | ||
143 | down(&ice->gpio_mutex); | 145 | mutex_lock(&ice->gpio_mutex); |
144 | for (i = 0; i < 2; i++) { | 146 | for (i = 0; i < 2; i++) { |
145 | nval = ucontrol->value.integer.value[i]; | 147 | nval = ucontrol->value.integer.value[i]; |
146 | nval = (nval ? (nval + DAC_MIN) : 0) & 0xff; | 148 | nval = (nval ? (nval + DAC_MIN) : 0) & 0xff; |
@@ -152,7 +154,7 @@ static int wm_dac_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_val | |||
152 | change = 1; | 154 | change = 1; |
153 | } | 155 | } |
154 | } | 156 | } |
155 | up(&ice->gpio_mutex); | 157 | mutex_unlock(&ice->gpio_mutex); |
156 | return change; | 158 | return change; |
157 | } | 159 | } |
158 | 160 | ||
@@ -179,13 +181,13 @@ static int wm_adc_vol_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_val | |||
179 | unsigned short val; | 181 | unsigned short val; |
180 | int i; | 182 | int i; |
181 | 183 | ||
182 | down(&ice->gpio_mutex); | 184 | mutex_lock(&ice->gpio_mutex); |
183 | for (i = 0; i < 2; i++) { | 185 | for (i = 0; i < 2; i++) { |
184 | val = wm_get(ice, WM_ADC_ATTEN_L + i) & 0xff; | 186 | val = wm_get(ice, WM_ADC_ATTEN_L + i) & 0xff; |
185 | val = val > ADC_MIN ? (val - ADC_MIN) : 0; | 187 | val = val > ADC_MIN ? (val - ADC_MIN) : 0; |
186 | ucontrol->value.integer.value[i] = val; | 188 | ucontrol->value.integer.value[i] = val; |
187 | } | 189 | } |
188 | up(&ice->gpio_mutex); | 190 | mutex_unlock(&ice->gpio_mutex); |
189 | return 0; | 191 | return 0; |
190 | } | 192 | } |
191 | 193 | ||
@@ -195,7 +197,7 @@ static int wm_adc_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_val | |||
195 | unsigned short ovol, nvol; | 197 | unsigned short ovol, nvol; |
196 | int i, idx, change = 0; | 198 | int i, idx, change = 0; |
197 | 199 | ||
198 | down(&ice->gpio_mutex); | 200 | mutex_lock(&ice->gpio_mutex); |
199 | for (i = 0; i < 2; i++) { | 201 | for (i = 0; i < 2; i++) { |
200 | nvol = ucontrol->value.integer.value[i]; | 202 | nvol = ucontrol->value.integer.value[i]; |
201 | nvol = nvol ? (nvol + ADC_MIN) : 0; | 203 | nvol = nvol ? (nvol + ADC_MIN) : 0; |
@@ -206,7 +208,7 @@ static int wm_adc_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_val | |||
206 | change = 1; | 208 | change = 1; |
207 | } | 209 | } |
208 | } | 210 | } |
209 | up(&ice->gpio_mutex); | 211 | mutex_unlock(&ice->gpio_mutex); |
210 | return change; | 212 | return change; |
211 | } | 213 | } |
212 | 214 | ||
@@ -227,9 +229,9 @@ static int wm_adc_mux_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_val | |||
227 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); | 229 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); |
228 | int bit = kcontrol->private_value; | 230 | int bit = kcontrol->private_value; |
229 | 231 | ||
230 | down(&ice->gpio_mutex); | 232 | mutex_lock(&ice->gpio_mutex); |
231 | ucontrol->value.integer.value[0] = (wm_get(ice, WM_ADC_MUX) & (1 << bit)) ? 1 : 0; | 233 | ucontrol->value.integer.value[0] = (wm_get(ice, WM_ADC_MUX) & (1 << bit)) ? 1 : 0; |
232 | up(&ice->gpio_mutex); | 234 | mutex_unlock(&ice->gpio_mutex); |
233 | return 0; | 235 | return 0; |
234 | } | 236 | } |
235 | 237 | ||
@@ -240,7 +242,7 @@ static int wm_adc_mux_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_val | |||
240 | unsigned short oval, nval; | 242 | unsigned short oval, nval; |
241 | int change; | 243 | int change; |
242 | 244 | ||
243 | down(&ice->gpio_mutex); | 245 | mutex_lock(&ice->gpio_mutex); |
244 | nval = oval = wm_get(ice, WM_ADC_MUX); | 246 | nval = oval = wm_get(ice, WM_ADC_MUX); |
245 | if (ucontrol->value.integer.value[0]) | 247 | if (ucontrol->value.integer.value[0]) |
246 | nval |= (1 << bit); | 248 | nval |= (1 << bit); |
@@ -250,7 +252,7 @@ static int wm_adc_mux_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_val | |||
250 | if (change) { | 252 | if (change) { |
251 | wm_put(ice, WM_ADC_MUX, nval); | 253 | wm_put(ice, WM_ADC_MUX, nval); |
252 | } | 254 | } |
253 | up(&ice->gpio_mutex); | 255 | mutex_unlock(&ice->gpio_mutex); |
254 | return 0; | 256 | return 0; |
255 | } | 257 | } |
256 | 258 | ||
@@ -270,9 +272,9 @@ static int wm_bypass_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_valu | |||
270 | { | 272 | { |
271 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); | 273 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); |
272 | 274 | ||
273 | down(&ice->gpio_mutex); | 275 | mutex_lock(&ice->gpio_mutex); |
274 | ucontrol->value.integer.value[0] = (wm_get(ice, WM_OUT_MUX) & 0x04) ? 1 : 0; | 276 | ucontrol->value.integer.value[0] = (wm_get(ice, WM_OUT_MUX) & 0x04) ? 1 : 0; |
275 | up(&ice->gpio_mutex); | 277 | mutex_unlock(&ice->gpio_mutex); |
276 | return 0; | 278 | return 0; |
277 | } | 279 | } |
278 | 280 | ||
@@ -282,7 +284,7 @@ static int wm_bypass_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_valu | |||
282 | unsigned short val, oval; | 284 | unsigned short val, oval; |
283 | int change = 0; | 285 | int change = 0; |
284 | 286 | ||
285 | down(&ice->gpio_mutex); | 287 | mutex_lock(&ice->gpio_mutex); |
286 | val = oval = wm_get(ice, WM_OUT_MUX); | 288 | val = oval = wm_get(ice, WM_OUT_MUX); |
287 | if (ucontrol->value.integer.value[0]) | 289 | if (ucontrol->value.integer.value[0]) |
288 | val |= 0x04; | 290 | val |= 0x04; |
@@ -292,7 +294,7 @@ static int wm_bypass_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_valu | |||
292 | wm_put(ice, WM_OUT_MUX, val); | 294 | wm_put(ice, WM_OUT_MUX, val); |
293 | change = 1; | 295 | change = 1; |
294 | } | 296 | } |
295 | up(&ice->gpio_mutex); | 297 | mutex_unlock(&ice->gpio_mutex); |
296 | return change; | 298 | return change; |
297 | } | 299 | } |
298 | 300 | ||
@@ -312,9 +314,9 @@ static int wm_chswap_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_valu | |||
312 | { | 314 | { |
313 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); | 315 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); |
314 | 316 | ||
315 | down(&ice->gpio_mutex); | 317 | mutex_lock(&ice->gpio_mutex); |
316 | ucontrol->value.integer.value[0] = (wm_get(ice, WM_DAC_CTRL1) & 0xf0) != 0x90; | 318 | ucontrol->value.integer.value[0] = (wm_get(ice, WM_DAC_CTRL1) & 0xf0) != 0x90; |
317 | up(&ice->gpio_mutex); | 319 | mutex_unlock(&ice->gpio_mutex); |
318 | return 0; | 320 | return 0; |
319 | } | 321 | } |
320 | 322 | ||
@@ -324,7 +326,7 @@ static int wm_chswap_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_valu | |||
324 | unsigned short val, oval; | 326 | unsigned short val, oval; |
325 | int change = 0; | 327 | int change = 0; |
326 | 328 | ||
327 | down(&ice->gpio_mutex); | 329 | mutex_lock(&ice->gpio_mutex); |
328 | oval = wm_get(ice, WM_DAC_CTRL1); | 330 | oval = wm_get(ice, WM_DAC_CTRL1); |
329 | val = oval & 0x0f; | 331 | val = oval & 0x0f; |
330 | if (ucontrol->value.integer.value[0]) | 332 | if (ucontrol->value.integer.value[0]) |
@@ -336,7 +338,7 @@ static int wm_chswap_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_valu | |||
336 | wm_put_nocache(ice, WM_DAC_CTRL1, val); | 338 | wm_put_nocache(ice, WM_DAC_CTRL1, val); |
337 | change = 1; | 339 | change = 1; |
338 | } | 340 | } |
339 | up(&ice->gpio_mutex); | 341 | mutex_unlock(&ice->gpio_mutex); |
340 | return change; | 342 | return change; |
341 | } | 343 | } |
342 | 344 | ||
@@ -449,9 +451,9 @@ static int cs_source_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_valu | |||
449 | { | 451 | { |
450 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); | 452 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); |
451 | 453 | ||
452 | down(&ice->gpio_mutex); | 454 | mutex_lock(&ice->gpio_mutex); |
453 | ucontrol->value.enumerated.item[0] = ice->gpio.saved[0]; | 455 | ucontrol->value.enumerated.item[0] = ice->gpio.saved[0]; |
454 | up(&ice->gpio_mutex); | 456 | mutex_unlock(&ice->gpio_mutex); |
455 | return 0; | 457 | return 0; |
456 | } | 458 | } |
457 | 459 | ||
@@ -461,14 +463,14 @@ static int cs_source_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_valu | |||
461 | unsigned char val; | 463 | unsigned char val; |
462 | int change = 0; | 464 | int change = 0; |
463 | 465 | ||
464 | down(&ice->gpio_mutex); | 466 | mutex_lock(&ice->gpio_mutex); |
465 | if (ucontrol->value.enumerated.item[0] != ice->gpio.saved[0]) { | 467 | if (ucontrol->value.enumerated.item[0] != ice->gpio.saved[0]) { |
466 | ice->gpio.saved[0] = ucontrol->value.enumerated.item[0] & 3; | 468 | ice->gpio.saved[0] = ucontrol->value.enumerated.item[0] & 3; |
467 | val = 0x80 | (ice->gpio.saved[0] << 3); | 469 | val = 0x80 | (ice->gpio.saved[0] << 3); |
468 | spi_write(ice, CS_DEV, 0x04, val); | 470 | spi_write(ice, CS_DEV, 0x04, val); |
469 | change = 1; | 471 | change = 1; |
470 | } | 472 | } |
471 | up(&ice->gpio_mutex); | 473 | mutex_unlock(&ice->gpio_mutex); |
472 | return 0; | 474 | return 0; |
473 | } | 475 | } |
474 | 476 | ||
@@ -488,10 +490,10 @@ static int pontis_gpio_mask_info(struct snd_kcontrol *kcontrol, struct snd_ctl_e | |||
488 | static int pontis_gpio_mask_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) | 490 | static int pontis_gpio_mask_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
489 | { | 491 | { |
490 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); | 492 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); |
491 | down(&ice->gpio_mutex); | 493 | mutex_lock(&ice->gpio_mutex); |
492 | /* 4-7 reserved */ | 494 | /* 4-7 reserved */ |
493 | ucontrol->value.integer.value[0] = (~ice->gpio.write_mask & 0xffff) | 0x00f0; | 495 | ucontrol->value.integer.value[0] = (~ice->gpio.write_mask & 0xffff) | 0x00f0; |
494 | up(&ice->gpio_mutex); | 496 | mutex_unlock(&ice->gpio_mutex); |
495 | return 0; | 497 | return 0; |
496 | } | 498 | } |
497 | 499 | ||
@@ -500,22 +502,22 @@ static int pontis_gpio_mask_put(struct snd_kcontrol *kcontrol, struct snd_ctl_el | |||
500 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); | 502 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); |
501 | unsigned int val; | 503 | unsigned int val; |
502 | int changed; | 504 | int changed; |
503 | down(&ice->gpio_mutex); | 505 | mutex_lock(&ice->gpio_mutex); |
504 | /* 4-7 reserved */ | 506 | /* 4-7 reserved */ |
505 | val = (~ucontrol->value.integer.value[0] & 0xffff) | 0x00f0; | 507 | val = (~ucontrol->value.integer.value[0] & 0xffff) | 0x00f0; |
506 | changed = val != ice->gpio.write_mask; | 508 | changed = val != ice->gpio.write_mask; |
507 | ice->gpio.write_mask = val; | 509 | ice->gpio.write_mask = val; |
508 | up(&ice->gpio_mutex); | 510 | mutex_unlock(&ice->gpio_mutex); |
509 | return changed; | 511 | return changed; |
510 | } | 512 | } |
511 | 513 | ||
512 | static int pontis_gpio_dir_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) | 514 | static int pontis_gpio_dir_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
513 | { | 515 | { |
514 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); | 516 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); |
515 | down(&ice->gpio_mutex); | 517 | mutex_lock(&ice->gpio_mutex); |
516 | /* 4-7 reserved */ | 518 | /* 4-7 reserved */ |
517 | ucontrol->value.integer.value[0] = ice->gpio.direction & 0xff0f; | 519 | ucontrol->value.integer.value[0] = ice->gpio.direction & 0xff0f; |
518 | up(&ice->gpio_mutex); | 520 | mutex_unlock(&ice->gpio_mutex); |
519 | return 0; | 521 | return 0; |
520 | } | 522 | } |
521 | 523 | ||
@@ -524,23 +526,23 @@ static int pontis_gpio_dir_put(struct snd_kcontrol *kcontrol, struct snd_ctl_ele | |||
524 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); | 526 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); |
525 | unsigned int val; | 527 | unsigned int val; |
526 | int changed; | 528 | int changed; |
527 | down(&ice->gpio_mutex); | 529 | mutex_lock(&ice->gpio_mutex); |
528 | /* 4-7 reserved */ | 530 | /* 4-7 reserved */ |
529 | val = ucontrol->value.integer.value[0] & 0xff0f; | 531 | val = ucontrol->value.integer.value[0] & 0xff0f; |
530 | changed = (val != ice->gpio.direction); | 532 | changed = (val != ice->gpio.direction); |
531 | ice->gpio.direction = val; | 533 | ice->gpio.direction = val; |
532 | up(&ice->gpio_mutex); | 534 | mutex_unlock(&ice->gpio_mutex); |
533 | return changed; | 535 | return changed; |
534 | } | 536 | } |
535 | 537 | ||
536 | static int pontis_gpio_data_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) | 538 | static int pontis_gpio_data_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
537 | { | 539 | { |
538 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); | 540 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); |
539 | down(&ice->gpio_mutex); | 541 | mutex_lock(&ice->gpio_mutex); |
540 | snd_ice1712_gpio_set_dir(ice, ice->gpio.direction); | 542 | snd_ice1712_gpio_set_dir(ice, ice->gpio.direction); |
541 | snd_ice1712_gpio_set_mask(ice, ice->gpio.write_mask); | 543 | snd_ice1712_gpio_set_mask(ice, ice->gpio.write_mask); |
542 | ucontrol->value.integer.value[0] = snd_ice1712_gpio_read(ice) & 0xffff; | 544 | ucontrol->value.integer.value[0] = snd_ice1712_gpio_read(ice) & 0xffff; |
543 | up(&ice->gpio_mutex); | 545 | mutex_unlock(&ice->gpio_mutex); |
544 | return 0; | 546 | return 0; |
545 | } | 547 | } |
546 | 548 | ||
@@ -549,7 +551,7 @@ static int pontis_gpio_data_put(struct snd_kcontrol *kcontrol, struct snd_ctl_el | |||
549 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); | 551 | struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); |
550 | unsigned int val, nval; | 552 | unsigned int val, nval; |
551 | int changed = 0; | 553 | int changed = 0; |
552 | down(&ice->gpio_mutex); | 554 | mutex_lock(&ice->gpio_mutex); |
553 | snd_ice1712_gpio_set_dir(ice, ice->gpio.direction); | 555 | snd_ice1712_gpio_set_dir(ice, ice->gpio.direction); |
554 | snd_ice1712_gpio_set_mask(ice, ice->gpio.write_mask); | 556 | snd_ice1712_gpio_set_mask(ice, ice->gpio.write_mask); |
555 | val = snd_ice1712_gpio_read(ice) & 0xffff; | 557 | val = snd_ice1712_gpio_read(ice) & 0xffff; |
@@ -558,7 +560,7 @@ static int pontis_gpio_data_put(struct snd_kcontrol *kcontrol, struct snd_ctl_el | |||
558 | snd_ice1712_gpio_write(ice, nval); | 560 | snd_ice1712_gpio_write(ice, nval); |
559 | changed = 1; | 561 | changed = 1; |
560 | } | 562 | } |
561 | up(&ice->gpio_mutex); | 563 | mutex_unlock(&ice->gpio_mutex); |
562 | return changed; | 564 | return changed; |
563 | } | 565 | } |
564 | 566 | ||
@@ -651,14 +653,14 @@ static void wm_proc_regs_write(struct snd_info_entry *entry, struct snd_info_buf | |||
651 | struct snd_ice1712 *ice = (struct snd_ice1712 *)entry->private_data; | 653 | struct snd_ice1712 *ice = (struct snd_ice1712 *)entry->private_data; |
652 | char line[64]; | 654 | char line[64]; |
653 | unsigned int reg, val; | 655 | unsigned int reg, val; |
654 | down(&ice->gpio_mutex); | 656 | mutex_lock(&ice->gpio_mutex); |
655 | while (!snd_info_get_line(buffer, line, sizeof(line))) { | 657 | while (!snd_info_get_line(buffer, line, sizeof(line))) { |
656 | if (sscanf(line, "%x %x", ®, &val) != 2) | 658 | if (sscanf(line, "%x %x", ®, &val) != 2) |
657 | continue; | 659 | continue; |
658 | if (reg <= 0x17 && val <= 0xffff) | 660 | if (reg <= 0x17 && val <= 0xffff) |
659 | wm_put(ice, reg, val); | 661 | wm_put(ice, reg, val); |
660 | } | 662 | } |
661 | up(&ice->gpio_mutex); | 663 | mutex_unlock(&ice->gpio_mutex); |
662 | } | 664 | } |
663 | 665 | ||
664 | static void wm_proc_regs_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer) | 666 | static void wm_proc_regs_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer) |
@@ -666,12 +668,12 @@ static void wm_proc_regs_read(struct snd_info_entry *entry, struct snd_info_buff | |||
666 | struct snd_ice1712 *ice = (struct snd_ice1712 *)entry->private_data; | 668 | struct snd_ice1712 *ice = (struct snd_ice1712 *)entry->private_data; |
667 | int reg, val; | 669 | int reg, val; |
668 | 670 | ||
669 | down(&ice->gpio_mutex); | 671 | mutex_lock(&ice->gpio_mutex); |
670 | for (reg = 0; reg <= 0x17; reg++) { | 672 | for (reg = 0; reg <= 0x17; reg++) { |
671 | val = wm_get(ice, reg); | 673 | val = wm_get(ice, reg); |
672 | snd_iprintf(buffer, "%02x = %04x\n", reg, val); | 674 | snd_iprintf(buffer, "%02x = %04x\n", reg, val); |
673 | } | 675 | } |
674 | up(&ice->gpio_mutex); | 676 | mutex_unlock(&ice->gpio_mutex); |
675 | } | 677 | } |
676 | 678 | ||
677 | static void wm_proc_init(struct snd_ice1712 *ice) | 679 | static void wm_proc_init(struct snd_ice1712 *ice) |
@@ -690,14 +692,14 @@ static void cs_proc_regs_read(struct snd_info_entry *entry, struct snd_info_buff | |||
690 | struct snd_ice1712 *ice = (struct snd_ice1712 *)entry->private_data; | 692 | struct snd_ice1712 *ice = (struct snd_ice1712 *)entry->private_data; |
691 | int reg, val; | 693 | int reg, val; |
692 | 694 | ||
693 | down(&ice->gpio_mutex); | 695 | mutex_lock(&ice->gpio_mutex); |
694 | for (reg = 0; reg <= 0x26; reg++) { | 696 | for (reg = 0; reg <= 0x26; reg++) { |
695 | val = spi_read(ice, CS_DEV, reg); | 697 | val = spi_read(ice, CS_DEV, reg); |
696 | snd_iprintf(buffer, "%02x = %02x\n", reg, val); | 698 | snd_iprintf(buffer, "%02x = %02x\n", reg, val); |
697 | } | 699 | } |
698 | val = spi_read(ice, CS_DEV, 0x7f); | 700 | val = spi_read(ice, CS_DEV, 0x7f); |
699 | snd_iprintf(buffer, "%02x = %02x\n", 0x7f, val); | 701 | snd_iprintf(buffer, "%02x = %02x\n", 0x7f, val); |
700 | up(&ice->gpio_mutex); | 702 | mutex_unlock(&ice->gpio_mutex); |
701 | } | 703 | } |
702 | 704 | ||
703 | static void cs_proc_init(struct snd_ice1712 *ice) | 705 | static void cs_proc_init(struct snd_ice1712 *ice) |
diff --git a/sound/pci/korg1212/korg1212.c b/sound/pci/korg1212/korg1212.c index 4eddb512c12f..4721c096335e 100644 --- a/sound/pci/korg1212/korg1212.c +++ b/sound/pci/korg1212/korg1212.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/slab.h> | 27 | #include <linux/slab.h> |
28 | #include <linux/wait.h> | 28 | #include <linux/wait.h> |
29 | #include <linux/moduleparam.h> | 29 | #include <linux/moduleparam.h> |
30 | #include <linux/mutex.h> | ||
30 | 31 | ||
31 | #include <sound/core.h> | 32 | #include <sound/core.h> |
32 | #include <sound/info.h> | 33 | #include <sound/info.h> |
@@ -325,7 +326,7 @@ struct snd_korg1212 { | |||
325 | int irq; | 326 | int irq; |
326 | 327 | ||
327 | spinlock_t lock; | 328 | spinlock_t lock; |
328 | struct semaphore open_mutex; | 329 | struct mutex open_mutex; |
329 | 330 | ||
330 | struct timer_list timer; /* timer callback for checking ack of stop request */ | 331 | struct timer_list timer; /* timer callback for checking ack of stop request */ |
331 | int stop_pending_cnt; /* counter for stop pending check */ | 332 | int stop_pending_cnt; /* counter for stop pending check */ |
@@ -667,13 +668,13 @@ static int snd_korg1212_OpenCard(struct snd_korg1212 * korg1212) | |||
667 | { | 668 | { |
668 | K1212_DEBUG_PRINTK("K1212_DEBUG: OpenCard [%s] %d\n", | 669 | K1212_DEBUG_PRINTK("K1212_DEBUG: OpenCard [%s] %d\n", |
669 | stateName[korg1212->cardState], korg1212->opencnt); | 670 | stateName[korg1212->cardState], korg1212->opencnt); |
670 | down(&korg1212->open_mutex); | 671 | mutex_lock(&korg1212->open_mutex); |
671 | if (korg1212->opencnt++ == 0) { | 672 | if (korg1212->opencnt++ == 0) { |
672 | snd_korg1212_TurnOffIdleMonitor(korg1212); | 673 | snd_korg1212_TurnOffIdleMonitor(korg1212); |
673 | snd_korg1212_setCardState(korg1212, K1212_STATE_OPEN); | 674 | snd_korg1212_setCardState(korg1212, K1212_STATE_OPEN); |
674 | } | 675 | } |
675 | 676 | ||
676 | up(&korg1212->open_mutex); | 677 | mutex_unlock(&korg1212->open_mutex); |
677 | return 1; | 678 | return 1; |
678 | } | 679 | } |
679 | 680 | ||
@@ -682,9 +683,9 @@ static int snd_korg1212_CloseCard(struct snd_korg1212 * korg1212) | |||
682 | K1212_DEBUG_PRINTK("K1212_DEBUG: CloseCard [%s] %d\n", | 683 | K1212_DEBUG_PRINTK("K1212_DEBUG: CloseCard [%s] %d\n", |
683 | stateName[korg1212->cardState], korg1212->opencnt); | 684 | stateName[korg1212->cardState], korg1212->opencnt); |
684 | 685 | ||
685 | down(&korg1212->open_mutex); | 686 | mutex_lock(&korg1212->open_mutex); |
686 | if (--(korg1212->opencnt)) { | 687 | if (--(korg1212->opencnt)) { |
687 | up(&korg1212->open_mutex); | 688 | mutex_unlock(&korg1212->open_mutex); |
688 | return 0; | 689 | return 0; |
689 | } | 690 | } |
690 | 691 | ||
@@ -695,7 +696,7 @@ static int snd_korg1212_CloseCard(struct snd_korg1212 * korg1212) | |||
695 | K1212_DEBUG_PRINTK("K1212_DEBUG: CloseCard - RC = %d [%s]\n", | 696 | K1212_DEBUG_PRINTK("K1212_DEBUG: CloseCard - RC = %d [%s]\n", |
696 | rc, stateName[korg1212->cardState]); | 697 | rc, stateName[korg1212->cardState]); |
697 | if (rc != K1212_CMDRET_Success) { | 698 | if (rc != K1212_CMDRET_Success) { |
698 | up(&korg1212->open_mutex); | 699 | mutex_unlock(&korg1212->open_mutex); |
699 | return 0; | 700 | return 0; |
700 | } | 701 | } |
701 | } else if (korg1212->cardState > K1212_STATE_SETUP) { | 702 | } else if (korg1212->cardState > K1212_STATE_SETUP) { |
@@ -707,7 +708,7 @@ static int snd_korg1212_CloseCard(struct snd_korg1212 * korg1212) | |||
707 | snd_korg1212_setCardState(korg1212, K1212_STATE_READY); | 708 | snd_korg1212_setCardState(korg1212, K1212_STATE_READY); |
708 | } | 709 | } |
709 | 710 | ||
710 | up(&korg1212->open_mutex); | 711 | mutex_unlock(&korg1212->open_mutex); |
711 | return 0; | 712 | return 0; |
712 | } | 713 | } |
713 | 714 | ||
@@ -2179,7 +2180,7 @@ static int __devinit snd_korg1212_create(struct snd_card *card, struct pci_dev * | |||
2179 | 2180 | ||
2180 | init_waitqueue_head(&korg1212->wait); | 2181 | init_waitqueue_head(&korg1212->wait); |
2181 | spin_lock_init(&korg1212->lock); | 2182 | spin_lock_init(&korg1212->lock); |
2182 | init_MUTEX(&korg1212->open_mutex); | 2183 | mutex_init(&korg1212->open_mutex); |
2183 | init_timer(&korg1212->timer); | 2184 | init_timer(&korg1212->timer); |
2184 | korg1212->timer.function = snd_korg1212_timer_func; | 2185 | korg1212->timer.function = snd_korg1212_timer_func; |
2185 | korg1212->timer.data = (unsigned long)korg1212; | 2186 | korg1212->timer.data = (unsigned long)korg1212; |
diff --git a/sound/pci/mixart/mixart.c b/sound/pci/mixart/mixart.c index b218e1d20c78..e79fb264532b 100644 --- a/sound/pci/mixart/mixart.c +++ b/sound/pci/mixart/mixart.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/interrupt.h> | 26 | #include <linux/interrupt.h> |
27 | #include <linux/pci.h> | 27 | #include <linux/pci.h> |
28 | #include <linux/moduleparam.h> | 28 | #include <linux/moduleparam.h> |
29 | #include <linux/mutex.h> | ||
29 | #include <sound/core.h> | 30 | #include <sound/core.h> |
30 | #include <sound/initval.h> | 31 | #include <sound/initval.h> |
31 | #include <sound/info.h> | 32 | #include <sound/info.h> |
@@ -589,7 +590,7 @@ static int snd_mixart_hw_params(struct snd_pcm_substream *subs, | |||
589 | /* set up format for the stream */ | 590 | /* set up format for the stream */ |
590 | format = params_format(hw); | 591 | format = params_format(hw); |
591 | 592 | ||
592 | down(&mgr->setup_mutex); | 593 | mutex_lock(&mgr->setup_mutex); |
593 | 594 | ||
594 | /* update the stream levels */ | 595 | /* update the stream levels */ |
595 | if( stream->pcm_number <= MIXART_PCM_DIGITAL ) { | 596 | if( stream->pcm_number <= MIXART_PCM_DIGITAL ) { |
@@ -628,7 +629,7 @@ static int snd_mixart_hw_params(struct snd_pcm_substream *subs, | |||
628 | bufferinfo[i].available_length, | 629 | bufferinfo[i].available_length, |
629 | subs->number); | 630 | subs->number); |
630 | } | 631 | } |
631 | up(&mgr->setup_mutex); | 632 | mutex_unlock(&mgr->setup_mutex); |
632 | 633 | ||
633 | return err; | 634 | return err; |
634 | } | 635 | } |
@@ -700,7 +701,7 @@ static int snd_mixart_playback_open(struct snd_pcm_substream *subs) | |||
700 | int err = 0; | 701 | int err = 0; |
701 | int pcm_number; | 702 | int pcm_number; |
702 | 703 | ||
703 | down(&mgr->setup_mutex); | 704 | mutex_lock(&mgr->setup_mutex); |
704 | 705 | ||
705 | if ( pcm == chip->pcm ) { | 706 | if ( pcm == chip->pcm ) { |
706 | pcm_number = MIXART_PCM_ANALOG; | 707 | pcm_number = MIXART_PCM_ANALOG; |
@@ -758,7 +759,7 @@ static int snd_mixart_playback_open(struct snd_pcm_substream *subs) | |||
758 | } | 759 | } |
759 | 760 | ||
760 | _exit_open: | 761 | _exit_open: |
761 | up(&mgr->setup_mutex); | 762 | mutex_unlock(&mgr->setup_mutex); |
762 | 763 | ||
763 | return err; | 764 | return err; |
764 | } | 765 | } |
@@ -775,7 +776,7 @@ static int snd_mixart_capture_open(struct snd_pcm_substream *subs) | |||
775 | int err = 0; | 776 | int err = 0; |
776 | int pcm_number; | 777 | int pcm_number; |
777 | 778 | ||
778 | down(&mgr->setup_mutex); | 779 | mutex_lock(&mgr->setup_mutex); |
779 | 780 | ||
780 | if ( pcm == chip->pcm ) { | 781 | if ( pcm == chip->pcm ) { |
781 | pcm_number = MIXART_PCM_ANALOG; | 782 | pcm_number = MIXART_PCM_ANALOG; |
@@ -836,7 +837,7 @@ static int snd_mixart_capture_open(struct snd_pcm_substream *subs) | |||
836 | } | 837 | } |
837 | 838 | ||
838 | _exit_open: | 839 | _exit_open: |
839 | up(&mgr->setup_mutex); | 840 | mutex_unlock(&mgr->setup_mutex); |
840 | 841 | ||
841 | return err; | 842 | return err; |
842 | } | 843 | } |
@@ -849,7 +850,7 @@ static int snd_mixart_close(struct snd_pcm_substream *subs) | |||
849 | struct mixart_mgr *mgr = chip->mgr; | 850 | struct mixart_mgr *mgr = chip->mgr; |
850 | struct mixart_stream *stream = subs->runtime->private_data; | 851 | struct mixart_stream *stream = subs->runtime->private_data; |
851 | 852 | ||
852 | down(&mgr->setup_mutex); | 853 | mutex_lock(&mgr->setup_mutex); |
853 | 854 | ||
854 | snd_printdd("snd_mixart_close C%d/P%d/Sub%d\n", chip->chip_idx, stream->pcm_number, subs->number); | 855 | snd_printdd("snd_mixart_close C%d/P%d/Sub%d\n", chip->chip_idx, stream->pcm_number, subs->number); |
855 | 856 | ||
@@ -868,7 +869,7 @@ static int snd_mixart_close(struct snd_pcm_substream *subs) | |||
868 | stream->status = MIXART_STREAM_STATUS_FREE; | 869 | stream->status = MIXART_STREAM_STATUS_FREE; |
869 | stream->substream = NULL; | 870 | stream->substream = NULL; |
870 | 871 | ||
871 | up(&mgr->setup_mutex); | 872 | mutex_unlock(&mgr->setup_mutex); |
872 | return 0; | 873 | return 0; |
873 | } | 874 | } |
874 | 875 | ||
@@ -1335,12 +1336,12 @@ static int __devinit snd_mixart_probe(struct pci_dev *pci, | |||
1335 | mgr->msg_fifo_writeptr = 0; | 1336 | mgr->msg_fifo_writeptr = 0; |
1336 | 1337 | ||
1337 | spin_lock_init(&mgr->msg_lock); | 1338 | spin_lock_init(&mgr->msg_lock); |
1338 | init_MUTEX(&mgr->msg_mutex); | 1339 | mutex_init(&mgr->msg_mutex); |
1339 | init_waitqueue_head(&mgr->msg_sleep); | 1340 | init_waitqueue_head(&mgr->msg_sleep); |
1340 | atomic_set(&mgr->msg_processed, 0); | 1341 | atomic_set(&mgr->msg_processed, 0); |
1341 | 1342 | ||
1342 | /* init setup mutex*/ | 1343 | /* init setup mutex*/ |
1343 | init_MUTEX(&mgr->setup_mutex); | 1344 | mutex_init(&mgr->setup_mutex); |
1344 | 1345 | ||
1345 | /* init message taslket */ | 1346 | /* init message taslket */ |
1346 | tasklet_init(&mgr->msg_taskq, snd_mixart_msg_tasklet, (unsigned long) mgr); | 1347 | tasklet_init(&mgr->msg_taskq, snd_mixart_msg_tasklet, (unsigned long) mgr); |
diff --git a/sound/pci/mixart/mixart.h b/sound/pci/mixart/mixart.h index 3e84863ca02c..561634d5c007 100644 --- a/sound/pci/mixart/mixart.h +++ b/sound/pci/mixart/mixart.h | |||
@@ -24,6 +24,7 @@ | |||
24 | #define __SOUND_MIXART_H | 24 | #define __SOUND_MIXART_H |
25 | 25 | ||
26 | #include <linux/interrupt.h> | 26 | #include <linux/interrupt.h> |
27 | #include <linux/mutex.h> | ||
27 | #include <sound/pcm.h> | 28 | #include <sound/pcm.h> |
28 | 29 | ||
29 | #define MIXART_DRIVER_VERSION 0x000100 /* 0.1.0 */ | 30 | #define MIXART_DRIVER_VERSION 0x000100 /* 0.1.0 */ |
@@ -92,9 +93,9 @@ struct mixart_mgr { | |||
92 | 93 | ||
93 | spinlock_t lock; /* interrupt spinlock */ | 94 | spinlock_t lock; /* interrupt spinlock */ |
94 | spinlock_t msg_lock; /* mailbox spinlock */ | 95 | spinlock_t msg_lock; /* mailbox spinlock */ |
95 | struct semaphore msg_mutex; /* mutex for blocking_requests */ | 96 | struct mutex msg_mutex; /* mutex for blocking_requests */ |
96 | 97 | ||
97 | struct semaphore setup_mutex; /* mutex used in hw_params, open and close */ | 98 | struct mutex setup_mutex; /* mutex used in hw_params, open and close */ |
98 | 99 | ||
99 | /* hardware interface */ | 100 | /* hardware interface */ |
100 | unsigned int dsp_loaded; /* bit flags of loaded dsp indices */ | 101 | unsigned int dsp_loaded; /* bit flags of loaded dsp indices */ |
@@ -107,7 +108,7 @@ struct mixart_mgr { | |||
107 | int sample_rate; | 108 | int sample_rate; |
108 | int ref_count_rate; | 109 | int ref_count_rate; |
109 | 110 | ||
110 | struct semaphore mixer_mutex; /* mutex for mixer */ | 111 | struct mutex mixer_mutex; /* mutex for mixer */ |
111 | 112 | ||
112 | }; | 113 | }; |
113 | 114 | ||
diff --git a/sound/pci/mixart/mixart_core.c b/sound/pci/mixart/mixart_core.c index 07c707d7ebbf..406ac3a9d42a 100644 --- a/sound/pci/mixart/mixart_core.c +++ b/sound/pci/mixart/mixart_core.c | |||
@@ -22,6 +22,8 @@ | |||
22 | 22 | ||
23 | #include <sound/driver.h> | 23 | #include <sound/driver.h> |
24 | #include <linux/interrupt.h> | 24 | #include <linux/interrupt.h> |
25 | #include <linux/mutex.h> | ||
26 | |||
25 | #include <asm/io.h> | 27 | #include <asm/io.h> |
26 | #include <sound/core.h> | 28 | #include <sound/core.h> |
27 | #include "mixart.h" | 29 | #include "mixart.h" |
@@ -239,7 +241,7 @@ int snd_mixart_send_msg(struct mixart_mgr *mgr, struct mixart_msg *request, int | |||
239 | wait_queue_t wait; | 241 | wait_queue_t wait; |
240 | long timeout; | 242 | long timeout; |
241 | 243 | ||
242 | down(&mgr->msg_mutex); | 244 | mutex_lock(&mgr->msg_mutex); |
243 | 245 | ||
244 | init_waitqueue_entry(&wait, current); | 246 | init_waitqueue_entry(&wait, current); |
245 | 247 | ||
@@ -248,7 +250,7 @@ int snd_mixart_send_msg(struct mixart_mgr *mgr, struct mixart_msg *request, int | |||
248 | err = send_msg(mgr, request, max_resp_size, 1, &msg_frame); /* send and mark the answer pending */ | 250 | err = send_msg(mgr, request, max_resp_size, 1, &msg_frame); /* send and mark the answer pending */ |
249 | if (err) { | 251 | if (err) { |
250 | spin_unlock_irq(&mgr->msg_lock); | 252 | spin_unlock_irq(&mgr->msg_lock); |
251 | up(&mgr->msg_mutex); | 253 | mutex_unlock(&mgr->msg_mutex); |
252 | return err; | 254 | return err; |
253 | } | 255 | } |
254 | 256 | ||
@@ -260,7 +262,7 @@ int snd_mixart_send_msg(struct mixart_mgr *mgr, struct mixart_msg *request, int | |||
260 | 262 | ||
261 | if (! timeout) { | 263 | if (! timeout) { |
262 | /* error - no ack */ | 264 | /* error - no ack */ |
263 | up(&mgr->msg_mutex); | 265 | mutex_unlock(&mgr->msg_mutex); |
264 | snd_printk(KERN_ERR "error: no reponse on msg %x\n", msg_frame); | 266 | snd_printk(KERN_ERR "error: no reponse on msg %x\n", msg_frame); |
265 | return -EIO; | 267 | return -EIO; |
266 | } | 268 | } |
@@ -276,7 +278,7 @@ int snd_mixart_send_msg(struct mixart_mgr *mgr, struct mixart_msg *request, int | |||
276 | if( request->message_id != resp.message_id ) | 278 | if( request->message_id != resp.message_id ) |
277 | snd_printk(KERN_ERR "REPONSE ERROR!\n"); | 279 | snd_printk(KERN_ERR "REPONSE ERROR!\n"); |
278 | 280 | ||
279 | up(&mgr->msg_mutex); | 281 | mutex_unlock(&mgr->msg_mutex); |
280 | return err; | 282 | return err; |
281 | } | 283 | } |
282 | 284 | ||
@@ -292,7 +294,7 @@ int snd_mixart_send_msg_wait_notif(struct mixart_mgr *mgr, | |||
292 | snd_assert((notif_event & MSG_TYPE_MASK) == MSG_TYPE_NOTIFY, return -EINVAL); | 294 | snd_assert((notif_event & MSG_TYPE_MASK) == MSG_TYPE_NOTIFY, return -EINVAL); |
293 | snd_assert((notif_event & MSG_CANCEL_NOTIFY_MASK) == 0, return -EINVAL); | 295 | snd_assert((notif_event & MSG_CANCEL_NOTIFY_MASK) == 0, return -EINVAL); |
294 | 296 | ||
295 | down(&mgr->msg_mutex); | 297 | mutex_lock(&mgr->msg_mutex); |
296 | 298 | ||
297 | init_waitqueue_entry(&wait, current); | 299 | init_waitqueue_entry(&wait, current); |
298 | 300 | ||
@@ -301,7 +303,7 @@ int snd_mixart_send_msg_wait_notif(struct mixart_mgr *mgr, | |||
301 | err = send_msg(mgr, request, MSG_DEFAULT_SIZE, 1, ¬if_event); /* send and mark the notification event pending */ | 303 | err = send_msg(mgr, request, MSG_DEFAULT_SIZE, 1, ¬if_event); /* send and mark the notification event pending */ |
302 | if(err) { | 304 | if(err) { |
303 | spin_unlock_irq(&mgr->msg_lock); | 305 | spin_unlock_irq(&mgr->msg_lock); |
304 | up(&mgr->msg_mutex); | 306 | mutex_unlock(&mgr->msg_mutex); |
305 | return err; | 307 | return err; |
306 | } | 308 | } |
307 | 309 | ||
@@ -313,12 +315,12 @@ int snd_mixart_send_msg_wait_notif(struct mixart_mgr *mgr, | |||
313 | 315 | ||
314 | if (! timeout) { | 316 | if (! timeout) { |
315 | /* error - no ack */ | 317 | /* error - no ack */ |
316 | up(&mgr->msg_mutex); | 318 | mutex_unlock(&mgr->msg_mutex); |
317 | snd_printk(KERN_ERR "error: notification %x not received\n", notif_event); | 319 | snd_printk(KERN_ERR "error: notification %x not received\n", notif_event); |
318 | return -EIO; | 320 | return -EIO; |
319 | } | 321 | } |
320 | 322 | ||
321 | up(&mgr->msg_mutex); | 323 | mutex_unlock(&mgr->msg_mutex); |
322 | return 0; | 324 | return 0; |
323 | } | 325 | } |
324 | 326 | ||
diff --git a/sound/pci/mixart/mixart_mixer.c b/sound/pci/mixart/mixart_mixer.c index 36a7e9ddfb15..ed47b732c103 100644 --- a/sound/pci/mixart/mixart_mixer.c +++ b/sound/pci/mixart/mixart_mixer.c | |||
@@ -24,6 +24,8 @@ | |||
24 | #include <linux/time.h> | 24 | #include <linux/time.h> |
25 | #include <linux/interrupt.h> | 25 | #include <linux/interrupt.h> |
26 | #include <linux/init.h> | 26 | #include <linux/init.h> |
27 | #include <linux/mutex.h> | ||
28 | |||
27 | #include <sound/core.h> | 29 | #include <sound/core.h> |
28 | #include "mixart.h" | 30 | #include "mixart.h" |
29 | #include "mixart_core.h" | 31 | #include "mixart_core.h" |
@@ -353,7 +355,7 @@ static int mixart_analog_vol_info(struct snd_kcontrol *kcontrol, struct snd_ctl_ | |||
353 | static int mixart_analog_vol_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) | 355 | static int mixart_analog_vol_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
354 | { | 356 | { |
355 | struct snd_mixart *chip = snd_kcontrol_chip(kcontrol); | 357 | struct snd_mixart *chip = snd_kcontrol_chip(kcontrol); |
356 | down(&chip->mgr->mixer_mutex); | 358 | mutex_lock(&chip->mgr->mixer_mutex); |
357 | if(kcontrol->private_value == 0) { /* playback */ | 359 | if(kcontrol->private_value == 0) { /* playback */ |
358 | ucontrol->value.integer.value[0] = chip->analog_playback_volume[0]; | 360 | ucontrol->value.integer.value[0] = chip->analog_playback_volume[0]; |
359 | ucontrol->value.integer.value[1] = chip->analog_playback_volume[1]; | 361 | ucontrol->value.integer.value[1] = chip->analog_playback_volume[1]; |
@@ -361,7 +363,7 @@ static int mixart_analog_vol_get(struct snd_kcontrol *kcontrol, struct snd_ctl_e | |||
361 | ucontrol->value.integer.value[0] = chip->analog_capture_volume[0]; | 363 | ucontrol->value.integer.value[0] = chip->analog_capture_volume[0]; |
362 | ucontrol->value.integer.value[1] = chip->analog_capture_volume[1]; | 364 | ucontrol->value.integer.value[1] = chip->analog_capture_volume[1]; |
363 | } | 365 | } |
364 | up(&chip->mgr->mixer_mutex); | 366 | mutex_unlock(&chip->mgr->mixer_mutex); |
365 | return 0; | 367 | return 0; |
366 | } | 368 | } |
367 | 369 | ||
@@ -371,7 +373,7 @@ static int mixart_analog_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_e | |||
371 | int changed = 0; | 373 | int changed = 0; |
372 | int is_capture, i; | 374 | int is_capture, i; |
373 | 375 | ||
374 | down(&chip->mgr->mixer_mutex); | 376 | mutex_lock(&chip->mgr->mixer_mutex); |
375 | is_capture = (kcontrol->private_value != 0); | 377 | is_capture = (kcontrol->private_value != 0); |
376 | for(i=0; i<2; i++) { | 378 | for(i=0; i<2; i++) { |
377 | int new_volume = ucontrol->value.integer.value[i]; | 379 | int new_volume = ucontrol->value.integer.value[i]; |
@@ -382,7 +384,7 @@ static int mixart_analog_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_e | |||
382 | } | 384 | } |
383 | } | 385 | } |
384 | if(changed) mixart_update_analog_audio_level(chip, is_capture); | 386 | if(changed) mixart_update_analog_audio_level(chip, is_capture); |
385 | up(&chip->mgr->mixer_mutex); | 387 | mutex_unlock(&chip->mgr->mixer_mutex); |
386 | return changed; | 388 | return changed; |
387 | } | 389 | } |
388 | 390 | ||
@@ -408,10 +410,10 @@ static int mixart_audio_sw_get(struct snd_kcontrol *kcontrol, struct snd_ctl_ele | |||
408 | { | 410 | { |
409 | struct snd_mixart *chip = snd_kcontrol_chip(kcontrol); | 411 | struct snd_mixart *chip = snd_kcontrol_chip(kcontrol); |
410 | 412 | ||
411 | down(&chip->mgr->mixer_mutex); | 413 | mutex_lock(&chip->mgr->mixer_mutex); |
412 | ucontrol->value.integer.value[0] = chip->analog_playback_active[0]; | 414 | ucontrol->value.integer.value[0] = chip->analog_playback_active[0]; |
413 | ucontrol->value.integer.value[1] = chip->analog_playback_active[1]; | 415 | ucontrol->value.integer.value[1] = chip->analog_playback_active[1]; |
414 | up(&chip->mgr->mixer_mutex); | 416 | mutex_unlock(&chip->mgr->mixer_mutex); |
415 | return 0; | 417 | return 0; |
416 | } | 418 | } |
417 | 419 | ||
@@ -419,7 +421,7 @@ static int mixart_audio_sw_put(struct snd_kcontrol *kcontrol, struct snd_ctl_ele | |||
419 | { | 421 | { |
420 | struct snd_mixart *chip = snd_kcontrol_chip(kcontrol); | 422 | struct snd_mixart *chip = snd_kcontrol_chip(kcontrol); |
421 | int i, changed = 0; | 423 | int i, changed = 0; |
422 | down(&chip->mgr->mixer_mutex); | 424 | mutex_lock(&chip->mgr->mixer_mutex); |
423 | for(i=0; i<2; i++) { | 425 | for(i=0; i<2; i++) { |
424 | if(chip->analog_playback_active[i] != ucontrol->value.integer.value[i]) { | 426 | if(chip->analog_playback_active[i] != ucontrol->value.integer.value[i]) { |
425 | chip->analog_playback_active[i] = ucontrol->value.integer.value[i]; | 427 | chip->analog_playback_active[i] = ucontrol->value.integer.value[i]; |
@@ -427,7 +429,7 @@ static int mixart_audio_sw_put(struct snd_kcontrol *kcontrol, struct snd_ctl_ele | |||
427 | } | 429 | } |
428 | } | 430 | } |
429 | if(changed) mixart_update_analog_audio_level(chip, 0); /* update playback levels */ | 431 | if(changed) mixart_update_analog_audio_level(chip, 0); /* update playback levels */ |
430 | up(&chip->mgr->mixer_mutex); | 432 | mutex_unlock(&chip->mgr->mixer_mutex); |
431 | return changed; | 433 | return changed; |
432 | } | 434 | } |
433 | 435 | ||
@@ -817,7 +819,7 @@ static int mixart_pcm_vol_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem | |||
817 | int *stored_volume; | 819 | int *stored_volume; |
818 | int is_capture = kcontrol->private_value & MIXART_VOL_REC_MASK; | 820 | int is_capture = kcontrol->private_value & MIXART_VOL_REC_MASK; |
819 | int is_aes = kcontrol->private_value & MIXART_VOL_AES_MASK; | 821 | int is_aes = kcontrol->private_value & MIXART_VOL_AES_MASK; |
820 | down(&chip->mgr->mixer_mutex); | 822 | mutex_lock(&chip->mgr->mixer_mutex); |
821 | if(is_capture) { | 823 | if(is_capture) { |
822 | if(is_aes) stored_volume = chip->digital_capture_volume[1]; /* AES capture */ | 824 | if(is_aes) stored_volume = chip->digital_capture_volume[1]; /* AES capture */ |
823 | else stored_volume = chip->digital_capture_volume[0]; /* analog capture */ | 825 | else stored_volume = chip->digital_capture_volume[0]; /* analog capture */ |
@@ -828,7 +830,7 @@ static int mixart_pcm_vol_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem | |||
828 | } | 830 | } |
829 | ucontrol->value.integer.value[0] = stored_volume[0]; | 831 | ucontrol->value.integer.value[0] = stored_volume[0]; |
830 | ucontrol->value.integer.value[1] = stored_volume[1]; | 832 | ucontrol->value.integer.value[1] = stored_volume[1]; |
831 | up(&chip->mgr->mixer_mutex); | 833 | mutex_unlock(&chip->mgr->mixer_mutex); |
832 | return 0; | 834 | return 0; |
833 | } | 835 | } |
834 | 836 | ||
@@ -841,7 +843,7 @@ static int mixart_pcm_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem | |||
841 | int is_aes = kcontrol->private_value & MIXART_VOL_AES_MASK; | 843 | int is_aes = kcontrol->private_value & MIXART_VOL_AES_MASK; |
842 | int* stored_volume; | 844 | int* stored_volume; |
843 | int i; | 845 | int i; |
844 | down(&chip->mgr->mixer_mutex); | 846 | mutex_lock(&chip->mgr->mixer_mutex); |
845 | if(is_capture) { | 847 | if(is_capture) { |
846 | if(is_aes) stored_volume = chip->digital_capture_volume[1]; /* AES capture */ | 848 | if(is_aes) stored_volume = chip->digital_capture_volume[1]; /* AES capture */ |
847 | else stored_volume = chip->digital_capture_volume[0]; /* analog capture */ | 849 | else stored_volume = chip->digital_capture_volume[0]; /* analog capture */ |
@@ -860,7 +862,7 @@ static int mixart_pcm_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem | |||
860 | if(is_capture) mixart_update_capture_stream_level(chip, is_aes); | 862 | if(is_capture) mixart_update_capture_stream_level(chip, is_aes); |
861 | else mixart_update_playback_stream_level(chip, is_aes, idx); | 863 | else mixart_update_playback_stream_level(chip, is_aes, idx); |
862 | } | 864 | } |
863 | up(&chip->mgr->mixer_mutex); | 865 | mutex_unlock(&chip->mgr->mixer_mutex); |
864 | return changed; | 866 | return changed; |
865 | } | 867 | } |
866 | 868 | ||
@@ -880,12 +882,12 @@ static int mixart_pcm_sw_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_ | |||
880 | struct snd_mixart *chip = snd_kcontrol_chip(kcontrol); | 882 | struct snd_mixart *chip = snd_kcontrol_chip(kcontrol); |
881 | int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); /* index */ | 883 | int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); /* index */ |
882 | snd_assert ( idx < MIXART_PLAYBACK_STREAMS ); | 884 | snd_assert ( idx < MIXART_PLAYBACK_STREAMS ); |
883 | down(&chip->mgr->mixer_mutex); | 885 | mutex_lock(&chip->mgr->mixer_mutex); |
884 | if(kcontrol->private_value & MIXART_VOL_AES_MASK) /* AES playback */ | 886 | if(kcontrol->private_value & MIXART_VOL_AES_MASK) /* AES playback */ |
885 | idx += MIXART_PLAYBACK_STREAMS; | 887 | idx += MIXART_PLAYBACK_STREAMS; |
886 | ucontrol->value.integer.value[0] = chip->digital_playback_active[idx][0]; | 888 | ucontrol->value.integer.value[0] = chip->digital_playback_active[idx][0]; |
887 | ucontrol->value.integer.value[1] = chip->digital_playback_active[idx][1]; | 889 | ucontrol->value.integer.value[1] = chip->digital_playback_active[idx][1]; |
888 | up(&chip->mgr->mixer_mutex); | 890 | mutex_unlock(&chip->mgr->mixer_mutex); |
889 | return 0; | 891 | return 0; |
890 | } | 892 | } |
891 | 893 | ||
@@ -897,7 +899,7 @@ static int mixart_pcm_sw_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_ | |||
897 | int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); /* index */ | 899 | int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); /* index */ |
898 | int i, j; | 900 | int i, j; |
899 | snd_assert ( idx < MIXART_PLAYBACK_STREAMS ); | 901 | snd_assert ( idx < MIXART_PLAYBACK_STREAMS ); |
900 | down(&chip->mgr->mixer_mutex); | 902 | mutex_lock(&chip->mgr->mixer_mutex); |
901 | j = idx; | 903 | j = idx; |
902 | if(is_aes) j += MIXART_PLAYBACK_STREAMS; | 904 | if(is_aes) j += MIXART_PLAYBACK_STREAMS; |
903 | for(i=0; i<2; i++) { | 905 | for(i=0; i<2; i++) { |
@@ -907,7 +909,7 @@ static int mixart_pcm_sw_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_ | |||
907 | } | 909 | } |
908 | } | 910 | } |
909 | if(changed) mixart_update_playback_stream_level(chip, is_aes, idx); | 911 | if(changed) mixart_update_playback_stream_level(chip, is_aes, idx); |
910 | up(&chip->mgr->mixer_mutex); | 912 | mutex_unlock(&chip->mgr->mixer_mutex); |
911 | return changed; | 913 | return changed; |
912 | } | 914 | } |
913 | 915 | ||
@@ -956,10 +958,10 @@ static int mixart_update_monitoring(struct snd_mixart* chip, int channel) | |||
956 | static int mixart_monitor_vol_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) | 958 | static int mixart_monitor_vol_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
957 | { | 959 | { |
958 | struct snd_mixart *chip = snd_kcontrol_chip(kcontrol); | 960 | struct snd_mixart *chip = snd_kcontrol_chip(kcontrol); |
959 | down(&chip->mgr->mixer_mutex); | 961 | mutex_lock(&chip->mgr->mixer_mutex); |
960 | ucontrol->value.integer.value[0] = chip->monitoring_volume[0]; | 962 | ucontrol->value.integer.value[0] = chip->monitoring_volume[0]; |
961 | ucontrol->value.integer.value[1] = chip->monitoring_volume[1]; | 963 | ucontrol->value.integer.value[1] = chip->monitoring_volume[1]; |
962 | up(&chip->mgr->mixer_mutex); | 964 | mutex_unlock(&chip->mgr->mixer_mutex); |
963 | return 0; | 965 | return 0; |
964 | } | 966 | } |
965 | 967 | ||
@@ -968,7 +970,7 @@ static int mixart_monitor_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_ | |||
968 | struct snd_mixart *chip = snd_kcontrol_chip(kcontrol); | 970 | struct snd_mixart *chip = snd_kcontrol_chip(kcontrol); |
969 | int changed = 0; | 971 | int changed = 0; |
970 | int i; | 972 | int i; |
971 | down(&chip->mgr->mixer_mutex); | 973 | mutex_lock(&chip->mgr->mixer_mutex); |
972 | for(i=0; i<2; i++) { | 974 | for(i=0; i<2; i++) { |
973 | if(chip->monitoring_volume[i] != ucontrol->value.integer.value[i]) { | 975 | if(chip->monitoring_volume[i] != ucontrol->value.integer.value[i]) { |
974 | chip->monitoring_volume[i] = ucontrol->value.integer.value[i]; | 976 | chip->monitoring_volume[i] = ucontrol->value.integer.value[i]; |
@@ -976,7 +978,7 @@ static int mixart_monitor_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_ | |||
976 | changed = 1; | 978 | changed = 1; |
977 | } | 979 | } |
978 | } | 980 | } |
979 | up(&chip->mgr->mixer_mutex); | 981 | mutex_unlock(&chip->mgr->mixer_mutex); |
980 | return changed; | 982 | return changed; |
981 | } | 983 | } |
982 | 984 | ||
@@ -995,10 +997,10 @@ static struct snd_kcontrol_new mixart_control_monitor_vol = { | |||
995 | static int mixart_monitor_sw_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) | 997 | static int mixart_monitor_sw_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
996 | { | 998 | { |
997 | struct snd_mixart *chip = snd_kcontrol_chip(kcontrol); | 999 | struct snd_mixart *chip = snd_kcontrol_chip(kcontrol); |
998 | down(&chip->mgr->mixer_mutex); | 1000 | mutex_lock(&chip->mgr->mixer_mutex); |
999 | ucontrol->value.integer.value[0] = chip->monitoring_active[0]; | 1001 | ucontrol->value.integer.value[0] = chip->monitoring_active[0]; |
1000 | ucontrol->value.integer.value[1] = chip->monitoring_active[1]; | 1002 | ucontrol->value.integer.value[1] = chip->monitoring_active[1]; |
1001 | up(&chip->mgr->mixer_mutex); | 1003 | mutex_unlock(&chip->mgr->mixer_mutex); |
1002 | return 0; | 1004 | return 0; |
1003 | } | 1005 | } |
1004 | 1006 | ||
@@ -1007,7 +1009,7 @@ static int mixart_monitor_sw_put(struct snd_kcontrol *kcontrol, struct snd_ctl_e | |||
1007 | struct snd_mixart *chip = snd_kcontrol_chip(kcontrol); | 1009 | struct snd_mixart *chip = snd_kcontrol_chip(kcontrol); |
1008 | int changed = 0; | 1010 | int changed = 0; |
1009 | int i; | 1011 | int i; |
1010 | down(&chip->mgr->mixer_mutex); | 1012 | mutex_lock(&chip->mgr->mixer_mutex); |
1011 | for(i=0; i<2; i++) { | 1013 | for(i=0; i<2; i++) { |
1012 | if(chip->monitoring_active[i] != ucontrol->value.integer.value[i]) { | 1014 | if(chip->monitoring_active[i] != ucontrol->value.integer.value[i]) { |
1013 | chip->monitoring_active[i] = ucontrol->value.integer.value[i]; | 1015 | chip->monitoring_active[i] = ucontrol->value.integer.value[i]; |
@@ -1029,7 +1031,7 @@ static int mixart_monitor_sw_put(struct snd_kcontrol *kcontrol, struct snd_ctl_e | |||
1029 | } | 1031 | } |
1030 | } | 1032 | } |
1031 | 1033 | ||
1032 | up(&chip->mgr->mixer_mutex); | 1034 | mutex_unlock(&chip->mgr->mixer_mutex); |
1033 | return (changed != 0); | 1035 | return (changed != 0); |
1034 | } | 1036 | } |
1035 | 1037 | ||
@@ -1059,7 +1061,7 @@ int snd_mixart_create_mixer(struct mixart_mgr *mgr) | |||
1059 | struct snd_mixart *chip; | 1061 | struct snd_mixart *chip; |
1060 | int err, i; | 1062 | int err, i; |
1061 | 1063 | ||
1062 | init_MUTEX(&mgr->mixer_mutex); /* can be in another place */ | 1064 | mutex_init(&mgr->mixer_mutex); /* can be in another place */ |
1063 | 1065 | ||
1064 | for(i=0; i<mgr->num_cards; i++) { | 1066 | for(i=0; i<mgr->num_cards; i++) { |
1065 | struct snd_kcontrol_new temp; | 1067 | struct snd_kcontrol_new temp; |
diff --git a/sound/pci/nm256/nm256.c b/sound/pci/nm256/nm256.c index 0d0ff54f0fc6..3a3ba6f547bc 100644 --- a/sound/pci/nm256/nm256.c +++ b/sound/pci/nm256/nm256.c | |||
@@ -32,6 +32,8 @@ | |||
32 | #include <linux/pci.h> | 32 | #include <linux/pci.h> |
33 | #include <linux/slab.h> | 33 | #include <linux/slab.h> |
34 | #include <linux/moduleparam.h> | 34 | #include <linux/moduleparam.h> |
35 | #include <linux/mutex.h> | ||
36 | |||
35 | #include <sound/core.h> | 37 | #include <sound/core.h> |
36 | #include <sound/info.h> | 38 | #include <sound/info.h> |
37 | #include <sound/control.h> | 39 | #include <sound/control.h> |
@@ -235,7 +237,7 @@ struct nm256 { | |||
235 | int irq_acks; | 237 | int irq_acks; |
236 | irqreturn_t (*interrupt)(int, void *, struct pt_regs *); | 238 | irqreturn_t (*interrupt)(int, void *, struct pt_regs *); |
237 | int badintrcount; /* counter to check bogus interrupts */ | 239 | int badintrcount; /* counter to check bogus interrupts */ |
238 | struct semaphore irq_mutex; | 240 | struct mutex irq_mutex; |
239 | 241 | ||
240 | struct nm256_stream streams[2]; | 242 | struct nm256_stream streams[2]; |
241 | 243 | ||
@@ -459,32 +461,32 @@ snd_nm256_set_format(struct nm256 *chip, struct nm256_stream *s, | |||
459 | /* acquire interrupt */ | 461 | /* acquire interrupt */ |
460 | static int snd_nm256_acquire_irq(struct nm256 *chip) | 462 | static int snd_nm256_acquire_irq(struct nm256 *chip) |
461 | { | 463 | { |
462 | down(&chip->irq_mutex); | 464 | mutex_lock(&chip->irq_mutex); |
463 | if (chip->irq < 0) { | 465 | if (chip->irq < 0) { |
464 | if (request_irq(chip->pci->irq, chip->interrupt, SA_INTERRUPT|SA_SHIRQ, | 466 | if (request_irq(chip->pci->irq, chip->interrupt, SA_INTERRUPT|SA_SHIRQ, |
465 | chip->card->driver, chip)) { | 467 | chip->card->driver, chip)) { |
466 | snd_printk(KERN_ERR "unable to grab IRQ %d\n", chip->pci->irq); | 468 | snd_printk(KERN_ERR "unable to grab IRQ %d\n", chip->pci->irq); |
467 | up(&chip->irq_mutex); | 469 | mutex_unlock(&chip->irq_mutex); |
468 | return -EBUSY; | 470 | return -EBUSY; |
469 | } | 471 | } |
470 | chip->irq = chip->pci->irq; | 472 | chip->irq = chip->pci->irq; |
471 | } | 473 | } |
472 | chip->irq_acks++; | 474 | chip->irq_acks++; |
473 | up(&chip->irq_mutex); | 475 | mutex_unlock(&chip->irq_mutex); |
474 | return 0; | 476 | return 0; |
475 | } | 477 | } |
476 | 478 | ||
477 | /* release interrupt */ | 479 | /* release interrupt */ |
478 | static void snd_nm256_release_irq(struct nm256 *chip) | 480 | static void snd_nm256_release_irq(struct nm256 *chip) |
479 | { | 481 | { |
480 | down(&chip->irq_mutex); | 482 | mutex_lock(&chip->irq_mutex); |
481 | if (chip->irq_acks > 0) | 483 | if (chip->irq_acks > 0) |
482 | chip->irq_acks--; | 484 | chip->irq_acks--; |
483 | if (chip->irq_acks == 0 && chip->irq >= 0) { | 485 | if (chip->irq_acks == 0 && chip->irq >= 0) { |
484 | free_irq(chip->irq, chip); | 486 | free_irq(chip->irq, chip); |
485 | chip->irq = -1; | 487 | chip->irq = -1; |
486 | } | 488 | } |
487 | up(&chip->irq_mutex); | 489 | mutex_unlock(&chip->irq_mutex); |
488 | } | 490 | } |
489 | 491 | ||
490 | /* | 492 | /* |
@@ -1407,7 +1409,7 @@ snd_nm256_create(struct snd_card *card, struct pci_dev *pci, | |||
1407 | chip->use_cache = use_cache; | 1409 | chip->use_cache = use_cache; |
1408 | spin_lock_init(&chip->reg_lock); | 1410 | spin_lock_init(&chip->reg_lock); |
1409 | chip->irq = -1; | 1411 | chip->irq = -1; |
1410 | init_MUTEX(&chip->irq_mutex); | 1412 | mutex_init(&chip->irq_mutex); |
1411 | 1413 | ||
1412 | /* store buffer sizes in bytes */ | 1414 | /* store buffer sizes in bytes */ |
1413 | chip->streams[SNDRV_PCM_STREAM_PLAYBACK].bufsize = playback_bufsize * 1024; | 1415 | chip->streams[SNDRV_PCM_STREAM_PLAYBACK].bufsize = playback_bufsize * 1024; |
diff --git a/sound/pci/pcxhr/pcxhr.c b/sound/pci/pcxhr/pcxhr.c index b2cba75b6b16..31a3e8e1b234 100644 --- a/sound/pci/pcxhr/pcxhr.c +++ b/sound/pci/pcxhr/pcxhr.c | |||
@@ -28,6 +28,8 @@ | |||
28 | #include <linux/pci.h> | 28 | #include <linux/pci.h> |
29 | #include <linux/delay.h> | 29 | #include <linux/delay.h> |
30 | #include <linux/moduleparam.h> | 30 | #include <linux/moduleparam.h> |
31 | #include <linux/mutex.h> | ||
32 | |||
31 | #include <sound/core.h> | 33 | #include <sound/core.h> |
32 | #include <sound/initval.h> | 34 | #include <sound/initval.h> |
33 | #include <sound/info.h> | 35 | #include <sound/info.h> |
@@ -518,7 +520,7 @@ static void pcxhr_trigger_tasklet(unsigned long arg) | |||
518 | struct timeval my_tv1, my_tv2; | 520 | struct timeval my_tv1, my_tv2; |
519 | do_gettimeofday(&my_tv1); | 521 | do_gettimeofday(&my_tv1); |
520 | #endif | 522 | #endif |
521 | down(&mgr->setup_mutex); | 523 | mutex_lock(&mgr->setup_mutex); |
522 | 524 | ||
523 | /* check the pipes concerned and build pipe_array */ | 525 | /* check the pipes concerned and build pipe_array */ |
524 | for (i = 0; i < mgr->num_cards; i++) { | 526 | for (i = 0; i < mgr->num_cards; i++) { |
@@ -537,7 +539,7 @@ static void pcxhr_trigger_tasklet(unsigned long arg) | |||
537 | } | 539 | } |
538 | } | 540 | } |
539 | if (capture_mask == 0 && playback_mask == 0) { | 541 | if (capture_mask == 0 && playback_mask == 0) { |
540 | up(&mgr->setup_mutex); | 542 | mutex_unlock(&mgr->setup_mutex); |
541 | snd_printk(KERN_ERR "pcxhr_trigger_tasklet : no pipes\n"); | 543 | snd_printk(KERN_ERR "pcxhr_trigger_tasklet : no pipes\n"); |
542 | return; | 544 | return; |
543 | } | 545 | } |
@@ -548,7 +550,7 @@ static void pcxhr_trigger_tasklet(unsigned long arg) | |||
548 | /* synchronous stop of all the pipes concerned */ | 550 | /* synchronous stop of all the pipes concerned */ |
549 | err = pcxhr_set_pipe_state(mgr, playback_mask, capture_mask, 0); | 551 | err = pcxhr_set_pipe_state(mgr, playback_mask, capture_mask, 0); |
550 | if (err) { | 552 | if (err) { |
551 | up(&mgr->setup_mutex); | 553 | mutex_unlock(&mgr->setup_mutex); |
552 | snd_printk(KERN_ERR "pcxhr_trigger_tasklet : error stop pipes (P%x C%x)\n", | 554 | snd_printk(KERN_ERR "pcxhr_trigger_tasklet : error stop pipes (P%x C%x)\n", |
553 | playback_mask, capture_mask); | 555 | playback_mask, capture_mask); |
554 | return; | 556 | return; |
@@ -592,7 +594,7 @@ static void pcxhr_trigger_tasklet(unsigned long arg) | |||
592 | /* synchronous start of all the pipes concerned */ | 594 | /* synchronous start of all the pipes concerned */ |
593 | err = pcxhr_set_pipe_state(mgr, playback_mask, capture_mask, 1); | 595 | err = pcxhr_set_pipe_state(mgr, playback_mask, capture_mask, 1); |
594 | if (err) { | 596 | if (err) { |
595 | up(&mgr->setup_mutex); | 597 | mutex_unlock(&mgr->setup_mutex); |
596 | snd_printk(KERN_ERR "pcxhr_trigger_tasklet : error start pipes (P%x C%x)\n", | 598 | snd_printk(KERN_ERR "pcxhr_trigger_tasklet : error start pipes (P%x C%x)\n", |
597 | playback_mask, capture_mask); | 599 | playback_mask, capture_mask); |
598 | return; | 600 | return; |
@@ -619,7 +621,7 @@ static void pcxhr_trigger_tasklet(unsigned long arg) | |||
619 | } | 621 | } |
620 | spin_unlock_irqrestore(&mgr->lock, flags); | 622 | spin_unlock_irqrestore(&mgr->lock, flags); |
621 | 623 | ||
622 | up(&mgr->setup_mutex); | 624 | mutex_unlock(&mgr->setup_mutex); |
623 | 625 | ||
624 | #ifdef CONFIG_SND_DEBUG_DETECT | 626 | #ifdef CONFIG_SND_DEBUG_DETECT |
625 | do_gettimeofday(&my_tv2); | 627 | do_gettimeofday(&my_tv2); |
@@ -728,7 +730,7 @@ static int pcxhr_prepare(struct snd_pcm_substream *subs) | |||
728 | } | 730 | } |
729 | */ | 731 | */ |
730 | 732 | ||
731 | down(&mgr->setup_mutex); | 733 | mutex_lock(&mgr->setup_mutex); |
732 | 734 | ||
733 | do { | 735 | do { |
734 | /* if the stream was stopped before, format and buffer were reset */ | 736 | /* if the stream was stopped before, format and buffer were reset */ |
@@ -755,7 +757,7 @@ static int pcxhr_prepare(struct snd_pcm_substream *subs) | |||
755 | } | 757 | } |
756 | } while(0); /* do only once (so we can use break instead of goto) */ | 758 | } while(0); /* do only once (so we can use break instead of goto) */ |
757 | 759 | ||
758 | up(&mgr->setup_mutex); | 760 | mutex_unlock(&mgr->setup_mutex); |
759 | 761 | ||
760 | return err; | 762 | return err; |
761 | } | 763 | } |
@@ -780,7 +782,7 @@ static int pcxhr_hw_params(struct snd_pcm_substream *subs, | |||
780 | /* set up format for the stream */ | 782 | /* set up format for the stream */ |
781 | format = params_format(hw); | 783 | format = params_format(hw); |
782 | 784 | ||
783 | down(&mgr->setup_mutex); | 785 | mutex_lock(&mgr->setup_mutex); |
784 | 786 | ||
785 | stream->channels = channels; | 787 | stream->channels = channels; |
786 | stream->format = format; | 788 | stream->format = format; |
@@ -789,7 +791,7 @@ static int pcxhr_hw_params(struct snd_pcm_substream *subs, | |||
789 | /* | 791 | /* |
790 | err = pcxhr_set_format(stream); | 792 | err = pcxhr_set_format(stream); |
791 | if(err) { | 793 | if(err) { |
792 | up(&mgr->setup_mutex); | 794 | mutex_unlock(&mgr->setup_mutex); |
793 | return err; | 795 | return err; |
794 | } | 796 | } |
795 | */ | 797 | */ |
@@ -801,7 +803,7 @@ static int pcxhr_hw_params(struct snd_pcm_substream *subs, | |||
801 | err = pcxhr_update_r_buffer(stream); | 803 | err = pcxhr_update_r_buffer(stream); |
802 | } | 804 | } |
803 | */ | 805 | */ |
804 | up(&mgr->setup_mutex); | 806 | mutex_unlock(&mgr->setup_mutex); |
805 | 807 | ||
806 | return err; | 808 | return err; |
807 | } | 809 | } |
@@ -847,7 +849,7 @@ static int pcxhr_open(struct snd_pcm_substream *subs) | |||
847 | struct pcxhr_stream *stream; | 849 | struct pcxhr_stream *stream; |
848 | int is_capture; | 850 | int is_capture; |
849 | 851 | ||
850 | down(&mgr->setup_mutex); | 852 | mutex_lock(&mgr->setup_mutex); |
851 | 853 | ||
852 | /* copy the struct snd_pcm_hardware struct */ | 854 | /* copy the struct snd_pcm_hardware struct */ |
853 | runtime->hw = pcxhr_caps; | 855 | runtime->hw = pcxhr_caps; |
@@ -871,7 +873,7 @@ static int pcxhr_open(struct snd_pcm_substream *subs) | |||
871 | /* streams in use */ | 873 | /* streams in use */ |
872 | snd_printk(KERN_ERR "pcxhr_open chip%d subs%d in use\n", | 874 | snd_printk(KERN_ERR "pcxhr_open chip%d subs%d in use\n", |
873 | chip->chip_idx, subs->number); | 875 | chip->chip_idx, subs->number); |
874 | up(&mgr->setup_mutex); | 876 | mutex_unlock(&mgr->setup_mutex); |
875 | return -EBUSY; | 877 | return -EBUSY; |
876 | } | 878 | } |
877 | 879 | ||
@@ -887,7 +889,7 @@ static int pcxhr_open(struct snd_pcm_substream *subs) | |||
887 | &external_rate) || | 889 | &external_rate) || |
888 | external_rate == 0) { | 890 | external_rate == 0) { |
889 | /* cannot detect the external clock rate */ | 891 | /* cannot detect the external clock rate */ |
890 | up(&mgr->setup_mutex); | 892 | mutex_unlock(&mgr->setup_mutex); |
891 | return -EBUSY; | 893 | return -EBUSY; |
892 | } | 894 | } |
893 | runtime->hw.rate_min = runtime->hw.rate_max = external_rate; | 895 | runtime->hw.rate_min = runtime->hw.rate_max = external_rate; |
@@ -905,7 +907,7 @@ static int pcxhr_open(struct snd_pcm_substream *subs) | |||
905 | 907 | ||
906 | mgr->ref_count_rate++; | 908 | mgr->ref_count_rate++; |
907 | 909 | ||
908 | up(&mgr->setup_mutex); | 910 | mutex_unlock(&mgr->setup_mutex); |
909 | return 0; | 911 | return 0; |
910 | } | 912 | } |
911 | 913 | ||
@@ -916,7 +918,7 @@ static int pcxhr_close(struct snd_pcm_substream *subs) | |||
916 | struct pcxhr_mgr *mgr = chip->mgr; | 918 | struct pcxhr_mgr *mgr = chip->mgr; |
917 | struct pcxhr_stream *stream = subs->runtime->private_data; | 919 | struct pcxhr_stream *stream = subs->runtime->private_data; |
918 | 920 | ||
919 | down(&mgr->setup_mutex); | 921 | mutex_lock(&mgr->setup_mutex); |
920 | 922 | ||
921 | snd_printdd("pcxhr_close chip%d subs%d\n", chip->chip_idx, subs->number); | 923 | snd_printdd("pcxhr_close chip%d subs%d\n", chip->chip_idx, subs->number); |
922 | 924 | ||
@@ -929,7 +931,7 @@ static int pcxhr_close(struct snd_pcm_substream *subs) | |||
929 | stream->status = PCXHR_STREAM_STATUS_FREE; | 931 | stream->status = PCXHR_STREAM_STATUS_FREE; |
930 | stream->substream = NULL; | 932 | stream->substream = NULL; |
931 | 933 | ||
932 | up(&mgr->setup_mutex); | 934 | mutex_unlock(&mgr->setup_mutex); |
933 | 935 | ||
934 | return 0; | 936 | return 0; |
935 | } | 937 | } |
@@ -1264,7 +1266,7 @@ static int __devinit pcxhr_probe(struct pci_dev *pci, const struct pci_device_id | |||
1264 | spin_lock_init(&mgr->msg_lock); | 1266 | spin_lock_init(&mgr->msg_lock); |
1265 | 1267 | ||
1266 | /* init setup mutex*/ | 1268 | /* init setup mutex*/ |
1267 | init_MUTEX(&mgr->setup_mutex); | 1269 | mutex_init(&mgr->setup_mutex); |
1268 | 1270 | ||
1269 | /* init taslket */ | 1271 | /* init taslket */ |
1270 | tasklet_init(&mgr->msg_taskq, pcxhr_msg_tasklet, (unsigned long) mgr); | 1272 | tasklet_init(&mgr->msg_taskq, pcxhr_msg_tasklet, (unsigned long) mgr); |
diff --git a/sound/pci/pcxhr/pcxhr.h b/sound/pci/pcxhr/pcxhr.h index 049f2b3f2867..652064787a55 100644 --- a/sound/pci/pcxhr/pcxhr.h +++ b/sound/pci/pcxhr/pcxhr.h | |||
@@ -24,6 +24,7 @@ | |||
24 | #define __SOUND_PCXHR_H | 24 | #define __SOUND_PCXHR_H |
25 | 25 | ||
26 | #include <linux/interrupt.h> | 26 | #include <linux/interrupt.h> |
27 | #include <linux/mutex.h> | ||
27 | #include <sound/pcm.h> | 28 | #include <sound/pcm.h> |
28 | 29 | ||
29 | #define PCXHR_DRIVER_VERSION 0x000804 /* 0.8.4 */ | 30 | #define PCXHR_DRIVER_VERSION 0x000804 /* 0.8.4 */ |
@@ -76,8 +77,8 @@ struct pcxhr_mgr { | |||
76 | spinlock_t lock; /* interrupt spinlock */ | 77 | spinlock_t lock; /* interrupt spinlock */ |
77 | spinlock_t msg_lock; /* message spinlock */ | 78 | spinlock_t msg_lock; /* message spinlock */ |
78 | 79 | ||
79 | struct semaphore setup_mutex; /* mutex used in hw_params, open and close */ | 80 | struct mutex setup_mutex; /* mutex used in hw_params, open and close */ |
80 | struct semaphore mixer_mutex; /* mutex for mixer */ | 81 | struct mutex mixer_mutex; /* mutex for mixer */ |
81 | 82 | ||
82 | /* hardware interface */ | 83 | /* hardware interface */ |
83 | unsigned int dsp_loaded; /* bit flags of loaded dsp indices */ | 84 | unsigned int dsp_loaded; /* bit flags of loaded dsp indices */ |
diff --git a/sound/pci/pcxhr/pcxhr_mixer.c b/sound/pci/pcxhr/pcxhr_mixer.c index 760e733ac25e..94e63a1e90d9 100644 --- a/sound/pci/pcxhr/pcxhr_mixer.c +++ b/sound/pci/pcxhr/pcxhr_mixer.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/time.h> | 25 | #include <linux/time.h> |
26 | #include <linux/interrupt.h> | 26 | #include <linux/interrupt.h> |
27 | #include <linux/init.h> | 27 | #include <linux/init.h> |
28 | #include <linux/mutex.h> | ||
28 | #include <sound/core.h> | 29 | #include <sound/core.h> |
29 | #include "pcxhr.h" | 30 | #include "pcxhr.h" |
30 | #include "pcxhr_hwdep.h" | 31 | #include "pcxhr_hwdep.h" |
@@ -92,7 +93,7 @@ static int pcxhr_analog_vol_get(struct snd_kcontrol *kcontrol, | |||
92 | struct snd_ctl_elem_value *ucontrol) | 93 | struct snd_ctl_elem_value *ucontrol) |
93 | { | 94 | { |
94 | struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol); | 95 | struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol); |
95 | down(&chip->mgr->mixer_mutex); | 96 | mutex_lock(&chip->mgr->mixer_mutex); |
96 | if (kcontrol->private_value == 0) { /* playback */ | 97 | if (kcontrol->private_value == 0) { /* playback */ |
97 | ucontrol->value.integer.value[0] = chip->analog_playback_volume[0]; | 98 | ucontrol->value.integer.value[0] = chip->analog_playback_volume[0]; |
98 | ucontrol->value.integer.value[1] = chip->analog_playback_volume[1]; | 99 | ucontrol->value.integer.value[1] = chip->analog_playback_volume[1]; |
@@ -100,7 +101,7 @@ static int pcxhr_analog_vol_get(struct snd_kcontrol *kcontrol, | |||
100 | ucontrol->value.integer.value[0] = chip->analog_capture_volume[0]; | 101 | ucontrol->value.integer.value[0] = chip->analog_capture_volume[0]; |
101 | ucontrol->value.integer.value[1] = chip->analog_capture_volume[1]; | 102 | ucontrol->value.integer.value[1] = chip->analog_capture_volume[1]; |
102 | } | 103 | } |
103 | up(&chip->mgr->mixer_mutex); | 104 | mutex_unlock(&chip->mgr->mixer_mutex); |
104 | return 0; | 105 | return 0; |
105 | } | 106 | } |
106 | 107 | ||
@@ -111,7 +112,7 @@ static int pcxhr_analog_vol_put(struct snd_kcontrol *kcontrol, | |||
111 | int changed = 0; | 112 | int changed = 0; |
112 | int is_capture, i; | 113 | int is_capture, i; |
113 | 114 | ||
114 | down(&chip->mgr->mixer_mutex); | 115 | mutex_lock(&chip->mgr->mixer_mutex); |
115 | is_capture = (kcontrol->private_value != 0); | 116 | is_capture = (kcontrol->private_value != 0); |
116 | for (i = 0; i < 2; i++) { | 117 | for (i = 0; i < 2; i++) { |
117 | int new_volume = ucontrol->value.integer.value[i]; | 118 | int new_volume = ucontrol->value.integer.value[i]; |
@@ -123,7 +124,7 @@ static int pcxhr_analog_vol_put(struct snd_kcontrol *kcontrol, | |||
123 | pcxhr_update_analog_audio_level(chip, is_capture, i); | 124 | pcxhr_update_analog_audio_level(chip, is_capture, i); |
124 | } | 125 | } |
125 | } | 126 | } |
126 | up(&chip->mgr->mixer_mutex); | 127 | mutex_unlock(&chip->mgr->mixer_mutex); |
127 | return changed; | 128 | return changed; |
128 | } | 129 | } |
129 | 130 | ||
@@ -150,10 +151,10 @@ static int pcxhr_audio_sw_get(struct snd_kcontrol *kcontrol, | |||
150 | { | 151 | { |
151 | struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol); | 152 | struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol); |
152 | 153 | ||
153 | down(&chip->mgr->mixer_mutex); | 154 | mutex_lock(&chip->mgr->mixer_mutex); |
154 | ucontrol->value.integer.value[0] = chip->analog_playback_active[0]; | 155 | ucontrol->value.integer.value[0] = chip->analog_playback_active[0]; |
155 | ucontrol->value.integer.value[1] = chip->analog_playback_active[1]; | 156 | ucontrol->value.integer.value[1] = chip->analog_playback_active[1]; |
156 | up(&chip->mgr->mixer_mutex); | 157 | mutex_unlock(&chip->mgr->mixer_mutex); |
157 | return 0; | 158 | return 0; |
158 | } | 159 | } |
159 | 160 | ||
@@ -162,7 +163,7 @@ static int pcxhr_audio_sw_put(struct snd_kcontrol *kcontrol, | |||
162 | { | 163 | { |
163 | struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol); | 164 | struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol); |
164 | int i, changed = 0; | 165 | int i, changed = 0; |
165 | down(&chip->mgr->mixer_mutex); | 166 | mutex_lock(&chip->mgr->mixer_mutex); |
166 | for(i = 0; i < 2; i++) { | 167 | for(i = 0; i < 2; i++) { |
167 | if (chip->analog_playback_active[i] != ucontrol->value.integer.value[i]) { | 168 | if (chip->analog_playback_active[i] != ucontrol->value.integer.value[i]) { |
168 | chip->analog_playback_active[i] = ucontrol->value.integer.value[i]; | 169 | chip->analog_playback_active[i] = ucontrol->value.integer.value[i]; |
@@ -170,7 +171,7 @@ static int pcxhr_audio_sw_put(struct snd_kcontrol *kcontrol, | |||
170 | pcxhr_update_analog_audio_level(chip, 0, i); /* update playback levels */ | 171 | pcxhr_update_analog_audio_level(chip, 0, i); /* update playback levels */ |
171 | } | 172 | } |
172 | } | 173 | } |
173 | up(&chip->mgr->mixer_mutex); | 174 | mutex_unlock(&chip->mgr->mixer_mutex); |
174 | return changed; | 175 | return changed; |
175 | } | 176 | } |
176 | 177 | ||
@@ -299,14 +300,14 @@ static int pcxhr_pcm_vol_get(struct snd_kcontrol *kcontrol, | |||
299 | int *stored_volume; | 300 | int *stored_volume; |
300 | int is_capture = kcontrol->private_value; | 301 | int is_capture = kcontrol->private_value; |
301 | 302 | ||
302 | down(&chip->mgr->mixer_mutex); | 303 | mutex_lock(&chip->mgr->mixer_mutex); |
303 | if (is_capture) | 304 | if (is_capture) |
304 | stored_volume = chip->digital_capture_volume; /* digital capture */ | 305 | stored_volume = chip->digital_capture_volume; /* digital capture */ |
305 | else | 306 | else |
306 | stored_volume = chip->digital_playback_volume[idx]; /* digital playback */ | 307 | stored_volume = chip->digital_playback_volume[idx]; /* digital playback */ |
307 | ucontrol->value.integer.value[0] = stored_volume[0]; | 308 | ucontrol->value.integer.value[0] = stored_volume[0]; |
308 | ucontrol->value.integer.value[1] = stored_volume[1]; | 309 | ucontrol->value.integer.value[1] = stored_volume[1]; |
309 | up(&chip->mgr->mixer_mutex); | 310 | mutex_unlock(&chip->mgr->mixer_mutex); |
310 | return 0; | 311 | return 0; |
311 | } | 312 | } |
312 | 313 | ||
@@ -320,7 +321,7 @@ static int pcxhr_pcm_vol_put(struct snd_kcontrol *kcontrol, | |||
320 | int *stored_volume; | 321 | int *stored_volume; |
321 | int i; | 322 | int i; |
322 | 323 | ||
323 | down(&chip->mgr->mixer_mutex); | 324 | mutex_lock(&chip->mgr->mixer_mutex); |
324 | if (is_capture) | 325 | if (is_capture) |
325 | stored_volume = chip->digital_capture_volume; /* digital capture */ | 326 | stored_volume = chip->digital_capture_volume; /* digital capture */ |
326 | else | 327 | else |
@@ -335,7 +336,7 @@ static int pcxhr_pcm_vol_put(struct snd_kcontrol *kcontrol, | |||
335 | } | 336 | } |
336 | if (! is_capture && changed) | 337 | if (! is_capture && changed) |
337 | pcxhr_update_playback_stream_level(chip, idx); /* update playback volume */ | 338 | pcxhr_update_playback_stream_level(chip, idx); /* update playback volume */ |
338 | up(&chip->mgr->mixer_mutex); | 339 | mutex_unlock(&chip->mgr->mixer_mutex); |
339 | return changed; | 340 | return changed; |
340 | } | 341 | } |
341 | 342 | ||
@@ -356,10 +357,10 @@ static int pcxhr_pcm_sw_get(struct snd_kcontrol *kcontrol, | |||
356 | struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol); | 357 | struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol); |
357 | int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); /* index */ | 358 | int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); /* index */ |
358 | 359 | ||
359 | down(&chip->mgr->mixer_mutex); | 360 | mutex_lock(&chip->mgr->mixer_mutex); |
360 | ucontrol->value.integer.value[0] = chip->digital_playback_active[idx][0]; | 361 | ucontrol->value.integer.value[0] = chip->digital_playback_active[idx][0]; |
361 | ucontrol->value.integer.value[1] = chip->digital_playback_active[idx][1]; | 362 | ucontrol->value.integer.value[1] = chip->digital_playback_active[idx][1]; |
362 | up(&chip->mgr->mixer_mutex); | 363 | mutex_unlock(&chip->mgr->mixer_mutex); |
363 | return 0; | 364 | return 0; |
364 | } | 365 | } |
365 | 366 | ||
@@ -370,7 +371,7 @@ static int pcxhr_pcm_sw_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_v | |||
370 | int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); /* index */ | 371 | int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); /* index */ |
371 | int i, j; | 372 | int i, j; |
372 | 373 | ||
373 | down(&chip->mgr->mixer_mutex); | 374 | mutex_lock(&chip->mgr->mixer_mutex); |
374 | j = idx; | 375 | j = idx; |
375 | for (i = 0; i < 2; i++) { | 376 | for (i = 0; i < 2; i++) { |
376 | if (chip->digital_playback_active[j][i] != ucontrol->value.integer.value[i]) { | 377 | if (chip->digital_playback_active[j][i] != ucontrol->value.integer.value[i]) { |
@@ -380,7 +381,7 @@ static int pcxhr_pcm_sw_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_v | |||
380 | } | 381 | } |
381 | if (changed) | 382 | if (changed) |
382 | pcxhr_update_playback_stream_level(chip, idx); | 383 | pcxhr_update_playback_stream_level(chip, idx); |
383 | up(&chip->mgr->mixer_mutex); | 384 | mutex_unlock(&chip->mgr->mixer_mutex); |
384 | return changed; | 385 | return changed; |
385 | } | 386 | } |
386 | 387 | ||
@@ -402,10 +403,10 @@ static int pcxhr_monitor_vol_get(struct snd_kcontrol *kcontrol, | |||
402 | struct snd_ctl_elem_value *ucontrol) | 403 | struct snd_ctl_elem_value *ucontrol) |
403 | { | 404 | { |
404 | struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol); | 405 | struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol); |
405 | down(&chip->mgr->mixer_mutex); | 406 | mutex_lock(&chip->mgr->mixer_mutex); |
406 | ucontrol->value.integer.value[0] = chip->monitoring_volume[0]; | 407 | ucontrol->value.integer.value[0] = chip->monitoring_volume[0]; |
407 | ucontrol->value.integer.value[1] = chip->monitoring_volume[1]; | 408 | ucontrol->value.integer.value[1] = chip->monitoring_volume[1]; |
408 | up(&chip->mgr->mixer_mutex); | 409 | mutex_unlock(&chip->mgr->mixer_mutex); |
409 | return 0; | 410 | return 0; |
410 | } | 411 | } |
411 | 412 | ||
@@ -416,7 +417,7 @@ static int pcxhr_monitor_vol_put(struct snd_kcontrol *kcontrol, | |||
416 | int changed = 0; | 417 | int changed = 0; |
417 | int i; | 418 | int i; |
418 | 419 | ||
419 | down(&chip->mgr->mixer_mutex); | 420 | mutex_lock(&chip->mgr->mixer_mutex); |
420 | for (i = 0; i < 2; i++) { | 421 | for (i = 0; i < 2; i++) { |
421 | if (chip->monitoring_volume[i] != ucontrol->value.integer.value[i]) { | 422 | if (chip->monitoring_volume[i] != ucontrol->value.integer.value[i]) { |
422 | chip->monitoring_volume[i] = ucontrol->value.integer.value[i]; | 423 | chip->monitoring_volume[i] = ucontrol->value.integer.value[i]; |
@@ -426,7 +427,7 @@ static int pcxhr_monitor_vol_put(struct snd_kcontrol *kcontrol, | |||
426 | changed = 1; | 427 | changed = 1; |
427 | } | 428 | } |
428 | } | 429 | } |
429 | up(&chip->mgr->mixer_mutex); | 430 | mutex_unlock(&chip->mgr->mixer_mutex); |
430 | return changed; | 431 | return changed; |
431 | } | 432 | } |
432 | 433 | ||
@@ -446,10 +447,10 @@ static int pcxhr_monitor_sw_get(struct snd_kcontrol *kcontrol, | |||
446 | struct snd_ctl_elem_value *ucontrol) | 447 | struct snd_ctl_elem_value *ucontrol) |
447 | { | 448 | { |
448 | struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol); | 449 | struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol); |
449 | down(&chip->mgr->mixer_mutex); | 450 | mutex_lock(&chip->mgr->mixer_mutex); |
450 | ucontrol->value.integer.value[0] = chip->monitoring_active[0]; | 451 | ucontrol->value.integer.value[0] = chip->monitoring_active[0]; |
451 | ucontrol->value.integer.value[1] = chip->monitoring_active[1]; | 452 | ucontrol->value.integer.value[1] = chip->monitoring_active[1]; |
452 | up(&chip->mgr->mixer_mutex); | 453 | mutex_unlock(&chip->mgr->mixer_mutex); |
453 | return 0; | 454 | return 0; |
454 | } | 455 | } |
455 | 456 | ||
@@ -460,7 +461,7 @@ static int pcxhr_monitor_sw_put(struct snd_kcontrol *kcontrol, | |||
460 | int changed = 0; | 461 | int changed = 0; |
461 | int i; | 462 | int i; |
462 | 463 | ||
463 | down(&chip->mgr->mixer_mutex); | 464 | mutex_lock(&chip->mgr->mixer_mutex); |
464 | for (i = 0; i < 2; i++) { | 465 | for (i = 0; i < 2; i++) { |
465 | if (chip->monitoring_active[i] != ucontrol->value.integer.value[i]) { | 466 | if (chip->monitoring_active[i] != ucontrol->value.integer.value[i]) { |
466 | chip->monitoring_active[i] = ucontrol->value.integer.value[i]; | 467 | chip->monitoring_active[i] = ucontrol->value.integer.value[i]; |
@@ -474,7 +475,7 @@ static int pcxhr_monitor_sw_put(struct snd_kcontrol *kcontrol, | |||
474 | /* update right monitoring volume and mute */ | 475 | /* update right monitoring volume and mute */ |
475 | pcxhr_update_audio_pipe_level(chip, 0, 1); | 476 | pcxhr_update_audio_pipe_level(chip, 0, 1); |
476 | 477 | ||
477 | up(&chip->mgr->mixer_mutex); | 478 | mutex_unlock(&chip->mgr->mixer_mutex); |
478 | return (changed != 0); | 479 | return (changed != 0); |
479 | } | 480 | } |
480 | 481 | ||
@@ -571,13 +572,13 @@ static int pcxhr_audio_src_put(struct snd_kcontrol *kcontrol, | |||
571 | struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol); | 572 | struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol); |
572 | int ret = 0; | 573 | int ret = 0; |
573 | 574 | ||
574 | down(&chip->mgr->mixer_mutex); | 575 | mutex_lock(&chip->mgr->mixer_mutex); |
575 | if (chip->audio_capture_source != ucontrol->value.enumerated.item[0]) { | 576 | if (chip->audio_capture_source != ucontrol->value.enumerated.item[0]) { |
576 | chip->audio_capture_source = ucontrol->value.enumerated.item[0]; | 577 | chip->audio_capture_source = ucontrol->value.enumerated.item[0]; |
577 | pcxhr_set_audio_source(chip); | 578 | pcxhr_set_audio_source(chip); |
578 | ret = 1; | 579 | ret = 1; |
579 | } | 580 | } |
580 | up(&chip->mgr->mixer_mutex); | 581 | mutex_unlock(&chip->mgr->mixer_mutex); |
581 | return ret; | 582 | return ret; |
582 | } | 583 | } |
583 | 584 | ||
@@ -636,9 +637,9 @@ static int pcxhr_clock_type_put(struct snd_kcontrol *kcontrol, | |||
636 | struct pcxhr_mgr *mgr = snd_kcontrol_chip(kcontrol); | 637 | struct pcxhr_mgr *mgr = snd_kcontrol_chip(kcontrol); |
637 | int rate, ret = 0; | 638 | int rate, ret = 0; |
638 | 639 | ||
639 | down(&mgr->mixer_mutex); | 640 | mutex_lock(&mgr->mixer_mutex); |
640 | if (mgr->use_clock_type != ucontrol->value.enumerated.item[0]) { | 641 | if (mgr->use_clock_type != ucontrol->value.enumerated.item[0]) { |
641 | down(&mgr->setup_mutex); | 642 | mutex_lock(&mgr->setup_mutex); |
642 | mgr->use_clock_type = ucontrol->value.enumerated.item[0]; | 643 | mgr->use_clock_type = ucontrol->value.enumerated.item[0]; |
643 | if (mgr->use_clock_type) | 644 | if (mgr->use_clock_type) |
644 | pcxhr_get_external_clock(mgr, mgr->use_clock_type, &rate); | 645 | pcxhr_get_external_clock(mgr, mgr->use_clock_type, &rate); |
@@ -649,10 +650,10 @@ static int pcxhr_clock_type_put(struct snd_kcontrol *kcontrol, | |||
649 | if (mgr->sample_rate) | 650 | if (mgr->sample_rate) |
650 | mgr->sample_rate = rate; | 651 | mgr->sample_rate = rate; |
651 | } | 652 | } |
652 | up(&mgr->setup_mutex); | 653 | mutex_unlock(&mgr->setup_mutex); |
653 | ret = 1; /* return 1 even if the set was not done. ok ? */ | 654 | ret = 1; /* return 1 even if the set was not done. ok ? */ |
654 | } | 655 | } |
655 | up(&mgr->mixer_mutex); | 656 | mutex_unlock(&mgr->mixer_mutex); |
656 | return ret; | 657 | return ret; |
657 | } | 658 | } |
658 | 659 | ||
@@ -685,7 +686,7 @@ static int pcxhr_clock_rate_get(struct snd_kcontrol *kcontrol, | |||
685 | struct pcxhr_mgr *mgr = snd_kcontrol_chip(kcontrol); | 686 | struct pcxhr_mgr *mgr = snd_kcontrol_chip(kcontrol); |
686 | int i, err, rate; | 687 | int i, err, rate; |
687 | 688 | ||
688 | down(&mgr->mixer_mutex); | 689 | mutex_lock(&mgr->mixer_mutex); |
689 | for(i = 0; i < 3 + mgr->capture_chips; i++) { | 690 | for(i = 0; i < 3 + mgr->capture_chips; i++) { |
690 | if (i == PCXHR_CLOCK_TYPE_INTERNAL) | 691 | if (i == PCXHR_CLOCK_TYPE_INTERNAL) |
691 | rate = mgr->sample_rate_real; | 692 | rate = mgr->sample_rate_real; |
@@ -696,7 +697,7 @@ static int pcxhr_clock_rate_get(struct snd_kcontrol *kcontrol, | |||
696 | } | 697 | } |
697 | ucontrol->value.integer.value[i] = rate; | 698 | ucontrol->value.integer.value[i] = rate; |
698 | } | 699 | } |
699 | up(&mgr->mixer_mutex); | 700 | mutex_unlock(&mgr->mixer_mutex); |
700 | return 0; | 701 | return 0; |
701 | } | 702 | } |
702 | 703 | ||
@@ -765,7 +766,7 @@ static int pcxhr_iec958_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_v | |||
765 | unsigned char aes_bits; | 766 | unsigned char aes_bits; |
766 | int i, err; | 767 | int i, err; |
767 | 768 | ||
768 | down(&chip->mgr->mixer_mutex); | 769 | mutex_lock(&chip->mgr->mixer_mutex); |
769 | for(i = 0; i < 5; i++) { | 770 | for(i = 0; i < 5; i++) { |
770 | if (kcontrol->private_value == 0) /* playback */ | 771 | if (kcontrol->private_value == 0) /* playback */ |
771 | aes_bits = chip->aes_bits[i]; | 772 | aes_bits = chip->aes_bits[i]; |
@@ -776,7 +777,7 @@ static int pcxhr_iec958_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_v | |||
776 | } | 777 | } |
777 | ucontrol->value.iec958.status[i] = aes_bits; | 778 | ucontrol->value.iec958.status[i] = aes_bits; |
778 | } | 779 | } |
779 | up(&chip->mgr->mixer_mutex); | 780 | mutex_unlock(&chip->mgr->mixer_mutex); |
780 | return 0; | 781 | return 0; |
781 | } | 782 | } |
782 | 783 | ||
@@ -828,14 +829,14 @@ static int pcxhr_iec958_put(struct snd_kcontrol *kcontrol, | |||
828 | int i, changed = 0; | 829 | int i, changed = 0; |
829 | 830 | ||
830 | /* playback */ | 831 | /* playback */ |
831 | down(&chip->mgr->mixer_mutex); | 832 | mutex_lock(&chip->mgr->mixer_mutex); |
832 | for (i = 0; i < 5; i++) { | 833 | for (i = 0; i < 5; i++) { |
833 | if (ucontrol->value.iec958.status[i] != chip->aes_bits[i]) { | 834 | if (ucontrol->value.iec958.status[i] != chip->aes_bits[i]) { |
834 | pcxhr_iec958_update_byte(chip, i, ucontrol->value.iec958.status[i]); | 835 | pcxhr_iec958_update_byte(chip, i, ucontrol->value.iec958.status[i]); |
835 | changed = 1; | 836 | changed = 1; |
836 | } | 837 | } |
837 | } | 838 | } |
838 | up(&chip->mgr->mixer_mutex); | 839 | mutex_unlock(&chip->mgr->mixer_mutex); |
839 | return changed; | 840 | return changed; |
840 | } | 841 | } |
841 | 842 | ||
@@ -916,7 +917,7 @@ int pcxhr_create_mixer(struct pcxhr_mgr *mgr) | |||
916 | struct snd_pcxhr *chip; | 917 | struct snd_pcxhr *chip; |
917 | int err, i; | 918 | int err, i; |
918 | 919 | ||
919 | init_MUTEX(&mgr->mixer_mutex); /* can be in another place */ | 920 | mutex_init(&mgr->mixer_mutex); /* can be in another place */ |
920 | 921 | ||
921 | for (i = 0; i < mgr->num_cards; i++) { | 922 | for (i = 0; i < mgr->num_cards; i++) { |
922 | struct snd_kcontrol_new temp; | 923 | struct snd_kcontrol_new temp; |
diff --git a/sound/pci/trident/trident_memory.c b/sound/pci/trident/trident_memory.c index cf09ea99755c..46c6982c9e88 100644 --- a/sound/pci/trident/trident_memory.c +++ b/sound/pci/trident/trident_memory.c | |||
@@ -27,6 +27,8 @@ | |||
27 | #include <asm/io.h> | 27 | #include <asm/io.h> |
28 | #include <linux/pci.h> | 28 | #include <linux/pci.h> |
29 | #include <linux/time.h> | 29 | #include <linux/time.h> |
30 | #include <linux/mutex.h> | ||
31 | |||
30 | #include <sound/core.h> | 32 | #include <sound/core.h> |
31 | #include <sound/trident.h> | 33 | #include <sound/trident.h> |
32 | 34 | ||
@@ -201,16 +203,16 @@ snd_trident_alloc_sg_pages(struct snd_trident *trident, | |||
201 | 203 | ||
202 | 204 | ||
203 | 205 | ||
204 | down(&hdr->block_mutex); | 206 | mutex_lock(&hdr->block_mutex); |
205 | blk = search_empty(hdr, runtime->dma_bytes); | 207 | blk = search_empty(hdr, runtime->dma_bytes); |
206 | if (blk == NULL) { | 208 | if (blk == NULL) { |
207 | up(&hdr->block_mutex); | 209 | mutex_unlock(&hdr->block_mutex); |
208 | return NULL; | 210 | return NULL; |
209 | } | 211 | } |
210 | if (lastpg(blk) - firstpg(blk) >= sgbuf->pages) { | 212 | if (lastpg(blk) - firstpg(blk) >= sgbuf->pages) { |
211 | snd_printk(KERN_ERR "page calculation doesn't match: allocated pages = %d, trident = %d/%d\n", sgbuf->pages, firstpg(blk), lastpg(blk)); | 213 | snd_printk(KERN_ERR "page calculation doesn't match: allocated pages = %d, trident = %d/%d\n", sgbuf->pages, firstpg(blk), lastpg(blk)); |
212 | __snd_util_mem_free(hdr, blk); | 214 | __snd_util_mem_free(hdr, blk); |
213 | up(&hdr->block_mutex); | 215 | mutex_unlock(&hdr->block_mutex); |
214 | return NULL; | 216 | return NULL; |
215 | } | 217 | } |
216 | 218 | ||
@@ -221,12 +223,12 @@ snd_trident_alloc_sg_pages(struct snd_trident *trident, | |||
221 | unsigned long ptr = (unsigned long)sgbuf->table[idx].buf; | 223 | unsigned long ptr = (unsigned long)sgbuf->table[idx].buf; |
222 | if (! is_valid_page(addr)) { | 224 | if (! is_valid_page(addr)) { |
223 | __snd_util_mem_free(hdr, blk); | 225 | __snd_util_mem_free(hdr, blk); |
224 | up(&hdr->block_mutex); | 226 | mutex_unlock(&hdr->block_mutex); |
225 | return NULL; | 227 | return NULL; |
226 | } | 228 | } |
227 | set_tlb_bus(trident, page, ptr, addr); | 229 | set_tlb_bus(trident, page, ptr, addr); |
228 | } | 230 | } |
229 | up(&hdr->block_mutex); | 231 | mutex_unlock(&hdr->block_mutex); |
230 | return blk; | 232 | return blk; |
231 | } | 233 | } |
232 | 234 | ||
@@ -248,10 +250,10 @@ snd_trident_alloc_cont_pages(struct snd_trident *trident, | |||
248 | hdr = trident->tlb.memhdr; | 250 | hdr = trident->tlb.memhdr; |
249 | snd_assert(hdr != NULL, return NULL); | 251 | snd_assert(hdr != NULL, return NULL); |
250 | 252 | ||
251 | down(&hdr->block_mutex); | 253 | mutex_lock(&hdr->block_mutex); |
252 | blk = search_empty(hdr, runtime->dma_bytes); | 254 | blk = search_empty(hdr, runtime->dma_bytes); |
253 | if (blk == NULL) { | 255 | if (blk == NULL) { |
254 | up(&hdr->block_mutex); | 256 | mutex_unlock(&hdr->block_mutex); |
255 | return NULL; | 257 | return NULL; |
256 | } | 258 | } |
257 | 259 | ||
@@ -262,12 +264,12 @@ snd_trident_alloc_cont_pages(struct snd_trident *trident, | |||
262 | ptr += SNDRV_TRIDENT_PAGE_SIZE, addr += SNDRV_TRIDENT_PAGE_SIZE) { | 264 | ptr += SNDRV_TRIDENT_PAGE_SIZE, addr += SNDRV_TRIDENT_PAGE_SIZE) { |
263 | if (! is_valid_page(addr)) { | 265 | if (! is_valid_page(addr)) { |
264 | __snd_util_mem_free(hdr, blk); | 266 | __snd_util_mem_free(hdr, blk); |
265 | up(&hdr->block_mutex); | 267 | mutex_unlock(&hdr->block_mutex); |
266 | return NULL; | 268 | return NULL; |
267 | } | 269 | } |
268 | set_tlb_bus(trident, page, ptr, addr); | 270 | set_tlb_bus(trident, page, ptr, addr); |
269 | } | 271 | } |
270 | up(&hdr->block_mutex); | 272 | mutex_unlock(&hdr->block_mutex); |
271 | return blk; | 273 | return blk; |
272 | } | 274 | } |
273 | 275 | ||
@@ -300,13 +302,13 @@ int snd_trident_free_pages(struct snd_trident *trident, | |||
300 | snd_assert(blk != NULL, return -EINVAL); | 302 | snd_assert(blk != NULL, return -EINVAL); |
301 | 303 | ||
302 | hdr = trident->tlb.memhdr; | 304 | hdr = trident->tlb.memhdr; |
303 | down(&hdr->block_mutex); | 305 | mutex_lock(&hdr->block_mutex); |
304 | /* reset TLB entries */ | 306 | /* reset TLB entries */ |
305 | for (page = firstpg(blk); page <= lastpg(blk); page++) | 307 | for (page = firstpg(blk); page <= lastpg(blk); page++) |
306 | set_silent_tlb(trident, page); | 308 | set_silent_tlb(trident, page); |
307 | /* free memory block */ | 309 | /* free memory block */ |
308 | __snd_util_mem_free(hdr, blk); | 310 | __snd_util_mem_free(hdr, blk); |
309 | up(&hdr->block_mutex); | 311 | mutex_unlock(&hdr->block_mutex); |
310 | return 0; | 312 | return 0; |
311 | } | 313 | } |
312 | 314 | ||
@@ -332,18 +334,18 @@ snd_trident_synth_alloc(struct snd_trident *hw, unsigned int size) | |||
332 | struct snd_util_memblk *blk; | 334 | struct snd_util_memblk *blk; |
333 | struct snd_util_memhdr *hdr = hw->tlb.memhdr; | 335 | struct snd_util_memhdr *hdr = hw->tlb.memhdr; |
334 | 336 | ||
335 | down(&hdr->block_mutex); | 337 | mutex_lock(&hdr->block_mutex); |
336 | blk = __snd_util_mem_alloc(hdr, size); | 338 | blk = __snd_util_mem_alloc(hdr, size); |
337 | if (blk == NULL) { | 339 | if (blk == NULL) { |
338 | up(&hdr->block_mutex); | 340 | mutex_unlock(&hdr->block_mutex); |
339 | return NULL; | 341 | return NULL; |
340 | } | 342 | } |
341 | if (synth_alloc_pages(hw, blk)) { | 343 | if (synth_alloc_pages(hw, blk)) { |
342 | __snd_util_mem_free(hdr, blk); | 344 | __snd_util_mem_free(hdr, blk); |
343 | up(&hdr->block_mutex); | 345 | mutex_unlock(&hdr->block_mutex); |
344 | return NULL; | 346 | return NULL; |
345 | } | 347 | } |
346 | up(&hdr->block_mutex); | 348 | mutex_unlock(&hdr->block_mutex); |
347 | return blk; | 349 | return blk; |
348 | } | 350 | } |
349 | 351 | ||
@@ -356,10 +358,10 @@ snd_trident_synth_free(struct snd_trident *hw, struct snd_util_memblk *blk) | |||
356 | { | 358 | { |
357 | struct snd_util_memhdr *hdr = hw->tlb.memhdr; | 359 | struct snd_util_memhdr *hdr = hw->tlb.memhdr; |
358 | 360 | ||
359 | down(&hdr->block_mutex); | 361 | mutex_lock(&hdr->block_mutex); |
360 | synth_free_pages(hw, blk); | 362 | synth_free_pages(hw, blk); |
361 | __snd_util_mem_free(hdr, blk); | 363 | __snd_util_mem_free(hdr, blk); |
362 | up(&hdr->block_mutex); | 364 | mutex_unlock(&hdr->block_mutex); |
363 | return 0; | 365 | return 0; |
364 | } | 366 | } |
365 | 367 | ||
diff --git a/sound/pci/vx222/vx222_ops.c b/sound/pci/vx222/vx222_ops.c index c705af409b0f..9b6d345b83a6 100644 --- a/sound/pci/vx222/vx222_ops.c +++ b/sound/pci/vx222/vx222_ops.c | |||
@@ -24,6 +24,8 @@ | |||
24 | #include <linux/delay.h> | 24 | #include <linux/delay.h> |
25 | #include <linux/device.h> | 25 | #include <linux/device.h> |
26 | #include <linux/firmware.h> | 26 | #include <linux/firmware.h> |
27 | #include <linux/mutex.h> | ||
28 | |||
27 | #include <sound/core.h> | 29 | #include <sound/core.h> |
28 | #include <sound/control.h> | 30 | #include <sound/control.h> |
29 | #include <asm/io.h> | 31 | #include <asm/io.h> |
@@ -861,10 +863,10 @@ static int vx_input_level_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem | |||
861 | { | 863 | { |
862 | struct vx_core *_chip = snd_kcontrol_chip(kcontrol); | 864 | struct vx_core *_chip = snd_kcontrol_chip(kcontrol); |
863 | struct snd_vx222 *chip = (struct snd_vx222 *)_chip; | 865 | struct snd_vx222 *chip = (struct snd_vx222 *)_chip; |
864 | down(&_chip->mixer_mutex); | 866 | mutex_lock(&_chip->mixer_mutex); |
865 | ucontrol->value.integer.value[0] = chip->input_level[0]; | 867 | ucontrol->value.integer.value[0] = chip->input_level[0]; |
866 | ucontrol->value.integer.value[1] = chip->input_level[1]; | 868 | ucontrol->value.integer.value[1] = chip->input_level[1]; |
867 | up(&_chip->mixer_mutex); | 869 | mutex_unlock(&_chip->mixer_mutex); |
868 | return 0; | 870 | return 0; |
869 | } | 871 | } |
870 | 872 | ||
@@ -872,16 +874,16 @@ static int vx_input_level_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem | |||
872 | { | 874 | { |
873 | struct vx_core *_chip = snd_kcontrol_chip(kcontrol); | 875 | struct vx_core *_chip = snd_kcontrol_chip(kcontrol); |
874 | struct snd_vx222 *chip = (struct snd_vx222 *)_chip; | 876 | struct snd_vx222 *chip = (struct snd_vx222 *)_chip; |
875 | down(&_chip->mixer_mutex); | 877 | mutex_lock(&_chip->mixer_mutex); |
876 | if (chip->input_level[0] != ucontrol->value.integer.value[0] || | 878 | if (chip->input_level[0] != ucontrol->value.integer.value[0] || |
877 | chip->input_level[1] != ucontrol->value.integer.value[1]) { | 879 | chip->input_level[1] != ucontrol->value.integer.value[1]) { |
878 | chip->input_level[0] = ucontrol->value.integer.value[0]; | 880 | chip->input_level[0] = ucontrol->value.integer.value[0]; |
879 | chip->input_level[1] = ucontrol->value.integer.value[1]; | 881 | chip->input_level[1] = ucontrol->value.integer.value[1]; |
880 | vx2_set_input_level(chip); | 882 | vx2_set_input_level(chip); |
881 | up(&_chip->mixer_mutex); | 883 | mutex_unlock(&_chip->mixer_mutex); |
882 | return 1; | 884 | return 1; |
883 | } | 885 | } |
884 | up(&_chip->mixer_mutex); | 886 | mutex_unlock(&_chip->mixer_mutex); |
885 | return 0; | 887 | return 0; |
886 | } | 888 | } |
887 | 889 | ||
@@ -907,14 +909,14 @@ static int vx_mic_level_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_v | |||
907 | { | 909 | { |
908 | struct vx_core *_chip = snd_kcontrol_chip(kcontrol); | 910 | struct vx_core *_chip = snd_kcontrol_chip(kcontrol); |
909 | struct snd_vx222 *chip = (struct snd_vx222 *)_chip; | 911 | struct snd_vx222 *chip = (struct snd_vx222 *)_chip; |
910 | down(&_chip->mixer_mutex); | 912 | mutex_lock(&_chip->mixer_mutex); |
911 | if (chip->mic_level != ucontrol->value.integer.value[0]) { | 913 | if (chip->mic_level != ucontrol->value.integer.value[0]) { |
912 | chip->mic_level = ucontrol->value.integer.value[0]; | 914 | chip->mic_level = ucontrol->value.integer.value[0]; |
913 | vx2_set_input_level(chip); | 915 | vx2_set_input_level(chip); |
914 | up(&_chip->mixer_mutex); | 916 | mutex_unlock(&_chip->mixer_mutex); |
915 | return 1; | 917 | return 1; |
916 | } | 918 | } |
917 | up(&_chip->mixer_mutex); | 919 | mutex_unlock(&_chip->mixer_mutex); |
918 | return 0; | 920 | return 0; |
919 | } | 921 | } |
920 | 922 | ||