aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/hda/hda_codec.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/pci/hda/hda_codec.c')
-rw-r--r--sound/pci/hda/hda_codec.c25
1 files changed, 13 insertions, 12 deletions
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
index e16cf63821ae..f80e5f3b97dc 100644
--- a/sound/pci/hda/hda_codec.c
+++ b/sound/pci/hda/hda_codec.c
@@ -735,6 +735,7 @@ int /*__devinit*/ snd_hda_codec_new(struct hda_bus *bus, unsigned int codec_addr
735 codec->bus = bus; 735 codec->bus = bus;
736 codec->addr = codec_addr; 736 codec->addr = codec_addr;
737 mutex_init(&codec->spdif_mutex); 737 mutex_init(&codec->spdif_mutex);
738 mutex_init(&codec->control_mutex);
738 init_hda_cache(&codec->amp_cache, sizeof(struct hda_amp_info)); 739 init_hda_cache(&codec->amp_cache, sizeof(struct hda_amp_info));
739 init_hda_cache(&codec->cmd_cache, sizeof(struct hda_cache_head)); 740 init_hda_cache(&codec->cmd_cache, sizeof(struct hda_cache_head));
740 snd_array_init(&codec->mixers, sizeof(struct snd_kcontrol *), 32); 741 snd_array_init(&codec->mixers, sizeof(struct snd_kcontrol *), 32);
@@ -1418,12 +1419,12 @@ int snd_hda_mixer_bind_switch_get(struct snd_kcontrol *kcontrol,
1418 unsigned long pval; 1419 unsigned long pval;
1419 int err; 1420 int err;
1420 1421
1421 mutex_lock(&codec->spdif_mutex); /* reuse spdif_mutex */ 1422 mutex_lock(&codec->control_mutex);
1422 pval = kcontrol->private_value; 1423 pval = kcontrol->private_value;
1423 kcontrol->private_value = pval & ~AMP_VAL_IDX_MASK; /* index 0 */ 1424 kcontrol->private_value = pval & ~AMP_VAL_IDX_MASK; /* index 0 */
1424 err = snd_hda_mixer_amp_switch_get(kcontrol, ucontrol); 1425 err = snd_hda_mixer_amp_switch_get(kcontrol, ucontrol);
1425 kcontrol->private_value = pval; 1426 kcontrol->private_value = pval;
1426 mutex_unlock(&codec->spdif_mutex); 1427 mutex_unlock(&codec->control_mutex);
1427 return err; 1428 return err;
1428} 1429}
1429EXPORT_SYMBOL_HDA(snd_hda_mixer_bind_switch_get); 1430EXPORT_SYMBOL_HDA(snd_hda_mixer_bind_switch_get);
@@ -1435,7 +1436,7 @@ int snd_hda_mixer_bind_switch_put(struct snd_kcontrol *kcontrol,
1435 unsigned long pval; 1436 unsigned long pval;
1436 int i, indices, err = 0, change = 0; 1437 int i, indices, err = 0, change = 0;
1437 1438
1438 mutex_lock(&codec->spdif_mutex); /* reuse spdif_mutex */ 1439 mutex_lock(&codec->control_mutex);
1439 pval = kcontrol->private_value; 1440 pval = kcontrol->private_value;
1440 indices = (pval & AMP_VAL_IDX_MASK) >> AMP_VAL_IDX_SHIFT; 1441 indices = (pval & AMP_VAL_IDX_MASK) >> AMP_VAL_IDX_SHIFT;
1441 for (i = 0; i < indices; i++) { 1442 for (i = 0; i < indices; i++) {
@@ -1447,7 +1448,7 @@ int snd_hda_mixer_bind_switch_put(struct snd_kcontrol *kcontrol,
1447 change |= err; 1448 change |= err;
1448 } 1449 }
1449 kcontrol->private_value = pval; 1450 kcontrol->private_value = pval;
1450 mutex_unlock(&codec->spdif_mutex); 1451 mutex_unlock(&codec->control_mutex);
1451 return err < 0 ? err : change; 1452 return err < 0 ? err : change;
1452} 1453}
1453EXPORT_SYMBOL_HDA(snd_hda_mixer_bind_switch_put); 1454EXPORT_SYMBOL_HDA(snd_hda_mixer_bind_switch_put);
@@ -1462,12 +1463,12 @@ int snd_hda_mixer_bind_ctls_info(struct snd_kcontrol *kcontrol,
1462 struct hda_bind_ctls *c; 1463 struct hda_bind_ctls *c;
1463 int err; 1464 int err;
1464 1465
1465 mutex_lock(&codec->spdif_mutex); /* reuse spdif_mutex */ 1466 mutex_lock(&codec->control_mutex);
1466 c = (struct hda_bind_ctls *)kcontrol->private_value; 1467 c = (struct hda_bind_ctls *)kcontrol->private_value;
1467 kcontrol->private_value = *c->values; 1468 kcontrol->private_value = *c->values;
1468 err = c->ops->info(kcontrol, uinfo); 1469 err = c->ops->info(kcontrol, uinfo);
1469 kcontrol->private_value = (long)c; 1470 kcontrol->private_value = (long)c;
1470 mutex_unlock(&codec->spdif_mutex); 1471 mutex_unlock(&codec->control_mutex);
1471 return err; 1472 return err;
1472} 1473}
1473EXPORT_SYMBOL_HDA(snd_hda_mixer_bind_ctls_info); 1474EXPORT_SYMBOL_HDA(snd_hda_mixer_bind_ctls_info);
@@ -1479,12 +1480,12 @@ int snd_hda_mixer_bind_ctls_get(struct snd_kcontrol *kcontrol,
1479 struct hda_bind_ctls *c; 1480 struct hda_bind_ctls *c;
1480 int err; 1481 int err;
1481 1482
1482 mutex_lock(&codec->spdif_mutex); /* reuse spdif_mutex */ 1483 mutex_lock(&codec->control_mutex);
1483 c = (struct hda_bind_ctls *)kcontrol->private_value; 1484 c = (struct hda_bind_ctls *)kcontrol->private_value;
1484 kcontrol->private_value = *c->values; 1485 kcontrol->private_value = *c->values;
1485 err = c->ops->get(kcontrol, ucontrol); 1486 err = c->ops->get(kcontrol, ucontrol);
1486 kcontrol->private_value = (long)c; 1487 kcontrol->private_value = (long)c;
1487 mutex_unlock(&codec->spdif_mutex); 1488 mutex_unlock(&codec->control_mutex);
1488 return err; 1489 return err;
1489} 1490}
1490EXPORT_SYMBOL_HDA(snd_hda_mixer_bind_ctls_get); 1491EXPORT_SYMBOL_HDA(snd_hda_mixer_bind_ctls_get);
@@ -1497,7 +1498,7 @@ int snd_hda_mixer_bind_ctls_put(struct snd_kcontrol *kcontrol,
1497 unsigned long *vals; 1498 unsigned long *vals;
1498 int err = 0, change = 0; 1499 int err = 0, change = 0;
1499 1500
1500 mutex_lock(&codec->spdif_mutex); /* reuse spdif_mutex */ 1501 mutex_lock(&codec->control_mutex);
1501 c = (struct hda_bind_ctls *)kcontrol->private_value; 1502 c = (struct hda_bind_ctls *)kcontrol->private_value;
1502 for (vals = c->values; *vals; vals++) { 1503 for (vals = c->values; *vals; vals++) {
1503 kcontrol->private_value = *vals; 1504 kcontrol->private_value = *vals;
@@ -1507,7 +1508,7 @@ int snd_hda_mixer_bind_ctls_put(struct snd_kcontrol *kcontrol,
1507 change |= err; 1508 change |= err;
1508 } 1509 }
1509 kcontrol->private_value = (long)c; 1510 kcontrol->private_value = (long)c;
1510 mutex_unlock(&codec->spdif_mutex); 1511 mutex_unlock(&codec->control_mutex);
1511 return err < 0 ? err : change; 1512 return err < 0 ? err : change;
1512} 1513}
1513EXPORT_SYMBOL_HDA(snd_hda_mixer_bind_ctls_put); 1514EXPORT_SYMBOL_HDA(snd_hda_mixer_bind_ctls_put);
@@ -1519,12 +1520,12 @@ int snd_hda_mixer_bind_tlv(struct snd_kcontrol *kcontrol, int op_flag,
1519 struct hda_bind_ctls *c; 1520 struct hda_bind_ctls *c;
1520 int err; 1521 int err;
1521 1522
1522 mutex_lock(&codec->spdif_mutex); /* reuse spdif_mutex */ 1523 mutex_lock(&codec->control_mutex);
1523 c = (struct hda_bind_ctls *)kcontrol->private_value; 1524 c = (struct hda_bind_ctls *)kcontrol->private_value;
1524 kcontrol->private_value = *c->values; 1525 kcontrol->private_value = *c->values;
1525 err = c->ops->tlv(kcontrol, op_flag, size, tlv); 1526 err = c->ops->tlv(kcontrol, op_flag, size, tlv);
1526 kcontrol->private_value = (long)c; 1527 kcontrol->private_value = (long)c;
1527 mutex_unlock(&codec->spdif_mutex); 1528 mutex_unlock(&codec->control_mutex);
1528 return err; 1529 return err;
1529} 1530}
1530EXPORT_SYMBOL_HDA(snd_hda_mixer_bind_tlv); 1531EXPORT_SYMBOL_HDA(snd_hda_mixer_bind_tlv);