diff options
author | Clemens Ladisch <clemens@ladisch.de> | 2008-09-22 03:01:11 -0400 |
---|---|---|
committer | Clemens Ladisch <clemens@ladisch.de> | 2008-09-22 03:01:11 -0400 |
commit | c3f00739c5e45b4bf6f759172a5318256b92f2b2 (patch) | |
tree | 0ad1987783d637d13daa8731b634217f6be4ea3e /sound/pci/oxygen/virtuoso.c | |
parent | fe10662c3c7e1a77cac7949a4b269622da663c2e (diff) |
ALSA: virtuoso: create common functions for GPIO bit switch controls
Factor out the common code of the mixer callbacks that handle controls
that just switch a single GPIO bit.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Diffstat (limited to 'sound/pci/oxygen/virtuoso.c')
-rw-r--r-- | sound/pci/oxygen/virtuoso.c | 53 |
1 files changed, 15 insertions, 38 deletions
diff --git a/sound/pci/oxygen/virtuoso.c b/sound/pci/oxygen/virtuoso.c index c4ac91f80235..34baff19ad36 100644 --- a/sound/pci/oxygen/virtuoso.c +++ b/sound/pci/oxygen/virtuoso.c | |||
@@ -444,29 +444,31 @@ static void xonar_gpio_changed(struct oxygen *chip) | |||
444 | } | 444 | } |
445 | } | 445 | } |
446 | 446 | ||
447 | static int alt_switch_get(struct snd_kcontrol *ctl, | 447 | static int gpio_bit_switch_get(struct snd_kcontrol *ctl, |
448 | struct snd_ctl_elem_value *value) | 448 | struct snd_ctl_elem_value *value) |
449 | { | 449 | { |
450 | struct oxygen *chip = ctl->private_data; | 450 | struct oxygen *chip = ctl->private_data; |
451 | u16 bit = ctl->private_value; | ||
451 | 452 | ||
452 | value->value.integer.value[0] = | 453 | value->value.integer.value[0] = |
453 | !!(oxygen_read16(chip, OXYGEN_GPIO_DATA) & GPIO_D2_ALT); | 454 | !!(oxygen_read16(chip, OXYGEN_GPIO_DATA) & bit); |
454 | return 0; | 455 | return 0; |
455 | } | 456 | } |
456 | 457 | ||
457 | static int alt_switch_put(struct snd_kcontrol *ctl, | 458 | static int gpio_bit_switch_put(struct snd_kcontrol *ctl, |
458 | struct snd_ctl_elem_value *value) | 459 | struct snd_ctl_elem_value *value) |
459 | { | 460 | { |
460 | struct oxygen *chip = ctl->private_data; | 461 | struct oxygen *chip = ctl->private_data; |
462 | u16 bit = ctl->private_value; | ||
461 | u16 old_bits, new_bits; | 463 | u16 old_bits, new_bits; |
462 | int changed; | 464 | int changed; |
463 | 465 | ||
464 | spin_lock_irq(&chip->reg_lock); | 466 | spin_lock_irq(&chip->reg_lock); |
465 | old_bits = oxygen_read16(chip, OXYGEN_GPIO_DATA); | 467 | old_bits = oxygen_read16(chip, OXYGEN_GPIO_DATA); |
466 | if (value->value.integer.value[0]) | 468 | if (value->value.integer.value[0]) |
467 | new_bits = old_bits | GPIO_D2_ALT; | 469 | new_bits = old_bits | bit; |
468 | else | 470 | else |
469 | new_bits = old_bits & ~GPIO_D2_ALT; | 471 | new_bits = old_bits & ~bit; |
470 | changed = new_bits != old_bits; | 472 | changed = new_bits != old_bits; |
471 | if (changed) | 473 | if (changed) |
472 | oxygen_write16(chip, OXYGEN_GPIO_DATA, new_bits); | 474 | oxygen_write16(chip, OXYGEN_GPIO_DATA, new_bits); |
@@ -478,43 +480,18 @@ static const struct snd_kcontrol_new alt_switch = { | |||
478 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | 480 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, |
479 | .name = "Analog Loopback Switch", | 481 | .name = "Analog Loopback Switch", |
480 | .info = snd_ctl_boolean_mono_info, | 482 | .info = snd_ctl_boolean_mono_info, |
481 | .get = alt_switch_get, | 483 | .get = gpio_bit_switch_get, |
482 | .put = alt_switch_put, | 484 | .put = gpio_bit_switch_put, |
485 | .private_value = GPIO_D2_ALT, | ||
483 | }; | 486 | }; |
484 | 487 | ||
485 | static int front_panel_get(struct snd_kcontrol *ctl, | ||
486 | struct snd_ctl_elem_value *value) | ||
487 | { | ||
488 | struct oxygen *chip = ctl->private_data; | ||
489 | |||
490 | value->value.integer.value[0] = | ||
491 | !!(oxygen_read16(chip, OXYGEN_GPIO_DATA) & GPIO_DX_FRONT_PANEL); | ||
492 | return 0; | ||
493 | } | ||
494 | |||
495 | static int front_panel_put(struct snd_kcontrol *ctl, | ||
496 | struct snd_ctl_elem_value *value) | ||
497 | { | ||
498 | struct oxygen *chip = ctl->private_data; | ||
499 | u16 old_reg, new_reg; | ||
500 | |||
501 | spin_lock_irq(&chip->reg_lock); | ||
502 | old_reg = oxygen_read16(chip, OXYGEN_GPIO_DATA); | ||
503 | if (value->value.integer.value[0]) | ||
504 | new_reg = old_reg | GPIO_DX_FRONT_PANEL; | ||
505 | else | ||
506 | new_reg = old_reg & ~GPIO_DX_FRONT_PANEL; | ||
507 | oxygen_write16(chip, OXYGEN_GPIO_DATA, new_reg); | ||
508 | spin_unlock_irq(&chip->reg_lock); | ||
509 | return old_reg != new_reg; | ||
510 | } | ||
511 | |||
512 | static const struct snd_kcontrol_new front_panel_switch = { | 488 | static const struct snd_kcontrol_new front_panel_switch = { |
513 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | 489 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, |
514 | .name = "Front Panel Switch", | 490 | .name = "Front Panel Switch", |
515 | .info = snd_ctl_boolean_mono_info, | 491 | .info = snd_ctl_boolean_mono_info, |
516 | .get = front_panel_get, | 492 | .get = gpio_bit_switch_get, |
517 | .put = front_panel_put, | 493 | .put = gpio_bit_switch_put, |
494 | .private_value = GPIO_DX_FRONT_PANEL, | ||
518 | }; | 495 | }; |
519 | 496 | ||
520 | static void xonar_d1_ac97_switch(struct oxygen *chip, | 497 | static void xonar_d1_ac97_switch(struct oxygen *chip, |