Beispiel #1
0
static int ca0110_parse_auto_config(struct hda_codec *codec)
{
	struct ca0110_spec *spec = codec->spec;
	int err;

	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL);
	if (err < 0)
		return err;

	parse_line_outs(codec);
	parse_hp_out(codec);
	parse_digital(codec);
	parse_input(codec);
	return 0;
}
Beispiel #2
0
static int vt1708_parse_auto_config(struct hda_codec *codec)
{
	struct via_spec *spec = codec->spec;
	int err;

	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL);
	if (err < 0)
		return err;
	err = vt1708_auto_fill_dac_nids(spec, &spec->autocfg);
	if (err < 0)
		return err;
	if (!spec->autocfg.line_outs && !spec->autocfg.hp_pins[0])
		return 0; /* can't find valid BIOS pin config */

	err = vt1708_auto_create_multi_out_ctls(spec, &spec->autocfg);
	if (err < 0)
		return err;
	err = vt1708_auto_create_hp_ctls(spec, spec->autocfg.hp_pins[0]);
	if (err < 0)
		return err;
	err = vt1708_auto_create_analog_input_ctls(spec, &spec->autocfg);
	if (err < 0)
		return err;

	spec->multiout.max_channels = spec->multiout.num_dacs * 2;

	if (spec->autocfg.dig_out_pin)
		spec->multiout.dig_out_nid = VT1708_DIGOUT_NID;
	if (spec->autocfg.dig_in_pin)
		spec->dig_in_nid = VT1708_DIGIN_NID;

	if (spec->kctl_alloc)
		spec->mixers[spec->num_mixers++] = spec->kctl_alloc;

	spec->init_verbs = vt1708_volume_init_verbs;	

	spec->input_mux = &spec->private_imux;

	return 1;
}
Beispiel #3
0
static int patch_cmi9880(struct hda_codec *codec)
{
    struct cmi_spec *spec;

    spec = kzalloc(sizeof(*spec), GFP_KERNEL);
    if (spec == NULL)
        return -ENOMEM;

    codec->spec = spec;
    spec->board_config = snd_hda_check_board_config(codec, CMI_MODELS,
                            cmi9880_models,
                            cmi9880_cfg_tbl);
    if (spec->board_config < 0) {
        snd_printdd(KERN_INFO "hda_codec: Unknown model for CMI9880\n");
        spec->board_config = CMI_AUTO; /* try everything */
    }

    /* copy default DAC NIDs */
    memcpy(spec->dac_nids, cmi9880_dac_nids, sizeof(spec->dac_nids));
    spec->num_dacs = 4;

    switch (spec->board_config) {
    case CMI_MINIMAL:
    case CMI_MIN_FP:
        spec->channel_modes = cmi9880_channel_modes;
        if (spec->board_config == CMI_MINIMAL)
            spec->num_channel_modes = 2;
        else {
            spec->front_panel = 1;
            spec->num_channel_modes = 3;
        }
        spec->multiout.max_channels = cmi9880_channel_modes[0].channels;
        spec->input_mux = &cmi9880_basic_mux;
        break;
    case CMI_FULL:
    case CMI_FULL_DIG:
        spec->front_panel = 1;
        spec->multiout.max_channels = 8;
        spec->input_mux = &cmi9880_basic_mux;
        if (spec->board_config == CMI_FULL_DIG) {
            spec->multiout.dig_out_nid = CMI_DIG_OUT_NID;
            spec->dig_in_nid = CMI_DIG_IN_NID;
        }
        break;
    case CMI_ALLOUT:
        spec->front_panel = 1;
        spec->multiout.max_channels = 8;
        spec->no_line_in = 1;
        spec->input_mux = &cmi9880_no_line_mux;
        spec->multiout.dig_out_nid = CMI_DIG_OUT_NID;
        break;
    case CMI_AUTO:
        {
        unsigned int port_e, port_f, port_g, port_h;
        unsigned int port_spdifi, port_spdifo;
        struct auto_pin_cfg cfg;

        /* collect pin default configuration */
        port_e = snd_hda_codec_read(codec, 0x0f, 0, AC_VERB_GET_CONFIG_DEFAULT, 0);
        port_f = snd_hda_codec_read(codec, 0x10, 0, AC_VERB_GET_CONFIG_DEFAULT, 0);
        spec->front_panel = 1;
        if (get_defcfg_connect(port_e) == AC_JACK_PORT_NONE ||
            get_defcfg_connect(port_f) == AC_JACK_PORT_NONE) {
            port_g = snd_hda_codec_read(codec, 0x1f, 0, AC_VERB_GET_CONFIG_DEFAULT, 0);
            port_h = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_CONFIG_DEFAULT, 0);
            spec->channel_modes = cmi9880_channel_modes;
            /* no front panel */
            if (get_defcfg_connect(port_g) == AC_JACK_PORT_NONE ||
                get_defcfg_connect(port_h) == AC_JACK_PORT_NONE) {
                /* no optional rear panel */
                spec->board_config = CMI_MINIMAL;
                spec->front_panel = 0;
                spec->num_channel_modes = 2;
            } else {
                spec->board_config = CMI_MIN_FP;
                spec->num_channel_modes = 3;
            }
            spec->input_mux = &cmi9880_basic_mux;
            spec->multiout.max_channels = cmi9880_channel_modes[0].channels;
        } else {
            spec->input_mux = &cmi9880_basic_mux;
            port_spdifi = snd_hda_codec_read(codec, 0x13, 0, AC_VERB_GET_CONFIG_DEFAULT, 0);
            port_spdifo = snd_hda_codec_read(codec, 0x12, 0, AC_VERB_GET_CONFIG_DEFAULT, 0);
            if (get_defcfg_connect(port_spdifo) != AC_JACK_PORT_NONE)
                spec->multiout.dig_out_nid = CMI_DIG_OUT_NID;
            if (get_defcfg_connect(port_spdifi) != AC_JACK_PORT_NONE)
                spec->dig_in_nid = CMI_DIG_IN_NID;
            spec->multiout.max_channels = 8;
        }
        snd_hda_parse_pin_def_config(codec, &cfg, NULL);
        if (cfg.line_outs) {
            spec->multiout.max_channels = cfg.line_outs * 2;
            cmi9880_fill_multi_dac_nids(codec, &cfg);
            cmi9880_fill_multi_init(codec, &cfg);
        } else
            snd_printd("patch_cmedia: cannot detect association in defcfg\n");
        break;
        }
    }

    spec->multiout.num_dacs = spec->num_dacs;
    spec->multiout.dac_nids = spec->dac_nids;

    spec->adc_nids = cmi9880_adc_nids;

    codec->patch_ops = cmi9880_patch_ops;

    return 0;
}