Message ID | 20220715122903.332535-13-nuno.sa@analog.com (mailing list archive) |
---|---|
State | Handled Elsewhere |
Headers | show |
Series | make iio inkern interface firmware agnostic | expand |
On Fri, 15 Jul 2022 14:29:00 +0200 Nuno Sá <nuno.sa@analog.com> wrote: > Make the conversion to firmware agnostic device properties. As part of > the conversion the IIO inkern interface 'of_xlate()' is also converted to > 'fwnode_xlate()'. The goal is to completely drop 'of_xlate' and hence OF > dependencies from IIO. > > Signed-off-by: Nuno Sá <nuno.sa@analog.com> > Acked-by: Linus Walleij <linus.walleij@linaro.org> > Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com> +CC Marijin who happend to post a patch for this driver that I just accepted and hence probably has hardware access. Any chance of a test for this series? If not, no problem as this is fairly mechanical and we have testing on some of the other drivers using the new code. I'll probably queue this up in the meantime but it won't end up upstream for a few weeks yet. Thanks, Jonathan > --- > drivers/iio/adc/qcom-spmi-adc5.c | 63 +++++++++++++++----------------- > 1 file changed, 30 insertions(+), 33 deletions(-) > > diff --git a/drivers/iio/adc/qcom-spmi-adc5.c b/drivers/iio/adc/qcom-spmi-adc5.c > index 87438d1e5c0b..a23f9293d6c1 100644 > --- a/drivers/iio/adc/qcom-spmi-adc5.c > +++ b/drivers/iio/adc/qcom-spmi-adc5.c > @@ -14,9 +14,9 @@ > #include <linux/log2.h> > #include <linux/math64.h> > #include <linux/module.h> > -#include <linux/of.h> > -#include <linux/of_device.h> > +#include <linux/mod_devicetable.h> > #include <linux/platform_device.h> > +#include <linux/property.h> > #include <linux/regmap.h> > #include <linux/slab.h> > > @@ -403,8 +403,8 @@ static irqreturn_t adc5_isr(int irq, void *dev_id) > return IRQ_HANDLED; > } > > -static int adc5_of_xlate(struct iio_dev *indio_dev, > - const struct of_phandle_args *iiospec) > +static int adc5_fwnode_xlate(struct iio_dev *indio_dev, > + const struct fwnode_reference_args *iiospec) > { > struct adc5_chip *adc = iio_priv(indio_dev); > int i; > @@ -416,8 +416,8 @@ static int adc5_of_xlate(struct iio_dev *indio_dev, > return -EINVAL; > } > > -static int adc7_of_xlate(struct iio_dev *indio_dev, > - const struct of_phandle_args *iiospec) > +static int adc7_fwnode_xlate(struct iio_dev *indio_dev, > + const struct fwnode_reference_args *iiospec) > { > struct adc5_chip *adc = iio_priv(indio_dev); > int i, v_channel; > @@ -481,12 +481,12 @@ static int adc7_read_raw(struct iio_dev *indio_dev, > > static const struct iio_info adc5_info = { > .read_raw = adc5_read_raw, > - .of_xlate = adc5_of_xlate, > + .fwnode_xlate = adc5_fwnode_xlate, > }; > > static const struct iio_info adc7_info = { > .read_raw = adc7_read_raw, > - .of_xlate = adc7_of_xlate, > + .fwnode_xlate = adc7_fwnode_xlate, > }; > > struct adc5_channels { > @@ -611,18 +611,18 @@ static const struct adc5_channels adc5_chans_rev2[ADC5_MAX_CHANNEL] = { > SCALE_HW_CALIB_THERM_100K_PULLUP) > }; > > -static int adc5_get_dt_channel_data(struct adc5_chip *adc, > +static int adc5_get_fw_channel_data(struct adc5_chip *adc, > struct adc5_channel_prop *prop, > - struct device_node *node, > + struct fwnode_handle *fwnode, > const struct adc5_data *data) > { > - const char *name = node->name, *channel_name; > + const char *name = fwnode_get_name(fwnode), *channel_name; > u32 chan, value, varr[2]; > u32 sid = 0; > int ret; > struct device *dev = adc->dev; > > - ret = of_property_read_u32(node, "reg", &chan); > + ret = fwnode_property_read_u32(fwnode, "reg", &chan); > if (ret) { > dev_err(dev, "invalid channel number %s\n", name); > return ret; > @@ -647,15 +647,13 @@ static int adc5_get_dt_channel_data(struct adc5_chip *adc, > prop->channel = chan; > prop->sid = sid; > > - channel_name = of_get_property(node, > - "label", NULL) ? : node->name; > - if (!channel_name) { > - dev_err(dev, "Invalid channel name\n"); > - return -EINVAL; > - } > + ret = fwnode_property_read_string(fwnode, "label", &channel_name); > + if (ret) > + channel_name = name; > + > prop->datasheet_name = channel_name; > > - ret = of_property_read_u32(node, "qcom,decimation", &value); > + ret = fwnode_property_read_u32(fwnode, "qcom,decimation", &value); > if (!ret) { > ret = qcom_adc5_decimation_from_dt(value, data->decimation); > if (ret < 0) { > @@ -668,7 +666,7 @@ static int adc5_get_dt_channel_data(struct adc5_chip *adc, > prop->decimation = ADC5_DECIMATION_DEFAULT; > } > > - ret = of_property_read_u32_array(node, "qcom,pre-scaling", varr, 2); > + ret = fwnode_property_read_u32_array(fwnode, "qcom,pre-scaling", varr, 2); > if (!ret) { > ret = qcom_adc5_prescaling_from_dt(varr[0], varr[1]); > if (ret < 0) { > @@ -682,7 +680,7 @@ static int adc5_get_dt_channel_data(struct adc5_chip *adc, > adc->data->adc_chans[prop->channel].prescale_index; > } > > - ret = of_property_read_u32(node, "qcom,hw-settle-time", &value); > + ret = fwnode_property_read_u32(fwnode, "qcom,hw-settle-time", &value); > if (!ret) { > u8 dig_version[2]; > > @@ -713,7 +711,7 @@ static int adc5_get_dt_channel_data(struct adc5_chip *adc, > prop->hw_settle_time = VADC_DEF_HW_SETTLE_TIME; > } > > - ret = of_property_read_u32(node, "qcom,avg-samples", &value); > + ret = fwnode_property_read_u32(fwnode, "qcom,avg-samples", &value); > if (!ret) { > ret = qcom_adc5_avg_samples_from_dt(value); > if (ret < 0) { > @@ -726,7 +724,7 @@ static int adc5_get_dt_channel_data(struct adc5_chip *adc, > prop->avg_samples = VADC_DEF_AVG_SAMPLES; > } > > - if (of_property_read_bool(node, "qcom,ratiometric")) > + if (fwnode_property_read_bool(fwnode, "qcom,ratiometric")) > prop->cal_method = ADC5_RATIOMETRIC_CAL; > else > prop->cal_method = ADC5_ABSOLUTE_CAL; > @@ -801,16 +799,16 @@ static const struct of_device_id adc5_match_table[] = { > }; > MODULE_DEVICE_TABLE(of, adc5_match_table); > > -static int adc5_get_dt_data(struct adc5_chip *adc, struct device_node *node) > +static int adc5_get_fw_data(struct adc5_chip *adc) > { > const struct adc5_channels *adc_chan; > struct iio_chan_spec *iio_chan; > struct adc5_channel_prop prop, *chan_props; > - struct device_node *child; > + struct fwnode_handle *child; > unsigned int index = 0; > int ret; > > - adc->nchannels = of_get_available_child_count(node); > + adc->nchannels = device_get_child_node_count(adc->dev); > if (!adc->nchannels) > return -EINVAL; > > @@ -826,14 +824,14 @@ static int adc5_get_dt_data(struct adc5_chip *adc, struct device_node *node) > > chan_props = adc->chan_props; > iio_chan = adc->iio_chans; > - adc->data = of_device_get_match_data(adc->dev); > + adc->data = device_get_match_data(adc->dev); > if (!adc->data) > adc->data = &adc5_data_pmic; > > - for_each_available_child_of_node(node, child) { > - ret = adc5_get_dt_channel_data(adc, &prop, child, adc->data); > + device_for_each_child_node(adc->dev, child) { > + ret = adc5_get_fw_channel_data(adc, &prop, child, adc->data); > if (ret) { > - of_node_put(child); > + fwnode_handle_put(child); > return ret; > } > > @@ -858,7 +856,6 @@ static int adc5_get_dt_data(struct adc5_chip *adc, struct device_node *node) > > static int adc5_probe(struct platform_device *pdev) > { > - struct device_node *node = pdev->dev.of_node; > struct device *dev = &pdev->dev; > struct iio_dev *indio_dev; > struct adc5_chip *adc; > @@ -870,7 +867,7 @@ static int adc5_probe(struct platform_device *pdev) > if (!regmap) > return -ENODEV; > > - ret = of_property_read_u32(node, "reg", ®); > + ret = device_property_read_u32(dev, "reg", ®); > if (ret < 0) > return ret; > > @@ -886,7 +883,7 @@ static int adc5_probe(struct platform_device *pdev) > init_completion(&adc->complete); > mutex_init(&adc->lock); > > - ret = adc5_get_dt_data(adc, node); > + ret = adc5_get_fw_data(adc); > if (ret) { > dev_err(dev, "adc get dt data failed\n"); > return ret;
On 2022-08-06 19:20:48, Jonathan Cameron wrote: > On Fri, 15 Jul 2022 14:29:00 +0200 > Nuno Sá <nuno.sa@analog.com> wrote: > > > Make the conversion to firmware agnostic device properties. As part of > > the conversion the IIO inkern interface 'of_xlate()' is also converted to > > 'fwnode_xlate()'. The goal is to completely drop 'of_xlate' and hence OF > > dependencies from IIO. > > > > Signed-off-by: Nuno Sá <nuno.sa@analog.com> > > Acked-by: Linus Walleij <linus.walleij@linaro.org> > > Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com> > +CC Marijin who happend to post a patch for this driver that I just accepted > and hence probably has hardware access. Any chance of a test for this series? > > If not, no problem as this is fairly mechanical and we have testing on some of > the other drivers using the new code. > > I'll probably queue this up in the meantime but it won't end up upstream > for a few weeks yet. Jonathan, This CC just surfaced in my inbox while searching for our current discussion around missing labels in qcom-spmi-vadc - and on the side a userspace @xx label name ABI break (in qcom-spmi-adc5) caused by this patch's fwnode_get_name change - we could've caught it if I had not accidentally marked it as read and/or forgot about it. My apologies. - Marijn
On Mon, Jan 16, 2023 at 10:44 PM Marijn Suijten <marijn.suijten@somainline.org> wrote: > > On 2022-08-06 19:20:48, Jonathan Cameron wrote: > > On Fri, 15 Jul 2022 14:29:00 +0200 > > Nuno Sá <nuno.sa@analog.com> wrote: > > > > > Make the conversion to firmware agnostic device properties. As part of > > > the conversion the IIO inkern interface 'of_xlate()' is also converted to > > > 'fwnode_xlate()'. The goal is to completely drop 'of_xlate' and hence OF > > > dependencies from IIO. > > > > > > Signed-off-by: Nuno Sá <nuno.sa@analog.com> > > > Acked-by: Linus Walleij <linus.walleij@linaro.org> > > > Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com> > > +CC Marijin who happend to post a patch for this driver that I just accepted > > and hence probably has hardware access. Any chance of a test for this series? > > > > If not, no problem as this is fairly mechanical and we have testing on some of > > the other drivers using the new code. > > > > I'll probably queue this up in the meantime but it won't end up upstream > > for a few weeks yet. > > Jonathan, > > This CC just surfaced in my inbox while searching for our current > discussion around missing labels in qcom-spmi-vadc - and on the side a > userspace @xx label name ABI break (in qcom-spmi-adc5) caused by this > patch's fwnode_get_name change - we could've caught it if I had not > accidentally marked it as read and/or forgot about it. My apologies. Does the following addition to the top of the adc5_get_fw_channel_data() fix the issue? + name = devm_kasprintf(adc->dev, GFP_KERNEL, "%pfwP", fwnode); + if (!name) + return -ENOMEM;
On Tue, Jan 17, 2023 at 10:53 AM Andy Shevchenko <andy.shevchenko@gmail.com> wrote: > > On Mon, Jan 16, 2023 at 10:44 PM Marijn Suijten > <marijn.suijten@somainline.org> wrote: > > > > On 2022-08-06 19:20:48, Jonathan Cameron wrote: > > > On Fri, 15 Jul 2022 14:29:00 +0200 > > > Nuno Sá <nuno.sa@analog.com> wrote: > > > > > > > Make the conversion to firmware agnostic device properties. As part of > > > > the conversion the IIO inkern interface 'of_xlate()' is also converted to > > > > 'fwnode_xlate()'. The goal is to completely drop 'of_xlate' and hence OF > > > > dependencies from IIO. > > > > > > > > Signed-off-by: Nuno Sá <nuno.sa@analog.com> > > > > Acked-by: Linus Walleij <linus.walleij@linaro.org> > > > > Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com> > > > +CC Marijin who happend to post a patch for this driver that I just accepted > > > and hence probably has hardware access. Any chance of a test for this series? > > > > > > If not, no problem as this is fairly mechanical and we have testing on some of > > > the other drivers using the new code. > > > > > > I'll probably queue this up in the meantime but it won't end up upstream > > > for a few weeks yet. > > > > Jonathan, > > > > This CC just surfaced in my inbox while searching for our current > > discussion around missing labels in qcom-spmi-vadc - and on the side a > > userspace @xx label name ABI break (in qcom-spmi-adc5) caused by this > > patch's fwnode_get_name change - we could've caught it if I had not > > accidentally marked it as read and/or forgot about it. My apologies. > > Does the following addition to the top of the > adc5_get_fw_channel_data() fix the issue? > > + name = devm_kasprintf(adc->dev, GFP_KERNEL, "%pfwP", fwnode); > + if (!name) > + return -ENOMEM; Okay, it probably the same, so it might need additional code to + name[strchrnul(name, '@') - name] = '\0';
On Tue, Jan 17, 2023 at 11:06 AM Andy Shevchenko <andy.shevchenko@gmail.com> wrote: > > On Tue, Jan 17, 2023 at 10:53 AM Andy Shevchenko > <andy.shevchenko@gmail.com> wrote: > > > > On Mon, Jan 16, 2023 at 10:44 PM Marijn Suijten > > <marijn.suijten@somainline.org> wrote: > > > > > > On 2022-08-06 19:20:48, Jonathan Cameron wrote: > > > > On Fri, 15 Jul 2022 14:29:00 +0200 > > > > Nuno Sá <nuno.sa@analog.com> wrote: > > > > > > > > > Make the conversion to firmware agnostic device properties. As part of > > > > > the conversion the IIO inkern interface 'of_xlate()' is also converted to > > > > > 'fwnode_xlate()'. The goal is to completely drop 'of_xlate' and hence OF > > > > > dependencies from IIO. > > > > > > > > > > Signed-off-by: Nuno Sá <nuno.sa@analog.com> > > > > > Acked-by: Linus Walleij <linus.walleij@linaro.org> > > > > > Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com> > > > > +CC Marijin who happend to post a patch for this driver that I just accepted > > > > and hence probably has hardware access. Any chance of a test for this series? > > > > > > > > If not, no problem as this is fairly mechanical and we have testing on some of > > > > the other drivers using the new code. > > > > > > > > I'll probably queue this up in the meantime but it won't end up upstream > > > > for a few weeks yet. > > > > > > Jonathan, > > > > > > This CC just surfaced in my inbox while searching for our current > > > discussion around missing labels in qcom-spmi-vadc - and on the side a > > > userspace @xx label name ABI break (in qcom-spmi-adc5) caused by this > > > patch's fwnode_get_name change - we could've caught it if I had not > > > accidentally marked it as read and/or forgot about it. My apologies. > > > > Does the following addition to the top of the > > adc5_get_fw_channel_data() fix the issue? > > > > + name = devm_kasprintf(adc->dev, GFP_KERNEL, "%pfwP", fwnode); > > + if (!name) > > + return -ENOMEM; > > Okay, it probably the same, so it might need additional code to > > + name[strchrnul(name, '@') - name] = '\0'; I have just sent a formal patch, please test on top of non-working kernel. -- With Best Regards, Andy Shevchenko
On 2023-01-17 11:40:42, Andy Shevchenko wrote: <snip> > > > > This CC just surfaced in my inbox while searching for our current > > > > discussion around missing labels in qcom-spmi-vadc - and on the side a > > > > userspace @xx label name ABI break (in qcom-spmi-adc5) caused by this > > > > patch's fwnode_get_name change - we could've caught it if I had not > > > > accidentally marked it as read and/or forgot about it. My apologies. > > > > > > Does the following addition to the top of the > > > adc5_get_fw_channel_data() fix the issue? > > > > > > + name = devm_kasprintf(adc->dev, GFP_KERNEL, "%pfwP", fwnode); > > > + if (!name) > > > + return -ENOMEM; > > > > Okay, it probably the same, so it might need additional code to > > > > + name[strchrnul(name, '@') - name] = '\0'; > > I have just sent a formal patch, please test on top of non-working kernel. I would've preferred to fix this in the same way as qcom-spmi-vadc by implementing read_label instead and basing it on the DT label or driver string literals instead [1], but dropping extend_name (hence changing sysfs filenames once again) would be considered an ABI break. I've instead gone for a similar change that also ignores the node name in favour of falling back to the driver string literal (if no "label" property is available) while retaining extend_label [3] and the - however ugly they are - sysfs filenames, but that'll likely get rejected as strictly being an ABI break as well, not in the least because DT needs to be patched up [3] for it to work out. I'll at least test your patch when getting back to one of these devices. - Marijn [1]: https://lore.kernel.org/linux-arm-msm/20230116220909.196926-6-marijn.suijten@somainline.org/ [2]: https://lore.kernel.org/linux-arm-msm/20230116220909.196926-4-marijn.suijten@somainline.org/ [3]: https://lore.kernel.org/linux-arm-msm/20221209215308.1781047-1-marijn.suijten@somainline.org/
diff --git a/drivers/iio/adc/qcom-spmi-adc5.c b/drivers/iio/adc/qcom-spmi-adc5.c index 87438d1e5c0b..a23f9293d6c1 100644 --- a/drivers/iio/adc/qcom-spmi-adc5.c +++ b/drivers/iio/adc/qcom-spmi-adc5.c @@ -14,9 +14,9 @@ #include <linux/log2.h> #include <linux/math64.h> #include <linux/module.h> -#include <linux/of.h> -#include <linux/of_device.h> +#include <linux/mod_devicetable.h> #include <linux/platform_device.h> +#include <linux/property.h> #include <linux/regmap.h> #include <linux/slab.h> @@ -403,8 +403,8 @@ static irqreturn_t adc5_isr(int irq, void *dev_id) return IRQ_HANDLED; } -static int adc5_of_xlate(struct iio_dev *indio_dev, - const struct of_phandle_args *iiospec) +static int adc5_fwnode_xlate(struct iio_dev *indio_dev, + const struct fwnode_reference_args *iiospec) { struct adc5_chip *adc = iio_priv(indio_dev); int i; @@ -416,8 +416,8 @@ static int adc5_of_xlate(struct iio_dev *indio_dev, return -EINVAL; } -static int adc7_of_xlate(struct iio_dev *indio_dev, - const struct of_phandle_args *iiospec) +static int adc7_fwnode_xlate(struct iio_dev *indio_dev, + const struct fwnode_reference_args *iiospec) { struct adc5_chip *adc = iio_priv(indio_dev); int i, v_channel; @@ -481,12 +481,12 @@ static int adc7_read_raw(struct iio_dev *indio_dev, static const struct iio_info adc5_info = { .read_raw = adc5_read_raw, - .of_xlate = adc5_of_xlate, + .fwnode_xlate = adc5_fwnode_xlate, }; static const struct iio_info adc7_info = { .read_raw = adc7_read_raw, - .of_xlate = adc7_of_xlate, + .fwnode_xlate = adc7_fwnode_xlate, }; struct adc5_channels { @@ -611,18 +611,18 @@ static const struct adc5_channels adc5_chans_rev2[ADC5_MAX_CHANNEL] = { SCALE_HW_CALIB_THERM_100K_PULLUP) }; -static int adc5_get_dt_channel_data(struct adc5_chip *adc, +static int adc5_get_fw_channel_data(struct adc5_chip *adc, struct adc5_channel_prop *prop, - struct device_node *node, + struct fwnode_handle *fwnode, const struct adc5_data *data) { - const char *name = node->name, *channel_name; + const char *name = fwnode_get_name(fwnode), *channel_name; u32 chan, value, varr[2]; u32 sid = 0; int ret; struct device *dev = adc->dev; - ret = of_property_read_u32(node, "reg", &chan); + ret = fwnode_property_read_u32(fwnode, "reg", &chan); if (ret) { dev_err(dev, "invalid channel number %s\n", name); return ret; @@ -647,15 +647,13 @@ static int adc5_get_dt_channel_data(struct adc5_chip *adc, prop->channel = chan; prop->sid = sid; - channel_name = of_get_property(node, - "label", NULL) ? : node->name; - if (!channel_name) { - dev_err(dev, "Invalid channel name\n"); - return -EINVAL; - } + ret = fwnode_property_read_string(fwnode, "label", &channel_name); + if (ret) + channel_name = name; + prop->datasheet_name = channel_name; - ret = of_property_read_u32(node, "qcom,decimation", &value); + ret = fwnode_property_read_u32(fwnode, "qcom,decimation", &value); if (!ret) { ret = qcom_adc5_decimation_from_dt(value, data->decimation); if (ret < 0) { @@ -668,7 +666,7 @@ static int adc5_get_dt_channel_data(struct adc5_chip *adc, prop->decimation = ADC5_DECIMATION_DEFAULT; } - ret = of_property_read_u32_array(node, "qcom,pre-scaling", varr, 2); + ret = fwnode_property_read_u32_array(fwnode, "qcom,pre-scaling", varr, 2); if (!ret) { ret = qcom_adc5_prescaling_from_dt(varr[0], varr[1]); if (ret < 0) { @@ -682,7 +680,7 @@ static int adc5_get_dt_channel_data(struct adc5_chip *adc, adc->data->adc_chans[prop->channel].prescale_index; } - ret = of_property_read_u32(node, "qcom,hw-settle-time", &value); + ret = fwnode_property_read_u32(fwnode, "qcom,hw-settle-time", &value); if (!ret) { u8 dig_version[2]; @@ -713,7 +711,7 @@ static int adc5_get_dt_channel_data(struct adc5_chip *adc, prop->hw_settle_time = VADC_DEF_HW_SETTLE_TIME; } - ret = of_property_read_u32(node, "qcom,avg-samples", &value); + ret = fwnode_property_read_u32(fwnode, "qcom,avg-samples", &value); if (!ret) { ret = qcom_adc5_avg_samples_from_dt(value); if (ret < 0) { @@ -726,7 +724,7 @@ static int adc5_get_dt_channel_data(struct adc5_chip *adc, prop->avg_samples = VADC_DEF_AVG_SAMPLES; } - if (of_property_read_bool(node, "qcom,ratiometric")) + if (fwnode_property_read_bool(fwnode, "qcom,ratiometric")) prop->cal_method = ADC5_RATIOMETRIC_CAL; else prop->cal_method = ADC5_ABSOLUTE_CAL; @@ -801,16 +799,16 @@ static const struct of_device_id adc5_match_table[] = { }; MODULE_DEVICE_TABLE(of, adc5_match_table); -static int adc5_get_dt_data(struct adc5_chip *adc, struct device_node *node) +static int adc5_get_fw_data(struct adc5_chip *adc) { const struct adc5_channels *adc_chan; struct iio_chan_spec *iio_chan; struct adc5_channel_prop prop, *chan_props; - struct device_node *child; + struct fwnode_handle *child; unsigned int index = 0; int ret; - adc->nchannels = of_get_available_child_count(node); + adc->nchannels = device_get_child_node_count(adc->dev); if (!adc->nchannels) return -EINVAL; @@ -826,14 +824,14 @@ static int adc5_get_dt_data(struct adc5_chip *adc, struct device_node *node) chan_props = adc->chan_props; iio_chan = adc->iio_chans; - adc->data = of_device_get_match_data(adc->dev); + adc->data = device_get_match_data(adc->dev); if (!adc->data) adc->data = &adc5_data_pmic; - for_each_available_child_of_node(node, child) { - ret = adc5_get_dt_channel_data(adc, &prop, child, adc->data); + device_for_each_child_node(adc->dev, child) { + ret = adc5_get_fw_channel_data(adc, &prop, child, adc->data); if (ret) { - of_node_put(child); + fwnode_handle_put(child); return ret; } @@ -858,7 +856,6 @@ static int adc5_get_dt_data(struct adc5_chip *adc, struct device_node *node) static int adc5_probe(struct platform_device *pdev) { - struct device_node *node = pdev->dev.of_node; struct device *dev = &pdev->dev; struct iio_dev *indio_dev; struct adc5_chip *adc; @@ -870,7 +867,7 @@ static int adc5_probe(struct platform_device *pdev) if (!regmap) return -ENODEV; - ret = of_property_read_u32(node, "reg", ®); + ret = device_property_read_u32(dev, "reg", ®); if (ret < 0) return ret; @@ -886,7 +883,7 @@ static int adc5_probe(struct platform_device *pdev) init_completion(&adc->complete); mutex_init(&adc->lock); - ret = adc5_get_dt_data(adc, node); + ret = adc5_get_fw_data(adc); if (ret) { dev_err(dev, "adc get dt data failed\n"); return ret;