aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/asihpi
diff options
context:
space:
mode:
authorEliot Blennerhassett <eblennerhassett@audioscience.com>2011-07-21 23:53:03 -0400
committerTakashi Iwai <tiwai@suse.de>2011-07-22 01:54:20 -0400
commitfe0aa88eecfc0a9caa6f6298eb600eb7a55d8a17 (patch)
tree4c6e4fe4e7e8afe0ee5eeef31341c701dd397330 /sound/pci/asihpi
parentc8306135746687b30048f8bd949d2dfb8d6c697a (diff)
ALSA: asihpi - Add volume mute controls
Mute functionality was recently added to the DSP firmware Signed-off-by: Eliot Blennerhassett <eblennerhassett@audioscience.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci/asihpi')
-rw-r--r--sound/pci/asihpi/asihpi.c51
1 files changed, 50 insertions, 1 deletions
diff --git a/sound/pci/asihpi/asihpi.c b/sound/pci/asihpi/asihpi.c
index 3444bd7d3268..f2b35e1bdc90 100644
--- a/sound/pci/asihpi/asihpi.c
+++ b/sound/pci/asihpi/asihpi.c
@@ -1487,11 +1487,48 @@ static int snd_asihpi_volume_put(struct snd_kcontrol *kcontrol,
1487 1487
1488static const DECLARE_TLV_DB_SCALE(db_scale_100, -10000, VOL_STEP_mB, 0); 1488static const DECLARE_TLV_DB_SCALE(db_scale_100, -10000, VOL_STEP_mB, 0);
1489 1489
1490static int snd_asihpi_volume_mute_info(struct snd_kcontrol *kcontrol,
1491 struct snd_ctl_elem_info *uinfo)
1492{
1493 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
1494 uinfo->count = 1;
1495 uinfo->value.integer.min = 0;
1496 uinfo->value.integer.max = 1;
1497 return 0;
1498}
1499
1500static int snd_asihpi_volume_mute_get(struct snd_kcontrol *kcontrol,
1501 struct snd_ctl_elem_value *ucontrol)
1502{
1503 u32 h_control = kcontrol->private_value;
1504 u32 mute;
1505
1506 hpi_handle_error(hpi_volume_get_mute(h_control, &mute));
1507 ucontrol->value.integer.value[0] = mute ? 0 : 1;
1508
1509 return 0;
1510}
1511
1512static int snd_asihpi_volume_mute_put(struct snd_kcontrol *kcontrol,
1513 struct snd_ctl_elem_value *ucontrol)
1514{
1515 u32 h_control = kcontrol->private_value;
1516 int change = 1;
1517 /* HPI currently only supports all or none muting of multichannel volume
1518 ALSA Switch element has opposite sense to HPI mute: on==unmuted, off=muted
1519 */
1520 int mute = ucontrol->value.integer.value[0] ? 0 : HPI_BITMASK_ALL_CHANNELS;
1521 hpi_handle_error(hpi_volume_set_mute(h_control, mute));
1522 return change;
1523}
1524
1490static int __devinit snd_asihpi_volume_add(struct snd_card_asihpi *asihpi, 1525static int __devinit snd_asihpi_volume_add(struct snd_card_asihpi *asihpi,
1491 struct hpi_control *hpi_ctl) 1526 struct hpi_control *hpi_ctl)
1492{ 1527{
1493 struct snd_card *card = asihpi->card; 1528 struct snd_card *card = asihpi->card;
1494 struct snd_kcontrol_new snd_control; 1529 struct snd_kcontrol_new snd_control;
1530 int err;
1531 u32 mute;
1495 1532
1496 asihpi_ctl_init(&snd_control, hpi_ctl, "Volume"); 1533 asihpi_ctl_init(&snd_control, hpi_ctl, "Volume");
1497 snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE | 1534 snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
@@ -1501,7 +1538,19 @@ static int __devinit snd_asihpi_volume_add(struct snd_card_asihpi *asihpi,
1501 snd_control.put = snd_asihpi_volume_put; 1538 snd_control.put = snd_asihpi_volume_put;
1502 snd_control.tlv.p = db_scale_100; 1539 snd_control.tlv.p = db_scale_100;
1503 1540
1504 return ctl_add(card, &snd_control, asihpi); 1541 err = ctl_add(card, &snd_control, asihpi);
1542 if (err)
1543 return err;
1544
1545 if (hpi_volume_get_mute(hpi_ctl->h_control, &mute) == 0) {
1546 asihpi_ctl_init(&snd_control, hpi_ctl, "Switch");
1547 snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE;
1548 snd_control.info = snd_asihpi_volume_mute_info;
1549 snd_control.get = snd_asihpi_volume_mute_get;
1550 snd_control.put = snd_asihpi_volume_mute_put;
1551 err = ctl_add(card, &snd_control, asihpi);
1552 }
1553 return err;
1505} 1554}
1506 1555
1507/*------------------------------------------------------------ 1556/*------------------------------------------------------------