Commit 98b7b0ca authored by Andy Shevchenko's avatar Andy Shevchenko Committed by Jonathan Cameron
Browse files

iio: dac: ad5770r: Put fwnode in error case during ->probe()



device_for_each_child_node() bumps a reference counting of a returned variable.
We have to balance it whenever we return to the caller.

Fixes: cbbb8198 ("iio: dac: ad5770r: Add AD5770R support")
Cc: Alexandru Tachici <alexandru.tachici@analog.com>
Signed-off-by: default avatarAndy Shevchenko <andy.shevchenko@gmail.com>
Reviewed-by: default avatarAlexandru Ardelean <ardeleanalex@gmail.com>
Link: https://lore.kernel.org/r/20210510095649.3302835-1-andy.shevchenko@gmail.com


Cc: <Stable@vger.kernel.org>
Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent 2a54c8c9
Loading
Loading
Loading
Loading
+11 −5
Original line number Diff line number Diff line
@@ -524,23 +524,29 @@ static int ad5770r_channel_config(struct ad5770r_state *st)
	device_for_each_child_node(&st->spi->dev, child) {
		ret = fwnode_property_read_u32(child, "num", &num);
		if (ret)
			return ret;
		if (num >= AD5770R_MAX_CHANNELS)
			return -EINVAL;
			goto err_child_out;
		if (num >= AD5770R_MAX_CHANNELS) {
			ret = -EINVAL;
			goto err_child_out;
		}

		ret = fwnode_property_read_u32_array(child,
						     "adi,range-microamp",
						     tmp, 2);
		if (ret)
			return ret;
			goto err_child_out;

		min = tmp[0] / 1000;
		max = tmp[1] / 1000;
		ret = ad5770r_store_output_range(st, min, max, num);
		if (ret)
			return ret;
			goto err_child_out;
	}

	return 0;

err_child_out:
	fwnode_handle_put(child);
	return ret;
}