awacs.c (2d8ad8719591fa803b0d589ed057fa46f49b7155) awacs.c (15afafc2565bc785eb7a440b8b4a53f77910cf04)
1/*
2 * PMac AWACS lowlevel functions
3 *
4 * Copyright (c) by Takashi Iwai <tiwai@suse.de>
5 * code based on dmasound.c.
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by

--- 463 unchanged lines hidden (view full) ---

472 return 1;
473 }
474 return 0;
475}
476
477#define AMP_CH_SPK 0
478#define AMP_CH_HD 1
479
1/*
2 * PMac AWACS lowlevel functions
3 *
4 * Copyright (c) by Takashi Iwai <tiwai@suse.de>
5 * code based on dmasound.c.
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by

--- 463 unchanged lines hidden (view full) ---

472 return 1;
473 }
474 return 0;
475}
476
477#define AMP_CH_SPK 0
478#define AMP_CH_HD 1
479
480static struct snd_kcontrol_new snd_pmac_awacs_amp_vol[] __devinitdata = {
480static struct snd_kcontrol_new snd_pmac_awacs_amp_vol[] = {
481 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
482 .name = "Speaker Playback Volume",
483 .info = snd_pmac_awacs_info_volume_amp,
484 .get = snd_pmac_awacs_get_volume_amp,
485 .put = snd_pmac_awacs_put_volume_amp,
486 .private_value = AMP_CH_SPK,
487 },
488 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER,

--- 20 unchanged lines hidden (view full) ---

509 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
510 .name = "Amp Master Playback Volume",
511 .info = snd_pmac_awacs_info_master_amp,
512 .get = snd_pmac_awacs_get_master_amp,
513 .put = snd_pmac_awacs_put_master_amp,
514 },
515};
516
481 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
482 .name = "Speaker Playback Volume",
483 .info = snd_pmac_awacs_info_volume_amp,
484 .get = snd_pmac_awacs_get_volume_amp,
485 .put = snd_pmac_awacs_put_volume_amp,
486 .private_value = AMP_CH_SPK,
487 },
488 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER,

--- 20 unchanged lines hidden (view full) ---

509 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
510 .name = "Amp Master Playback Volume",
511 .info = snd_pmac_awacs_info_master_amp,
512 .get = snd_pmac_awacs_get_master_amp,
513 .put = snd_pmac_awacs_put_master_amp,
514 },
515};
516
517static struct snd_kcontrol_new snd_pmac_awacs_amp_hp_sw __devinitdata = {
517static struct snd_kcontrol_new snd_pmac_awacs_amp_hp_sw = {
518 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
519 .name = "Headphone Playback Switch",
520 .info = snd_pmac_boolean_stereo_info,
521 .get = snd_pmac_awacs_get_switch_amp,
522 .put = snd_pmac_awacs_put_switch_amp,
523 .private_value = AMP_CH_HD,
524};
525
518 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
519 .name = "Headphone Playback Switch",
520 .info = snd_pmac_boolean_stereo_info,
521 .get = snd_pmac_awacs_get_switch_amp,
522 .put = snd_pmac_awacs_put_switch_amp,
523 .private_value = AMP_CH_HD,
524};
525
526static struct snd_kcontrol_new snd_pmac_awacs_amp_spk_sw __devinitdata = {
526static struct snd_kcontrol_new snd_pmac_awacs_amp_spk_sw = {
527 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
528 .name = "Speaker Playback Switch",
529 .info = snd_pmac_boolean_stereo_info,
530 .get = snd_pmac_awacs_get_switch_amp,
531 .put = snd_pmac_awacs_put_switch_amp,
532 .private_value = AMP_CH_SPK,
533};
534

--- 55 unchanged lines hidden (view full) ---

590 }
591 spin_unlock_irqrestore(&chip->reg_lock, flags);
592 return changed;
593}
594
595/*
596 * lists of mixer elements
597 */
527 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
528 .name = "Speaker Playback Switch",
529 .info = snd_pmac_boolean_stereo_info,
530 .get = snd_pmac_awacs_get_switch_amp,
531 .put = snd_pmac_awacs_put_switch_amp,
532 .private_value = AMP_CH_SPK,
533};
534

