From nobody Mon Jun 8 10:57:07 2026 Received: from mail-wm1-f45.google.com (mail-wm1-f45.google.com [209.85.128.45]) (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 26085478E53 for ; Fri, 29 May 2026 18:37:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780079841; cv=none; b=M4fE2figxJGUNEweKHmyigVyZKLrhspNjzfXvk4wxg1ezTzFB9dmT2ncpVVcY914vZp8nb0gLOfNkRe0nBzSxp7kk9FOjWs75f7sfhz2cxePgB7B2E2JC4yFlvgmSsWNCqZp75cCcTAsjG2soyd/K4HdKiCiZUu4H9FQ8uLjTvk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780079841; c=relaxed/simple; bh=4kYvBVIyxbZc3wN4nTs2bf6YuCzG0XhcPUB/ns1CWpY=; h=From:To:Cc:Subject:Date:Message-Id:MIME-Version; b=kQ/+237NewB6GiZOf3vJP6ssSyX7vksKghSI3wL52Xet17yQmKBGRhojKWw83/Hh+2RnRtZWv45gMf3ApldvFWqimhRz+sZ9KrGoeXNsxgDS3Dy6X95GZu8bxJ/MNHOosbiDPllY/MjkfAMzBByijKzCuTGze2kJ26d9TC0wrmc= 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=d30sJnjB; arc=none smtp.client-ip=209.85.128.45 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="d30sJnjB" Received: by mail-wm1-f45.google.com with SMTP id 5b1f17b1804b1-48962cd0864so11803385e9.1 for ; Fri, 29 May 2026 11:37:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1780079834; x=1780684634; 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=S/m4QFm7x6hshNVSS9JbTtp77lFuR+iDM6hBxOl/wts=; b=d30sJnjBjDm25cyvNEpoBxOBvYO6g6xlA7hX/IIgC/RDMBgbz0pQv/BXQgQDVdXJJE 25hPQzNhCQBxNaX4Y6HDjSZoJof17r/tNqQSz6Dco4dOiJmySoSsXxwrcRYTwVtZVIzC rb6mJYwiPEP7g1ATguZgMr2KPdSUjpVQ2+1FIV7rnHY5W8MMU7dtZfRWdU9W8Xm0xvxq 8cgfIvFrBFkses3N3CC92SeHS/QRlyC2MavpIUr/XgJpX/T92Qj+IfKEb4qz9t+PW9ja MGWdl+OIYxKmi7KlPJ5TxliClp5d/gFsc8uoAFlDFZBpR3Xk2lZ31MWCwYG56rBupxsF aaVA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780079834; x=1780684634; 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=S/m4QFm7x6hshNVSS9JbTtp77lFuR+iDM6hBxOl/wts=; b=W0XWGtRe7XiNkkBIrmaL0FHvXQtBh02vik1UxjUlcBqnoPr9bJ7yglj4o/toOZKgxO FJPPRF9DivImZaatndgyrNPaEO0gUO+Oy6Ai0Sz5AexirjSIh24RBll/xxPvYgBPr6eT SMQ81CuG/nmz11fxHDbbG+ZC2pryD8eUR73hJp8ohrIRr23U2JOnShetAR7vCOK/l2uh sIqMmv6jVV/oMZXLa4+Mol0Qf7Yuux1NnVkSgdEjOcvTvUbDQl8KM14JB8AAl2+6OlLZ rr7NmaZrNfnlH3INYLuonWxQV1LCvubTKnDjmLfGSphrqz4WCZub3v/Z3QBILMUYM3Zs TnVw== X-Forwarded-Encrypted: i=1; AFNElJ/PXytrenPyTAJKLJw4DNDxQUdSKqs8czvq++irKoRanSojvLOCBS8dB09jRQix1APVWUD1whe8pGaOTeM=@vger.kernel.org X-Gm-Message-State: AOJu0YzBpYLrXduflYf563u0ovizn2Ouh2uFBaAGzmNQzeeo1PIzyPhj /JohkmSKUWHKkRudZB3NqvxRWVSDRXCxl4SMePsIE8fdXlNpNzW9DCAd X-Gm-Gg: Acq92OEUQY6XtlGD29HYs9a4S1dCn3ZcDAZp7uPJuXONPbG5mxsNwcnmdnva5iiPxPA LOBd33EwSzxfORVlSIImuKQm6IM2JYLvD1nWx9Gzx0xWghvdQSU4lIHnOxXlHgGMiBBVPnaeQRJ ASc0V0YVONQ/fMOBx01RrTuufYVEG7qlvrgjF5hhju9FbAB0FUKT8yd5b1v7GolntJ5YQ+OdVtI ZXkR4zW2tYc9Gt+5a71ahveFZwecCUXkO0j+U1klyQXbGVtLOElxVIbhnfcgWfZe6sHaraz9K3E Xhgs6GvIJ8bGWVeC5Eg28ECvjPVat+qwFgae39MkRBdy+RuN/Hk9KEGRlF3v5Nfh1RMccxtSMoR ioQTGWChyys+tQTLSpqFK8rNTsWKdDpQEahU7LbkhKDS8UqlH56ALmLy9fDJI5sHFTIoVU+fWxC z1VhTUaHH/TJzbuRj7TxIoElLnvX8vKt9M+rfQMXzpx9Qzwq8Hxc2xhtNQCGQlWt2IbA== X-Received: by 2002:a05:600c:4f8e:b0:490:6238:c5d0 with SMTP id 5b1f17b1804b1-490a290ce4dmr6140515e9.1.1780079834202; Fri, 29 May 2026 11:37:14 -0700 (PDT) Received: from localhost.localdomain ([82.215.118.79]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-45ef34c3081sm5740555f8f.15.2026.05.29.11.37.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 29 May 2026 11:37:13 -0700 (PDT) From: Stepan Ionichev To: jic23@kernel.org Cc: dlechner@baylibre.com, nuno.sa@analog.com, andy@kernel.org, joshua.crofts1@gmail.com, linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2] iio: adc: ti-ads1015: use devm helpers to fix probe error paths Date: Fri, 29 May 2026 23:37:08 +0500 Message-Id: <20260529183708.17819-1-sozdayvek@gmail.com> X-Mailer: git-send-email 2.33.0.windows.2 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Once ads1015_probe() gets past ads1015_set_conv_mode(CONTINUOUS), two resources leak on its error paths and on driver unbind: - pm_runtime_enable() is left enabled if iio_device_register() fails; on subsequent probe/rebind the runtime PM tracking complains about an unbalanced enable. - The CONTINUOUS conversion mode written to the chip is never restored on any error path after that point, so on probe failure the chip is left running. Convert all three teardown operations of ads1015_remove() to devm so that the error paths and the unbind path share the same unwind in reverse-of-setup order: - ads1015_set_conv_mode(SINGLESHOT) becomes a devm action registered immediately after CONTINUOUS mode is enabled. - pm_runtime_enable() becomes devm_pm_runtime_enable(). - iio_device_register() becomes devm_iio_device_register(), so the iio device is unregistered first on unbind. ads1015_remove() is no longer needed and is dropped. Signed-off-by: Stepan Ionichev --- v2: - Full devm conversion: register a devm action for set_conv_mode(SINGLESHOT= ), switch to devm_iio_device_register, drop ads1015_remove() entirely. This avoids mixing devm with manual unwind (Jonathan) and also fixes the pre-existing continuous-mode leak on probe failure. - Drop the unrelated dev_err() -> dev_err_probe() conversion from v1 (Joshu= a). v1: https://lore.kernel.org/all/20260529101011.3030-1-sozdayvek@gmail.com/ drivers/iio/adc/ti-ads1015.c | 44 +++++++++++++++--------------------- 1 file changed, 18 insertions(+), 26 deletions(-) diff --git a/drivers/iio/adc/ti-ads1015.c b/drivers/iio/adc/ti-ads1015.c index c7ffe47449e2..d7f4d0d5bcf9 100644 --- a/drivers/iio/adc/ti-ads1015.c +++ b/drivers/iio/adc/ti-ads1015.c @@ -930,6 +930,17 @@ static int ads1015_set_conv_mode(struct ads1015_data *= data, int mode) mode << ADS1015_CFG_MOD_SHIFT); } =20 +static void ads1015_power_down(void *p) +{ + struct ads1015_data *data =3D p; + int ret; + + ret =3D ads1015_set_conv_mode(data, ADS1015_SINGLESHOT); + if (ret) + dev_warn(regmap_get_device(data->regmap), + "Failed to power down (%pe)\n", ERR_PTR(ret)); +} + static int ads1015_probe(struct i2c_client *client) { const struct ads1015_chip_data *chip; @@ -1030,6 +1041,10 @@ static int ads1015_probe(struct i2c_client *client) if (ret) return ret; =20 + ret =3D devm_add_action_or_reset(&client->dev, ads1015_power_down, data); + if (ret) + return ret; + data->conv_invalid =3D true; =20 ret =3D pm_runtime_set_active(&client->dev); @@ -1037,33 +1052,11 @@ static int ads1015_probe(struct i2c_client *client) return ret; pm_runtime_set_autosuspend_delay(&client->dev, ADS1015_SLEEP_DELAY_MS); pm_runtime_use_autosuspend(&client->dev); - pm_runtime_enable(&client->dev); - - ret =3D iio_device_register(indio_dev); - if (ret < 0) { - dev_err(&client->dev, "Failed to register IIO device\n"); + ret =3D devm_pm_runtime_enable(&client->dev); + if (ret) return ret; - } - - return 0; -} =20 -static void ads1015_remove(struct i2c_client *client) -{ - struct iio_dev *indio_dev =3D i2c_get_clientdata(client); - struct ads1015_data *data =3D iio_priv(indio_dev); - int ret; - - iio_device_unregister(indio_dev); - - pm_runtime_disable(&client->dev); - pm_runtime_set_suspended(&client->dev); - - /* power down single shot mode */ - ret =3D ads1015_set_conv_mode(data, ADS1015_SINGLESHOT); - if (ret) - dev_warn(&client->dev, "Failed to power down (%pe)\n", - ERR_PTR(ret)); + return devm_iio_device_register(&client->dev, indio_dev); } =20 #ifdef CONFIG_PM @@ -1150,7 +1143,6 @@ static struct i2c_driver ads1015_driver =3D { .pm =3D &ads1015_pm_ops, }, .probe =3D ads1015_probe, - .remove =3D ads1015_remove, .id_table =3D ads1015_id, }; =20 --=20 2.43.0