From nobody Thu Apr 9 14:56:38 2026 Received: from mail-pl1-f172.google.com (mail-pl1-f172.google.com [209.85.214.172]) (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 DFE9439524E for ; Sun, 8 Mar 2026 18:29:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772994565; cv=none; b=D9SRsSQTUKNHAr7eenYYxedHu+8WOtc8E9Ck5gW2PQLEAKGLXvIn0RaWrcIxLICtcf8+pScnW3KzKrT1Z52tBYmIhL7zDRNZABTWrTYNR43AP8FYmrRH7acjM02GGhpMvva9V/0YXlNu4Roq7a/z3O+hwclBtvjdLuJpMXGXlJk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772994565; c=relaxed/simple; bh=PjYmpT+k/BWReQwno+eCz8dspA5NeFBxuH/Bl2Dhj5Y=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Ek2XHpr7BgA2GMqqf9EXPyeWJ2w4WmNtCQtotCiZYNBIDl0N5d2XhLWu00TCAbHdZggiFa7H/JgKFXl6QoLfZri1Od5EpZ7ew9e3irStWW9Y6W7mkdRgdgnpn/GMVT4OfxL92W+WJD4Rp5f7lN/u2BAJ5N1T/SrF5B4LpDfUr5o= 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=GTp5seSQ; arc=none smtp.client-ip=209.85.214.172 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="GTp5seSQ" Received: by mail-pl1-f172.google.com with SMTP id d9443c01a7336-2ae8177446fso15957585ad.0 for ; Sun, 08 Mar 2026 11:29:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772994563; x=1773599363; 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=yYPf0gJQ1Xt4/WFQtvodMValHNTAraDsvu+wn3lhBJc=; b=GTp5seSQJ2cEgXnMysOTqfHRDrgjBKKltYnsHHBPXpluMLFtxa4x62SnGJe5L6ytI2 AEjPUPvJptN/J+3obiTvmo+GZfPHe3Qw4p5dhQnhV+PGxQ9D0tEpQz6BIF6Am7ol6YG7 b6eGA/XCfEp9EvOr92iebdY6gOxlTyRshq/wuvSdmSai5H/3P1y6LyyAG+btn8cWfRQf nCwUDeNQvl5HMXBEctK7h32jMtToWzTyHEFpRGaUB37thNUu1Kbv/38lqUSMNn0I9pPS 2umgHor1KJTGZaNnja14QQl0Adw6rSF+79mnzqWMXOg59WK9yrqktf2EmXGu3tCu4sJU M0Bw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772994563; x=1773599363; 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=yYPf0gJQ1Xt4/WFQtvodMValHNTAraDsvu+wn3lhBJc=; b=DrMJn+aCuS9DIayvvBxf4Zj7r23D0Phi/9QOkNseb/HtZTCHwCqw87Pstwemuo6SXk 7LXir1j8YUW1NF0/Ytqdfv6if/FfQTKEvhPAqubFzybnLwcqyMPnXwW5Tesqa+5pyWXY PZm2W5SoN82ELSq+gzAGkBoYSJM4LjttVgDXC9wwpI7YerkYCqYfRMRp7RSUhJvOL0YS n6zTbytfUUXsObAvqGjkpBAUkKlnA68z5ExVktsky2HZARcmaK5gDBo+nH5T6TPaJA3M 9BmVMfIZib3dS5KRVpE0XV8AW9NnYfQ35mo+gNPjAySbuqfFnSjGf4Io/LtTDvYZFcyK tQVw== X-Forwarded-Encrypted: i=1; AJvYcCW+xnE4zYt4i8v7oCeF/UT2Zu1ezVogXbwddY5lTBviQ2WnjN3rQ3WUCAEsWCAmbuOURuGMYkEeuYIB61o=@vger.kernel.org X-Gm-Message-State: AOJu0YwV0yFBl61viaH0zOb2xPJVgUrqJ/oh7K3hvU/w8LO9/tk2m1cy lquN5Itp0+iWWinoHQo60Qm1FthOxcme95w4V3uSfcv4RMLQo15j9hh/ X-Gm-Gg: ATEYQzztdzsSlwziSMKOOWLjcRejY+4z9ca4+H7NZVVPDucr5+O/pwV/08omicW4fQR 0TetbCIPPdKeN1ctsJAnXkFYsXyJ5gB+CXHJffmX+YUZ9Qkd8HR148a3WiJuI9P4jXlQI/YRkKP UozwtKfSBWaKQgZW3hm36lJcRbP7TG4FIAYFrXuo3bSumO+J4vUSrZOn9gQiEDp/azd3uqZDunI 9cZ1zyma3ZvOzKquRiPX8kkcfoNdkAGg8curTh3VVOIOo3g3RE/OsPqaZt06C9eIc1cGoMeZUHE 5dnwkDvQUdGNANfkOPvPWUt9Lq7O/bpnk3wcthGJA4EcjlCm0zA42OhrE0GrhW1DsjqQJASBQrb M5RSqbDfWP9UNYyrL3iGlCfa0PObCe2NHND7tH+5AlMiyyTc8qQnD0i+cbWRM/6AryyQXzXK/qt KXlOOmUpgID9AU9G8LiQaPAZhQ5W5gEjjYv7tExbz+ X-Received: by 2002:a17:903:3bc7:b0:2ae:3bb2:a8cb with SMTP id d9443c01a7336-2ae825046e0mr83539535ad.40.1772994563230; Sun, 08 Mar 2026 11:29:23 -0700 (PDT) Received: from debian.ari ([152.58.179.53]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2ae83f783dbsm89006965ad.42.2026.03.08.11.29.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 08 Mar 2026 11:29:22 -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 v4 3/4] iio: adc: ad799x: use devm_add_action_or_reset for regulators Date: Sun, 8 Mar 2026 23:58:10 +0530 Message-Id: <20260308182811.33471-4-architanant5@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260308182811.33471-1-architanant5@gmail.com> References: <20260308182811.33471-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 manual regulator_disable() handling to use devm_add_action_or_reset(). This guarantees that the regulators are disabled in the correct reverse order of allocation during device teardown or probe failure. As part of this conversion, introduce a local device pointer to simplify function calls and remove redundant goto labels for regulator cleanup, as the devm framework now handles these automatically. Suggested-by: David Lechner Suggested-by: Andy Shevchenko Signed-off-by: Archit Anant --- drivers/iio/adc/ad799x.c | 46 ++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/drivers/iio/adc/ad799x.c b/drivers/iio/adc/ad799x.c index 28f1901698a6..f5ef6ff97c89 100644 --- a/drivers/iio/adc/ad799x.c +++ b/drivers/iio/adc/ad799x.c @@ -773,8 +773,14 @@ 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; const struct i2c_device_id *id =3D i2c_client_get_device_id(client); int ret; int extra_config =3D 0; @@ -783,7 +789,7 @@ static int ad799x_probe(struct i2c_client *client) const struct ad799x_chip_info *chip_info =3D &ad799x_chip_info_tbl[id->driver_data]; =20 - indio_dev =3D devm_iio_device_alloc(&client->dev, sizeof(*st)); + indio_dev =3D devm_iio_device_alloc(dev, sizeof(*st)); if (indio_dev =3D=3D NULL) return -ENOMEM; =20 @@ -799,7 +805,7 @@ static int ad799x_probe(struct i2c_client *client) =20 /* TODO: Add pdata options for filtering and bit delay */ =20 - st->reg =3D devm_regulator_get(&client->dev, "vcc"); + st->reg =3D devm_regulator_get(dev, "vcc"); if (IS_ERR(st->reg)) return PTR_ERR(st->reg); ret =3D regulator_enable(st->reg); @@ -807,31 +813,38 @@ static int ad799x_probe(struct i2c_client *client) return ret; ret =3D regulator_get_voltage(st->reg); if (ret < 0) - goto error_disable_reg; + return ret; st->vref_uV =3D 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(&client->dev, "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(&client->dev, "Using VCC reference voltage\n"); + dev_info(dev, "Using VCC reference voltage\n"); } =20 if (st->vref) { - dev_info(&client->dev, "Using external reference voltage\n"); + dev_info(dev, "Using external reference voltage\n"); extra_config |=3D AD7991_REF_SEL; ret =3D regulator_enable(st->vref); if (ret) - goto error_disable_reg; + return ret; =20 ret =3D regulator_get_voltage(st->vref); if (ret < 0) - goto error_disable_vref; + return ret; st->vref_uV =3D ret; + + ret =3D devm_add_action_or_reset(dev, ad799x_reg_disable, st->vref); + if (ret) + return ret; } } =20 @@ -846,15 +859,15 @@ 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, &ad799x_trigger_handler, NULL); if (ret) - goto error_disable_vref; + return ret; =20 if (client->irq > 0) { - ret =3D devm_request_threaded_irq(&client->dev, + ret =3D devm_request_threaded_irq(dev, client->irq, NULL, ad799x_event_handler, @@ -876,11 +889,6 @@ static int ad799x_probe(struct i2c_client *client) =20 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); =20 return ret; } @@ -888,14 +896,10 @@ static int ad799x_probe(struct i2c_client *client) 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); =20 iio_device_unregister(indio_dev); =20 iio_triggered_buffer_cleanup(indio_dev); - if (st->vref) - regulator_disable(st->vref); - regulator_disable(st->reg); } =20 static int ad799x_suspend(struct device *dev) --=20 2.39.5