From nobody Mon Apr 6 19:44:45 2026 Received: from mail-pj1-f45.google.com (mail-pj1-f45.google.com [209.85.216.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 6927E3B7B95 for ; Wed, 18 Mar 2026 09:30:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773826205; cv=none; b=fpj29n3/OzQfSR8fAJhxqkaA1cX9Aifx5cOQHN0paWNaittUd2ogeyDAQPekgi6E6p4M+SNnTLcJiClACJ5bcjS9FVubtiTu1Dt+3EM5Xm2xkCEypqCFeAt4T2DxVszfXwfC8UzpTj5AgWjSXpEFHUuX/j/oiQJeLp0thQPfLOA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773826205; c=relaxed/simple; bh=Tk8gsHUA/br8aqrC1iyhj1FHWqR7iTwilxeIVhkRv9w=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Kdna3HAAJs0SMLXY6D0EVxSUFGG0/rOI7OHQYhemn0K1angn3gJvJmVB+E2fYw+6YlVNSX5QCTDy2drLrF/wB7Fyns0RCPBNzfPapWvf/ASnV9hFiu5YhDy0NrWgkr1PhClmNLADYf29JiEI8ZWg8W2X5oDIE4NIxYY788bE3Sg= 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=AOHjbepp; arc=none smtp.client-ip=209.85.216.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="AOHjbepp" Received: by mail-pj1-f45.google.com with SMTP id 98e67ed59e1d1-35a09e0dd63so7587463a91.3 for ; Wed, 18 Mar 2026 02:30:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773826200; x=1774431000; 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=9q1E7NzrKrJ5QZEJfz50RfWy0GA0rHOKbA0v+tdNbCk=; b=AOHjbeppezO+IB3o22PtkZEljCIWN/f0U085hTyGBxAj3qPKpiDn5BLbyYpNasceuT iLhEASduwPMzmBipPm3hM8boqad5dzc0xGvLILa5TDx1xxXvDiZBBUW1Z99CAJw5r7az fCZk2DNUxLxZzx+wvW7DVT9Yfz2dnrblVUnRA/RTH1jgKkRMU7O2/+w1GOegaicRQv4X MUAThMAJB2ejYYb2OR0ZyzeQ1ibT+U+saTpK+4DH618dziDEQnXsdGsFkOBH4qm4DONw uv4HD0wauiklnpmccpJY865hb1oLRDdUxKDZwwfjpEb8XQBt8NcTQFT86lr1X4km+NIK 2ucg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773826200; x=1774431000; 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=9q1E7NzrKrJ5QZEJfz50RfWy0GA0rHOKbA0v+tdNbCk=; b=KTfsUJ5JnwHGLPOEb2TCHn/pcL/YAUCIeAIMqY+ClGQ0DKdSfosO0sbOUo8Ao0FAjS HP0eaaWHYpuimCV77ZQLTnSph3MkxGE101lKOcwkg21aFCrGf9YCjo8fIHUN2wTawRNM jdlmA4OXymti0Z0dFozgEcmAgwio3pcflyo2UgYtjcXJwqntzx3S1BzZJltpdMr+MAlq jal7dgkjxD8kvkIpFRZg0gvh56otSCx5Bs4KtDDLM7FGYw1xTua4JHOWLbjpIDNgg2fP 7WM0CnT3APXIAyQtHBOhSLpxeLgjYaSoLr5XCkKwtmgTlgckUCx/YX6arOYyvav5/7nm XWZQ== X-Forwarded-Encrypted: i=1; AJvYcCVv+HcEg/6Dc+5SLa1aL0hCpiQ/NaxttN34mE5JyXUtFA8t/LAO9aT2lrr2C4la1wxnx1Hn5jIgMtO+yqM=@vger.kernel.org X-Gm-Message-State: AOJu0YwtoBiLZ3I47u+tJIbaJtKx6G4TB9Ir7nMUbHF4XwtsqZF7Fvfn D/aGQgQA/zRuwxhry7ZDOp/S+4ykbdS7PluxAW4L/71OOK1oxH4Chi2M X-Gm-Gg: ATEYQzy0xtw6ks/nwmgL2DuBDYDI5a1HZO7pRh6ZKi34qvrBLZsEYW9mlTw05GRCvSY vyX2JDM2TU56nRb9hVxEf7LptP7cVEb8cSUNYpPHt2IvKww72B1WUEj2tSgWQ6mLiA532Bjx3tt COqLUFzsfY3L3oPXmDXdlkwWzjKYy8GCtvwff1Fh2wtCmp5EwxdtBRjlpzML3tVkOPhUZgV1cbt CK8qex9t5D68PSt0LIZeZbpDILzjUt1zRZuFMjL7Rcl0k77d+3H15DYU5jALsowFX40909lUOh2 fDjwBsE0WJRuo6IihJoXVdJy20ESkCNuMI3aC2a10MkWVLxV0mIjlvKo4zXNt7LjwW/bVafS9Bn ptYuAe7KLxmi69zMj6wz11UtyPYJbVeEQE3Sqrm5QP1d9Flr2bl1AFZjFbautZ4Za41V+thZ470 +xbuuAaXwGqo89/BXq0VUiOVccNK0MfZlgyOftGp8MBVkJWM3kg+j4SRfNxdDB3F0YzNg3R7qY X-Received: by 2002:a17:903:2445:b0:2ae:ceb0:d5eb with SMTP id d9443c01a7336-2b06e30fcadmr29723885ad.6.1773826200285; Wed, 18 Mar 2026 02:30:00 -0700 (PDT) Received: from debian.ari ([152.58.182.62]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b06e616351sm21168315ad.67.2026.03.18.02.29.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Mar 2026 02:29:59 -0700 (PDT) From: Archit Anant To: jic23@kernel.org, lars@metafoo.de, Michael.Hennerich@analog.com Cc: dlechner@baylibre.com, nuno.sa@analog.com, andy@kernel.org, linux-iio@vger.kernel.org, linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org, Archit Anant Subject: [PATCH v5 4/4] iio: adc: ad799x: use devm_iio_device_register and drop remove() Date: Wed, 18 Mar 2026 14:57:15 +0530 Message-Id: <20260318092715.42538-5-architanant5@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260318092715.42538-1-architanant5@gmail.com> References: <20260318092715.42538-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 | 62 ++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 37 deletions(-) diff --git a/drivers/iio/adc/ad799x.c b/drivers/iio/adc/ad799x.c index ae2ad4bd37cc..3d745612bb80 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,13 +813,17 @@ 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; + return ret; st->vref =3D NULL; dev_info(dev, "Using VCC reference voltage\n"); } @@ -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