From mboxrd@z Thu Jan 1 00:00:00 1970 From: Peter Ujfalusi Subject: Re: [PATCH] ASoC: tlv320aic3x: Add support for tlv320aic3104 Date: Mon, 2 Feb 2015 09:52:58 +0200 Message-ID: <54CF2CDA.3060607@ti.com> References: <1422633743-11758-1-git-send-email-jsarha@ti.com> Mime-Version: 1.0 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: QUOTED-PRINTABLE Return-path: In-Reply-To: <1422633743-11758-1-git-send-email-jsarha-l0cyMroinI0@public.gmane.org> Sender: devicetree-owner-u79uwXL29TY76Z2rM5mHXA@public.gmane.org To: Jyri Sarha , 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 List-Id: devicetree@vger.kernel.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. >=20 > Signed-off-by: Jyri Sarha > --- > .../devicetree/bindings/sound/tlv320aic3x.txt | 10 +- > sound/soc/codecs/tlv320aic3x.c | 344 ++++++++++= ++++------ > 2 files changed, 252 insertions(+), 102 deletions(-) >=20 > 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. --=20 P=E9ter > =20 > =20 > - reg - - I2C slave address > @@ -18,6 +19,7 @@ Optional properties: > =20 > - gpio-reset - gpio pin number used for codec reset > - ai3x-gpio-func - - AIC3X_GPIO1 & AIC3X_GPIO2 Func= tionality > + - 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 > =20 > -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/tlv320= aic3x.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; > =20 > /* Selects the micbias voltage */ > @@ -316,52 +317,37 @@ static const struct snd_kcontrol_new aic3x_snd_= controls[] =3D { > * only for swapped L-to-R and R-to-L routes. See below stereo cont= rols > * 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), > =20 > - 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), > =20 > - 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), > =20 > - 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), > =20 > - 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), > =20 > - 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), > =20 > /* 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_co= ntrols[] =3D { > DACL1_2_LLOPM_VOL, DACR1_2_RLOPM_VOL, > 0, 118, 1, output_stage_tlv), > =20 > - 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_co= ntrols[] =3D { > DACL1_2_HPLOUT_VOL, DACR1_2_HPROUT_VOL, > 0, 118, 1, output_stage_tlv), > =20 > - 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_c= ontrols[] =3D { > SOC_ENUM("Output Driver Ramp-up step", aic3x_rampup_step_enum), > }; > =20 > +/* For other than tlv320aic3104 */ > +static const struct snd_kcontrol_new aic3x_extra_snd_controls[] =3D = { > + /* > + * Output controls that map to output mixer switches. Note these ar= e > + * only for swapped L-to-R and R-to-L routes. See below stereo cont= rols > + * 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[] =3D { > 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); > =20 > /* Left Line Mixer */ > static const struct snd_kcontrol_new aic3x_left_line_mixer_controls[= ] =3D { > - 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= ), > }; > =20 > /* Right Line Mixer */ > static const struct snd_kcontrol_new aic3x_right_line_mixer_controls= [] =3D { > - 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= ), > }; > =20 > /* Mono Mixer */ > @@ -494,42 +515,46 @@ static const struct snd_kcontrol_new aic3x_mono= _mixer_controls[] =3D { > =20 > /* Left HP Mixer */ > static const struct snd_kcontrol_new aic3x_left_hp_mixer_controls[] = =3D { > - 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), > }; > =20 > /* Right HP Mixer */ > static const struct snd_kcontrol_new aic3x_right_hp_mixer_controls[]= =3D { > - 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), > }; > =20 > /* Left HPCOM Mixer */ > static const struct snd_kcontrol_new aic3x_left_hpcom_mixer_controls= [] =3D { > - 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), > }; > =20 > /* Right HPCOM Mixer */ > static const struct snd_kcontrol_new aic3x_right_hpcom_mixer_control= s[] =3D { > - 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), > }; > =20 > /* Left PGA Mixer */ > @@ -550,6 +575,22 @@ static const struct snd_kcontrol_new aic3x_right= _pga_mixer_controls[] =3D { > SOC_DAPM_SINGLE_AIC3X("Mic3R Switch", MIC3LR_2_RADC_CTRL, 0, 1, 1), > }; > =20 > +/* Left PGA Mixer for tlv320aic3104 */ > +static const struct snd_kcontrol_new aic3104_left_pga_mixer_controls= [] =3D { > + 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_control= s[] =3D { > + 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 = =3D > SOC_DAPM_ENUM("Route", aic3x_line1l_2_l_enum); > @@ -593,26 +634,56 @@ static const struct snd_soc_dapm_widget aic3x_d= apm_widgets[] =3D { > =20 > /* 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), > =20 > /* 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 nee= ded. > + * 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[] =3D= { > + /* 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), > =20 > @@ -637,11 +708,6 @@ static const struct snd_soc_dapm_widget aic3x_da= pm_widgets[] =3D { > SND_SOC_DAPM_REG(snd_soc_dapm_micbias, "DMic Rate 32", > AIC3X_ASD_INTF_CTRLA, 0, 3, 3, 0), > =20 > - /* 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_d= apm_widgets[] =3D { > &aic3x_right_hpcom_mixer_controls[0], > ARRAY_SIZE(aic3x_right_hpcom_mixer_controls)), > =20 > - 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"), > +}; > =20 > - /* > - * Virtual output pin to detection block inside codec. This can be > - * used to keep codec bias on if gpio or detection features are nee= ded. > - * 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[]= =3D { > + /* 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"), > }; > =20 > static const struct snd_soc_dapm_widget aic3x_dapm_mono_widgets[] =3D= { > @@ -712,17 +797,10 @@ static const struct snd_soc_dapm_route intercon= [] =3D { > {"Left Line1R Mux", "single-ended", "LINE1R"}, > {"Left Line1R Mux", "differential", "LINE1R"}, > =20 > - {"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"}, > =20 > {"Left ADC", NULL, "Left PGA Mixer"}, > - {"Left ADC", NULL, "GPIO1 dmic modclk"}, > =20 > /* Right Input */ > {"Right Line1R Mux", "single-ended", "LINE1R"}, > @@ -730,25 +808,10 @@ static const struct snd_soc_dapm_route intercon= [] =3D { > {"Right Line1L Mux", "single-ended", "LINE1L"}, > {"Right Line1L Mux", "differential", "LINE1L"}, > =20 > - {"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"}, > =20 > {"Right ADC", NULL, "Right PGA Mixer"}, > - {"Right ADC", NULL, "GPIO1 dmic modclk"}, > - > - /* > - * Logical path between digital mic enable and GPIO1 modulator cloc= k > - * output function > - */ > - {"GPIO1 dmic modclk", NULL, "DMic Rate 128"}, > - {"GPIO1 dmic modclk", NULL, "DMic Rate 64"}, > - {"GPIO1 dmic modclk", NULL, "DMic Rate 32"}, > =20 > /* Left DAC Output */ > {"Left DAC Mux", "DAC_L1", "Left DAC"}, > @@ -761,10 +824,8 @@ static const struct snd_soc_dapm_route intercon[= ] =3D { > {"Right DAC Mux", "DAC_R3", "Right DAC"}, > =20 > /* 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"}, > =20 > @@ -773,10 +834,8 @@ static const struct snd_soc_dapm_route intercon[= ] =3D { > {"LLOUT", NULL, "Left Line Out"}, > =20 > /* 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"}, > =20 > @@ -785,10 +844,8 @@ static const struct snd_soc_dapm_route intercon[= ] =3D { > {"RLOUT", NULL, "Right Line Out"}, > =20 > /* 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"}, > =20 > @@ -797,10 +854,8 @@ static const struct snd_soc_dapm_route intercon[= ] =3D { > {"HPLOUT", NULL, "Left HP Out"}, > =20 > /* 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"}, > =20 > @@ -809,10 +864,8 @@ static const struct snd_soc_dapm_route intercon[= ] =3D { > {"HPROUT", NULL, "Right HP Out"}, > =20 > /* 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"}, > =20 > @@ -823,10 +876,8 @@ static const struct snd_soc_dapm_route intercon[= ] =3D { > {"HPLCOM", NULL, "Left HP Com"}, > =20 > /* 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"}, > =20 > @@ -839,6 +890,72 @@ static const struct snd_soc_dapm_route intercon[= ] =3D { > {"HPRCOM", NULL, "Right HP Com"}, > }; > =20 > +/* For other than tlv320aic3104 */ > +static const struct snd_soc_dapm_route intercon_extra[] =3D { > + /* 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 cloc= k > + * 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[] =3D { > + /* 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[] =3D { > /* Mono Output */ > {"Mono Mixer", "Line2L Bypass Switch", "Left Line2L Mux"}, > @@ -867,17 +984,31 @@ static int aic3x_add_widgets(struct snd_soc_cod= ec *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; > } > =20 > return 0; > @@ -1438,23 +1569,33 @@ static int aic3x_probe(struct snd_soc_codec *= codec) > aic3x_init(codec); > =20 > 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 !=3D 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 tlv3= 20aic3104\n"); > + } > } > =20 > 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; > } > =20 > /* set mic bias voltage */ > @@ -1522,6 +1663,7 @@ static const struct i2c_device_id aic3x_i2c_id[= ] =3D { > { "tlv320aic33", AIC3X_MODEL_33 }, > { "tlv320aic3007", AIC3X_MODEL_3007 }, > { "tlv320aic3106", AIC3X_MODEL_3X }, > + { "tlv320aic3104", AIC3X_MODEL_3104 }, > { } > }; > MODULE_DEVICE_TABLE(i2c, aic3x_i2c_id); >=20 -- To unsubscribe from this list: send the line "unsubscribe devicetree" i= n the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html