All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Ujfalusi <peter.ujfalusi-l0cyMroinI0@public.gmane.org>
To: Jyri Sarha <jsarha-l0cyMroinI0@public.gmane.org>,
	linux-omap-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	alsa-devel-K7yf7f+aM1XWsZ/bQMPhNw@public.gmane.org,
	devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Cc: broonie-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org,
	liam.r.girdwood-VuQAYsv1563Yd54FQh9/CA@public.gmane.org,
	benoit.thebaudeau.dev-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org,
	wlear-uoOHlzqel7feqrA4Bvp/NA@public.gmane.org
Subject: Re: [PATCH] ASoC: tlv320aic3x: Add support for tlv320aic3104
Date: Mon, 2 Feb 2015 09:52:58 +0200	[thread overview]
Message-ID: <54CF2CDA.3060607@ti.com> (raw)
In-Reply-To: <1422633743-11758-1-git-send-email-jsarha-l0cyMroinI0@public.gmane.org>

On 01/30/2015 06:02 PM, Jyri Sarha wrote:
> Disables GPIO support and LINE2 input and renames Mic3 input to Mic2,
> if tlv320aic3104 mode is seleced. Devicetree binding document is
> updated accordingly.
> 
> Signed-off-by: Jyri Sarha <jsarha-l0cyMroinI0@public.gmane.org>
> ---
>  .../devicetree/bindings/sound/tlv320aic3x.txt      |   10 +-
>  sound/soc/codecs/tlv320aic3x.c                     |  344 ++++++++++++++------
>  2 files changed, 252 insertions(+), 102 deletions(-)
> 
> diff --git a/Documentation/devicetree/bindings/sound/tlv320aic3x.txt b/Documentation/devicetree/bindings/sound/tlv320aic3x.txt
> index 5e6040c..47a213c 100644
> --- a/Documentation/devicetree/bindings/sound/tlv320aic3x.txt
> +++ b/Documentation/devicetree/bindings/sound/tlv320aic3x.txt
> @@ -9,6 +9,7 @@ Required properties:
>      "ti,tlv320aic33" - TLV320AIC33
>      "ti,tlv320aic3007" - TLV320AIC3007
>      "ti,tlv320aic3106" - TLV320AIC3106
> +    "ti,tlv320aic3104" - TLV320AIC3104

I think you should update the driver's tlv320aic3x_of_match[] table to include
the ti,tlv320aic3104 as well?

other than that it looks good.

-- 
Péter

