[alsa-devel] [PATCH] ASoC: ts3a227e: do not report jack status when there is i2c read err
Yang Fang
yang.a.fang at intel.com
Wed Jul 1 19:34:09 CEST 2015
On Wed, Jul 01, 2015 at 10:12:37AM -0700, Dylan Reid wrote:
> On Tue, Jun 30, 2015 at 9:18 PM, <yang.a.fang at intel.com> wrote:
> > From: "Fang, Yang A" <yang.a.fang at intel.com>
> >
> > After suspend -> resume the ts3a227e_interrupt sometimes comes before i2c
> > controller resume is called .regmap_read will return incorrect status
> > and report a wrong jack status.We should return if there is read err,the
> > interrupt will come again since it is level triggered and we are not yet
> > clear the interrupt. In addtion,cht_bsw_max98090_ti machine driver
> > registered additional notifier base on jack event which will program
> > the audio codec.there will be codec timeout err if such event occurs
> > prior to i2c controller is resumed.
>
> Thanks, I think the error checking is good to have anyway, but should
> the interrupt also be disabled across suspend/resume? I'd hope this
> device's resume callback wouldn't happen until after the parent i2c
> bus is ready.
I am looping Mika. I was expecting that interrupt would come after i2c
bus is ready. but with current pinctrl-cherryview driver the interrupt
comes in random order after resume.
>
> >
> > Signed-off-by: Fang, Yang A <yang.a.fang at intel.com>
> > ---
> > sound/soc/codecs/ts3a227e.c | 18 ++++++++++++++++--
> > 1 file changed, 16 insertions(+), 2 deletions(-)
> >
> > diff --git a/sound/soc/codecs/ts3a227e.c b/sound/soc/codecs/ts3a227e.c
> > index 12232d7..12d0f2a 100644
> > --- a/sound/soc/codecs/ts3a227e.c
> > +++ b/sound/soc/codecs/ts3a227e.c
> > @@ -23,6 +23,7 @@
> > #include "ts3a227e.h"
> >
> > struct ts3a227e {
> > + struct device *dev;
> > struct regmap *regmap;
> > struct snd_soc_jack *jack;
> > bool plugged;
> > @@ -189,16 +190,28 @@ static irqreturn_t ts3a227e_interrupt(int irq, void *data)
> > struct ts3a227e *ts3a227e = (struct ts3a227e *)data;
> > struct regmap *regmap = ts3a227e->regmap;
> > unsigned int int_reg, kp_int_reg, acc_reg, i;
> > + struct device *dev = ts3a227e->dev;
> > + int ret;
> >
> > /* Check for plug/unplug. */
> > - regmap_read(regmap, TS3A227E_REG_INTERRUPT, &int_reg);
> > + ret = regmap_read(regmap, TS3A227E_REG_INTERRUPT, &int_reg);
> > + if (ret) {
> > + dev_err(dev, "failed to clear interrupt ret=%d\n", ret);
> > + return IRQ_HANDLED;
> > + }
> > +
> > if (int_reg & (DETECTION_COMPLETE_EVENT | INS_REM_EVENT)) {
> > regmap_read(regmap, TS3A227E_REG_ACCESSORY_STATUS, &acc_reg);
> > ts3a227e_new_jack_state(ts3a227e, acc_reg);
> > }
> >
> > /* Report any key events. */
> > - regmap_read(regmap, TS3A227E_REG_KP_INTERRUPT, &kp_int_reg);
> > + ret = regmap_read(regmap, TS3A227E_REG_KP_INTERRUPT, &kp_int_reg);
> > + if (ret) {
> > + dev_err(dev, "failed to clear key interrupt ret=%d\n", ret);
> > + return IRQ_HANDLED;
> > + }
> > +
> > for (i = 0; i < TS3A227E_NUM_BUTTONS; i++) {
> > if (kp_int_reg & PRESS_MASK(i))
> > ts3a227e->buttons_held |= (1 << i);
> > @@ -283,6 +296,7 @@ static int ts3a227e_i2c_probe(struct i2c_client *i2c,
> > return -ENOMEM;
> >
> > i2c_set_clientdata(i2c, ts3a227e);
> > + ts3a227e->dev = dev;
> >
> > ts3a227e->regmap = devm_regmap_init_i2c(i2c, &ts3a227e_regmap_config);
> > if (IS_ERR(ts3a227e->regmap))
> > --
> > 1.7.9.5
> >
> > _______________________________________________
> > Alsa-devel mailing list
> > Alsa-devel at alsa-project.org
> > http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
More information about the Alsa-devel
mailing list