From nobody Thu Apr 2 20:26:38 2026 Received: from mail-pl1-f171.google.com (mail-pl1-f171.google.com [209.85.214.171]) (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 DFC08341660 for ; Thu, 26 Mar 2026 18:05:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774548361; cv=none; b=tqgrrCzk2xOWGfQMmmen7CxzrZcj8xYC2Qd9LhdobLotIO4d6cwXc1VgEkaaQSGTNH/UWYjk9Ul0eUJObtc+gIB/4s1467sgzh6bmy3u0OtFDlTJ6X3NJikchNEk+wdqri86x5s9WSCpUmv7A6YgokCsONc6c1q7RAa6FqCNbSc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774548361; c=relaxed/simple; bh=/819GhgVQ0f1i/VhmZvxWpH70/XmEbCIvtzBQyZG8Uo=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=F44mdqgXRziL3buLxvrv+B4StzuHAbkM0LRs3V6iHAAJYyWr0M6KgQwCFiIdvPmZzYU3L0At1GscbJ+0+Z6TbF8xGZNkRSyU0AlC3kW+dsYdlg/GNQn39LkyOglQ1SE1r12+z9qtNf18dP4QY1vtB4Bw96/Nj3OAMwHxHsc7tWI= 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=nnQGkdvY; arc=none smtp.client-ip=209.85.214.171 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="nnQGkdvY" Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-2ad617d5b80so8400035ad.1 for ; Thu, 26 Mar 2026 11:05:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774548358; x=1775153158; 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=3ATvkbzTX4jbWmEQzoe5/614PGWtMpERJNWTbS3U6No=; b=nnQGkdvYcdLKRMLJCES3aAEf1/94ExzPmhCyJV9ze+sjsKonA/NwgXnO6mZSU5oNN7 mXOgrz7Oe/jKBdUK9LEJmXyeFys8Qar+lKE/BxyAIZOkVLThE/LOMo0Ot1YnLgL0Bfrg UF54Cvs/E8eJQSMvuJo8HTIzH17dz1cQvuOsUYoxbSZ5Ga05RUBQ4Ipnn80CfTUMohqx Iy8j9NUaDvkp7Yz3ZJjh0fx4RbnMRJADngwB4v/XulP4boq23hqoCQi4ITFu3N9JUOzV KdMSFU4oFDiI5uSWfJQMQpEwMPwnyeRDhuOpd5V3n8X7jt2gCYq74QYT4OkWGFJf/Cwv M/sQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774548358; x=1775153158; 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=3ATvkbzTX4jbWmEQzoe5/614PGWtMpERJNWTbS3U6No=; b=CcIvFMHwLRWclwKOcy2g4Unroo38ZVHgEZoEC12zPNrBvbgw1sDpUJ7N6bJuom9F7I Sn0fn+fDV4IT2X6skG9wkSmqLLqRGNeJ3x+TqO9Wg6+sPtevMmugvK8c7l5FV9XB6/C4 7gRGMh4RAnHLD6YQ7BqtS8wusIR7wO9vg2L8SuvJjyblIMIMvaJDUcWzNpxYqf0lbJ8O sOGCmZ2QoPOA7g5oBRUxH5b7eJzTYs5YozW8cnm8BTaWdmKiF0JpLLeo/4prU0kMFzoA mHv17uJHdLo12JkTw2iKnBn7PGiHj9DkBxOUAS1U6yedafQnZbuCl3kmy7IybhE4Behy CpaQ== X-Forwarded-Encrypted: i=1; AJvYcCXzjMppAlH+Kyf8rZZrLZ+HgOj3n0/p3hm5g04CC/+PDS0YI4Eo3ZmUf6j1kyv6Jq6/nlOThEaRL2/gACs=@vger.kernel.org X-Gm-Message-State: AOJu0YwMmYCK1AQii45E1lli22c90Ps4XLkHXIgzyl0bTKVylNF6bGYp YfBKjTJvqcnpU9q99JT5jaUFDgYb/iU2D+nqPiRQNWPKmxnfmcwvXo15 X-Gm-Gg: ATEYQzzmvdWxQQEE7UgW0CCuNTUNbj3tcZ0VpNlSzPvbSqgsIiEYGKFYZQkP0YHWjGU UAxM7hsz8+jT1W8SdeTVcK+a0ZJIUk5Voweg+F683Du0JKYcfhLUPUUPwV4HcZtxcxIDd1oJZL6 sinjfNmv0j/FLLyvlNDxMQy50GKb1j5zYc/XQDf03CNT/5do8FeWqkGtmDKZ3QtfajqE/AensvL Y9g8gWnw52bL06oQ9MSptWuqKyaZRFQ3yXwDlCZ9SQIGUXy58ouoWUg1ztexwCYYMfOlMPjb3KL CmqooIXrZOEVyl3xcLO5lFbiRmDMUgJfx065y6o4lHW8hsNO8gGKTGjNubSC4KoK0IkI0WJ6uF0 9rRuiwvcclXRdwYyL9CccX0HUenwdKemp3ZXS8uNa7w0EVlNf2TPiTWyHXGr+ky8Z7vR1EJ/7QO muGYy0p2cxejBEhH89iMkt9XdS1BjXdRKh9eo+nyrggXL8KhL2r/2Dy8vnBgO1LmWTv/4oRfWRS rA= X-Received: by 2002:a17:903:38cd:b0:2b0:7a50:886f with SMTP id d9443c01a7336-2b0b0b1dc00mr89275245ad.51.1774548357917; Thu, 26 Mar 2026 11:05:57 -0700 (PDT) Received: from debian.ari ([47.30.237.79]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b0bc7a17c5sm43823545ad.26.2026.03.26.11.05.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2026 11:05:57 -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 Subject: [PATCH v6 4/4] iio: adc: ad799x: use devm_iio_device_register and drop remove() Date: Thu, 26 Mar 2026 23:35:29 +0530 Message-Id: <20260326180529.19154-5-architanant5@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260326180529.19154-1-architanant5@gmail.com> References: <20260326180529.19154-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 to use the device-managed versions of iio_device_register(), iio_triggered_buffer_setup(), and mutex_init(). 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. Because all resources (buffer, regulators, IRQs, IIO device, mutex) are now fully managed by the devm core, the unwinding order is guaranteed to be correct (reverse order of allocation). We can now safely remove all manual error handling goto labels in ad799x_probe() and delete the ad799x_remove() function entirely. This eliminates boilerplate code and prevents potential resource leaks. Suggested-by: Jonathan Cameron Suggested-by: David Lechner Signed-off-by: Archit Anant --- drivers/iio/adc/ad799x.c | 66 ++++++++++++++++------------------------ 1 file changed, 27 insertions(+), 39 deletions(-) diff --git a/drivers/iio/adc/ad799x.c b/drivers/iio/adc/ad799x.c index 3cf7850357ab..c12bd7ed4dd7 100644 --- a/drivers/iio/adc/ad799x.c +++ b/drivers/iio/adc/ad799x.c @@ -774,6 +774,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; @@ -808,15 +813,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) { @@ -824,10 +833,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; } } @@ -835,7 +849,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 @@ -850,12 +864,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, @@ -867,39 +881,14 @@ 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); + ret =3D devm_mutex_init(dev, &st->lock); 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); + return ret; =20 - 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) @@ -969,7 +958,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