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@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;