>  
>  
>  - reg - <int> -  I2C slave address
> @@ -18,6 +19,7 @@ Optional properties:
>  
>  - gpio-reset - gpio pin number used for codec reset
>  - ai3x-gpio-func - <array of 2 int> - AIC3X_GPIO1 & AIC3X_GPIO2 Functionality
> +				    - Not supported on tlv320aic3104
>  - ai3x-micbias-vg - MicBias Voltage required.
>  	1 - MICBIAS output is powered to 2.0V,
>  	2 - MICBIAS output is powered to 2.5V,
> @@ -36,7 +38,13 @@ CODEC output pins:
>    * HPLCOM
>    * HPRCOM
>  
> -CODEC input pins:
> +CODEC input pins for TLV320AIC3104:
> +  * MIC2L
> +  * MIC2R
> +  * LINE1L
> +  * LINE1R
> +
> +CODEC input pins for other compatible codecs:
>    * MIC3L
>    * MIC3R
>    * LINE1L
> diff --git a/sound/soc/codecs/tlv320aic3x.c b/sound/soc/codecs/tlv320aic3x.c
> index b7ebce0..49ba3c7 100644
> --- a/sound/soc/codecs/tlv320aic3x.c
> +++ b/sound/soc/codecs/tlv320aic3x.c
> @@ -87,6 +87,7 @@ struct aic3x_priv {
>  #define AIC3X_MODEL_3X 0
>  #define AIC3X_MODEL_33 1
>  #define AIC3X_MODEL_3007 2
> +#define AIC3X_MODEL_3104 3
>  	u16 model;
>  
>  	/* Selects the micbias voltage */
> @@ -316,52 +317,37 @@ static const struct snd_kcontrol_new aic3x_snd_controls[] = {
>  	 * only for swapped L-to-R and R-to-L routes. See below stereo controls
>  	 * for direct L-to-L and R-to-R routes.
>  	 */
> -	SOC_SINGLE_TLV("Left Line Mixer Line2R Bypass Volume",
> -		       LINE2R_2_LLOPM_VOL, 0, 118, 1, output_stage_tlv),
>  	SOC_SINGLE_TLV("Left Line Mixer PGAR Bypass Volume",
>  		       PGAR_2_LLOPM_VOL, 0, 118, 1, output_stage_tlv),
>  	SOC_SINGLE_TLV("Left Line Mixer DACR1 Playback Volume",
>  		       DACR1_2_LLOPM_VOL, 0, 118, 1, output_stage_tlv),
>  
> -	SOC_SINGLE_TLV("Right Line Mixer Line2L Bypass Volume",
> -		       LINE2L_2_RLOPM_VOL, 0, 118, 1, output_stage_tlv),
>  	SOC_SINGLE_TLV("Right Line Mixer PGAL Bypass Volume",
>  		       PGAL_2_RLOPM_VOL, 0, 118, 1, output_stage_tlv),
>  	SOC_SINGLE_TLV("Right Line Mixer DACL1 Playback Volume",
>  		       DACL1_2_RLOPM_VOL, 0, 118, 1, output_stage_tlv),
>  
> -	SOC_SINGLE_TLV("Left HP Mixer Line2R Bypass Volume",
> -		       LINE2R_2_HPLOUT_VOL, 0, 118, 1, output_stage_tlv),
>  	SOC_SINGLE_TLV("Left HP Mixer PGAR Bypass Volume",
>  		       PGAR_2_HPLOUT_VOL, 0, 118, 1, output_stage_tlv),
>  	SOC_SINGLE_TLV("Left HP Mixer DACR1 Playback Volume",
>  		       DACR1_2_HPLOUT_VOL, 0, 118, 1, output_stage_tlv),
>  
> -	SOC_SINGLE_TLV("Right HP Mixer Line2L Bypass Volume",
> -		       LINE2L_2_HPROUT_VOL, 0, 118, 1, output_stage_tlv),
>  	SOC_SINGLE_TLV("Right HP Mixer PGAL Bypass Volume",
>  		       PGAL_2_HPROUT_VOL, 0, 118, 1, output_stage_tlv),
>  	SOC_SINGLE_TLV("Right HP Mixer DACL1 Playback Volume",
>  		       DACL1_2_HPROUT_VOL, 0, 118, 1, output_stage_tlv),
>  
> -	SOC_SINGLE_TLV("Left HPCOM Mixer Line2R Bypass Volume",
> -		       LINE2R_2_HPLCOM_VOL, 0, 118, 1, output_stage_tlv),
>  	SOC_SINGLE_TLV("Left HPCOM Mixer PGAR Bypass Volume",
>  		       PGAR_2_HPLCOM_VOL, 0, 118, 1, output_stage_tlv),
>  	SOC_SINGLE_TLV("Left HPCOM Mixer DACR1 Playback Volume",
>  		       DACR1_2_HPLCOM_VOL, 0, 118, 1, output_stage_tlv),
>  
> -	SOC_SINGLE_TLV("Right HPCOM Mixer Line2L Bypass Volume",
> -		       LINE2L_2_HPRCOM_VOL, 0, 118, 1, output_stage_tlv),
>  	SOC_SINGLE_TLV("Right HPCOM Mixer PGAL Bypass Volume",
>  		       PGAL_2_HPRCOM_VOL, 0, 118, 1, output_stage_tlv),
>  	SOC_SINGLE_TLV("Right HPCOM Mixer DACL1 Playback Volume",
>  		       DACL1_2_HPRCOM_VOL, 0, 118, 1, output_stage_tlv),
>  
>  	/* Stereo output controls for direct L-to-L and R-to-R routes */
> -	SOC_DOUBLE_R_TLV("Line Line2 Bypass Volume",
> -			 LINE2L_2_LLOPM_VOL, LINE2R_2_RLOPM_VOL,
> -			 0, 118, 1, output_stage_tlv),
>  	SOC_DOUBLE_R_TLV("Line PGA Bypass Volume",
>  			 PGAL_2_LLOPM_VOL, PGAR_2_RLOPM_VOL,
>  			 0, 118, 1, output_stage_tlv),
> @@ -369,9 +355,6 @@ static const struct snd_kcontrol_new aic3x_snd_controls[] = {
>  			 DACL1_2_LLOPM_VOL, DACR1_2_RLOPM_VOL,
>  			 0, 118, 1, output_stage_tlv),
>  
> -	SOC_DOUBLE_R_TLV("HP Line2 Bypass Volume",
> -			 LINE2L_2_HPLOUT_VOL, LINE2R_2_HPROUT_VOL,
> -			 0, 118, 1, output_stage_tlv),
>  	SOC_DOUBLE_R_TLV("HP PGA Bypass Volume",
>  			 PGAL_2_HPLOUT_VOL, PGAR_2_HPROUT_VOL,
>  			 0, 118, 1, output_stage_tlv),
> @@ -379,9 +362,6 @@ static const struct snd_kcontrol_new aic3x_snd_controls[] = {
>  			 DACL1_2_HPLOUT_VOL, DACR1_2_HPROUT_VOL,
>  			 0, 118, 1, output_stage_tlv),
>  
> -	SOC_DOUBLE_R_TLV("HPCOM Line2 Bypass Volume",
> -			 LINE2L_2_HPLCOM_VOL, LINE2R_2_HPRCOM_VOL,
> -			 0, 118, 1, output_stage_tlv),
>  	SOC_DOUBLE_R_TLV("HPCOM PGA Bypass Volume",
>  			 PGAL_2_HPLCOM_VOL, PGAR_2_HPRCOM_VOL,
>  			 0, 118, 1, output_stage_tlv),
> @@ -424,6 +404,45 @@ static const struct snd_kcontrol_new aic3x_snd_controls[] = {
>  	SOC_ENUM("Output Driver Ramp-up step", aic3x_rampup_step_enum),
>  };
>  
> +/* For other than tlv320aic3104 */
> +static const struct snd_kcontrol_new aic3x_extra_snd_controls[] = {
> +	/*
> +	 * Output controls that map to output mixer switches. Note these are
> +	 * only for swapped L-to-R and R-to-L routes. See below stereo controls
> +	 * for direct L-to-L and R-to-R routes.
> +	 */
> +	SOC_SINGLE_TLV("Left Line Mixer Line2R Bypass Volume",
> +		       LINE2R_2_LLOPM_VOL, 0, 118, 1, output_stage_tlv),
> +
> +	SOC_SINGLE_TLV("Right Line Mixer Line2L Bypass Volume",
> +		       LINE2L_2_RLOPM_VOL, 0, 118, 1, output_stage_tlv),
> +
> +	SOC_SINGLE_TLV("Left HP Mixer Line2R Bypass Volume",
> +		       LINE2R_2_HPLOUT_VOL, 0, 118, 1, output_stage_tlv),
> +
> +	SOC_SINGLE_TLV("Right HP Mixer Line2L Bypass Volume",
> +		       LINE2L_2_HPROUT_VOL, 0, 118, 1, output_stage_tlv),
> +
> +	SOC_SINGLE_TLV("Left HPCOM Mixer Line2R Bypass Volume",
> +		       LINE2R_2_HPLCOM_VOL, 0, 118, 1, output_stage_tlv),
> +
> +	SOC_SINGLE_TLV("Right HPCOM Mixer Line2L Bypass Volume",
> +		       LINE2L_2_HPRCOM_VOL, 0, 118, 1, output_stage_tlv),
> +
> +	/* Stereo output controls for direct L-to-L and R-to-R routes */
> +	SOC_DOUBLE_R_TLV("Line Line2 Bypass Volume",
> +			 LINE2L_2_LLOPM_VOL, LINE2R_2_RLOPM_VOL,
> +			 0, 118, 1, output_stage_tlv),
> +
> +	SOC_DOUBLE_R_TLV("HP Line2 Bypass Volume",
> +			 LINE2L_2_HPLOUT_VOL, LINE2R_2_HPROUT_VOL,
> +			 0, 118, 1, output_stage_tlv),
> +
> +	SOC_DOUBLE_R_TLV("HPCOM Line2 Bypass Volume",
> +			 LINE2L_2_HPLCOM_VOL, LINE2R_2_HPRCOM_VOL,
> +			 0, 118, 1, output_stage_tlv),
> +};
> +
>  static const struct snd_kcontrol_new aic3x_mono_controls[] = {
>  	SOC_DOUBLE_R_TLV("Mono Line2 Bypass Volume",
>  			 LINE2L_2_MONOLOPM_VOL, LINE2R_2_MONOLOPM_VOL,
> @@ -464,22 +483,24 @@ SOC_DAPM_ENUM("Route", aic3x_right_hpcom_enum);
>  
>  /* Left Line Mixer */
>  static const struct snd_kcontrol_new aic3x_left_line_mixer_controls[] = {
> -	SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_LLOPM_VOL, 7, 1, 0),
>  	SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_LLOPM_VOL, 7, 1, 0),
>  	SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_LLOPM_VOL, 7, 1, 0),
> -	SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_LLOPM_VOL, 7, 1, 0),
>  	SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_LLOPM_VOL, 7, 1, 0),
>  	SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_LLOPM_VOL, 7, 1, 0),
> +	/* Not on tlv320aic3104 */
> +	SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_LLOPM_VOL, 7, 1, 0),
> +	SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_LLOPM_VOL, 7, 1, 0),
>  };
>  
>  /* Right Line Mixer */
>  static const struct snd_kcontrol_new aic3x_right_line_mixer_controls[] = {
> -	SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_RLOPM_VOL, 7, 1, 0),
>  	SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_RLOPM_VOL, 7, 1, 0),
>  	SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_RLOPM_VOL, 7, 1, 0),
> -	SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_RLOPM_VOL, 7, 1, 0),
>  	SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_RLOPM_VOL, 7, 1, 0),
>  	SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_RLOPM_VOL, 7, 1, 0),
> +	/* Not on tlv320aic3104 */
> +	SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_RLOPM_VOL, 7, 1, 0),
> +	SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_RLOPM_VOL, 7, 1, 0),
>  };
>  
>  /* Mono Mixer */
> @@ -494,42 +515,46 @@ static const struct snd_kcontrol_new aic3x_mono_mixer_controls[] = {
>  
>  /* Left HP Mixer */
>  static const struct snd_kcontrol_new aic3x_left_hp_mixer_controls[] = {
> -	SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_HPLOUT_VOL, 7, 1, 0),
>  	SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_HPLOUT_VOL, 7, 1, 0),
>  	SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_HPLOUT_VOL, 7, 1, 0),
> -	SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_HPLOUT_VOL, 7, 1, 0),
>  	SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_HPLOUT_VOL, 7, 1, 0),
>  	SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_HPLOUT_VOL, 7, 1, 0),
> +	/* Not on tlv320aic3104 */
> +	SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_HPLOUT_VOL, 7, 1, 0),
> +	SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_HPLOUT_VOL, 7, 1, 0),
>  };
>  
>  /* Right HP Mixer */
>  static const struct snd_kcontrol_new aic3x_right_hp_mixer_controls[] = {
> -	SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_HPROUT_VOL, 7, 1, 0),
>  	SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_HPROUT_VOL, 7, 1, 0),
>  	SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_HPROUT_VOL, 7, 1, 0),
> -	SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_HPROUT_VOL, 7, 1, 0),
>  	SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_HPROUT_VOL, 7, 1, 0),
>  	SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_HPROUT_VOL, 7, 1, 0),
> +	/* Not on tlv320aic3104 */
> +	SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_HPROUT_VOL, 7, 1, 0),
> +	SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_HPROUT_VOL, 7, 1, 0),
>  };
>  
>  /* Left HPCOM Mixer */
>  static const struct snd_kcontrol_new aic3x_left_hpcom_mixer_controls[] = {
> -	SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_HPLCOM_VOL, 7, 1, 0),
>  	SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_HPLCOM_VOL, 7, 1, 0),
>  	SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_HPLCOM_VOL, 7, 1, 0),
> -	SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_HPLCOM_VOL, 7, 1, 0),
>  	SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_HPLCOM_VOL, 7, 1, 0),
>  	SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_HPLCOM_VOL, 7, 1, 0),
> +	/* Not on tlv320aic3104 */
> +	SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_HPLCOM_VOL, 7, 1, 0),
> +	SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_HPLCOM_VOL, 7, 1, 0),
>  };
>  
>  /* Right HPCOM Mixer */
>  static const struct snd_kcontrol_new aic3x_right_hpcom_mixer_controls[] = {
> -	SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_HPRCOM_VOL, 7, 1, 0),
>  	SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_HPRCOM_VOL, 7, 1, 0),
>  	SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_HPRCOM_VOL, 7, 1, 0),
> -	SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_HPRCOM_VOL, 7, 1, 0),
>  	SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_HPRCOM_VOL, 7, 1, 0),
>  	SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_HPRCOM_VOL, 7, 1, 0),
> +	/* Not on tlv320aic3104 */
> +	SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_HPRCOM_VOL, 7, 1, 0),
> +	SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_HPRCOM_VOL, 7, 1, 0),
>  };
>  
>  /* Left PGA Mixer */
> @@ -550,6 +575,22 @@ static const struct snd_kcontrol_new aic3x_right_pga_mixer_controls[] = {
>  	SOC_DAPM_SINGLE_AIC3X("Mic3R Switch", MIC3LR_2_RADC_CTRL, 0, 1, 1),
>  };
>  
> +/* Left PGA Mixer for tlv320aic3104 */
> +static const struct snd_kcontrol_new aic3104_left_pga_mixer_controls[] = {
> +	SOC_DAPM_SINGLE_AIC3X("Line1L Switch", LINE1L_2_LADC_CTRL, 3, 1, 1),
> +	SOC_DAPM_SINGLE_AIC3X("Line1R Switch", LINE1R_2_LADC_CTRL, 3, 1, 1),
> +	SOC_DAPM_SINGLE_AIC3X("Mic2L Switch", MIC3LR_2_LADC_CTRL, 4, 1, 1),
> +	SOC_DAPM_SINGLE_AIC3X("Mic2R Switch", MIC3LR_2_LADC_CTRL, 0, 1, 1),
> +};
> +
> +/* Right PGA Mixer for tlv320aic3104 */
> +static const struct snd_kcontrol_new aic3104_right_pga_mixer_controls[] = {
> +	SOC_DAPM_SINGLE_AIC3X("Line1R Switch", LINE1R_2_RADC_CTRL, 3, 1, 1),
> +	SOC_DAPM_SINGLE_AIC3X("Line1L Switch", LINE1L_2_RADC_CTRL, 3, 1, 1),
> +	SOC_DAPM_SINGLE_AIC3X("Mic2L Switch", MIC3LR_2_RADC_CTRL, 4, 1, 1),
> +	SOC_DAPM_SINGLE_AIC3X("Mic2R Switch", MIC3LR_2_RADC_CTRL, 0, 1, 1),
> +};
> +
>  /* Left Line1 Mux */
>  static const struct snd_kcontrol_new aic3x_left_line1l_mux_controls =
>  SOC_DAPM_ENUM("Route", aic3x_line1l_2_l_enum);
> @@ -593,26 +634,56 @@ static const struct snd_soc_dapm_widget aic3x_dapm_widgets[] = {
>  
>  	/* Inputs to Left ADC */
>  	SND_SOC_DAPM_ADC("Left ADC", "Left Capture", LINE1L_2_LADC_CTRL, 2, 0),
> -	SND_SOC_DAPM_MIXER("Left PGA Mixer", SND_SOC_NOPM, 0, 0,
> -			   &aic3x_left_pga_mixer_controls[0],
> -			   ARRAY_SIZE(aic3x_left_pga_mixer_controls)),
>  	SND_SOC_DAPM_MUX("Left Line1L Mux", SND_SOC_NOPM, 0, 0,
>  			 &aic3x_left_line1l_mux_controls),
>  	SND_SOC_DAPM_MUX("Left Line1R Mux", SND_SOC_NOPM, 0, 0,
>  			 &aic3x_left_line1r_mux_controls),
> -	SND_SOC_DAPM_MUX("Left Line2L Mux", SND_SOC_NOPM, 0, 0,
> -			 &aic3x_left_line2_mux_controls),
>  
>  	/* Inputs to Right ADC */
>  	SND_SOC_DAPM_ADC("Right ADC", "Right Capture",
>  			 LINE1R_2_RADC_CTRL, 2, 0),
> -	SND_SOC_DAPM_MIXER("Right PGA Mixer", SND_SOC_NOPM, 0, 0,
> -			   &aic3x_right_pga_mixer_controls[0],
> -			   ARRAY_SIZE(aic3x_right_pga_mixer_controls)),
>  	SND_SOC_DAPM_MUX("Right Line1L Mux", SND_SOC_NOPM, 0, 0,
>  			 &aic3x_right_line1l_mux_controls),
>  	SND_SOC_DAPM_MUX("Right Line1R Mux", SND_SOC_NOPM, 0, 0,
>  			 &aic3x_right_line1r_mux_controls),
> +
> +	/* Mic Bias */
> +	SND_SOC_DAPM_SUPPLY("Mic Bias", MICBIAS_CTRL, 6, 0,
> +			 mic_bias_event,
> +			 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
> +
> +	SND_SOC_DAPM_OUTPUT("LLOUT"),
> +	SND_SOC_DAPM_OUTPUT("RLOUT"),
> +	SND_SOC_DAPM_OUTPUT("HPLOUT"),
> +	SND_SOC_DAPM_OUTPUT("HPROUT"),
> +	SND_SOC_DAPM_OUTPUT("HPLCOM"),
> +	SND_SOC_DAPM_OUTPUT("HPRCOM"),
> +
> +	SND_SOC_DAPM_INPUT("LINE1L"),
> +	SND_SOC_DAPM_INPUT("LINE1R"),
> +
> +	/*
> +	 * Virtual output pin to detection block inside codec. This can be
> +	 * used to keep codec bias on if gpio or detection features are needed.
> +	 * Force pin on or construct a path with an input jack and mic bias
> +	 * widgets.
> +	 */
> +	SND_SOC_DAPM_OUTPUT("Detection"),
> +};
> +
> +/* For other than tlv320aic3104 */
> +static const struct snd_soc_dapm_widget aic3x_extra_dapm_widgets[] = {
> +	/* Inputs to Left ADC */
> +	SND_SOC_DAPM_MIXER("Left PGA Mixer", SND_SOC_NOPM, 0, 0,
> +			   &aic3x_left_pga_mixer_controls[0],
> +			   ARRAY_SIZE(aic3x_left_pga_mixer_controls)),
> +	SND_SOC_DAPM_MUX("Left Line2L Mux", SND_SOC_NOPM, 0, 0,
> +			 &aic3x_left_line2_mux_controls),
> +
> +	/* Inputs to Right ADC */
> +	SND_SOC_DAPM_MIXER("Right PGA Mixer", SND_SOC_NOPM, 0, 0,
> +			   &aic3x_right_pga_mixer_controls[0],
> +			   ARRAY_SIZE(aic3x_right_pga_mixer_controls)),
>  	SND_SOC_DAPM_MUX("Right Line2R Mux", SND_SOC_NOPM, 0, 0,
>  			 &aic3x_right_line2_mux_controls),
>  
> @@ -637,11 +708,6 @@ static const struct snd_soc_dapm_widget aic3x_dapm_widgets[] = {
>  	SND_SOC_DAPM_REG(snd_soc_dapm_micbias, "DMic Rate 32",
>  			 AIC3X_ASD_INTF_CTRLA, 0, 3, 3, 0),
>  
> -	/* Mic Bias */
> -	SND_SOC_DAPM_SUPPLY("Mic Bias", MICBIAS_CTRL, 6, 0,
> -			 mic_bias_event,
> -			 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
> -
>  	/* Output mixers */
>  	SND_SOC_DAPM_MIXER("Left Line Mixer", SND_SOC_NOPM, 0, 0,
>  			   &aic3x_left_line_mixer_controls[0],
> @@ -662,27 +728,46 @@ static const struct snd_soc_dapm_widget aic3x_dapm_widgets[] = {
>  			   &aic3x_right_hpcom_mixer_controls[0],
>  			   ARRAY_SIZE(aic3x_right_hpcom_mixer_controls)),
>  
> -	SND_SOC_DAPM_OUTPUT("LLOUT"),
> -	SND_SOC_DAPM_OUTPUT("RLOUT"),
> -	SND_SOC_DAPM_OUTPUT("HPLOUT"),
> -	SND_SOC_DAPM_OUTPUT("HPROUT"),
> -	SND_SOC_DAPM_OUTPUT("HPLCOM"),
> -	SND_SOC_DAPM_OUTPUT("HPRCOM"),
> -
>  	SND_SOC_DAPM_INPUT("MIC3L"),
>  	SND_SOC_DAPM_INPUT("MIC3R"),
> -	SND_SOC_DAPM_INPUT("LINE1L"),
> -	SND_SOC_DAPM_INPUT("LINE1R"),
>  	SND_SOC_DAPM_INPUT("LINE2L"),
>  	SND_SOC_DAPM_INPUT("LINE2R"),
> +};
>  
> -	/*
> -	 * Virtual output pin to detection block inside codec. This can be
> -	 * used to keep codec bias on if gpio or detection features are needed.
> -	 * Force pin on or construct a path with an input jack and mic bias
> -	 * widgets.
> -	 */
> -	SND_SOC_DAPM_OUTPUT("Detection"),
> +/* For tlv320aic3104 */
> +static const struct snd_soc_dapm_widget aic3104_extra_dapm_widgets[] = {
> +	/* Inputs to Left ADC */
> +	SND_SOC_DAPM_MIXER("Left PGA Mixer", SND_SOC_NOPM, 0, 0,
> +			   &aic3104_left_pga_mixer_controls[0],
> +			   ARRAY_SIZE(aic3104_left_pga_mixer_controls)),
> +
> +	/* Inputs to Right ADC */
> +	SND_SOC_DAPM_MIXER("Right PGA Mixer", SND_SOC_NOPM, 0, 0,
> +			   &aic3104_right_pga_mixer_controls[0],
> +			   ARRAY_SIZE(aic3104_right_pga_mixer_controls)),
> +
> +	/* Output mixers */
> +	SND_SOC_DAPM_MIXER("Left Line Mixer", SND_SOC_NOPM, 0, 0,
> +			   &aic3x_left_line_mixer_controls[0],
> +			   ARRAY_SIZE(aic3x_left_line_mixer_controls) - 2),
> +	SND_SOC_DAPM_MIXER("Right Line Mixer", SND_SOC_NOPM, 0, 0,
> +			   &aic3x_right_line_mixer_controls[0],
> +			   ARRAY_SIZE(aic3x_right_line_mixer_controls) - 2),
> +	SND_SOC_DAPM_MIXER("Left HP Mixer", SND_SOC_NOPM, 0, 0,
> +			   &aic3x_left_hp_mixer_controls[0],
> +			   ARRAY_SIZE(aic3x_left_hp_mixer_controls) - 2),
> +	SND_SOC_DAPM_MIXER("Right HP Mixer", SND_SOC_NOPM, 0, 0,
> +			   &aic3x_right_hp_mixer_controls[0],
> +			   ARRAY_SIZE(aic3x_right_hp_mixer_controls) - 2),
> +	SND_SOC_DAPM_MIXER("Left HPCOM Mixer", SND_SOC_NOPM, 0, 0,
> +			   &aic3x_left_hpcom_mixer_controls[0],
> +			   ARRAY_SIZE(aic3x_left_hpcom_mixer_controls) - 2),
> +	SND_SOC_DAPM_MIXER("Right HPCOM Mixer", SND_SOC_NOPM, 0, 0,
> +			   &aic3x_right_hpcom_mixer_controls[0],
> +			   ARRAY_SIZE(aic3x_right_hpcom_mixer_controls) - 2),
> +
> +	SND_SOC_DAPM_INPUT("MIC2L"),
> +	SND_SOC_DAPM_INPUT("MIC2R"),
>  };
>  
>  static const struct snd_soc_dapm_widget aic3x_dapm_mono_widgets[] = {
> @@ -712,17 +797,10 @@ static const struct snd_soc_dapm_route intercon[] = {
>  	{"Left Line1R Mux", "single-ended", "LINE1R"},
>  	{"Left Line1R Mux", "differential", "LINE1R"},
>  
> -	{"Left Line2L Mux", "single-ended", "LINE2L"},
> -	{"Left Line2L Mux", "differential", "LINE2L"},
> -
>  	{"Left PGA Mixer", "Line1L Switch", "Left Line1L Mux"},
>  	{"Left PGA Mixer", "Line1R Switch", "Left Line1R Mux"},
> -	{"Left PGA Mixer", "Line2L Switch", "Left Line2L Mux"},
> -	{"Left PGA Mixer", "Mic3L Switch", "MIC3L"},
> -	{"Left PGA Mixer", "Mic3R Switch", "MIC3R"},
>  
>  	{"Left ADC", NULL, "Left PGA Mixer"},
> -	{"Left ADC", NULL, "GPIO1 dmic modclk"},
>  
>  	/* Right Input */
>  	{"Right Line1R Mux", "single-ended", "LINE1R"},
> @@ -730,25 +808,10 @@ static const struct snd_soc_dapm_route intercon[] = {
>  	{"Right Line1L Mux", "single-ended", "LINE1L"},
>  	{"Right Line1L Mux", "differential", "LINE1L"},
>  
> -	{"Right Line2R Mux", "single-ended", "LINE2R"},
> -	{"Right Line2R Mux", "differential", "LINE2R"},
> -
>  	{"Right PGA Mixer", "Line1L Switch", "Right Line1L Mux"},
>  	{"Right PGA Mixer", "Line1R Switch", "Right Line1R Mux"},
> -	{"Right PGA Mixer", "Line2R Switch", "Right Line2R Mux"},
> -	{"Right PGA Mixer", "Mic3L Switch", "MIC3L"},
> -	{"Right PGA Mixer", "Mic3R Switch", "MIC3R"},
>  
>  	{"Right ADC", NULL, "Right PGA Mixer"},
> -	{"Right ADC", NULL, "GPIO1 dmic modclk"},
> -
> -	/*
> -	 * Logical path between digital mic enable and GPIO1 modulator clock
> -	 * output function
> -	 */
> -	{"GPIO1 dmic modclk", NULL, "DMic Rate 128"},
> -	{"GPIO1 dmic modclk", NULL, "DMic Rate 64"},
> -	{"GPIO1 dmic modclk", NULL, "DMic Rate 32"},
>  
>  	/* Left DAC Output */
>  	{"Left DAC Mux", "DAC_L1", "Left DAC"},
> @@ -761,10 +824,8 @@ static const struct snd_soc_dapm_route intercon[] = {
>  	{"Right DAC Mux", "DAC_R3", "Right DAC"},
>  
>  	/* Left Line Output */
> -	{"Left Line Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
>  	{"Left Line Mixer", "PGAL Bypass Switch", "Left PGA Mixer"},
>  	{"Left Line Mixer", "DACL1 Switch", "Left DAC Mux"},
> -	{"Left Line Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
>  	{"Left Line Mixer", "PGAR Bypass Switch", "Right PGA Mixer"},
>  	{"Left Line Mixer", "DACR1 Switch", "Right DAC Mux"},
>  
> @@ -773,10 +834,8 @@ static const struct snd_soc_dapm_route intercon[] = {
>  	{"LLOUT", NULL, "Left Line Out"},
>  
>  	/* Right Line Output */
> -	{"Right Line Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
>  	{"Right Line Mixer", "PGAL Bypass Switch", "Left PGA Mixer"},
>  	{"Right Line Mixer", "DACL1 Switch", "Left DAC Mux"},
> -	{"Right Line Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
>  	{"Right Line Mixer", "PGAR Bypass Switch", "Right PGA Mixer"},
>  	{"Right Line Mixer", "DACR1 Switch", "Right DAC Mux"},
>  
> @@ -785,10 +844,8 @@ static const struct snd_soc_dapm_route intercon[] = {
>  	{"RLOUT", NULL, "Right Line Out"},
>  
>  	/* Left HP Output */
> -	{"Left HP Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
>  	{"Left HP Mixer", "PGAL Bypass Switch", "Left PGA Mixer"},
>  	{"Left HP Mixer", "DACL1 Switch", "Left DAC Mux"},
> -	{"Left HP Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
>  	{"Left HP Mixer", "PGAR Bypass Switch", "Right PGA Mixer"},
>  	{"Left HP Mixer", "DACR1 Switch", "Right DAC Mux"},
>  
> @@ -797,10 +854,8 @@ static const struct snd_soc_dapm_route intercon[] = {
>  	{"HPLOUT", NULL, "Left HP Out"},
>  
>  	/* Right HP Output */
> -	{"Right HP Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
>  	{"Right HP Mixer", "PGAL Bypass Switch", "Left PGA Mixer"},
>  	{"Right HP Mixer", "DACL1 Switch", "Left DAC Mux"},
> -	{"Right HP Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
>  	{"Right HP Mixer", "PGAR Bypass Switch", "Right PGA Mixer"},
>  	{"Right HP Mixer", "DACR1 Switch", "Right DAC Mux"},
>  
> @@ -809,10 +864,8 @@ static const struct snd_soc_dapm_route intercon[] = {
>  	{"HPROUT", NULL, "Right HP Out"},
>  
>  	/* Left HPCOM Output */
> -	{"Left HPCOM Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
>  	{"Left HPCOM Mixer", "PGAL Bypass Switch", "Left PGA Mixer"},
>  	{"Left HPCOM Mixer", "DACL1 Switch", "Left DAC Mux"},
> -	{"Left HPCOM Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
>  	{"Left HPCOM Mixer", "PGAR Bypass Switch", "Right PGA Mixer"},
>  	{"Left HPCOM Mixer", "DACR1 Switch", "Right DAC Mux"},
>  
> @@ -823,10 +876,8 @@ static const struct snd_soc_dapm_route intercon[] = {
>  	{"HPLCOM", NULL, "Left HP Com"},
>  
>  	/* Right HPCOM Output */
> -	{"Right HPCOM Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
>  	{"Right HPCOM Mixer", "PGAL Bypass Switch", "Left PGA Mixer"},
>  	{"Right HPCOM Mixer", "DACL1 Switch", "Left DAC Mux"},
> -	{"Right HPCOM Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
>  	{"Right HPCOM Mixer", "PGAR Bypass Switch", "Right PGA Mixer"},
>  	{"Right HPCOM Mixer", "DACR1 Switch", "Right DAC Mux"},
>  
> @@ -839,6 +890,72 @@ static const struct snd_soc_dapm_route intercon[] = {
>  	{"HPRCOM", NULL, "Right HP Com"},
>  };
>  
> +/* For other than tlv320aic3104 */
> +static const struct snd_soc_dapm_route intercon_extra[] = {
> +	/* Left Input */
> +	{"Left Line2L Mux", "single-ended", "LINE2L"},
> +	{"Left Line2L Mux", "differential", "LINE2L"},
> +
> +	{"Left PGA Mixer", "Line2L Switch", "Left Line2L Mux"},
> +	{"Left PGA Mixer", "Mic3L Switch", "MIC3L"},
> +	{"Left PGA Mixer", "Mic3R Switch", "MIC3R"},
> +
> +	{"Left ADC", NULL, "GPIO1 dmic modclk"},
> +
> +	/* Right Input */
> +	{"Right Line2R Mux", "single-ended", "LINE2R"},
> +	{"Right Line2R Mux", "differential", "LINE2R"},
> +
> +	{"Right PGA Mixer", "Line2R Switch", "Right Line2R Mux"},
> +	{"Right PGA Mixer", "Mic3L Switch", "MIC3L"},
> +	{"Right PGA Mixer", "Mic3R Switch", "MIC3R"},
> +
> +	{"Right ADC", NULL, "GPIO1 dmic modclk"},
> +
> +	/*
> +	 * Logical path between digital mic enable and GPIO1 modulator clock
> +	 * output function
> +	 */
> +	{"GPIO1 dmic modclk", NULL, "DMic Rate 128"},
> +	{"GPIO1 dmic modclk", NULL, "DMic Rate 64"},
> +	{"GPIO1 dmic modclk", NULL, "DMic Rate 32"},
> +
> +	/* Left Line Output */
> +	{"Left Line Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
> +	{"Left Line Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
> +
> +	/* Right Line Output */
> +	{"Right Line Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
> +	{"Right Line Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
> +
> +	/* Left HP Output */
> +	{"Left HP Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
> +	{"Left HP Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
> +
> +	/* Right HP Output */
> +	{"Right HP Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
> +	{"Right HP Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
> +
> +	/* Left HPCOM Output */
> +	{"Left HPCOM Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
> +	{"Left HPCOM Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
> +
> +	/* Right HPCOM Output */
> +	{"Right HPCOM Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
> +	{"Right HPCOM Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
> +};
> +
> +/* For other than tlv320aic3104 */
> +static const struct snd_soc_dapm_route intercon_extra_3104[] = {
> +	/* Left Input */
> +	{"Left PGA Mixer", "Mic2L Switch", "MIC2L"},
> +	{"Left PGA Mixer", "Mic2R Switch", "MIC2R"},
> +
> +	/* Right Input */
> +	{"Right PGA Mixer", "Mic2L Switch", "MIC2L"},
> +	{"Right PGA Mixer", "Mic2R Switch", "MIC2R"},
> +};
> +
>  static const struct snd_soc_dapm_route intercon_mono[] = {
>  	/* Mono Output */
>  	{"Mono Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
> @@ -867,17 +984,31 @@ static int aic3x_add_widgets(struct snd_soc_codec *codec)
>  	switch (aic3x->model) {
>  	case AIC3X_MODEL_3X:
>  	case AIC3X_MODEL_33:
> +		snd_soc_dapm_new_controls(dapm, aic3x_extra_dapm_widgets,
> +					  ARRAY_SIZE(aic3x_extra_dapm_widgets));
> +		snd_soc_dapm_add_routes(dapm, intercon_extra,
> +					ARRAY_SIZE(intercon_extra));
>  		snd_soc_dapm_new_controls(dapm, aic3x_dapm_mono_widgets,
>  			ARRAY_SIZE(aic3x_dapm_mono_widgets));
>  		snd_soc_dapm_add_routes(dapm, intercon_mono,
>  					ARRAY_SIZE(intercon_mono));
>  		break;
>  	case AIC3X_MODEL_3007:
> +		snd_soc_dapm_new_controls(dapm, aic3x_extra_dapm_widgets,
> +					  ARRAY_SIZE(aic3x_extra_dapm_widgets));
> +		snd_soc_dapm_add_routes(dapm, intercon_extra,
> +					ARRAY_SIZE(intercon_extra));
>  		snd_soc_dapm_new_controls(dapm, aic3007_dapm_widgets,
>  			ARRAY_SIZE(aic3007_dapm_widgets));
>  		snd_soc_dapm_add_routes(dapm, intercon_3007,
>  					ARRAY_SIZE(intercon_3007));
>  		break;
> +	case AIC3X_MODEL_3104:
> +		snd_soc_dapm_new_controls(dapm, aic3104_extra_dapm_widgets,
> +				ARRAY_SIZE(aic3104_extra_dapm_widgets));
> +		snd_soc_dapm_add_routes(dapm, intercon_extra_3104,
> +				ARRAY_SIZE(intercon_extra_3104));
> +		break;
>  	}
>  
>  	return 0;
> @@ -1438,23 +1569,33 @@ static int aic3x_probe(struct snd_soc_codec *codec)
>  	aic3x_init(codec);
>  
>  	if (aic3x->setup) {
> -		/* setup GPIO functions */
> -		snd_soc_write(codec, AIC3X_GPIO1_REG,
> -			      (aic3x->setup->gpio_func[0] & 0xf) << 4);
> -		snd_soc_write(codec, AIC3X_GPIO2_REG,
> -			      (aic3x->setup->gpio_func[1] & 0xf) << 4);
> +		if (aic3x->model != AIC3X_MODEL_3104) {
> +			/* setup GPIO functions */
> +			snd_soc_write(codec, AIC3X_GPIO1_REG,
> +				      (aic3x->setup->gpio_func[0] & 0xf) << 4);
> +			snd_soc_write(codec, AIC3X_GPIO2_REG,
> +				      (aic3x->setup->gpio_func[1] & 0xf) << 4);
> +		} else {
> +			dev_warn(codec->dev, "GPIO functionality is not supported on tlv320aic3104\n");
> +		}
>  	}
>  
>  	switch (aic3x->model) {
>  	case AIC3X_MODEL_3X:
>  	case AIC3X_MODEL_33:
> +		snd_soc_add_codec_controls(codec, aic3x_extra_snd_controls,
> +				ARRAY_SIZE(aic3x_extra_snd_controls));
>  		snd_soc_add_codec_controls(codec, aic3x_mono_controls,
>  				ARRAY_SIZE(aic3x_mono_controls));
>  		break;
>  	case AIC3X_MODEL_3007:
> +		snd_soc_add_codec_controls(codec, aic3x_extra_snd_controls,
> +				ARRAY_SIZE(aic3x_extra_snd_controls));
>  		snd_soc_add_codec_controls(codec,
>  				&aic3x_classd_amp_gain_ctrl, 1);
>  		break;
> +	case AIC3X_MODEL_3104:
> +		break;
>  	}
>  
>  	/* set mic bias voltage */
> @@ -1522,6 +1663,7 @@ static const struct i2c_device_id aic3x_i2c_id[] = {
>  	{ "tlv320aic33", AIC3X_MODEL_33 },
>  	{ "tlv320aic3007", AIC3X_MODEL_3007 },
>  	{ "tlv320aic3106", AIC3X_MODEL_3X },
> +	{ "tlv320aic3104", AIC3X_MODEL_3104 },
>  	{ }
>  };
>  MODULE_DEVICE_TABLE(i2c, aic3x_i2c_id);
> 

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

  parent reply	other threads:[~2015-02-02  7:52 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-30 16:02 [PATCH] ASoC: tlv320aic3x: Add support for tlv320aic3104 Jyri Sarha
     [not found] ` <1422633743-11758-1-git-send-email-jsarha-l0cyMroinI0@public.gmane.org>
2015-02-02  7:52   ` Peter Ujfalusi [this message]
2015-02-02 14:48     ` [PATCH v2] " Jyri Sarha
2015-02-03 12:16       ` Mark Brown
     [not found]       ` <1422888485-13626-1-git-send-email-jsarha-l0cyMroinI0@public.gmane.org>
2015-02-03 22:25         ` Benoît Thébaudeau
2015-02-04  8:27           ` Peter Ujfalusi
     [not found]             ` <54D1D80F.1090304-l0cyMroinI0@public.gmane.org>
2015-02-04  9:33               ` Benoît Thébaudeau
     [not found]                 ` <CA+sos797a7CT2KqCwrW5CaL1vF0GVCHQGxp3gDAB7PTFi4jZjQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-02-04 10:02                   ` Peter Ujfalusi
     [not found]                     ` <54D1EE24.3000309-l0cyMroinI0@public.gmane.org>
2015-02-04 11:11                       ` Benoît Thébaudeau
2015-02-04 12:35                         ` Peter Ujfalusi
2015-02-04 13:30                           ` Benoît Thébaudeau

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=54CF2CDA.3060607@ti.com \
    --to=peter.ujfalusi-l0cymroini0@public.gmane.org \
    --cc=alsa-devel-K7yf7f+aM1XWsZ/bQMPhNw@public.gmane.org \
    --cc=benoit.thebaudeau.dev-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
    --cc=broonie-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
    --cc=devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=jsarha-l0cyMroinI0@public.gmane.org \
    --cc=liam.r.girdwood-VuQAYsv1563Yd54FQh9/CA@public.gmane.org \
    --cc=linux-omap-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=wlear-uoOHlzqel7feqrA4Bvp/NA@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.