]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - sound/ppc/awacs.c
OMAP1: clock: Typo fix for clock in omap1
[linux-2.6-omap-h63xx.git] / sound / ppc / awacs.c
index 7bd33e6552ab813967d44b19aca364801a9a93ba..80df9b1f651e01fbfec1302d77cd8673308a7b31 100644 (file)
@@ -608,9 +608,12 @@ static struct snd_kcontrol_new snd_pmac_screamer_mixers_beige[] __initdata = {
        AWACS_SWITCH("CD Capture Switch", 0, SHIFT_MUX_LINE, 0),
 };
 
-static struct snd_kcontrol_new snd_pmac_screamer_mixers_imac[] __initdata = {
+static struct snd_kcontrol_new snd_pmac_screamer_mixers_lo[] __initdata = {
        AWACS_VOLUME("Line out Playback Volume", 2, 6, 1),
-       AWACS_VOLUME("Master Playback Volume", 5, 6, 1),
+};
+
+static struct snd_kcontrol_new snd_pmac_screamer_mixers_imac[] __initdata = {
+       AWACS_VOLUME("Play-through Playback Volume", 5, 6, 1),
        AWACS_SWITCH("CD Capture Switch", 0, SHIFT_MUX_CD, 0),
 };
 
@@ -627,6 +630,10 @@ static struct snd_kcontrol_new snd_pmac_awacs_mixers_pmac7500[] __initdata = {
        AWACS_SWITCH("Line Capture Switch", 0, SHIFT_MUX_MIC, 0),
 };
 
+static struct snd_kcontrol_new snd_pmac_awacs_mixers_pmac5500[] __initdata = {
+       AWACS_VOLUME("Headphone Playback Volume", 2, 6, 1),
+};
+
 static struct snd_kcontrol_new snd_pmac_awacs_mixers_pmac[] __initdata = {
        AWACS_VOLUME("Master Playback Volume", 2, 6, 1),
        AWACS_SWITCH("CD Capture Switch", 0, SHIFT_MUX_CD, 0),
@@ -645,12 +652,19 @@ static struct snd_kcontrol_new snd_pmac_screamer_mixers2[] __initdata = {
        AWACS_SWITCH("Mic Capture Switch", 0, SHIFT_MUX_LINE, 0),
 };
 
+static struct snd_kcontrol_new snd_pmac_awacs_mixers2_pmac5500[] __initdata = {
+       AWACS_SWITCH("CD Capture Switch", 0, SHIFT_MUX_CD, 0),
+};
+
 static struct snd_kcontrol_new snd_pmac_awacs_master_sw __initdata =
 AWACS_SWITCH("Master Playback Switch", 1, SHIFT_HDMUTE, 1);
 
 static struct snd_kcontrol_new snd_pmac_awacs_master_sw_imac __initdata =
 AWACS_SWITCH("Line out Playback Switch", 1, SHIFT_HDMUTE, 1);
 
+static struct snd_kcontrol_new snd_pmac_awacs_master_sw_pmac5500 __initdata =
+AWACS_SWITCH("Headphone Playback Switch", 1, SHIFT_HDMUTE, 1);
+
 static struct snd_kcontrol_new snd_pmac_awacs_mic_boost[] __initdata = {
        AWACS_SWITCH("Mic Boost Capture Switch", 0, SHIFT_GAINLINE, 0),
 };
@@ -766,12 +780,16 @@ static void snd_pmac_awacs_resume(struct snd_pmac *chip)
 }
 #endif /* CONFIG_PM */
 
-#define IS_PM7500 (machine_is_compatible("AAPL,7500"))
+#define IS_PM7500 (machine_is_compatible("AAPL,7500") \
+               || machine_is_compatible("AAPL,8500") \
+               || machine_is_compatible("AAPL,9500"))
+#define IS_PM5500 (machine_is_compatible("AAPL,e411"))
 #define IS_BEIGE (machine_is_compatible("AAPL,Gossamer"))
 #define IS_IMAC1 (machine_is_compatible("PowerMac2,1"))
 #define IS_IMAC2 (machine_is_compatible("PowerMac2,2") \
                || machine_is_compatible("PowerMac4,1"))
 #define IS_G4AGP (machine_is_compatible("PowerMac3,1"))
+#define IS_LOMBARD (machine_is_compatible("PowerBook1,1"))
 
 static int imac1, imac2;
 
