Re: [PATCH v1] i2c: tegra: Remove suspend-resume

From: Thierry Reding
Date: Mon May 14 2018 - 08:47:32 EST


On Mon, May 14, 2018 at 05:51:58PM +0530, Laxman Dewangan wrote:
>
>
> On Monday 14 May 2018 05:29 PM, Thierry Reding wrote:
> > * PGP Signed by an unknown key
> >
> > On Mon, May 14, 2018 at 12:13:47AM +0300, Dmitry Osipenko wrote:
> > > Nothing prevents I2C clients to access I2C while Tegra's driver is being
> > > suspended, this results in -EBUSY error returned to the clients and that
> > > may have unfortunate consequences. In particular this causes problems
> > > for the TPS6586x MFD driver which emits hundreds of "failed to read
> > > interrupt status" error messages on resume from suspend. This happens if
> > > TPS6586X is used to wake system from suspend by the expired RTC alarm
> > > timer because TPS6586X is an I2C device driver and its IRQ handler reads
> > > the status register while Tegra's I2C driver is suspended, i.e. just after
> > > kernel enabled IRQ's during of resume-from-suspend process.
> > >
> > > Note that the removed tegra_i2c_resume() invoked tegra_i2c_init() which
> > > performs HW reset. That seems was also not entirely correct because moving
> > > tegra_i2c_resume to an earlier stage of resume-from-suspend process causes
> > > I2C transfer to fail in the case of TPS6586X. It is fine to remove the
> > > HW-reinitialization for now because it should be only needed in a case of
> > > using lowest power-mode during suspend, which upstream kernel doesn't
> > > support.
> > >
> > > Signed-off-by: Dmitry Osipenko <digetx@xxxxxxxxx>
> > > Cc: <stable@xxxxxxxxxxxxxxx>
> > > ---
> > > drivers/i2c/busses/i2c-tegra.c | 33 ---------------------------------
> > > 1 file changed, 33 deletions(-)
> > Shardar, Laxman, any thoughts on this? The is_suspended thing looks to
> > me like a workaround of some sort that may not be needed if clients have
> > proper suspend/resume implementations. Even without suspend/resume
> > support in client drivers, the driver core should resume devices in the
> > right order (I2C adapter before any of the clients), so I don't see any
> > cases where the is_suspended logic would be useful.
> >
>
> Our I2C driver is based on the interrupt. So we have converted the
> suspend/resume to suspend_noirq and reseume_noirq so that we will not allow
> the transfer when system interrupt disabled in downstream.
> SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(tegra_i2c_suspend, tegra_i2c_resume)

That seems to me like it shouldn't be necessary. If all clients are
properly suspended, then when the I2C controller gets suspended there
should be no pending transfers. That's provided that the driver model
properly orders suspend of clients vs. their controller. I think it
didn't use to do that (especially when deferred probing was involved)
but I remember that getting fixed sometime in the last couple of years.

> In shutdown path, where interrupt disabled and still need i2c, we use the
> bit-bang method via GPIO for i2c transfer.

Do we really need to bit-bang the GPIOs? Couldn't the I2C controller
operate in a polling mode where only the interrupt was disabled but we
still polled the status register to know when a transfer was finished?

Thierry

Attachment: signature.asc
Description: PGP signature