diff mbox series

[v3,12/15] iio: adc: qcom-spmi-adc5: convert to device properties

Message ID 20220715122903.332535-13-nuno.sa@analog.com (mailing list archive)
State New, archived
Headers show
Series make iio inkern interface firmware agnostic | expand

Commit Message

Nuno Sa July 15, 2022, 12:29 p.m. UTC
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>
---
 drivers/iio/adc/qcom-spmi-adc5.c | 63 +++++++++++++++-----------------
 1 file changed, 30 insertions(+), 33 deletions(-)

Comments

Jonathan Cameron Aug. 6, 2022, 6:20 p.m. UTC | #1
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", &reg);
> +	ret = device_property_read_u32(dev, "reg", &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;
Marijn Suijten Jan. 16, 2023, 8:44 p.m. UTC | #2
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
Andy Shevchenko Jan. 17, 2023, 8:53 a.m. UTC | #3
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;
Andy Shevchenko Jan. 17, 2023, 9:06 a.m. UTC | #4
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';
Andy Shevchenko Jan. 17, 2023, 9:40 a.m. UTC | #5
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
Marijn Suijten Jan. 17, 2023, 10:42 p.m. UTC | #6
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 mbox series

Patch

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", &reg);
+	ret = device_property_read_u32(dev, "reg", &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;