@@ -858,10 +876,14 @@ int __init
 snd_pmac_awacs_init(struct snd_pmac *chip)
 {
        int pm7500 = IS_PM7500;
+       int pm5500 = IS_PM5500;
        int beige = IS_BEIGE;
        int g4agp = IS_G4AGP;
+       int lombard = IS_LOMBARD;
        int imac;
        int err, vol;
+       struct snd_kcontrol *vmaster_sw, *vmaster_vol;
+       struct snd_kcontrol *master_vol, *speaker_vol;
 
        imac1 = IS_IMAC1;
        imac2 = IS_IMAC2;
@@ -915,7 +937,7 @@ snd_pmac_awacs_init(struct snd_pmac *chip)
                /* set headphone-jack detection bit */
                switch (chip->model) {
                case PMAC_AWACS:
-                       chip->hp_stat_mask = pm7500 ? MASK_HDPCONN
+                       chip->hp_stat_mask = pm7500 || pm5500 ? MASK_HDPCONN
                                : MASK_LOCONN;
                        break;
                case PMAC_SCREAMER:
@@ -954,7 +976,7 @@ snd_pmac_awacs_init(struct snd_pmac *chip)
                return err;
        if (beige || g4agp)
                ;
-       else if (chip->model == PMAC_SCREAMER)
+       else if (chip->model == PMAC_SCREAMER || pm5500)
                err = build_mixers(chip, ARRAY_SIZE(snd_pmac_screamer_mixers2),
                                   snd_pmac_screamer_mixers2);
        else if (!pm7500)
@@ -962,19 +984,35 @@ snd_pmac_awacs_init(struct snd_pmac *chip)
                                   snd_pmac_awacs_mixers2);
        if (err < 0)
                return err;
+       if (pm5500) {
+               err = build_mixers(chip,
+                                  ARRAY_SIZE(snd_pmac_awacs_mixers2_pmac5500),
+                                  snd_pmac_awacs_mixers2_pmac5500);
+               if (err < 0)
+                       return err;
+       }
        if (pm7500)
                err = build_mixers(chip,
                                   ARRAY_SIZE(snd_pmac_awacs_mixers_pmac7500),
                                   snd_pmac_awacs_mixers_pmac7500);
+       else if (pm5500)
+               err = snd_ctl_add(chip->card,
+                   (master_vol = snd_ctl_new1(snd_pmac_awacs_mixers_pmac5500,
+                                               chip)));
        else if (beige)
                err = build_mixers(chip,
                                   ARRAY_SIZE(snd_pmac_screamer_mixers_beige),
                                   snd_pmac_screamer_mixers_beige);
-       else if (imac)
+       else if (imac || lombard) {
+               err = snd_ctl_add(chip->card,
+                   (master_vol = snd_ctl_new1(snd_pmac_screamer_mixers_lo,
+                                               chip)));
+               if (err < 0)
+                       return err;
                err = build_mixers(chip,
                                   ARRAY_SIZE(snd_pmac_screamer_mixers_imac),
                                   snd_pmac_screamer_mixers_imac);
-       else if (g4agp)
+       else if (g4agp)
                err = build_mixers(chip,
                                   ARRAY_SIZE(snd_pmac_screamer_mixers_g4agp),
                                   snd_pmac_screamer_mixers_g4agp);
@@ -984,8 +1022,10 @@ snd_pmac_awacs_init(struct snd_pmac *chip)
                                   snd_pmac_awacs_mixers_pmac);
        if (err < 0)
                return err;
-       chip->master_sw_ctl = snd_ctl_new1((pm7500 || imac || g4agp)
+       chip->master_sw_ctl = snd_ctl_new1((pm7500 || imac || g4agp || lombard)
                        ? &snd_pmac_awacs_master_sw_imac
+                       : pm5500
+                       ? &snd_pmac_awacs_master_sw_pmac5500
                        : &snd_pmac_awacs_master_sw, chip);
        err = snd_ctl_add(chip->card, chip->master_sw_ctl);
        if (err < 0)
@@ -1017,8 +1057,9 @@ snd_pmac_awacs_init(struct snd_pmac *chip)
 #endif /* PMAC_AMP_AVAIL */
        {
                /* route A = headphone, route C = speaker */
-               err = build_mixers(chip, ARRAY_SIZE(snd_pmac_awacs_speaker_vol),
-                                       snd_pmac_awacs_speaker_vol);
+               err = snd_ctl_add(chip->card,
+                   (speaker_vol = snd_ctl_new1(snd_pmac_awacs_speaker_vol,
+                                               chip)));
                if (err < 0)
                        return err;
                chip->speaker_sw_ctl = snd_ctl_new1(imac1
@@ -1031,6 +1072,33 @@ snd_pmac_awacs_init(struct snd_pmac *chip)
                        return err;
        }
 
+       if (pm5500 || imac || lombard) {
+               vmaster_sw = snd_ctl_make_virtual_master(
+                       "Master Playback Switch", (unsigned int *) NULL);
+               err = snd_ctl_add_slave_uncached(vmaster_sw,
+                                                chip->master_sw_ctl);
+               if (err < 0)
+                       return err;
+               err = snd_ctl_add_slave_uncached(vmaster_sw,
+                                                 chip->speaker_sw_ctl);
+               if (err < 0)
+                       return err;
+               err = snd_ctl_add(chip->card, vmaster_sw);
+               if (err < 0)
+                       return err;
+               vmaster_vol = snd_ctl_make_virtual_master(
+                       "Master Playback Volume", (unsigned int *) NULL);
+               err = snd_ctl_add_slave(vmaster_vol, master_vol);
+               if (err < 0)
+                       return err;
+               err = snd_ctl_add_slave(vmaster_vol, speaker_vol);
+               if (err < 0)
+                       return err;
+               err = snd_ctl_add(chip->card, vmaster_vol);
+               if (err < 0)
+                       return err;
+       }
+
        if (beige || g4agp)
                err = build_mixers(chip,
                                ARRAY_SIZE(snd_pmac_screamer_mic_boost_beige),