From nobody Mon Apr 13 08:43:17 2026 Received: from mail-pf1-f175.google.com (mail-pf1-f175.google.com [209.85.210.175]) (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 752763242D4 for ; Sun, 12 Apr 2026 09:38:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775986709; cv=none; b=o3tzi+MZEjBdfIJM7arUbYznYLZ7MeARQ1z3pdXzb5loY2qfW7MYmB3cpkczsLaXC/axBwLl80UoBL4+elkghSDjI9DFnQWw4/omZ/+eZZJJo3y1Vo1Z5kIJPXSvR02Jcos12xI2yTCPsfrfMDkMf5IJW+HZMQmbbdbh4Z3LW/k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775986709; c=relaxed/simple; bh=fKhxy+uUkv7uyoUtuBiGeXl0glQsbzn+BjMiYVG5E10=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=ZngUPS1luvcWBUPUU9FuyhhCCqu6eL74z0HOz3RxZtwxl/CLiPieKdxWbZSFf9kBZNYKmZBENym3HRPrFFJstf11yVManbvT9Q8PaNzl8/IZhMjJQnZoOz1vC0xok//qpQ0gZDiBsPqsMBQq7uFy0BVIUoCF1p9t5Pbj7GXLkDY= 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=tDMKJSrI; arc=none smtp.client-ip=209.85.210.175 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="tDMKJSrI" Received: by mail-pf1-f175.google.com with SMTP id d2e1a72fcca58-824c9da9928so2476998b3a.3 for ; Sun, 12 Apr 2026 02:38:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775986708; x=1776591508; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=I5lS9m0YKF/AhL70UDdpLWZKYq+rkGRCMnHCx58rcr0=; b=tDMKJSrIJgC1UC4OoirqjIw8UXeRMvAwFDU6Ul5uiGz2IcoYRx57aeLFykBcj3RJwv bq2oGqqKmUpk1h0/hQtlGJ4UM9yulo8DBSrd00DfefHSlFe5v6/4QaXzdBX0391BYPzD 87r3X31IQBpoDYCJPoLq9oLzfiTktShe+BOXLAy8ABUE7+a8P3mz4Fz5a1e4OMxchPSP WvRaIz1Dq/bpJAm0bL2ztftUZkFxvmdpchXpHo9gg/uChGtwgrPi5XIOELixvRfvgbL6 Z/uqZfpR9I4ld9BotVqus6+KX7/A8jXDMG7+zQbZfi52FzV6FlczcQXko7QdMGhay4oY Cfxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775986708; x=1776591508; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=I5lS9m0YKF/AhL70UDdpLWZKYq+rkGRCMnHCx58rcr0=; b=cy5tXYCeU0mOd/6I9v3zPfi8uschlLBbEUXhKuEqI2jnyJmjbMPOq2fWLpI8mIH+kR NQ6DQRaAdf2Dhc7+2o6XqcajbteDC+gIDXdZOfomZqSMSkycbGrenzmpkO0PUKSrLkkl /z1nus0aspfHYve5TAP1XWy4NHV8Td0pxeefWm8O7KdxdXDL2e6A20N7iqZIrKLU4RTn e/SD8EYn8ymvz2NTI/5HhJblpRF0EouEfa7fIgsdUo/gAAmUkdIq+LZONdq9BocIdaNM 1jbrUymwdMKsMUNktpraMKYmR1GkoistO4uBbj9mLBjb3m9HB7+lNadsP1rTCRHbX4Om qjxA== X-Forwarded-Encrypted: i=1; AJvYcCUPh2evGKzmvdqatwwKQ3wixRoQUDjchdXWlwR5OILqPBTHHkTF29SEQUAlRqJ2GNwi04eJkxhFO/b/sVg=@vger.kernel.org X-Gm-Message-State: AOJu0YxlDA+glCDmAtZh0zAC7h35cfovrITMJNIYu0qVJIX6MmOWAV9M wW2496mZ5akkzqqD6A8pjgHSGyBkt1YJCQljkpvHyRRvG1I1tanMjMUI X-Gm-Gg: AeBDietp2ZzqPcA2J0T3YUl4hdujQRM7Xp2UYUaysTpf10BRiol8mWfFIesyAmC8GjI 2Sp3SQL8rgIDVX0Sg9eQ2shXKN/rV2uEMnBQCrNqEczAi4TvbPaf0/UfZFjJ6EUplg36WGxuDAB Ql93U87iXZLBAW9NTeu/REN0qIur8A+oAEpDEOUjx8Xk3iHRYnQlPC1RIt6ciVoZlauAdCpYKbB kGuw3+NxXzEu6hPCajitPTBV7cmrH7x3ZtAwwHhNv+62QukODIbJQpxX9vq0EVqzwHNAlM25+E8 3UWqA9Eg3tMhpMuYS7LYTk1vn8JyxIbA8nmK4Sxlbl4R/BitnXJYVEqSpFs0tT8L6HAvg4SinmJ 8n0Tq9ul8TSrCJ++OCiHaOkQgNq1qxsbOITLQMUxyrOmSicZdf7hPYoYFFlmybaG9zM2W93msLZ U8MznyIK1dSBdLSuIj56R5Ijmsd6hwjJYG98u9NNJ4vhDf3kEcetKeA1tqzfr2gzsNLj6MYZmV X-Received: by 2002:a05:6a00:408d:b0:82a:8163:4bf4 with SMTP id d2e1a72fcca58-82f0c27749cmr10120883b3a.46.1775986707878; Sun, 12 Apr 2026 02:38:27 -0700 (PDT) Received: from debian.ari ([152.56.156.42]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82f0c36130csm7885038b3a.24.2026.04.12.02.38.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 12 Apr 2026 02:38:27 -0700 (PDT) From: Archit Anant To: jic23@kernel.org, dlechner@baylibre.com Cc: lars@metafoo.de, Michael.Hennerich@analog.com, nuno.sa@analog.com, andy@kernel.org, linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org, Archit Anant , Andy Shevchenko Subject: [PATCH v8 5/5] iio: adc: ad799x: convert to fully managed resources and drop remove() Date: Sun, 12 Apr 2026 15:07:39 +0530 Message-Id: <20260412093739.17116-6-architanant5@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260412093739.17116-1-architanant5@gmail.com> References: <20260412093739.17116-1-architanant5@gmail.com> 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" Convert the driver's remaining manual resource management to use the devm_ infrastructure, allowing for the complete removal of the ad799x_remove() function and the simplification of the probe error paths. Specifically: - Initialize the mutex using devm_mutex_init() and move it to the top of probe() (before IRQ registration) to prevent a race condition where an interrupt could attempt to take an uninitialized lock. - Use devm_add_action_or_reset() to ensure that the VCC and VREF regulators are disabled safely and in the correct order during driver teardown or probe failure. - Refactor the optional VREF error handling path for better readability. - Convert iio_triggered_buffer_setup() and iio_device_register() to their devm_ variants. Because all resources are now managed by the devm core, the unwinding order is guaranteed to follow the reverse order of allocation. All manual error handling goto labels in ad799x_probe() have been removed. Suggested-by: Jonathan Cameron Suggested-by: David Lechner Suggested-by: Andy Shevchenko Reviewed-by: David Lechner Signed-off-by: Archit Anant --- drivers/iio/adc/ad799x.c | 70 +++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 41 deletions(-) diff --git a/drivers/iio/adc/ad799x.c b/drivers/iio/adc/ad799x.c index e37bb64edd2b..0ceedea5df0b 100644 --- a/drivers/iio/adc/ad799x.c +++ b/drivers/iio/adc/ad799x.c @@ -775,6 +775,11 @@ static const struct ad799x_chip_info ad799x_chip_info_= tbl[] =3D { }, }; =20 +static void ad799x_reg_disable(void *reg) +{ + regulator_disable(reg); +} + static int ad799x_probe(struct i2c_client *client) { struct device *dev =3D &client->dev; @@ -794,6 +799,10 @@ static int ad799x_probe(struct i2c_client *client) /* this is only used for device removal purposes */ i2c_set_clientdata(client, indio_dev); =20 + ret =3D devm_mutex_init(dev, &st->lock); + if (ret) + return ret; + st->id =3D id->driver_data; if (client->irq > 0 && chip_info->irq_config.info) st->chip_config =3D &chip_info->irq_config; @@ -809,15 +818,19 @@ static int ad799x_probe(struct i2c_client *client) if (ret) return ret; =20 + ret =3D devm_add_action_or_reset(dev, ad799x_reg_disable, st->reg); + if (ret) + return ret; + /* check if an external reference is supplied */ if (chip_info->has_vref) { st->vref =3D devm_regulator_get_optional(dev, "vref"); ret =3D PTR_ERR_OR_ZERO(st->vref); - if (ret) { - if (ret !=3D -ENODEV) - goto error_disable_reg; + if (ret =3D=3D -ENODEV) { st->vref =3D NULL; dev_info(dev, "Using VCC reference voltage\n"); + } else if (ret) { + return ret; } =20 if (st->vref) { @@ -825,10 +838,15 @@ static int ad799x_probe(struct i2c_client *client) extra_config |=3D AD7991_REF_SEL; ret =3D regulator_enable(st->vref); if (ret) - goto error_disable_reg; + return ret; + + ret =3D devm_add_action_or_reset(dev, ad799x_reg_disable, st->vref); + if (ret) + return ret; + ret =3D regulator_get_voltage(st->vref); if (ret < 0) - goto error_disable_vref; + return ret; st->vref_uV =3D ret; } } @@ -836,7 +854,7 @@ static int ad799x_probe(struct i2c_client *client) if (!st->vref) { ret =3D regulator_get_voltage(st->reg); if (ret < 0) - goto error_disable_reg; + return ret; st->vref_uV =3D ret; } =20 @@ -851,12 +869,12 @@ static int ad799x_probe(struct i2c_client *client) =20 ret =3D ad799x_update_config(st, st->chip_config->default_config | extra_= config); if (ret) - goto error_disable_vref; + return ret; =20 - ret =3D iio_triggered_buffer_setup(indio_dev, NULL, + ret =3D devm_iio_triggered_buffer_setup(dev, indio_dev, NULL, &ad799x_trigger_handler, NULL); if (ret) - goto error_disable_vref; + return ret; =20 if (client->irq > 0) { ret =3D devm_request_threaded_irq(dev, @@ -868,39 +886,10 @@ static int ad799x_probe(struct i2c_client *client) client->name, indio_dev); if (ret) - goto error_cleanup_ring; + return ret; } =20 - mutex_init(&st->lock); - - ret =3D iio_device_register(indio_dev); - if (ret) - goto error_cleanup_ring; - - return 0; - -error_cleanup_ring: - iio_triggered_buffer_cleanup(indio_dev); -error_disable_vref: - if (st->vref) - regulator_disable(st->vref); -error_disable_reg: - regulator_disable(st->reg); - - return ret; -} - -static void ad799x_remove(struct i2c_client *client) -{ - struct iio_dev *indio_dev =3D i2c_get_clientdata(client); - struct ad799x_state *st =3D iio_priv(indio_dev); - - iio_device_unregister(indio_dev); - - iio_triggered_buffer_cleanup(indio_dev); - if (st->vref) - regulator_disable(st->vref); - regulator_disable(st->reg); + return devm_iio_device_register(dev, indio_dev); } =20 static int ad799x_suspend(struct device *dev) @@ -970,7 +959,6 @@ static struct i2c_driver ad799x_driver =3D { .pm =3D pm_sleep_ptr(&ad799x_pm_ops), }, .probe =3D ad799x_probe, - .remove =3D ad799x_remove, .id_table =3D ad799x_id, }; module_i2c_driver(ad799x_driver); --=20 2.39.5