At Thu, 28 Oct 2010 12:26:12 -0700, Todd Broch wrote: > > Hi Takashi, > > Thanks for the quick response. > > The system (mario) I'm working with has an external amplifier (EA) to drive > the > d-class speakers. The EA has 4 discrete gains determined by resistor > strappings. The chosen strapping coupled with maximum gain out of the > codec overdrives the speakers creating distortion. Changing the strappings > to a > lower gain would remove distortion but not allow maximum power to speakers. > > > The patch, most notably alc272_mario_inithook, decreases the codec's > internal > amplifier maximum by 5dB via the snd_hda_override_amp_caps function. This > remedies distortion while still providing maximum power. OK, so it's essentially only for overriding amp? In other words, if we can put only the amp-override somewhere for this device, the driver works as is? I'm asking this because you define init_verbs and mixer arrays. I understand that these are necessary for presets. But, if only the amp override is required, we may define another mechanism like fixup initverb or pin quirks. thanks, Takashi > > Todd > > > On Wed, Oct 27, 2010 at 11:04 PM, Takashi Iwai <tiwai@xxxxxxx> wrote: > > > At Wed, 27 Oct 2010 13:18:41 -0700, > > Todd Broch wrote: > > > > > > Add preset configuration for mario to override amp capabilities > > > > > > Signed-off-by: Todd Broch <tbroch@xxxxxxxxxxxx> > > > > Thanks for the patch. > > But could you give more background, e.g. why this change is necessary, > > and what exactly it fixes? > > > > > > Takashi > > > > > --- > > > sound/pci/hda/patch_realtek.c | 52 > > +++++++++++++++++++++++++++++++++++++++++ > > > 1 files changed, 52 insertions(+), 0 deletions(-) > > > > > > diff --git a/sound/pci/hda/patch_realtek.c > > b/sound/pci/hda/patch_realtek.c > > > index 79bf4c8..7c77950 100644 > > > --- a/sound/pci/hda/patch_realtek.c > > > +++ b/sound/pci/hda/patch_realtek.c > > > @@ -196,6 +196,7 @@ enum { > > > ALC272_DELL, > > > ALC272_DELL_ZM1, > > > ALC272_SAMSUNG_NC10, > > > + ALC272_MARIO, > > > ALC662_AUTO, > > > ALC662_MODEL_LAST, > > > }; > > > @@ -17643,6 +17644,18 @@ static struct hda_verb alc663_mode8_init_verbs[] > > = { > > > {} > > > }; > > > > > > +static struct hda_verb alc272_mario_init_verbs[] = { > > > + {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, > > > + {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, > > > + {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, > > > + {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */ > > > + {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, > > > + {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)}, > > > + {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | > > ALC880_MIC_EVENT}, > > > + {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | > > ALC880_HP_EVENT}, > > > + {} > > > +}; > > > + > > > static struct snd_kcontrol_new alc662_auto_capture_mixer[] = { > > > HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT), > > > HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT), > > > @@ -18126,6 +18139,20 @@ static void alc663_g50v_unsol_event(struct > > hda_codec *codec, > > > } > > > } > > > > > > +static void alc272_mario_inithook(struct hda_codec *codec) > > > +{ > > > + alc663_21jd_two_speaker_automute(codec); > > > + alc_mic_automute(codec); > > > + if (snd_hda_override_amp_caps(codec, 0x2, HDA_OUTPUT, > > > + (0x3b << AC_AMPCAP_OFFSET_SHIFT) | > > > + (0x3b << AC_AMPCAP_NUM_STEPS_SHIFT) | > > > + (0x03 << AC_AMPCAP_STEP_SIZE_SHIFT) | > > > + (0 << AC_AMPCAP_MUTE_SHIFT))) { > > > + printk(KERN_WARNING > > > + "hda_codec: failed to override amp caps for NID > > 0x2\n"); > > > + } > > > +} > > > + > > > #define alc663_g50v_setup alc663_m51va_setup > > > > > > static void alc663_g50v_inithook(struct hda_codec *codec) > > > @@ -18165,6 +18192,18 @@ static struct snd_kcontrol_new > > alc272_nc10_mixer[] = { > > > { } /* end */ > > > }; > > > > > > +static struct snd_kcontrol_new alc272_mario_mixer[] = { > > > + HDA_CODEC_VOLUME("Speaker Playback Volume", 0x2, 0x0, HDA_OUTPUT), > > > + HDA_CODEC_MUTE("Speaker Playback Switch", 0xc, 0x0, HDA_OUTPUT), > > > + HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, > > HDA_OUTPUT), > > > + HDA_CODEC_MUTE("Headphone Playback Switch", 0xd, 0x0, HDA_OUTPUT), > > > + > > > + HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), > > > + HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), > > > + HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), > > > + { } /* end */ > > > +}; > > > + > > > #ifdef CONFIG_SND_HDA_POWER_SAVE > > > #define alc662_loopbacks alc880_loopbacks > > > #endif > > > @@ -18203,6 +18242,7 @@ static const char > > *alc662_models[ALC662_MODEL_LAST] = { > > > [ALC272_DELL] = "dell", > > > [ALC272_DELL_ZM1] = "dell-zm1", > > > [ALC272_SAMSUNG_NC10] = "samsung-nc10", > > > + [ALC272_MARIO] = "mario", > > > [ALC662_AUTO] = "auto", > > > }; > > > > > > @@ -18590,6 +18630,18 @@ static struct alc_config_preset alc662_presets[] > > = { > > > .setup = alc663_mode4_setup, > > > .init_hook = alc663_mode4_inithook, > > > }, > > > + [ALC272_MARIO] = { > > > + .mixers = { alc272_mario_mixer }, > > > + .init_verbs = { alc662_init_verbs, > > > + alc272_mario_init_verbs}, > > > + .num_dacs = ARRAY_SIZE(alc272_dac_nids), > > > + .dac_nids = alc272_dac_nids, > > > + .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), > > > + .channel_mode = alc662_3ST_2ch_modes, > > > + .unsol_event = alc663_mode4_unsol_event, > > > + .setup = alc663_mode4_setup, > > > + .init_hook = alc272_mario_inithook, > > > + }, > > > }; > > > > > > > > > -- > > > 1.7.1 > > > > > _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel