diff options
| author | Ingo Molnar <mingo@elte.hu> | 2010-09-15 04:27:31 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2010-09-15 04:27:31 -0400 |
| commit | 3aabae7d9dfaed60effe93662f02c19bafc18537 (patch) | |
| tree | af94cdd69add07601d9f3f5988dfc1dc255e3886 /sound/pci/oxygen | |
| parent | 79e406d7b00ab2b261ae32a59f266fd3b7af6f29 (diff) | |
| parent | 57c072c7113f54f9512624d6c665db6184448782 (diff) | |
Merge branch 'tip/perf/core' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-2.6-trace into perf/core
Diffstat (limited to 'sound/pci/oxygen')
| -rw-r--r-- | sound/pci/oxygen/oxygen.h | 1 | ||||
| -rw-r--r-- | sound/pci/oxygen/oxygen_lib.c | 21 | ||||
| -rw-r--r-- | sound/pci/oxygen/virtuoso.c | 1 | ||||
| -rw-r--r-- | sound/pci/oxygen/xonar_wm87x6.c | 22 |
4 files changed, 41 insertions, 4 deletions
diff --git a/sound/pci/oxygen/oxygen.h b/sound/pci/oxygen/oxygen.h index 6147216af744..a3409edcfb50 100644 --- a/sound/pci/oxygen/oxygen.h +++ b/sound/pci/oxygen/oxygen.h | |||
| @@ -155,6 +155,7 @@ void oxygen_pci_remove(struct pci_dev *pci); | |||
| 155 | int oxygen_pci_suspend(struct pci_dev *pci, pm_message_t state); | 155 | int oxygen_pci_suspend(struct pci_dev *pci, pm_message_t state); |
| 156 | int oxygen_pci_resume(struct pci_dev *pci); | 156 | int oxygen_pci_resume(struct pci_dev *pci); |
| 157 | #endif | 157 | #endif |
| 158 | void oxygen_pci_shutdown(struct pci_dev *pci); | ||
| 158 | 159 | ||
| 159 | /* oxygen_mixer.c */ | 160 | /* oxygen_mixer.c */ |
| 160 | 161 | ||
diff --git a/sound/pci/oxygen/oxygen_lib.c b/sound/pci/oxygen/oxygen_lib.c index fad03d64e3ad..7e93cf884437 100644 --- a/sound/pci/oxygen/oxygen_lib.c +++ b/sound/pci/oxygen/oxygen_lib.c | |||
| @@ -519,16 +519,21 @@ static void oxygen_init(struct oxygen *chip) | |||
| 519 | } | 519 | } |
| 520 | } | 520 | } |
| 521 | 521 | ||
| 522 | static void oxygen_card_free(struct snd_card *card) | 522 | static void oxygen_shutdown(struct oxygen *chip) |
| 523 | { | 523 | { |
| 524 | struct oxygen *chip = card->private_data; | ||
| 525 | |||
| 526 | spin_lock_irq(&chip->reg_lock); | 524 | spin_lock_irq(&chip->reg_lock); |
| 527 | chip->interrupt_mask = 0; | 525 | chip->interrupt_mask = 0; |
| 528 | chip->pcm_running = 0; | 526 | chip->pcm_running = 0; |
| 529 | oxygen_write16(chip, OXYGEN_DMA_STATUS, 0); | 527 | oxygen_write16(chip, OXYGEN_DMA_STATUS, 0); |
| 530 | oxygen_write16(chip, OXYGEN_INTERRUPT_MASK, 0); | 528 | oxygen_write16(chip, OXYGEN_INTERRUPT_MASK, 0); |
| 531 | spin_unlock_irq(&chip->reg_lock); | 529 | spin_unlock_irq(&chip->reg_lock); |
| 530 | } | ||
| 531 | |||
| 532 | static void oxygen_card_free(struct snd_card *card) | ||
| 533 | { | ||
| 534 | struct oxygen *chip = card->private_data; | ||
| 535 | |||
| 536 | oxygen_shutdown(chip); | ||
| 532 | if (chip->irq >= 0) | 537 | if (chip->irq >= 0) |
| 533 | free_irq(chip->irq, chip); | 538 | free_irq(chip->irq, chip); |
| 534 | flush_scheduled_work(); | 539 | flush_scheduled_work(); |
| @@ -778,3 +783,13 @@ int oxygen_pci_resume(struct pci_dev *pci) | |||
| 778 | } | 783 | } |
| 779 | EXPORT_SYMBOL(oxygen_pci_resume); | 784 | EXPORT_SYMBOL(oxygen_pci_resume); |
| 780 | #endif /* CONFIG_PM */ | 785 | #endif /* CONFIG_PM */ |
| 786 | |||
| 787 | void oxygen_pci_shutdown(struct pci_dev *pci) | ||
| 788 | { | ||
| 789 | struct snd_card *card = pci_get_drvdata(pci); | ||
| 790 | struct oxygen *chip = card->private_data; | ||
| 791 | |||
| 792 | oxygen_shutdown(chip); | ||
| 793 | chip->model.cleanup(chip); | ||
| 794 | } | ||
| 795 | EXPORT_SYMBOL(oxygen_pci_shutdown); | ||
diff --git a/sound/pci/oxygen/virtuoso.c b/sound/pci/oxygen/virtuoso.c index f03a2f2cffee..06c863e86e3d 100644 --- a/sound/pci/oxygen/virtuoso.c +++ b/sound/pci/oxygen/virtuoso.c | |||
| @@ -95,6 +95,7 @@ static struct pci_driver xonar_driver = { | |||
| 95 | .suspend = oxygen_pci_suspend, | 95 | .suspend = oxygen_pci_suspend, |
| 96 | .resume = oxygen_pci_resume, | 96 | .resume = oxygen_pci_resume, |
| 97 | #endif | 97 | #endif |
| 98 | .shutdown = oxygen_pci_shutdown, | ||
| 98 | }; | 99 | }; |
| 99 | 100 | ||
| 100 | static int __init alsa_card_xonar_init(void) | 101 | static int __init alsa_card_xonar_init(void) |
diff --git a/sound/pci/oxygen/xonar_wm87x6.c b/sound/pci/oxygen/xonar_wm87x6.c index dbc4b89d74e4..b82c1cfa96f5 100644 --- a/sound/pci/oxygen/xonar_wm87x6.c +++ b/sound/pci/oxygen/xonar_wm87x6.c | |||
| @@ -53,6 +53,8 @@ struct xonar_wm87x6 { | |||
| 53 | struct xonar_generic generic; | 53 | struct xonar_generic generic; |
| 54 | u16 wm8776_regs[0x17]; | 54 | u16 wm8776_regs[0x17]; |
| 55 | u16 wm8766_regs[0x10]; | 55 | u16 wm8766_regs[0x10]; |
| 56 | struct snd_kcontrol *line_adcmux_control; | ||
| 57 | struct snd_kcontrol *mic_adcmux_control; | ||
| 56 | struct snd_kcontrol *lc_controls[13]; | 58 | struct snd_kcontrol *lc_controls[13]; |
| 57 | }; | 59 | }; |
| 58 | 60 | ||
| @@ -193,6 +195,7 @@ static void xonar_ds_init(struct oxygen *chip) | |||
| 193 | static void xonar_ds_cleanup(struct oxygen *chip) | 195 | static void xonar_ds_cleanup(struct oxygen *chip) |
| 194 | { | 196 | { |
| 195 | xonar_disable_output(chip); | 197 | xonar_disable_output(chip); |
| 198 | wm8776_write(chip, WM8776_RESET, 0); | ||
| 196 | } | 199 | } |
| 197 | 200 | ||
| 198 | static void xonar_ds_suspend(struct oxygen *chip) | 201 | static void xonar_ds_suspend(struct oxygen *chip) |
| @@ -603,6 +606,7 @@ static int wm8776_input_mux_put(struct snd_kcontrol *ctl, | |||
| 603 | { | 606 | { |
| 604 | struct oxygen *chip = ctl->private_data; | 607 | struct oxygen *chip = ctl->private_data; |
| 605 | struct xonar_wm87x6 *data = chip->model_data; | 608 | struct xonar_wm87x6 *data = chip->model_data; |
| 609 | struct snd_kcontrol *other_ctl; | ||
| 606 | unsigned int mux_bit = ctl->private_value; | 610 | unsigned int mux_bit = ctl->private_value; |
| 607 | u16 reg; | 611 | u16 reg; |
| 608 | int changed; | 612 | int changed; |
| @@ -610,8 +614,18 @@ static int wm8776_input_mux_put(struct snd_kcontrol *ctl, | |||
| 610 | mutex_lock(&chip->mutex); | 614 | mutex_lock(&chip->mutex); |
| 611 | reg = data->wm8776_regs[WM8776_ADCMUX]; | 615 | reg = data->wm8776_regs[WM8776_ADCMUX]; |
| 612 | if (value->value.integer.value[0]) { | 616 | if (value->value.integer.value[0]) { |
| 613 | reg &= ~0x003; | ||
| 614 | reg |= mux_bit; | 617 | reg |= mux_bit; |
| 618 | /* line-in and mic-in are exclusive */ | ||
| 619 | mux_bit ^= 3; | ||
| 620 | if (reg & mux_bit) { | ||
| 621 | reg &= ~mux_bit; | ||
| 622 | if (mux_bit == 1) | ||
| 623 | other_ctl = data->line_adcmux_control; | ||
| 624 | else | ||
| 625 | other_ctl = data->mic_adcmux_control; | ||
| 626 | snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, | ||
| 627 | &other_ctl->id); | ||
| 628 | } | ||
| 615 | } else | 629 | } else |
| 616 | reg &= ~mux_bit; | 630 | reg &= ~mux_bit; |
| 617 | changed = reg != data->wm8776_regs[WM8776_ADCMUX]; | 631 | changed = reg != data->wm8776_regs[WM8776_ADCMUX]; |
| @@ -963,7 +977,13 @@ static int xonar_ds_mixer_init(struct oxygen *chip) | |||
| 963 | err = snd_ctl_add(chip->card, ctl); | 977 | err = snd_ctl_add(chip->card, ctl); |
| 964 | if (err < 0) | 978 | if (err < 0) |
| 965 | return err; | 979 | return err; |
| 980 | if (!strcmp(ctl->id.name, "Line Capture Switch")) | ||
| 981 | data->line_adcmux_control = ctl; | ||
| 982 | else if (!strcmp(ctl->id.name, "Mic Capture Switch")) | ||
| 983 | data->mic_adcmux_control = ctl; | ||
| 966 | } | 984 | } |
| 985 | if (!data->line_adcmux_control || !data->mic_adcmux_control) | ||
| 986 | return -ENXIO; | ||
| 967 | BUILD_BUG_ON(ARRAY_SIZE(lc_controls) != ARRAY_SIZE(data->lc_controls)); | 987 | BUILD_BUG_ON(ARRAY_SIZE(lc_controls) != ARRAY_SIZE(data->lc_controls)); |
| 968 | for (i = 0; i < ARRAY_SIZE(lc_controls); ++i) { | 988 | for (i = 0; i < ARRAY_SIZE(lc_controls); ++i) { |
| 969 | ctl = snd_ctl_new1(&lc_controls[i], chip); | 989 | ctl = snd_ctl_new1(&lc_controls[i], chip); |
