Add output selection quirk table information for SoundBlaster AE-7, and
slightly modify the AE-5's ca0113 command table to accommodate the AE-7.

Signed-off-by: Connor McAdams <conmanx...@gmail.com>
---
 sound/pci/hda/patch_ca0132.c | 88 ++++++++++++++++++++++++++++--------
 1 file changed, 68 insertions(+), 20 deletions(-)

diff --git a/sound/pci/hda/patch_ca0132.c b/sound/pci/hda/patch_ca0132.c
index 040233b33074..ad594c2d47ec 100644
--- a/sound/pci/hda/patch_ca0132.c
+++ b/sound/pci/hda/patch_ca0132.c
@@ -727,22 +727,29 @@ static const struct ct_dsp_volume_ctl 
ca0132_alt_vol_ctls[] = {
 };
 
 /* Values for ca0113_mmio_command_set for selecting output. */
-#define AE5_CA0113_OUT_SET_COMMANDS 6
-struct ae5_ca0113_output_set {
-       unsigned int group[AE5_CA0113_OUT_SET_COMMANDS];
-       unsigned int target[AE5_CA0113_OUT_SET_COMMANDS];
-       unsigned int vals[AE5_CA0113_OUT_SET_COMMANDS];
+#define AE_CA0113_OUT_SET_COMMANDS 6
+struct ae_ca0113_output_set {
+       unsigned int group[AE_CA0113_OUT_SET_COMMANDS];
+       unsigned int target[AE_CA0113_OUT_SET_COMMANDS];
+       unsigned int vals[NUM_OF_OUTPUTS][AE_CA0113_OUT_SET_COMMANDS];
 };
 
-static const struct ae5_ca0113_output_set ae5_ca0113_output_presets[] = {
-       { .group =  { 0x30, 0x30, 0x48, 0x48, 0x48, 0x30 },
-         .target = { 0x2e, 0x30, 0x0d, 0x17, 0x19, 0x32 },
-         .vals =   { 0x00, 0x00, 0x40, 0x00, 0x00, 0x3f }
-       },
-       { .group =  { 0x30, 0x30, 0x48, 0x48, 0x48, 0x30 },
-         .target = { 0x2e, 0x30, 0x0d, 0x17, 0x19, 0x32 },
-         .vals =   { 0x3f, 0x3f, 0x00, 0x00, 0x00, 0x00 }
-       }
+static const struct ae_ca0113_output_set ae5_ca0113_output_presets = {
+       .group =  { 0x30, 0x30, 0x48, 0x48, 0x48, 0x30 },
+       .target = { 0x2e, 0x30, 0x0d, 0x17, 0x19, 0x32 },
+                   /* Speakers. */
+       .vals =   { { 0x00, 0x00, 0x40, 0x00, 0x00, 0x3f },
+                   /* Headphones. */
+                   { 0x3f, 0x3f, 0x00, 0x00, 0x00, 0x00 } },
+};
+
+static const struct ae_ca0113_output_set ae7_ca0113_output_presets = {
+       .group  = { 0x30, 0x30, 0x48, 0x48, 0x48, 0x30 },
+       .target = { 0x2e, 0x30, 0x0d, 0x17, 0x19, 0x32 },
+                   /* Speakers. */
+       .vals   = { { 0x00, 0x00, 0x40, 0x00, 0x00, 0x3f },
+                   /* Headphones. */
+                   { 0x3f, 0x3f, 0x00, 0x00, 0x02, 0x00 } },
 };
 
 /* ae5 ca0113 command sequences to set headphone gain levels. */
@@ -1427,6 +1434,41 @@ static const struct ca0132_alt_out_set_quirk_data 
quirk_out_set_data[] = {
                  .chipio_write_addr = 0x0018b03c,
                  .chipio_write_data = 0x00000012
                } },
+       },
+       { .quirk_id = QUIRK_AE7,
+         .has_headphone_gain = true,
+         .is_ae_series       = true,
+         .out_set_info = {
+               /* Speakers. */
+               { .dac2port          = 0x58,
+                 .has_hda_gpio      = false,
+                 .mmio_gpio_count   = 1,
+                 .mmio_gpio_pin     = { 0 },
+                 .mmio_gpio_set     = { 1 },
+                 .scp_cmds_count    = 2,
+                 .scp_cmd_mid       = { 0x96, 0x96 },
+                 .scp_cmd_req       = { SPEAKER_TUNING_FRONT_LEFT_INVERT,
+                                        SPEAKER_TUNING_FRONT_RIGHT_INVERT },
+                 .scp_cmd_val       = { FLOAT_ZERO, FLOAT_ZERO },
+                 .has_chipio_write  = true,
+                 .chipio_write_addr = 0x0018b03c,
+                 .chipio_write_data = 0x00000000
+               },
+               /* Headphones. */
+               { .dac2port          = 0x58,
+                 .has_hda_gpio      = false,
+                 .mmio_gpio_count   = 1,
+                 .mmio_gpio_pin     = { 0 },
+                 .mmio_gpio_set     = { 1 },
+                 .scp_cmds_count    = 2,
+                 .scp_cmd_mid       = { 0x96, 0x96 },
+                 .scp_cmd_req       = { SPEAKER_TUNING_FRONT_LEFT_INVERT,
+                                        SPEAKER_TUNING_FRONT_RIGHT_INVERT },
+                 .scp_cmd_val       = { FLOAT_ONE, FLOAT_ONE },
+                 .has_chipio_write  = true,
+                 .chipio_write_addr = 0x0018b03c,
+                 .chipio_write_data = 0x00000010
+               } },
        }
 };
 
@@ -4383,18 +4425,24 @@ static int ca0132_effects_set(struct hda_codec *codec, 
hda_nid_t nid, long val);
 static void ae5_mmio_select_out(struct hda_codec *codec)
 {
        struct ca0132_spec *spec = codec->spec;
+       const struct ae_ca0113_output_set *out_cmds;
        unsigned int i;
 
-       for (i = 0; i < AE5_CA0113_OUT_SET_COMMANDS; i++)
-               ca0113_mmio_command_set(codec,
-                       ae5_ca0113_output_presets[spec->cur_out_type].group[i],
-                       ae5_ca0113_output_presets[spec->cur_out_type].target[i],
-                       ae5_ca0113_output_presets[spec->cur_out_type].vals[i]);
+       if (ca0132_quirk(spec) == QUIRK_AE5)
+               out_cmds = &ae5_ca0113_output_presets;
+       else
+               out_cmds = &ae7_ca0113_output_presets;
+
+       for (i = 0; i < AE_CA0113_OUT_SET_COMMANDS; i++)
+               ca0113_mmio_command_set(codec, out_cmds->group[i],
+                               out_cmds->target[i],
+                               out_cmds->vals[spec->cur_out_type][i]);
 }
 
 static int ca0132_alt_set_full_range_speaker(struct hda_codec *codec)
 {
        struct ca0132_spec *spec = codec->spec;
+       int quirk = ca0132_quirk(spec);
        unsigned int tmp;
        int err;
 
@@ -4426,7 +4474,7 @@ static int ca0132_alt_set_full_range_speaker(struct 
hda_codec *codec)
         * Only the AE series cards set this value when setting full-range,
         * and it's always 1.0f.
         */
-       if (ca0132_quirk(spec) == QUIRK_AE5) {
+       if (quirk == QUIRK_AE5 || quirk == QUIRK_AE7) {
                err = dspio_set_uint_param(codec, 0x96,
                                SPEAKER_FULL_RANGE_SURROUND_L_R, FLOAT_ONE);
                if (err < 0)
-- 
2.20.1

Reply via email to