Commit 8a85e72e authored by Jonathan Cameron's avatar Jonathan Cameron
Browse files

iio: dac: ltc2688: Use device_for_each_child_node_scoped()



Switching to the _scoped() version removes the need for manual
calling of fwnode_handle_put() in the paths where the code
exits the loop early. In this case that's all in error paths.

Reviewed-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Tested-by: default avatarNuno Sa <nuno.sa@analog.com>
Reviewed-by: default avatarNuno Sa <nuno.sa@analog.com>
Link: https://lore.kernel.org/r/20240217164249.921878-16-jic23@kernel.org


Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent 2fe97fcc
Loading
Loading
Loading
Loading
+8 −20
Original line number Diff line number Diff line
@@ -746,26 +746,21 @@ static int ltc2688_span_lookup(const struct ltc2688_state *st, int min, int max)
static int ltc2688_channel_config(struct ltc2688_state *st)
{
	struct device *dev = &st->spi->dev;
	struct fwnode_handle *child;
	u32 reg, clk_input, val, tmp[2];
	int ret, span;

	device_for_each_child_node(dev, child) {
	device_for_each_child_node_scoped(dev, child) {
		struct ltc2688_chan *chan;

		ret = fwnode_property_read_u32(child, "reg", &reg);
		if (ret) {
			fwnode_handle_put(child);
		if (ret)
			return dev_err_probe(dev, ret,
					     "Failed to get reg property\n");
		}

		if (reg >= LTC2688_DAC_CHANNELS) {
			fwnode_handle_put(child);
		if (reg >= LTC2688_DAC_CHANNELS)
			return dev_err_probe(dev, -EINVAL,
					     "reg bigger than: %d\n",
					     LTC2688_DAC_CHANNELS);
		}

		val = 0;
		chan = &st->channels[reg];
@@ -786,12 +781,10 @@ static int ltc2688_channel_config(struct ltc2688_state *st)
		if (!ret) {
			span = ltc2688_span_lookup(st, (int)tmp[0] / 1000,
						   tmp[1] / 1000);
			if (span < 0) {
				fwnode_handle_put(child);
				return dev_err_probe(dev, -EINVAL,
			if (span < 0)
				return dev_err_probe(dev, span,
						     "output range not valid:[%d %d]\n",
						     tmp[0], tmp[1]);
			}

			val |= FIELD_PREP(LTC2688_CH_SPAN_MSK, span);
		}
@@ -800,17 +793,14 @@ static int ltc2688_channel_config(struct ltc2688_state *st)
					       &clk_input);
		if (!ret) {
			if (clk_input >= LTC2688_CH_TGP_MAX) {
				fwnode_handle_put(child);
				return dev_err_probe(dev, -EINVAL,
						     "toggle-dither-input inv value(%d)\n",
						     clk_input);
			}

			ret = ltc2688_tgp_clk_setup(st, chan, child, clk_input);
			if (ret) {
				fwnode_handle_put(child);
			if (ret)
				return ret;
			}

			/*
			 * 0 means software toggle which is the default mode.
@@ -844,12 +834,10 @@ static int ltc2688_channel_config(struct ltc2688_state *st)

		ret = regmap_write(st->regmap, LTC2688_CMD_CH_SETTING(reg),
				   val);
		if (ret) {
			fwnode_handle_put(child);
			return dev_err_probe(dev, -EINVAL,
		if (ret)
			return dev_err_probe(dev, ret,
					     "failed to set chan settings\n");
	}
	}

	return 0;
}