From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pl1-f178.google.com (mail-pl1-f178.google.com [209.85.214.178]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 733673AB272 for ; Mon, 15 Jun 2026 20:03:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.178 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781553819; cv=none; b=Mq06DRk5Ey5Gsj7KtX9bmQPpEdjepYxzP+/WjHvmOv739S0+8otDUfZGE6q0OSUterP1BL2FwYGMpSVb7uETqghMb3DRVTw/8aXKWyuslaWg5qtBNzQuq602KNxASq0x5WzM9Ec/mkcVTl3AUngI7eLPDi8CgNbNUha+flotM+4= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781553819; c=relaxed/simple; bh=MX4tfIeIUP2JNAfGBkbaVwMAfGJ79oNWBvBcRIJ6L/Q=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=dkZAAsskrLKhTbuJyyxy0lKjoJuX9YNid0ZhK2Zq/OSVoXofbzN5eRTT4BWstbQkLafPScCFfruQWIi1AuXASyJgPrLY/GI7pjnygx1hvhXG8hpxAmFVOEDwaMhQqt0ithmrVbucdU9rhKIArzYrSz1dMq3w2c4liGeGETZi/Bo= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=nuaBJVbp; arc=none smtp.client-ip=209.85.214.178 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="nuaBJVbp" Received: by mail-pl1-f178.google.com with SMTP id d9443c01a7336-2c0c20f0c0aso26521175ad.0 for ; Mon, 15 Jun 2026 13:03:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1781553817; x=1782158617; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=UlTxPy1b6VFV8iwjr8AQ1pKpnY184xWWnM9UWZPBFro=; b=nuaBJVbpv5P8ytNSwg4ajDnCn2MKY612lBbdXv0f+5uYtWmOgK+eKa7B/6qprZBtUM /tu5HDF4xK2Aw/OPrj5sPDj9Xtve/p4YBNtNDWJFhhvJaw6ohLkcvuK1IH05+Un7xpty gayWcb19pPFTAW9lmtb6eT4Tzu4l2VIbT5XWPP7y1r9DduMKbhBi3q0uex2KnQtmWtyJ SgSrRHOiFtNLK1j49qygronKLuqT8FUIxr1RWeJLgXFEGmbKddgdAoymaAlgNVAap4li isMfhnk+hb3eDmynNTGxl34cr4r+9GHgsQiLVt0djBstk5ij0w3YY2Otmb8KXMsW2zpO j8rA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781553817; x=1782158617; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=UlTxPy1b6VFV8iwjr8AQ1pKpnY184xWWnM9UWZPBFro=; b=d4NG/lXC1hKONOGtchvL1kT5mIvFK+u+7NdGUIxpYmP7M5zFE6aeyv8KhOdp0fSUe+ Th7W7qjK0ytrvyWfCxqndVv9CPXu9Aod2/NyyTf/pERjuk7imYQbPGd2pqHf2jIyRAw1 uBlvnqWNfYGTX260f9pvUbdvgwShjExGCEnGENQBieKVaWFu1bpr9l5abimbGpEg6gUu 5yq2WGY8LSwJmRGj2LnVDTx8nN3+PLnZgLGqzHQg0W06tasxvxwsYuf16i5+RtkPKHIU UV6RE9zZP6GiPsBtDujegbpTIAK2SZ2Kron16AoOcvv5u/qxa+wZvh8TzKhrKihzyoz3 9C7A== X-Forwarded-Encrypted: i=1; AFNElJ92sWj7UOS+Rktw4dKJD+1On+8MGIdGk5EFJnFcer2j7qskYzSU+5EdWEu/otdxD+p8ABwkIEwIeN1MufM=@vger.kernel.org X-Gm-Message-State: AOJu0Ywcj+k5GfeJbqayi3MS4YtbCONuGZHR6wt35TqAFXGX+0SqKD/p zBWQLzuFTgkdlw+S2AUTcLRziuaF7KEim/T5VLPIOmhBeQ6aLDI94UTF X-Gm-Gg: Acq92OE6Avs5P0ms8lzCSVwSlcqS68i9vJPUqk7yT7ijnTHo8Jyju45+dy+vZRmhW8C QBwhX4qDpXtTJuXW57LHYcyqFNOMtSHJMx5dFrm9UcGgIoXmR0BoFpbCpBqtm22Q6h0HvbYkyx9 ANtDMkSjqxGfcmKjEj8bt4Pl18RWFZnnu7SYzptCzbtG3gVWqwZod5Z9DMBwKQLWYK8MqFsbdZg 5tkHslB9TEs1IqdfaiB5muYRFeo2L7Xv24uOSyj3UAjQ4PyAvmJxdp2TfRocqc+ZKOy564xh23h guMAwaVNaR8Bcf0YW1YDyUNTSxexbNlw0oO1smuHD9x7wN7s2LtNHPCtXUBppOC0DlhHdpJ33cY FuqqajNMpKBzpy1obhDN9Gpe1kYy0AXOeOg5qX4oLOkwI415zeQGdzTJfWXgUbHFutzn39egG0E f7yt4zteiNcC7pXjt3vnTWtjumvVyQMPMerOnguwT3jq5inKTwGVHa X-Received: by 2002:a17:902:d48f:b0:2c2:1982:5270 with SMTP id d9443c01a7336-2c6641e28f9mr144081825ad.21.1781553816731; Mon, 15 Jun 2026 13:03:36 -0700 (PDT) Received: from localhost.localdomain ([49.207.217.37]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2c42f2e59e1sm110714925ad.17.2026.06.15.13.03.33 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 15 Jun 2026 13:03:36 -0700 (PDT) From: Biren Pandya To: Jonathan Cameron , linux-iio@vger.kernel.org Cc: David Lechner , =?UTF-8?q?Nuno=20S=C3=A1?= , Andy Shevchenko , Sakari Ailus , linux-kernel@vger.kernel.org, Biren Pandya Subject: [PATCH] iio: accel: kxsd9: Fix runtime PM error handling and scoping Date: Tue, 16 Jun 2026 01:33:30 +0530 Message-ID: <20260615200330.33207-1-birenpandya@gmail.com> X-Mailer: git-send-email 2.50.1 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit The kxsd9 driver uses pm_runtime_get_sync() in multiple places without checking its return value, which can lead to silent failures. It also relies on manual pm_runtime_put_autosuspend() calls in various return paths, which is prone to memory leaks if a return path is missed. Fix the runtime PM handling by using the new scoped guards and proper error checking: - In kxsd9_write_raw() and kxsd9_read_raw(), use the scoped PM_RUNTIME_ACQUIRE_IF_ENABLED_AUTOSUSPEND() macro to safely automate cleanup on function return, while maintaining the behavior of waking up a suspended device via pm_runtime_resume_and_get(). This allows us to cleanly remove all manual puts and error gotos. - In kxsd9_buffer_preenable(), replace pm_runtime_get_sync() with pm_runtime_resume_and_get() to safely check for errors and handle usage-counter unwinding on failure. - In kxsd9_common_remove(), replace pm_runtime_get_sync() with pm_runtime_resume_and_get() and only invoke kxsd9_power_down() if the resume succeeds. This prevents unbalanced regulator disable warnings and bus timeouts if the device is already suspended. Signed-off-by: Biren Pandya --- drivers/iio/accel/kxsd9.c | 50 +++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 26 deletions(-) diff --git a/drivers/iio/accel/kxsd9.c b/drivers/iio/accel/kxsd9.c index 4717d80fc24a..f23d1660e6da 100644 --- a/drivers/iio/accel/kxsd9.c +++ b/drivers/iio/accel/kxsd9.c @@ -139,68 +139,63 @@ static int kxsd9_write_raw(struct iio_dev *indio_dev, int val2, long mask) { - int ret = -EINVAL; struct kxsd9_state *st = iio_priv(indio_dev); - pm_runtime_get_sync(st->dev); + PM_RUNTIME_ACQUIRE_IF_ENABLED_AUTOSUSPEND(st->dev, pm); + if (PM_RUNTIME_ACQUIRE_ERR(&pm)) + return PM_RUNTIME_ACQUIRE_ERR(&pm); if (mask == IIO_CHAN_INFO_SCALE) { /* Check no integer component */ if (val) return -EINVAL; - ret = kxsd9_write_scale(indio_dev, val2); + return kxsd9_write_scale(indio_dev, val2); } - pm_runtime_put_autosuspend(st->dev); - - return ret; + return -EINVAL; } static int kxsd9_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, long mask) { - int ret = -EINVAL; struct kxsd9_state *st = iio_priv(indio_dev); unsigned int regval; __be16 raw_val; u16 nval; + int ret; - pm_runtime_get_sync(st->dev); + PM_RUNTIME_ACQUIRE_IF_ENABLED_AUTOSUSPEND(st->dev, pm); + if (PM_RUNTIME_ACQUIRE_ERR(&pm)) + return PM_RUNTIME_ACQUIRE_ERR(&pm); switch (mask) { case IIO_CHAN_INFO_RAW: ret = regmap_bulk_read(st->map, chan->address, &raw_val, sizeof(raw_val)); if (ret) - goto error_ret; + return ret; nval = be16_to_cpu(raw_val); /* Only 12 bits are valid */ nval >>= 4; *val = nval; - ret = IIO_VAL_INT; - break; + return IIO_VAL_INT; case IIO_CHAN_INFO_OFFSET: /* This has a bias of -2048 */ *val = KXSD9_ZERO_G_OFFSET; - ret = IIO_VAL_INT; - break; + return IIO_VAL_INT; case IIO_CHAN_INFO_SCALE: ret = regmap_read(st->map, KXSD9_REG_CTRL_C, ®val); if (ret < 0) - goto error_ret; + return ret; *val = 0; *val2 = kxsd9_micro_scales[regval & KXSD9_CTRL_C_FS_MASK]; - ret = IIO_VAL_INT_PLUS_MICRO; - break; + return IIO_VAL_INT_PLUS_MICRO; } -error_ret: - pm_runtime_put_autosuspend(st->dev); - - return ret; + return -EINVAL; }; static irqreturn_t kxsd9_trigger_handler(int irq, void *p) @@ -239,9 +234,7 @@ static int kxsd9_buffer_preenable(struct iio_dev *indio_dev) { struct kxsd9_state *st = iio_priv(indio_dev); - pm_runtime_get_sync(st->dev); - - return 0; + return pm_runtime_resume_and_get(st->dev); } static int kxsd9_buffer_postdisable(struct iio_dev *indio_dev) @@ -476,13 +469,18 @@ void kxsd9_common_remove(struct device *dev) { struct iio_dev *indio_dev = dev_get_drvdata(dev); struct kxsd9_state *st = iio_priv(indio_dev); + int ret; iio_triggered_buffer_cleanup(indio_dev); iio_device_unregister(indio_dev); - pm_runtime_get_sync(dev); - pm_runtime_put_noidle(dev); + + ret = pm_runtime_resume_and_get(dev); pm_runtime_disable(dev); - kxsd9_power_down(st); + + if (ret >= 0) { + kxsd9_power_down(st); + pm_runtime_put_noidle(dev); + } } EXPORT_SYMBOL_NS(kxsd9_common_remove, "IIO_KXSD9"); -- 2.50.1 (Apple Git-155)