iio: adc: qcom-spmi-adc5: convert to device properties
authorNuno Sá <nuno.sa@analog.com>
Fri, 15 Jul 2022 12:29:00 +0000 (14:29 +0200)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Mon, 15 Aug 2022 21:30:00 +0000 (22:30 +0100)
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>
Link: https://lore.kernel.org/r/20220715122903.332535-13-nuno.sa@analog.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/adc/qcom-spmi-adc5.c

index 0dc4fe6..e96da2e 100644 (file)
@@ -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 {
@@ -619,18 +619,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;
@@ -655,15 +655,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) {
@@ -676,7 +674,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) {
@@ -690,7 +688,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];
 
@@ -721,7 +719,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) {
@@ -734,7 +732,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;
@@ -809,16 +807,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;
 
@@ -834,14 +832,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;
                }
 
@@ -866,7 +864,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;
@@ -878,7 +875,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;
 
@@ -894,7 +891,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;