--- 55 unchanged lines hidden (view full) ---

590 }
591 spin_unlock_irqrestore(&chip->reg_lock, flags);
592 return changed;
593}
594
595/*
596 * lists of mixer elements
597 */
598static struct snd_kcontrol_new snd_pmac_awacs_mixers[] __devinitdata = {
598static struct snd_kcontrol_new snd_pmac_awacs_mixers[] = {
599 AWACS_SWITCH("Master Capture Switch", 1, SHIFT_LOOPTHRU, 0),
600 AWACS_VOLUME("Master Capture Volume", 0, 4, 0),
601/* AWACS_SWITCH("Unknown Playback Switch", 6, SHIFT_PAROUT0, 0), */
602};
603
599 AWACS_SWITCH("Master Capture Switch", 1, SHIFT_LOOPTHRU, 0),
600 AWACS_VOLUME("Master Capture Volume", 0, 4, 0),
601/* AWACS_SWITCH("Unknown Playback Switch", 6, SHIFT_PAROUT0, 0), */
602};
603
604static struct snd_kcontrol_new snd_pmac_screamer_mixers_beige[] __devinitdata = {
604static struct snd_kcontrol_new snd_pmac_screamer_mixers_beige[] = {
605 AWACS_VOLUME("Master Playback Volume", 2, 6, 1),
606 AWACS_VOLUME("Play-through Playback Volume", 5, 6, 1),
607 AWACS_SWITCH("Line Capture Switch", 0, SHIFT_MUX_MIC, 0),
608 AWACS_SWITCH("CD Capture Switch", 0, SHIFT_MUX_LINE, 0),
609};
610
605 AWACS_VOLUME("Master Playback Volume", 2, 6, 1),
606 AWACS_VOLUME("Play-through Playback Volume", 5, 6, 1),
607 AWACS_SWITCH("Line Capture Switch", 0, SHIFT_MUX_MIC, 0),
608 AWACS_SWITCH("CD Capture Switch", 0, SHIFT_MUX_LINE, 0),
609};
610
611static struct snd_kcontrol_new snd_pmac_screamer_mixers_lo[] __devinitdata = {
611static struct snd_kcontrol_new snd_pmac_screamer_mixers_lo[] = {
612 AWACS_VOLUME("Line out Playback Volume", 2, 6, 1),
613};
614
612 AWACS_VOLUME("Line out Playback Volume", 2, 6, 1),
613};
614
615static struct snd_kcontrol_new snd_pmac_screamer_mixers_imac[] __devinitdata = {
615static struct snd_kcontrol_new snd_pmac_screamer_mixers_imac[] = {
616 AWACS_VOLUME("Play-through Playback Volume", 5, 6, 1),
617 AWACS_SWITCH("CD Capture Switch", 0, SHIFT_MUX_CD, 0),
618};
619
616 AWACS_VOLUME("Play-through Playback Volume", 5, 6, 1),
617 AWACS_SWITCH("CD Capture Switch", 0, SHIFT_MUX_CD, 0),
618};
619
620static struct snd_kcontrol_new snd_pmac_screamer_mixers_g4agp[] __devinitdata = {
620static struct snd_kcontrol_new snd_pmac_screamer_mixers_g4agp[] = {
621 AWACS_VOLUME("Line out Playback Volume", 2, 6, 1),
622 AWACS_VOLUME("Master Playback Volume", 5, 6, 1),
623 AWACS_SWITCH("CD Capture Switch", 0, SHIFT_MUX_CD, 0),
624 AWACS_SWITCH("Line Capture Switch", 0, SHIFT_MUX_MIC, 0),
625};
626
621 AWACS_VOLUME("Line out Playback Volume", 2, 6, 1),
622 AWACS_VOLUME("Master Playback Volume", 5, 6, 1),
623 AWACS_SWITCH("CD Capture Switch", 0, SHIFT_MUX_CD, 0),
624 AWACS_SWITCH("Line Capture Switch", 0, SHIFT_MUX_MIC, 0),
625};
626
627static struct snd_kcontrol_new snd_pmac_awacs_mixers_pmac7500[] __devinitdata = {
627static struct snd_kcontrol_new snd_pmac_awacs_mixers_pmac7500[] = {
628 AWACS_VOLUME("Line out Playback Volume", 2, 6, 1),
629 AWACS_SWITCH("CD Capture Switch", 0, SHIFT_MUX_CD, 0),
630 AWACS_SWITCH("Line Capture Switch", 0, SHIFT_MUX_MIC, 0),
631};
632
628 AWACS_VOLUME("Line out Playback Volume", 2, 6, 1),
629 AWACS_SWITCH("CD Capture Switch", 0, SHIFT_MUX_CD, 0),
630 AWACS_SWITCH("Line Capture Switch", 0, SHIFT_MUX_MIC, 0),
631};
632
633static struct snd_kcontrol_new snd_pmac_awacs_mixers_pmac5500[] __devinitdata = {
633static struct snd_kcontrol_new snd_pmac_awacs_mixers_pmac5500[] = {
634 AWACS_VOLUME("Headphone Playback Volume", 2, 6, 1),
635};
636
634 AWACS_VOLUME("Headphone Playback Volume", 2, 6, 1),
635};
636
637static struct snd_kcontrol_new snd_pmac_awacs_mixers_pmac[] __devinitdata = {
637static struct snd_kcontrol_new snd_pmac_awacs_mixers_pmac[] = {
638 AWACS_VOLUME("Master Playback Volume", 2, 6, 1),
639 AWACS_SWITCH("CD Capture Switch", 0, SHIFT_MUX_CD, 0),
640};
641
642/* FIXME: is this correct order?
643 * screamer (powerbook G3 pismo) seems to have different bits...
644 */
638 AWACS_VOLUME("Master Playback Volume", 2, 6, 1),
639 AWACS_SWITCH("CD Capture Switch", 0, SHIFT_MUX_CD, 0),
640};
641
642/* FIXME: is this correct order?
643 * screamer (powerbook G3 pismo) seems to have different bits...
644 */
645static struct snd_kcontrol_new snd_pmac_awacs_mixers2[] __devinitdata = {
645static struct snd_kcontrol_new snd_pmac_awacs_mixers2[] = {
646 AWACS_SWITCH("Line Capture Switch", 0, SHIFT_MUX_LINE, 0),
647 AWACS_SWITCH("Mic Capture Switch", 0, SHIFT_MUX_MIC, 0),
648};
649
646 AWACS_SWITCH("Line Capture Switch", 0, SHIFT_MUX_LINE, 0),
647 AWACS_SWITCH("Mic Capture Switch", 0, SHIFT_MUX_MIC, 0),
648};
649
650static struct snd_kcontrol_new snd_pmac_screamer_mixers2[] __devinitdata = {
650static struct snd_kcontrol_new snd_pmac_screamer_mixers2[] = {
651 AWACS_SWITCH("Line Capture Switch", 0, SHIFT_MUX_MIC, 0),
652 AWACS_SWITCH("Mic Capture Switch", 0, SHIFT_MUX_LINE, 0),
653};
654
651 AWACS_SWITCH("Line Capture Switch", 0, SHIFT_MUX_MIC, 0),
652 AWACS_SWITCH("Mic Capture Switch", 0, SHIFT_MUX_LINE, 0),
653};
654
655static struct snd_kcontrol_new snd_pmac_awacs_mixers2_pmac5500[] __devinitdata = {
655static struct snd_kcontrol_new snd_pmac_awacs_mixers2_pmac5500[] = {
656 AWACS_SWITCH("CD Capture Switch", 0, SHIFT_MUX_CD, 0),
657};
658
656 AWACS_SWITCH("CD Capture Switch", 0, SHIFT_MUX_CD, 0),
657};
658
659static struct snd_kcontrol_new snd_pmac_awacs_master_sw __devinitdata =
659static struct snd_kcontrol_new snd_pmac_awacs_master_sw =
660AWACS_SWITCH("Master Playback Switch", 1, SHIFT_HDMUTE, 1);
661
660AWACS_SWITCH("Master Playback Switch", 1, SHIFT_HDMUTE, 1);
661
662static struct snd_kcontrol_new snd_pmac_awacs_master_sw_imac __devinitdata =
662static struct snd_kcontrol_new snd_pmac_awacs_master_sw_imac =
663AWACS_SWITCH("Line out Playback Switch", 1, SHIFT_HDMUTE, 1);
664
663AWACS_SWITCH("Line out Playback Switch", 1, SHIFT_HDMUTE, 1);
664
665static struct snd_kcontrol_new snd_pmac_awacs_master_sw_pmac5500 __devinitdata =
665static struct snd_kcontrol_new snd_pmac_awacs_master_sw_pmac5500 =
666AWACS_SWITCH("Headphone Playback Switch", 1, SHIFT_HDMUTE, 1);
667
666AWACS_SWITCH("Headphone Playback Switch", 1, SHIFT_HDMUTE, 1);
667
668static struct snd_kcontrol_new snd_pmac_awacs_mic_boost[] __devinitdata = {
668static struct snd_kcontrol_new snd_pmac_awacs_mic_boost[] = {
669 AWACS_SWITCH("Mic Boost Capture Switch", 0, SHIFT_GAINLINE, 0),
670};
671
669 AWACS_SWITCH("Mic Boost Capture Switch", 0, SHIFT_GAINLINE, 0),
670};
671
672static struct snd_kcontrol_new snd_pmac_screamer_mic_boost[] __devinitdata = {
672static struct snd_kcontrol_new snd_pmac_screamer_mic_boost[] = {
673 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
674 .name = "Mic Boost Capture Volume",
675 .info = snd_pmac_screamer_mic_boost_info,
676 .get = snd_pmac_screamer_mic_boost_get,
677 .put = snd_pmac_screamer_mic_boost_put,
678 },
679};
680
673 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
674 .name = "Mic Boost Capture Volume",
675 .info = snd_pmac_screamer_mic_boost_info,
676 .get = snd_pmac_screamer_mic_boost_get,
677 .put = snd_pmac_screamer_mic_boost_put,
678 },
679};
680
681static struct snd_kcontrol_new snd_pmac_awacs_mic_boost_pmac7500[] __devinitdata =
681static struct snd_kcontrol_new snd_pmac_awacs_mic_boost_pmac7500[] =
682{
683 AWACS_SWITCH("Line Boost Capture Switch", 0, SHIFT_GAINLINE, 0),
684};
685
682{
683 AWACS_SWITCH("Line Boost Capture Switch", 0, SHIFT_GAINLINE, 0),
684};
685
686static struct snd_kcontrol_new snd_pmac_screamer_mic_boost_beige[] __devinitdata =
686static struct snd_kcontrol_new snd_pmac_screamer_mic_boost_beige[] =
687{
688 AWACS_SWITCH("Line Boost Capture Switch", 0, SHIFT_GAINLINE, 0),
689 AWACS_SWITCH("CD Boost Capture Switch", 6, SHIFT_MIC_BOOST, 0),
690};
691
687{
688 AWACS_SWITCH("Line Boost Capture Switch", 0, SHIFT_GAINLINE, 0),
689 AWACS_SWITCH("CD Boost Capture Switch", 6, SHIFT_MIC_BOOST, 0),
690};
691
692static struct snd_kcontrol_new snd_pmac_screamer_mic_boost_imac[] __devinitdata =
692static struct snd_kcontrol_new snd_pmac_screamer_mic_boost_imac[] =
693{
694 AWACS_SWITCH("Line Boost Capture Switch", 0, SHIFT_GAINLINE, 0),
695 AWACS_SWITCH("Mic Boost Capture Switch", 6, SHIFT_MIC_BOOST, 0),
696};
697
693{
694 AWACS_SWITCH("Line Boost Capture Switch", 0, SHIFT_GAINLINE, 0),
695 AWACS_SWITCH("Mic Boost Capture Switch", 6, SHIFT_MIC_BOOST, 0),
696};
697
698static struct snd_kcontrol_new snd_pmac_awacs_speaker_vol[] __devinitdata = {
698static struct snd_kcontrol_new snd_pmac_awacs_speaker_vol[] = {
699 AWACS_VOLUME("Speaker Playback Volume", 4, 6, 1),
700};
701
699 AWACS_VOLUME("Speaker Playback Volume", 4, 6, 1),
700};
701
702static struct snd_kcontrol_new snd_pmac_awacs_speaker_sw __devinitdata =
702static struct snd_kcontrol_new snd_pmac_awacs_speaker_sw =
703AWACS_SWITCH("Speaker Playback Switch", 1, SHIFT_SPKMUTE, 1);
704
703AWACS_SWITCH("Speaker Playback Switch", 1, SHIFT_SPKMUTE, 1);
704
705static struct snd_kcontrol_new snd_pmac_awacs_speaker_sw_imac1 __devinitdata =
705static struct snd_kcontrol_new snd_pmac_awacs_speaker_sw_imac1 =
706AWACS_SWITCH("Speaker Playback Switch", 1, SHIFT_PAROUT1, 1);
707
706AWACS_SWITCH("Speaker Playback Switch", 1, SHIFT_PAROUT1, 1);
707
708static struct snd_kcontrol_new snd_pmac_awacs_speaker_sw_imac2 __devinitdata =
708static struct snd_kcontrol_new snd_pmac_awacs_speaker_sw_imac2 =
709AWACS_SWITCH("Speaker Playback Switch", 1, SHIFT_PAROUT1, 0);
710
711
712/*
713 * add new mixer elements to the card
714 */
715static int build_mixers(struct snd_pmac *chip, int nums,
716 struct snd_kcontrol_new *mixers)

