]> rtime.felk.cvut.cz Git - linux-imx.git/commitdiff
ALSA: hda - Allow codec drivers to give own badness tables
authorTakashi Iwai <tiwai@suse.de>
Fri, 22 Mar 2013 13:53:50 +0000 (14:53 +0100)
committerTakashi Iwai <tiwai@suse.de>
Fri, 22 Mar 2013 13:53:50 +0000 (14:53 +0100)
The standard badness values don't seem to fit to all preferences.
Some configuration prefer the side output over the headphone, some
want the speaker over the surround, etc.

This patch moves the badness table pointers into hda_gen_spec, so that
the codec driver can override them.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/hda_generic.c
sound/pci/hda/hda_generic.h

index 98c8627b2afbdf2efc598f74358b2a7fcdac4d58..326302fcab44b81d3fce9ab7d49b2e4e08ce9608 100644 (file)
@@ -1062,16 +1062,7 @@ static int assign_out_path_ctls(struct hda_codec *codec, struct nid_path *path)
        return badness;
 }
 
-struct badness_table {
-       int no_primary_dac;     /* no primary DAC */
-       int no_dac;             /* no secondary DACs */
-       int shared_primary;     /* primary DAC is shared with main output */
-       int shared_surr;        /* secondary DAC shared with main or primary */
-       int shared_clfe;        /* third DAC shared with main or primary */
-       int shared_surr_main;   /* secondary DAC sahred with main/DAC0 */
-};
-
-static struct badness_table main_out_badness = {
+const struct badness_table hda_main_out_badness = {
        .no_primary_dac = BAD_NO_PRIMARY_DAC,
        .no_dac = BAD_NO_DAC,
        .shared_primary = BAD_NO_PRIMARY_DAC,
@@ -1079,8 +1070,9 @@ static struct badness_table main_out_badness = {
        .shared_clfe = BAD_SHARED_CLFE,
        .shared_surr_main = BAD_SHARED_SURROUND,
 };
+EXPORT_SYMBOL_HDA(hda_main_out_badness);
 
-static struct badness_table extra_out_badness = {
+const struct badness_table hda_extra_out_badness = {
        .no_primary_dac = BAD_NO_DAC,
        .no_dac = BAD_NO_DAC,
        .shared_primary = BAD_NO_EXTRA_DAC,
@@ -1088,6 +1080,7 @@ static struct badness_table extra_out_badness = {
        .shared_clfe = BAD_SHARED_EXTRA_SURROUND,
        .shared_surr_main = BAD_NO_EXTRA_SURR_DAC,
 };
+EXPORT_SYMBOL_HDA(hda_extra_out_badness);
 
 /* get the DAC of the primary output corresponding to the given array index */
 static hda_nid_t get_primary_out(struct hda_codec *codec, int idx)
@@ -1518,7 +1511,7 @@ static int fill_and_eval_dacs(struct hda_codec *codec,
 
        badness += try_assign_dacs(codec, cfg->line_outs, cfg->line_out_pins,
                                   spec->private_dac_nids, spec->out_paths,
-                                  &main_out_badness);
+                                  spec->main_out_badness);
 
        if (fill_mio_first &&
            cfg->line_outs == 1 && cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
@@ -1533,7 +1526,7 @@ static int fill_and_eval_dacs(struct hda_codec *codec,
                err = try_assign_dacs(codec, cfg->hp_outs, cfg->hp_pins,
                                      spec->multiout.hp_out_nid,
                                      spec->hp_paths,
-                                     &extra_out_badness);
+                                     spec->extra_out_badness);
                if (err < 0)
                        return err;
                badness += err;
@@ -1543,7 +1536,7 @@ static int fill_and_eval_dacs(struct hda_codec *codec,
                                      cfg->speaker_pins,
                                      spec->multiout.extra_out_nid,
                                      spec->speaker_paths,
-                                     &extra_out_badness);
+                                     spec->extra_out_badness);
                if (err < 0)
                        return err;
                badness += err;
@@ -4180,6 +4173,11 @@ int snd_hda_gen_parse_auto_config(struct hda_codec *codec,
                cfg = &spec->autocfg;
        }
 
+       if (!spec->main_out_badness)
+               spec->main_out_badness = &hda_main_out_badness;
+       if (!spec->extra_out_badness)
+               spec->extra_out_badness = &hda_extra_out_badness;
+
        fill_all_dac_nids(codec);
 
        if (!cfg->line_outs) {
index 39d83943f25db812a89a54ad109d0ea678370d4a..54e66516037980c6ecb36be0b30ca4488151d3a3 100644 (file)
@@ -76,6 +76,19 @@ enum {
        HDA_GEN_PCM_ACT_CLOSE,
 };
 
+/* DAC assignment badness table */
+struct badness_table {
+       int no_primary_dac;     /* no primary DAC */
+       int no_dac;             /* no secondary DACs */
+       int shared_primary;     /* primary DAC is shared with main output */
+       int shared_surr;        /* secondary DAC shared with main or primary */
+       int shared_clfe;        /* third DAC shared with main or primary */
+       int shared_surr_main;   /* secondary DAC sahred with main/DAC0 */
+};
+
+extern const struct badness_table hda_main_out_badness;
+extern const struct badness_table hda_extra_out_badness;
+
 struct hda_gen_spec {
        char stream_name_analog[32];    /* analog PCM stream */
        const struct hda_pcm_stream *stream_analog_playback;
@@ -223,6 +236,10 @@ struct hda_gen_spec {
        unsigned int have_aamix_ctl:1;
        unsigned int hp_mic_jack_modes:1;
 
+       /* badness tables for output path evaluations */
+       const struct badness_table *main_out_badness;
+       const struct badness_table *extra_out_badness;
+
        /* loopback mixing mode */
        bool aamix_mode;