[alsa-devel] [PATCH v2 2/2] ASoC: add support for Conexant CX2072X CODEC
Takashi Iwai
tiwai at suse.de
Wed Apr 12 09:50:17 CEST 2017
On Wed, 12 Apr 2017 09:41:01 +0200,
Takashi Iwai wrote:
>
> On Wed, 12 Apr 2017 07:45:20 +0200,
> Takashi Iwai wrote:
> >
> > On Tue, 11 Apr 2017 15:31:37 +0200,
> > Takashi Iwai wrote:
> > >
> > > On Wed, 05 Apr 2017 11:07:14 +0200,
> > > <simon.ho.cnxt at gmail.com> wrote:
> > > >
> > > > --- /dev/null
> > > > +++ b/sound/soc/codecs/cx2072x.c
> > > > +/**
> > > > + * cx2072x_enable_detect - Enable CX2072X jack detection
> > > > + * @codec : pointer variable to codec having information related to codec
> > > > + *
> > > > + */
> > > > +int cx2072x_enable_detect(struct snd_soc_codec *codec)
> > > > +{
> > > .....
> > > > +}
> > > > +EXPORT_SYMBOL_GPL(cx2072x_enable_detect);
> > > > +
> > > > +/*
> > > > + * cx2072x_get_jack_state: Return current jack state.
> > > > + * @codec : pointer variable to codec having information related to codec
> > > > + *
> > > > + */
> > > > +int cx2072x_get_jack_state(struct snd_soc_codec *codec)
> > > > +{
> > > ....
> > > > +}
> > > > +EXPORT_SYMBOL_GPL(cx2072x_get_jack_state);
> > > > --- /dev/null
> > > > +++ b/sound/soc/codecs/cx2072x.h
> > > ....
> > > > +enum cx2072x_jack_types {
> > > > + CX_JACK_NONE = 0x0000,
> > > > + CX_JACK_HEADPHONE = 0x0001,
> > > > + CX_JACK_APPLE_HEADSET = 0x0002,
> > > > + CX_JACK_NOKIE_HEADSET = 0x0003,
> > > > +};
> > > > +
> > > > +int cx2072x_hs_jack_report(struct snd_soc_codec *codec);
> > >
> > > This function is nowhere defined. And the new jack functions
> > > cx2072x_enable_detect() and cx2072x_get_jack_state() are not declared
> > > here, either.
> >
> > Also, some DAPM entries are missing / wrong, obviously.
>
> ... and yet another missing ones, the powers for some pins aren't
> hooked.
Last but not least: the regcache_cache_bypass() calls in the jack
detection function don't look good.
These registers are volatile, and if the cache_only isn't set via bias
ctl, we need no bypass. And, if cache_only is at BIAS_OFF and the
jack detection gets triggered during that, it screws up, spewing a
kernel warning because of the check below:
void regcache_cache_bypass(struct regmap *map, bool enable)
{
map->lock(map->lock_arg);
WARN_ON(map->cache_only && enable);
So, either we should remove these bypass calls, or turn on/off
cache_only temporarily during the jack detection like below -- the
latter is so ugly, and better to avoid, though.
Takashi
===
diff --git a/sound/soc/codecs/cx2072x.c b/sound/soc/codecs/cx2072x.c
index fab564cb1176..5b3c4939e653 100644
--- a/sound/soc/codecs/cx2072x.c
+++ b/sound/soc/codecs/cx2072x.c
@@ -1246,13 +1246,17 @@ int cx2072x_get_jack_state(struct snd_soc_codec *codec)
unsigned int type = 0;
int state = 0;
struct cx2072x_priv *cx2072x = snd_soc_codec_get_drvdata(codec);
+ bool need_cache_bypass =
+ snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF;
- regcache_cache_bypass(cx2072x->regmap, true);
+ if (need_cache_bypass)
+ regcache_cache_only(cx2072x->regmap, false);
cx2072x->jack_state = CX_JACK_NONE;
regmap_read(cx2072x->regmap, CX2072X_PORTA_PIN_SENSE, &jack);
jack = jack >> 24;
regmap_read(cx2072x->regmap, CX2072X_DIGITAL_TEST11, &type);
- regcache_cache_bypass(cx2072x->regmap, false);
+ if (need_cache_bypass)
+ regcache_cache_only(cx2072x->regmap, true);
if (jack == 0x80) {
type = type >> 8;
More information about the Alsa-devel
mailing list