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

Jonathan Cameron jic23 at kernel.org
Sat Aug 6 11:20:48 PDT 2022


On Fri, 15 Jul 2022 14:29:00 +0200
Nuno Sá <nuno.sa at 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 at analog.com>
> Acked-by: Linus Walleij <linus.walleij at linaro.org>
> Reviewed-by: Andy Shevchenko <andy.shevchenko at 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;




More information about the Linux-mediatek mailing list