mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-11-01 17:08:10 +00:00
iio: adc: ad7124: Switch from of specific to fwnode based property handling
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>
This commit is contained in:
parent
f84aec5a6b
commit
a6eaf02b82
1 changed files with 23 additions and 32 deletions
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in a new issue