[alsa-devel] [PATCH] hda: 92hd73xx fixes
Takashi Iwai
tiwai at suse.de
Sat Sep 13 16:55:29 CEST 2008
At Fri, 12 Sep 2008 13:29:52 -0400,
Matthew Ranostay wrote:
>
> Added support for defining the number of amps and the creation
> of the private_dimux dynamically for the 92hd73xx codec family.
>
> Signed-off-by: Matthew Ranostay <mranostay at embeddedalley.com>
I got a conflict with this patch.
Could you re-create based on the latest sound-2.6 git tree?
thanks,
Takashi
> ---
>
> diff --git a/pci/hda/patch_sigmatel.c b/pci/hda/patch_sigmatel.c
> index f41ba17..fff27cc 100644
> --- a/pci/hda/patch_sigmatel.c
> +++ b/pci/hda/patch_sigmatel.c
> @@ -156,13 +156,11 @@ struct sigmatel_spec {
> unsigned int num_pwrs;
> unsigned int *pwr_mapping;
> hda_nid_t *pwr_nids;
> - hda_nid_t *amp_nids;
> hda_nid_t *dac_list;
>
> /* playback */
> struct hda_input_mux *mono_mux;
> struct hda_input_mux *amp_mux;
> - unsigned int cur_amux;
> unsigned int cur_mmux;
> struct hda_multi_out multiout;
> hda_nid_t dac_nids[5];
> @@ -201,6 +199,9 @@ struct sigmatel_spec {
> unsigned int cur_mux[3];
> struct hda_input_mux *sinput_mux;
> unsigned int cur_smux[2];
> + unsigned int cur_amux;
> + hda_nid_t *amp_nids;
> + unsigned int num_amps;
> unsigned int powerdown_adcs;
>
> /* i/o switches */
> @@ -247,8 +248,9 @@ static hda_nid_t stac92hd73xx_adc_nids[2] = {
> 0x1a, 0x1b
> };
>
> -static hda_nid_t stac92hd73xx_amp_nids[4] = {
> - 0x0b, 0x0c, 0x0e, 0
> +#define DELL_M6_AMP 2
> +static hda_nid_t stac92hd73xx_amp_nids[3] = {
> + 0x0b, 0x0c, 0x0e
> };
>
> #define STAC92HD73XX_NUM_DMICS 2
> @@ -963,29 +965,33 @@ static struct snd_kcontrol_new stac9200_mixer[] = {
> { } /* end */
> };
>
> +#define DELL_M6_MIXER 6
> static struct snd_kcontrol_new stac92hd73xx_6ch_mixer[] = {
> - STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 3),
> -
> - HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x20, 0x0, HDA_OUTPUT),
> - HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x20, 0x0, HDA_OUTPUT),
> -
> - HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x21, 0x0, HDA_OUTPUT),
> - HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x21, 0x0, HDA_OUTPUT),
> -
> + /* start of config #1 */
> HDA_CODEC_VOLUME("Front Mic Mixer Capture Volume", 0x1d, 0, HDA_INPUT),
> HDA_CODEC_MUTE("Front Mic Mixer Capture Switch", 0x1d, 0, HDA_INPUT),
>
> - HDA_CODEC_VOLUME("Mic Mixer Capture Volume", 0x1d, 0x1, HDA_INPUT),
> - HDA_CODEC_MUTE("Mic Mixer Capture Switch", 0x1d, 0x1, HDA_INPUT),
> -
> HDA_CODEC_VOLUME("Line In Mixer Capture Volume", 0x1d, 0x2, HDA_INPUT),
> HDA_CODEC_MUTE("Line In Mixer Capture Switch", 0x1d, 0x2, HDA_INPUT),
>
> + HDA_CODEC_VOLUME("CD Mixer Capture Volume", 0x1d, 0x4, HDA_INPUT),
> + HDA_CODEC_MUTE("CD Mixer Capture Switch", 0x1d, 0x4, HDA_INPUT),
> +
> + /* start of config #2 */
> + HDA_CODEC_VOLUME("Mic Mixer Capture Volume", 0x1d, 0x1, HDA_INPUT),
> + HDA_CODEC_MUTE("Mic Mixer Capture Switch", 0x1d, 0x1, HDA_INPUT),
> +
> HDA_CODEC_VOLUME("DAC Mixer Capture Volume", 0x1d, 0x3, HDA_INPUT),
> HDA_CODEC_MUTE("DAC Mixer Capture Switch", 0x1d, 0x3, HDA_INPUT),
>
> - HDA_CODEC_VOLUME("CD Mixer Capture Volume", 0x1d, 0x4, HDA_INPUT),
> - HDA_CODEC_MUTE("CD Mixer Capture Switch", 0x1d, 0x4, HDA_INPUT),
> + STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 3),
> +
> + HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x20, 0x0, HDA_OUTPUT),
> + HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x20, 0x0, HDA_OUTPUT),
> +
> + HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x21, 0x0, HDA_OUTPUT),
> + HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x21, 0x0, HDA_OUTPUT),
> +
> { } /* end */
> };
>
> @@ -2956,17 +2962,19 @@ static int stac92xx_auto_create_amp_input_ctls(struct hda_codec *codec)
> struct hda_input_mux *amp_mux = &spec->private_amp_mux;
> int i, err;
>
> - for (i = 0; i < ARRAY_SIZE(stac92xx_amp_labels); i++) {
> + for (i = 0; i < spec->num_amps; i++) {
> amp_mux->items[amp_mux->num_items].label =
> stac92xx_amp_labels[i];
> amp_mux->items[amp_mux->num_items].index = i;
> amp_mux->num_items++;
> }
>
> - err = stac92xx_add_control(spec, STAC_CTL_WIDGET_AMP_MUX,
> - "Amp Selector Capture Switch", 0);
> - if (err < 0)
> - return err;
> + if (spec->num_amps > 1) {
> + err = stac92xx_add_control(spec, STAC_CTL_WIDGET_AMP_MUX,
> + "Amp Selector Capture Switch", 0);
> + if (err < 0)
> + return err;
> + }
> return stac92xx_add_control(spec, STAC_CTL_WIDGET_AMP_VOL,
> "Amp Capture Volume",
> HDA_COMPOSE_AMP_VAL(spec->amp_nids[0], 3, 0, HDA_INPUT));
> @@ -3342,12 +3350,12 @@ static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out
> if (err < 0)
> return err;
> }
> - if (spec->amp_nids) {
> + if (spec->num_amps) {
> err = stac92xx_auto_create_amp_input_ctls(codec);
> if (err < 0)
> return err;
> }
> - if (spec->num_dmics > 0)
> + if (spec->num_dmics > 0 && !spec->dinput_mux)
> if ((err = stac92xx_auto_create_dmic_input_ctls(codec,
> &spec->autocfg)) < 0)
> return err;
> @@ -3375,8 +3383,7 @@ static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out
> spec->mixers[spec->num_mixers++] = spec->kctl_alloc;
>
> spec->input_mux = &spec->private_imux;
> - if (!spec->dinput_mux)
> - spec->dinput_mux = &spec->private_dimux;
> + spec->dinput_mux = &spec->private_dimux;
> spec->sinput_mux = &spec->private_smux;
> spec->mono_mux = &spec->private_mono_mux;
> spec->amp_mux = &spec->private_amp_mux;
> @@ -3975,9 +3982,9 @@ static struct hda_input_mux stac92hd73xx_dmux = {
> .num_items = 4,
> .items = {
> { "Analog Inputs", 0x0b },
> - { "CD", 0x08 },
> { "Digital Mic 1", 0x09 },
> { "Digital Mic 2", 0x0a },
> + { "CD", 0x08 },
> }
> };
>
> @@ -4048,12 +4055,14 @@ again:
> spec->dmux_nids = stac92hd73xx_dmux_nids;
> spec->smux_nids = stac92hd73xx_smux_nids;
> spec->amp_nids = stac92hd73xx_amp_nids;
> + spec->num_amps = ARRAY_SIZE(stac92hd73xx_amp_nids);
>
> spec->num_muxes = ARRAY_SIZE(stac92hd73xx_mux_nids);
> spec->num_adcs = ARRAY_SIZE(stac92hd73xx_adc_nids);
> spec->num_dmuxes = ARRAY_SIZE(stac92hd73xx_dmux_nids);
> - spec->num_smuxes = ARRAY_SIZE(stac92hd73xx_smux_nids);
> - spec->dinput_mux = &stac92hd73xx_dmux;
> + memcpy(&spec->private_dimux, &stac92hd73xx_dmux,
> + sizeof(stac92hd73xx_dmux));
> +
> /* GPIO0 High = Enable EAPD */
> spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0x1;
> spec->gpio_data = 0x01;
> @@ -4061,11 +4070,18 @@ again:
> switch (spec->board_config) {
> case STAC_DELL_M6:
> spec->init = dell_eq_core_init;
> + spec->num_smuxes = 0;
> + spec->multiout.hp_nid =
> + spec->multiout.dac_nids[spec->multiout.num_dacs - 1];
> + spec->mixer = &stac92hd73xx_6ch_mixer[DELL_M6_MIXER];
> + spec->amp_nids = &stac92hd73xx_amp_nids[DELL_M6_AMP];
> + spec->num_amps = 1;
> switch (codec->subsystem_id) {
> case 0x1028025e: /* Analog Mics */
> case 0x1028025f:
> stac92xx_set_config_reg(codec, 0x0b, 0x90A70170);
> spec->num_dmics = 0;
> + spec->private_dimux.num_items = 1;
> break;
> case 0x10280271: /* Digital Mics */
> case 0x10280272:
> @@ -4075,18 +4091,22 @@ again:
> case 0x10280255:
> stac92xx_set_config_reg(codec, 0x13, 0x90A60160);
> spec->num_dmics = 1;
> + spec->private_dimux.num_items = 2;
> break;
> case 0x10280256: /* Both */
> case 0x10280057:
> stac92xx_set_config_reg(codec, 0x0b, 0x90A70170);
> stac92xx_set_config_reg(codec, 0x13, 0x90A60160);
> spec->num_dmics = 1;
> + spec->private_dimux.num_items = 2;
> break;
> }
> break;
> default:
> spec->num_dmics = STAC92HD73XX_NUM_DMICS;
> + spec->num_smuxes = ARRAY_SIZE(stac92hd73xx_smux_nids);
> }
> + spec->dinput_mux = &spec->private_dimux;
>
> spec->num_pwrs = ARRAY_SIZE(stac92hd73xx_pwr_nids);
> spec->pwr_nids = stac92hd73xx_pwr_nids;
>
More information about the Alsa-devel
mailing list