[PATCH] ALSA: hda - Tweak OLPC XO-1.5 microphone bias

Takashi Iwai tiwai at suse.de
Tue Nov 10 02:41:35 EST 2009


At Mon,  9 Nov 2009 15:17:24 +0000 (GMT),
Daniel Drake wrote:
> 
> Our contacts at Conexant suggested that we reduce the external
> microphone bias to 50% in order to center the input signal with
> the DC input range of the codec. This is because the microphone
> port is DC coupled for potential use with sensors.
> 
> Signed-off-by: Daniel Drake <dsd at laptop.org>

Although I don't particularly like the dynamic struct array
initialization that this patch changes to, its change is pretty small
and this is what we'd need at this moment.  So I applied it as is
for 2.6.32.

Thanks!


Takashi

> 
> ---
>  sound/pci/hda/patch_conexant.c |   15 ++++++++++++---
>  1 files changed, 12 insertions(+), 3 deletions(-)
> 
> diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c
> index 5d3a25d..ace8898 100644
> --- a/sound/pci/hda/patch_conexant.c
> +++ b/sound/pci/hda/patch_conexant.c
> @@ -110,6 +110,7 @@ struct conexant_spec {
>  
>  	unsigned int dell_automute;
>  	unsigned int port_d_mode;
> +	unsigned char ext_mic_bias;
>  };
>  
>  static int conexant_playback_pcm_open(struct hda_pcm_stream *hinfo,
> @@ -1917,6 +1918,11 @@ static hda_nid_t cxt5066_adc_nids[3] = { 0x14, 0x15, 0x16 };
>  static hda_nid_t cxt5066_capsrc_nids[1] = { 0x17 };
>  #define CXT5066_SPDIF_OUT	0x21
>  
> +/* OLPC's microphone port is DC coupled for use with external sensors,
> + * therefore we use a 50% mic bias in order to center the input signal with
> + * the DC input range of the codec. */
> +#define CXT5066_OLPC_EXT_MIC_BIAS PIN_VREF50
> +
>  static struct hda_channel_mode cxt5066_modes[1] = {
>  	{ 2, NULL },
>  };
> @@ -1970,9 +1976,10 @@ static int cxt5066_hp_master_sw_put(struct snd_kcontrol *kcontrol,
>  /* toggle input of built-in and mic jack appropriately */
>  static void cxt5066_automic(struct hda_codec *codec)
>  {
> -	static struct hda_verb ext_mic_present[] = {
> +	struct conexant_spec *spec = codec->spec;
> +	struct hda_verb ext_mic_present[] = {
>  		/* enable external mic, port B */
> -		{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
> +		{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, spec->ext_mic_bias},
>  
>  		/* switch to external mic input */
>  		{0x17, AC_VERB_SET_CONNECT_SEL, 0},
> @@ -2225,7 +2232,7 @@ static struct hda_verb cxt5066_init_verbs_olpc[] = {
>  	{0x19, AC_VERB_SET_CONNECT_SEL, 0x00}, /* DAC1 */
>  
>  	/* Port B: external microphone */
> -	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
> +	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, CXT5066_OLPC_EXT_MIC_BIAS},
>  
>  	/* Port C: internal microphone */
>  	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
> @@ -2343,6 +2350,7 @@ static int patch_cxt5066(struct hda_codec *codec)
>  	spec->input_mux = &cxt5066_capture_source;
>  
>  	spec->port_d_mode = PIN_HP;
> +	spec->ext_mic_bias = PIN_VREF80;
>  
>  	spec->num_init_verbs = 1;
>  	spec->init_verbs[0] = cxt5066_init_verbs;
> @@ -2374,6 +2382,7 @@ static int patch_cxt5066(struct hda_codec *codec)
>  		spec->mixers[spec->num_mixers++] = cxt5066_mixer_master_olpc;
>  		spec->mixers[spec->num_mixers++] = cxt5066_mixers;
>  		spec->port_d_mode = 0;
> +		spec->ext_mic_bias = CXT5066_OLPC_EXT_MIC_BIAS;
>  
>  		/* no S/PDIF out */
>  		spec->multiout.dig_out_nid = 0;
> -- 
> 1.6.2.5
> 



More information about the Devel mailing list