--- 150 unchanged lines hidden (view full) ---

867 }
868}
869#endif /* PMAC_SUPPORT_AUTOMUTE */
870
871
872/*
873 * initialize chip
874 */
709AWACS_SWITCH("Speaker Playback Switch", 1, SHIFT_PAROUT1, 0);
710
711
712/*
713 * add new mixer elements to the card
714 */
715static int build_mixers(struct snd_pmac *chip, int nums,
716 struct snd_kcontrol_new *mixers)

--- 150 unchanged lines hidden (view full) ---

867 }
868}
869#endif /* PMAC_SUPPORT_AUTOMUTE */
870
871
872/*
873 * initialize chip
874 */
875int __devinit
875int
876snd_pmac_awacs_init(struct snd_pmac *chip)
877{
878 int pm7500 = IS_PM7500;
879 int pm5500 = IS_PM5500;
880 int beige = IS_BEIGE;
881 int g4agp = IS_G4AGP;
882 int lombard = IS_LOMBARD;
883 int imac;

--- 263 unchanged lines hidden ---
876snd_pmac_awacs_init(struct snd_pmac *chip)
877{
878 int pm7500 = IS_PM7500;
879 int pm5500 = IS_PM5500;
880 int beige = IS_BEIGE;
881 int g4agp = IS_G4AGP;
882 int lombard = IS_LOMBARD;
883 int imac;

--- 263 unchanged lines hidden ---