From: Lee Jones <lee@kernel.org>
To: Diogo Ivo <diogo.ivo@tecnico.ulisboa.pt>, broonie@kernel.org
Cc: Dmitry Osipenko <digetx@gmail.com>,
linux-kernel@vger.kernel.org, stable@vger.kernel.org
Subject: Re: [PATCH] mfd: max77620: Avoid regmap mutex deadlock in power-off handler
Date: Wed, 20 May 2026 17:19:00 +0100 [thread overview]
Message-ID: <20260520161900.GM2767592@google.com> (raw)
In-Reply-To: <38f5201a-6b52-4f18-bbbe-775171a3f147@tecnico.ulisboa.pt>
Mark,
On Wed, 20 May 2026, Diogo Ivo wrote:
> On 5/20/26 16:42, Dmitry Osipenko wrote:
> > 20.05.2026 17:28, Diogo Ivo пишет:
> > > max77620_pm_power_off() is called via the sys-off framework as a
> > > SYS_OFF_MODE_POWER_OFF handler, which runs in an atomic notifier chain
> > > with IRQs disabled after smp_send_stop(). regmap_update_bits() acquires
> > > the regmap mutex in this path; if another CPU held that mutex when it
> > > was stopped, the power-off sequence deadlocks.
> > >
> > > Replace regmap_update_bits() with i2c_smbus_write_byte_data(), which
> > > bypasses the regmap lock entirely. The I2C core detects the atomic
> > > context via i2c_in_atomic_xfer_mode() and uses i2c_trylock_bus() rather
> > > than a blocking acquisition, avoiding the deadlock.
> > >
> > > Tested on Pixel C, powers off correctly.
> > >
> > > Assisted-by: Claude:claude-sonnet-4-6
> > > Fixes: 744b13107d0d ("mfd: max77620: Provide system power-off functionality")
> > > Cc: stable@vger.kernel.org
> > > Signed-off-by: Diogo Ivo <diogo.ivo@tecnico.ulisboa.pt>
> > > ---
> > > This patch was tested on a local branch that sets pm_power_off =
> > > max77620_pm_power_off() unconditionally so that the function runs.
> > > I haven't checked whether the other bits in ONOFFCNFG1 are safe to
> > > discard at power-off time as I don't have access to the datasheet.
> > > If someone with access to the datasheet confirms they're not I'll
> > > respin the patch taking that into account.
> > > ---
> > > drivers/mfd/max77620.c | 10 +++++++---
> > > 1 file changed, 7 insertions(+), 3 deletions(-)
> > >
> > > diff --git a/drivers/mfd/max77620.c b/drivers/mfd/max77620.c
> > > index 3af2974b3023..8c768968a317 100644
> > > --- a/drivers/mfd/max77620.c
> > > +++ b/drivers/mfd/max77620.c
> > > @@ -487,10 +487,14 @@ static int max77620_read_es_version(struct max77620_chip *chip)
> > > static void max77620_pm_power_off(void)
> > > {
> > > struct max77620_chip *chip = max77620_scratch;
> > > + struct i2c_client *client = to_i2c_client(chip->dev);
> > > - regmap_update_bits(chip->rmap, MAX77620_REG_ONOFFCNFG1,
> > > - MAX77620_ONOFFCNFG1_SFT_RST,
> > > - MAX77620_ONOFFCNFG1_SFT_RST);
> > > + /*
> > > + * Atomic context: IRQs disabled. Use raw I2C write, bypassing
> > > + * regmap locking entirely.
> > > + */
> > > + i2c_smbus_write_byte_data(client, MAX77620_REG_ONOFFCNFG1,
> > > + MAX77620_ONOFFCNFG1_SFT_RST);
> > > }
> > > static int max77620_probe(struct i2c_client *client)
> > >
> > > ---
> > > base-commit: 27fa82620cbaa89a7fc11ac3057701d598813e87
> > > change-id: 20260520-max77620_poweroff-08e39429835f
> > >
> > > Best regards,
> > > --
> > > Diogo Ivo <diogo.ivo@tecnico.ulisboa.pt>
> >
> > Kernel parks secondary CPUs before powering off system, hence there
> > shouldn't be a locking contention.
>
> This patch was motivated by the Sashiko review I got in [1]. Its point
> here is that there is a possibility for a deadlock scenario in which
> a secondary CPU obtains the mutex for the regmap and then smp_send_stop()
> is called before this secondary CPU gets a chance to release the mutex,
> making it so that when the primary CPU tries to acquire it to issue the
> write it hangs. Is there something that I am misunderstanding here?
>
> > Have you checked whether regmap_write_bits() works?
>
> Now, in case this is all true this problem is still not something that
> will usually happen, only when this specific situation holds so
> generally even regmap_update_bits() was working, and in [1] I sent it
> out exactly like that. Changing it to regmap_write_bits() would not make
> any difference.
>
> [1]: https://lore.kernel.org/linux-tegra/20260514-smaug-poweroff-v1-0-30f9a4688966@tecnico.ulisboa.pt/
It's my understanding that using the Regmap wrappers _prevents_ locking
issues, rather than causes them.
I'm deferring to Mark.
--
Lee Jones
next prev parent reply other threads:[~2026-05-20 16:19 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-20 14:28 [PATCH] mfd: max77620: Avoid regmap mutex deadlock in power-off handler Diogo Ivo
2026-05-20 14:42 ` Dmitry Osipenko
2026-05-20 14:59 ` Diogo Ivo
2026-05-20 16:19 ` Lee Jones [this message]
2026-05-20 16:23 ` Mark Brown
2026-05-20 16:44 ` Dmitry Osipenko
2026-05-21 9:19 ` Diogo Ivo
2026-05-27 7:32 ` Dmitry Osipenko
2026-05-21 9:14 ` Diogo Ivo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260520161900.GM2767592@google.com \
--to=lee@kernel.org \
--cc=broonie@kernel.org \
--cc=digetx@gmail.com \
--cc=diogo.ivo@tecnico.ulisboa.pt \
--cc=linux-kernel@vger.kernel.org \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox