From: Andrey Skvortsov <andrej.skvortzov@gmail.com>
To: "Jean-Baptiste Maneyrol" <jean-baptiste.maneyrol@tdk.com>,
"Jonathan Cameron" <jic23@kernel.org>,
"David Lechner" <dlechner@baylibre.com>,
"Nuno Sá" <nuno.sa@analog.com>,
"Andy Shevchenko" <andy@kernel.org>,
linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org,
"Jonathan Marek" <jonathan@marek.ca>,
"Brian Masney" <masneyb@onstation.org>,
"Rob Herring" <robh@kernel.org>
Cc: Andrey Skvortsov <andrej.skvortzov@gmail.com>
Subject: [PATCH v4 1/3] iio: imu: inv_mpu6050: fix unbalanced regulator_disable() calls, when probe fails
Date: Fri, 5 Jun 2026 12:09:38 +0300 [thread overview]
Message-ID: <20260605090940.1103750-2-andrej.skvortzov@gmail.com> (raw)
In-Reply-To: <20260605090940.1103750-1-andrej.skvortzov@gmail.com>
During a probe function after all regulators are enabled, runtime PM
is enabled. Before probe function finishes, runtime PM triggers and
disables vddio regulator. When probe function fails after vddio
regulator is disabled by runtime PM,
inv_mpu_core_disable_regulator_action() tries to disable already
disabled by runtime PM vddio regulator causing following backtrace:
inv-mpu6050-i2c 1-0068: trigger probe fail -19
WARNING: drivers/regulator/core.c:3244 at _regulator_disable+0x2ac/0x600
Call trace:
_regulator_disable+0x2ac/0x600 (P)
regulator_disable+0xac/0x148
inv_mpu_core_disable_regulator_vddio_action+0x3c/0xb0 [inv_mpu6050]
devm_action_release+0x4c/0x88
release_nodes+0xd8/0x178
devres_release_group+0x214/0x3c8
i2c_device_probe+0x6fc/0x9b0
...
inv-mpu6050-i2c 1-0068: Failed to disable vddio regulator: -5
vddio state is handled in two places: runtime PM and
inv_mpu_core_disable_regulator_vddio_action() devm action.
inv_mpu_core_disable_regulator_vddio_action() has to check, whether
regulator is disabled by runtime PM already. But this information is
available only after runtime PM state is initialized by
pm_runtime_set_active() during a probe. So
inv_mpu_core_disable_regulator_vddio_action() has to be called only
after runtime PM state is initialized. To handle this correctly
runtime PM active status is set just before vddio regulator setup.
Signed-off-by: Andrey Skvortsov <andrej.skvortzov@gmail.com>
Fixes: 07c12b1c007c ("iio: imu: mpu6050: add support for regulator framework")
---
Changes in v4:
- update commit message to address Andy's comment
about functions, callbacks and runtime PM names
- move pm_runtime_set_active just before vddio regulator is enabled
as it was proposed previously in v2.
Changes in v3:
- make patch to be the first patch of the patchset for easier backporting
- update commit message to fix Andy's comment
- don't move pm_runtime_set_active from pm_runtime initialization,
move activation of inv_mpu_core_disable_regulator_action instead
Changes in v2:
- minimize call trace in commit message
- include specific driver name in patch subject
- move pm_runtime_set_active just before vddio regulator is enabled
drivers/iio/imu/inv_mpu6050/inv_mpu_core.c | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
index 5796896d54cd8..8c8b4f9a8ff63 100644
--- a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
+++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
@@ -1862,6 +1862,7 @@ static int inv_mpu_core_disable_regulator_vddio(struct inv_mpu6050_state *st)
static void inv_mpu_core_disable_regulator_action(void *_data)
{
struct inv_mpu6050_state *st = _data;
+ struct device *dev = regmap_get_device(st->map);
int result;
result = regulator_disable(st->vdd_supply);
@@ -1869,7 +1870,8 @@ static void inv_mpu_core_disable_regulator_action(void *_data)
dev_err(regmap_get_device(st->map),
"Failed to disable vdd regulator: %d\n", result);
- inv_mpu_core_disable_regulator_vddio(st);
+ if (!pm_runtime_status_suspended(dev))
+ inv_mpu_core_disable_regulator_vddio(st);
}
static void inv_mpu_pm_disable(void *data)
@@ -1970,6 +1972,11 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name,
}
msleep(INV_MPU6050_POWER_UP_TIME);
+ /* set pm_runtime active early for disable vddio resource cleanup */
+ result = pm_runtime_set_active(dev);
+ if (result)
+ return result;
+
result = inv_mpu_core_enable_regulator_vddio(st);
if (result) {
regulator_disable(st->vdd_supply);
@@ -2015,9 +2022,6 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name,
}
/* chip init is done, turning on runtime power management */
- result = pm_runtime_set_active(dev);
- if (result)
- goto error_power_off;
pm_runtime_get_noresume(dev);
pm_runtime_enable(dev);
pm_runtime_set_autosuspend_delay(dev, INV_MPU6050_SUSPEND_DELAY_MS);
--
2.53.0
next prev parent reply other threads:[~2026-06-05 9:10 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-05 9:09 [PATCH v4 0/3] iio: imu: inv_mpu6050: runtime pm fixes Andrey Skvortsov
2026-06-05 9:09 ` Andrey Skvortsov [this message]
2026-06-05 9:09 ` [PATCH v4 2/3] iio: imu: inv_mpu6050: use devres-enabled version of pm_runtime_enable() Andrey Skvortsov
2026-06-05 9:09 ` [PATCH v4 3/3] iio: imu: inv_mpu6050: control vdd supply using devm-helpers Andrey Skvortsov
2026-06-14 18:57 ` [PATCH v4 0/3] iio: imu: inv_mpu6050: runtime pm fixes Jonathan Cameron
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=20260605090940.1103750-2-andrej.skvortzov@gmail.com \
--to=andrej.skvortzov@gmail.com \
--cc=andy@kernel.org \
--cc=dlechner@baylibre.com \
--cc=jean-baptiste.maneyrol@tdk.com \
--cc=jic23@kernel.org \
--cc=jonathan@marek.ca \
--cc=linux-iio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=masneyb@onstation.org \
--cc=nuno.sa@analog.com \
--cc=robh@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
all inboxes | Powered by JetHome®