iio: adc: ad7124: Switch from of specific to fwnode based property handling
authorJonathan Cameron <Jonathan.Cameron@huawei.com>
Sun, 18 Feb 2024 17:27:26 +0000 (17:27 +0000)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Mon, 25 Mar 2024 19:50:09 +0000 (19:50 +0000)
Using the generic firmware data access functions from property.h
provides a number of advantages:
 1) Works with different firmware types.
 2) Doesn't provide a 'bad' example for new IIO drivers.
 3) Lets us use the new _scoped() loops with automatic reference count
    cleanup for fwnode_handle

Cc: Lars-Peter Clausen <lars@metafoo.de>
Cc: Michael Hennerich <Michael.Hennerich@analog.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://lore.kernel.org/r/20240218172731.1023367-4-jic23@kernel.org
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/adc/ad7124.c

index b9b206fcd748f585c53595f7da3ba13988c13acb..e7b1d517d3def712059331e5d18780ab6a36b03b 100644 (file)
@@ -14,7 +14,8 @@
 #include <linux/kernel.h>
 #include <linux/kfifo.h>
 #include <linux/module.h>
-#include <linux/of.h>
+#include <linux/mod_devicetable.h>
+#include <linux/property.h>
 #include <linux/regulator/consumer.h>
 #include <linux/spi/spi.h>
 
@@ -807,22 +808,19 @@ static int ad7124_check_chip_id(struct ad7124_state *st)
        return 0;
 }
 
-static int ad7124_of_parse_channel_config(struct iio_dev *indio_dev,
-                                         struct device_node *np)
+static int ad7124_parse_channel_config(struct iio_dev *indio_dev,
+                                      struct device *dev)
 {
        struct ad7124_state *st = iio_priv(indio_dev);
        struct ad7124_channel_config *cfg;
        struct ad7124_channel *channels;
-       struct device_node *child;
        struct iio_chan_spec *chan;
        unsigned int ain[2], channel = 0, tmp;
        int ret;
 
-       st->num_channels = of_get_available_child_count(np);
-       if (!st->num_channels) {
-               dev_err(indio_dev->dev.parent, "no channel children\n");
-               return -ENODEV;
-       }
+       st->num_channels = device_get_child_node_count(dev);
+       if (!st->num_channels)
+               return dev_err_probe(dev, -ENODEV, "no channel children\n");
 
        chan = devm_kcalloc(indio_dev->dev.parent, st->num_channels,
                            sizeof(*chan), GFP_KERNEL);
@@ -838,39 +836,38 @@ static int ad7124_of_parse_channel_config(struct iio_dev *indio_dev,
        indio_dev->num_channels = st->num_channels;
        st->channels = channels;
 
-       for_each_available_child_of_node(np, child) {
+       device_for_each_child_node_scoped(dev, child) {
                cfg = &st->channels[channel].cfg;
 
-               ret = of_property_read_u32(child, "reg", &channel);
+               ret = fwnode_property_read_u32(child, "reg", &channel);
                if (ret)
-                       goto err;
+                       return ret;
 
-               if (channel >= indio_dev->num_channels) {
-                       dev_err(indio_dev->dev.parent,
+               if (channel >= indio_dev->num_channels)
+                       return dev_err_probe(dev, -EINVAL,
                                "Channel index >= number of channels\n");
-                       ret = -EINVAL;
-                       goto err;
-               }
 
-               ret = of_property_read_u32_array(child, "diff-channels",
-                                                ain, 2);
+               ret = fwnode_property_read_u32_array(child, "diff-channels",
+                                                    ain, 2);
                if (ret)
-                       goto err;
+                       return ret;
 
                st->channels[channel].nr = channel;
                st->channels[channel].ain = AD7124_CHANNEL_AINP(ain[0]) |
                                                  AD7124_CHANNEL_AINM(ain[1]);
 
-               cfg->bipolar = of_property_read_bool(child, "bipolar");
+               cfg->bipolar = fwnode_property_read_bool(child, "bipolar");
 
-               ret = of_property_read_u32(child, "adi,reference-select", &tmp);
+               ret = fwnode_property_read_u32(child, "adi,reference-select", &tmp);
                if (ret)
                        cfg->refsel = AD7124_INT_REF;
                else
                        cfg->refsel = tmp;
 
-               cfg->buf_positive = of_property_read_bool(child, "adi,buffered-positive");
-               cfg->buf_negative = of_property_read_bool(child, "adi,buffered-negative");
+               cfg->buf_positive =
+                       fwnode_property_read_bool(child, "adi,buffered-positive");
+               cfg->buf_negative =
+                       fwnode_property_read_bool(child, "adi,buffered-negative");
 
                chan[channel] = ad7124_channel_template;
                chan[channel].address = channel;
@@ -880,10 +877,6 @@ static int ad7124_of_parse_channel_config(struct iio_dev *indio_dev,
        }
 
        return 0;
-err:
-       of_node_put(child);
-
-       return ret;
 }
 
 static int ad7124_setup(struct ad7124_state *st)
@@ -943,9 +936,7 @@ static int ad7124_probe(struct spi_device *spi)
        struct iio_dev *indio_dev;
        int i, ret;
 
-       info = of_device_get_match_data(&spi->dev);
-       if (!info)
-               info = (void *)spi_get_device_id(spi)->driver_data;
+       info = spi_get_device_match_data(spi);
        if (!info)
                return -ENODEV;
 
@@ -965,7 +956,7 @@ static int ad7124_probe(struct spi_device *spi)
        if (ret < 0)
                return ret;
 
-       ret = ad7124_of_parse_channel_config(indio_dev, spi->dev.of_node);
+       ret = ad7124_parse_channel_config(indio_dev, &spi->dev);
        if (ret < 0)
                return ret;