Message ID | 1423204800-6448-1-git-send-email-yang.jie@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
2015-02-06 7:40 GMT+01:00 Jie Yang <yang.jie@intel.com>: [...] > @@ -1012,6 +1039,8 @@ static irqreturn_t rt286_irq(int irq, void *data) > bool mic = false; > int status = 0; > > + if (!rt286->jack) > + return IRQ_HANDLED; > rt286_jack_detect(rt286, &hp, &mic); > > /* Clear IRQ */ This seems wrong. Are you sure you want to return IRQ_HANDLED when you did nothing to handle the interrupt? Best Regards, Micha? Miros?aw
Hi, Mark, Please hold on and not review this patch ATM, seems it can't disable the irq with this implement. Sorry for the confusing. ~Keyon > -----Original Message----- > From: Jie, Yang > Sent: Friday, February 06, 2015 2:40 PM > To: broonie@kernel.org > Cc: alsa-devel@alsa-project.org; Girdwood, Liam R; Jie, Yang > Subject: [PATCH v3] ASoC: rt286: add jack detection enable/disable APIs and > export > > Some platforms, e.g. WSB, don't need jack detection when system is in Suspend, > for power save reason. > > Here add jack detection enable/disable APIs and export them, when disabled, it > will ignore interrupt, and disable LDO1, which is used for jack detection when > headphone is plugged in. > > Signed-off-by: Jie Yang <yang.jie@intel.com> > Reviewed-by: Bard Liao <bardliao@realtek.com> > --- > sound/soc/codecs/rt286.c | 29 +++++++++++++++++++++++++++++ > sound/soc/codecs/rt286.h | 2 ++ > 2 files changed, 31 insertions(+) > > diff --git a/sound/soc/codecs/rt286.c b/sound/soc/codecs/rt286.c index > d5cc1bc..1a0c250f 100644 > --- a/sound/soc/codecs/rt286.c > +++ b/sound/soc/codecs/rt286.c > @@ -402,6 +402,33 @@ int rt286_mic_detect(struct snd_soc_codec *codec, > struct snd_soc_jack *jack) } EXPORT_SYMBOL_GPL(rt286_mic_detect); > > +int rt286_enable_jack_detection(struct snd_soc_codec *codec, struct > +snd_soc_jack *jack) { > + struct rt286_priv *rt286 = snd_soc_codec_get_drvdata(codec); > + > + if (!jack) > + return -EINVAL; > + rt286->jack = jack; > + if (jack->status | SND_JACK_HEADPHONE) > + snd_soc_dapm_force_enable_pin(&rt286->codec->dapm, "LDO1"); > + snd_soc_dapm_sync(&rt286->codec->dapm); > + return 0; > +} > +EXPORT_SYMBOL_GPL(rt286_enable_jack_detection); > + > +int rt286_disable_jack_detection(struct snd_soc_codec *codec, struct > +snd_soc_jack *jack) { > + struct rt286_priv *rt286 = snd_soc_codec_get_drvdata(codec); > + > + if (!jack) > + return -EINVAL; > + rt286->jack = NULL; > + snd_soc_dapm_disable_pin(&rt286->codec->dapm, "LDO1"); > + snd_soc_dapm_sync(&rt286->codec->dapm); > + return 0; > +} > +EXPORT_SYMBOL_GPL(rt286_disable_jack_detection); > + > static int is_mclk_mode(struct snd_soc_dapm_widget *source, > struct snd_soc_dapm_widget *sink) > { > @@ -1012,6 +1039,8 @@ static irqreturn_t rt286_irq(int irq, void *data) > bool mic = false; > int status = 0; > > + if (!rt286->jack) > + return IRQ_HANDLED; > rt286_jack_detect(rt286, &hp, &mic); > > /* Clear IRQ */ > diff --git a/sound/soc/codecs/rt286.h b/sound/soc/codecs/rt286.h index > 7130edb..d793185 100644 > --- a/sound/soc/codecs/rt286.h > +++ b/sound/soc/codecs/rt286.h > @@ -200,6 +200,8 @@ enum { > }; > > int rt286_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack > *jack); > +int rt286_enable_jack_detection(struct snd_soc_codec *codec, struct > +snd_soc_jack *jack); int rt286_disable_jack_detection(struct > +snd_soc_codec *codec, struct snd_soc_jack *jack); > > #endif /* __RT286_H__ */ > > -- > 1.9.1
> -----Original Message----- > From: Micha? Miros?aw [mailto:mirqus@gmail.com] > Sent: Friday, February 06, 2015 6:21 PM > To: Jie, Yang > Cc: broonie@kernel.org; alsa-devel@alsa-project.org; Girdwood, Liam R > Subject: Re: [alsa-devel] [PATCH v3] ASoC: rt286: add jack detection > enable/disable APIs and export > > 2015-02-06 7:40 GMT+01:00 Jie Yang <yang.jie@intel.com>: > [...] > > @@ -1012,6 +1039,8 @@ static irqreturn_t rt286_irq(int irq, void *data) > > bool mic = false; > > int status = 0; > > > > + if (!rt286->jack) > > + return IRQ_HANDLED; > > rt286_jack_detect(rt286, &hp, &mic); > > > > /* Clear IRQ */ > > This seems wrong. Are you sure you want to return IRQ_HANDLED when you > did nothing to handle the interrupt? [Keyon] thanks, yes, I also noticed this. The interrupt will keep coming endlessly with returning IRQ_HANDLED here. :( > > Best Regards, > Micha? Miros?aw
diff --git a/sound/soc/codecs/rt286.c b/sound/soc/codecs/rt286.c index d5cc1bc..1a0c250f 100644 --- a/sound/soc/codecs/rt286.c +++ b/sound/soc/codecs/rt286.c @@ -402,6 +402,33 @@ int rt286_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack) } EXPORT_SYMBOL_GPL(rt286_mic_detect); +int rt286_enable_jack_detection(struct snd_soc_codec *codec, struct snd_soc_jack *jack) +{ + struct rt286_priv *rt286 = snd_soc_codec_get_drvdata(codec); + + if (!jack) + return -EINVAL; + rt286->jack = jack; + if (jack->status | SND_JACK_HEADPHONE) + snd_soc_dapm_force_enable_pin(&rt286->codec->dapm, "LDO1"); + snd_soc_dapm_sync(&rt286->codec->dapm); + return 0; +} +EXPORT_SYMBOL_GPL(rt286_enable_jack_detection); + +int rt286_disable_jack_detection(struct snd_soc_codec *codec, struct snd_soc_jack *jack) +{ + struct rt286_priv *rt286 = snd_soc_codec_get_drvdata(codec); + + if (!jack) + return -EINVAL; + rt286->jack = NULL; + snd_soc_dapm_disable_pin(&rt286->codec->dapm, "LDO1"); + snd_soc_dapm_sync(&rt286->codec->dapm); + return 0; +} +EXPORT_SYMBOL_GPL(rt286_disable_jack_detection); + static int is_mclk_mode(struct snd_soc_dapm_widget *source, struct snd_soc_dapm_widget *sink) { @@ -1012,6 +1039,8 @@ static irqreturn_t rt286_irq(int irq, void *data) bool mic = false; int status = 0; + if (!rt286->jack) + return IRQ_HANDLED; rt286_jack_detect(rt286, &hp, &mic); /* Clear IRQ */ diff --git a/sound/soc/codecs/rt286.h b/sound/soc/codecs/rt286.h index 7130edb..d793185 100644 --- a/sound/soc/codecs/rt286.h +++ b/sound/soc/codecs/rt286.h @@ -200,6 +200,8 @@ enum { }; int rt286_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack); +int rt286_enable_jack_detection(struct snd_soc_codec *codec, struct snd_soc_jack *jack); +int rt286_disable_jack_detection(struct snd_soc_codec *codec, struct snd_soc_jack *jack); #endif /* __RT286_H__ */