Commit 4f47a236 authored by Nuno Sá's avatar Nuno Sá Committed by Jonathan Cameron

iio: adc: qcom-spmi-adc5: convert to device properties

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: default avatarNuno Sá <nuno.sa@analog.com>
Acked-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Reviewed-by: default avatarAndy Shevchenko <andy.shevchenko@gmail.com>
Link: https://lore.kernel.org/r/20220715122903.332535-13-nuno.sa@analog.comSigned-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent e7c672d0
...@@ -14,9 +14,9 @@ ...@@ -14,9 +14,9 @@
#include <linux/log2.h> #include <linux/log2.h>
#include <linux/math64.h> #include <linux/math64.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/of.h> #include <linux/mod_devicetable.h>
#include <linux/of_device.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/property.h>
#include <linux/regmap.h> #include <linux/regmap.h>
#include <linux/slab.h> #include <linux/slab.h>
...@@ -403,8 +403,8 @@ static irqreturn_t adc5_isr(int irq, void *dev_id) ...@@ -403,8 +403,8 @@ static irqreturn_t adc5_isr(int irq, void *dev_id)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static int adc5_of_xlate(struct iio_dev *indio_dev, static int adc5_fwnode_xlate(struct iio_dev *indio_dev,
const struct of_phandle_args *iiospec) const struct fwnode_reference_args *iiospec)
{ {
struct adc5_chip *adc = iio_priv(indio_dev); struct adc5_chip *adc = iio_priv(indio_dev);
int i; int i;
...@@ -416,8 +416,8 @@ static int adc5_of_xlate(struct iio_dev *indio_dev, ...@@ -416,8 +416,8 @@ static int adc5_of_xlate(struct iio_dev *indio_dev,
return -EINVAL; return -EINVAL;
} }
static int adc7_of_xlate(struct iio_dev *indio_dev, static int adc7_fwnode_xlate(struct iio_dev *indio_dev,
const struct of_phandle_args *iiospec) const struct fwnode_reference_args *iiospec)
{ {
struct adc5_chip *adc = iio_priv(indio_dev); struct adc5_chip *adc = iio_priv(indio_dev);
int i, v_channel; int i, v_channel;
...@@ -481,12 +481,12 @@ static int adc7_read_raw(struct iio_dev *indio_dev, ...@@ -481,12 +481,12 @@ static int adc7_read_raw(struct iio_dev *indio_dev,
static const struct iio_info adc5_info = { static const struct iio_info adc5_info = {
.read_raw = adc5_read_raw, .read_raw = adc5_read_raw,
.of_xlate = adc5_of_xlate, .fwnode_xlate = adc5_fwnode_xlate,
}; };
static const struct iio_info adc7_info = { static const struct iio_info adc7_info = {
.read_raw = adc7_read_raw, .read_raw = adc7_read_raw,
.of_xlate = adc7_of_xlate, .fwnode_xlate = adc7_fwnode_xlate,
}; };
struct adc5_channels { struct adc5_channels {
...@@ -619,18 +619,18 @@ static const struct adc5_channels adc5_chans_rev2[ADC5_MAX_CHANNEL] = { ...@@ -619,18 +619,18 @@ static const struct adc5_channels adc5_chans_rev2[ADC5_MAX_CHANNEL] = {
SCALE_HW_CALIB_THERM_100K_PULLUP) 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 adc5_channel_prop *prop,
struct device_node *node, struct fwnode_handle *fwnode,
const struct adc5_data *data) 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 chan, value, varr[2];
u32 sid = 0; u32 sid = 0;
int ret; int ret;
struct device *dev = adc->dev; struct device *dev = adc->dev;
ret = of_property_read_u32(node, "reg", &chan); ret = fwnode_property_read_u32(fwnode, "reg", &chan);
if (ret) { if (ret) {
dev_err(dev, "invalid channel number %s\n", name); dev_err(dev, "invalid channel number %s\n", name);
return ret; return ret;
...@@ -655,15 +655,13 @@ static int adc5_get_dt_channel_data(struct adc5_chip *adc, ...@@ -655,15 +655,13 @@ static int adc5_get_dt_channel_data(struct adc5_chip *adc,
prop->channel = chan; prop->channel = chan;
prop->sid = sid; prop->sid = sid;
channel_name = of_get_property(node, ret = fwnode_property_read_string(fwnode, "label", &channel_name);
"label", NULL) ? : node->name; if (ret)
if (!channel_name) { channel_name = name;
dev_err(dev, "Invalid channel name\n");
return -EINVAL;
}
prop->datasheet_name = channel_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) { if (!ret) {
ret = qcom_adc5_decimation_from_dt(value, data->decimation); ret = qcom_adc5_decimation_from_dt(value, data->decimation);
if (ret < 0) { if (ret < 0) {
...@@ -676,7 +674,7 @@ static int adc5_get_dt_channel_data(struct adc5_chip *adc, ...@@ -676,7 +674,7 @@ static int adc5_get_dt_channel_data(struct adc5_chip *adc,
prop->decimation = ADC5_DECIMATION_DEFAULT; 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) { if (!ret) {
ret = qcom_adc5_prescaling_from_dt(varr[0], varr[1]); ret = qcom_adc5_prescaling_from_dt(varr[0], varr[1]);
if (ret < 0) { if (ret < 0) {
...@@ -690,7 +688,7 @@ static int adc5_get_dt_channel_data(struct adc5_chip *adc, ...@@ -690,7 +688,7 @@ static int adc5_get_dt_channel_data(struct adc5_chip *adc,
adc->data->adc_chans[prop->channel].prescale_index; 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) { if (!ret) {
u8 dig_version[2]; u8 dig_version[2];
...@@ -721,7 +719,7 @@ static int adc5_get_dt_channel_data(struct adc5_chip *adc, ...@@ -721,7 +719,7 @@ static int adc5_get_dt_channel_data(struct adc5_chip *adc,
prop->hw_settle_time = VADC_DEF_HW_SETTLE_TIME; 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) { if (!ret) {
ret = qcom_adc5_avg_samples_from_dt(value); ret = qcom_adc5_avg_samples_from_dt(value);
if (ret < 0) { if (ret < 0) {
...@@ -734,7 +732,7 @@ static int adc5_get_dt_channel_data(struct adc5_chip *adc, ...@@ -734,7 +732,7 @@ static int adc5_get_dt_channel_data(struct adc5_chip *adc,
prop->avg_samples = VADC_DEF_AVG_SAMPLES; 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; prop->cal_method = ADC5_RATIOMETRIC_CAL;
else else
prop->cal_method = ADC5_ABSOLUTE_CAL; prop->cal_method = ADC5_ABSOLUTE_CAL;
...@@ -809,16 +807,16 @@ static const struct of_device_id adc5_match_table[] = { ...@@ -809,16 +807,16 @@ static const struct of_device_id adc5_match_table[] = {
}; };
MODULE_DEVICE_TABLE(of, 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; const struct adc5_channels *adc_chan;
struct iio_chan_spec *iio_chan; struct iio_chan_spec *iio_chan;
struct adc5_channel_prop prop, *chan_props; struct adc5_channel_prop prop, *chan_props;
struct device_node *child; struct fwnode_handle *child;
unsigned int index = 0; unsigned int index = 0;
int ret; int ret;
adc->nchannels = of_get_available_child_count(node); adc->nchannels = device_get_child_node_count(adc->dev);
if (!adc->nchannels) if (!adc->nchannels)
return -EINVAL; return -EINVAL;
...@@ -834,14 +832,14 @@ static int adc5_get_dt_data(struct adc5_chip *adc, struct device_node *node) ...@@ -834,14 +832,14 @@ static int adc5_get_dt_data(struct adc5_chip *adc, struct device_node *node)
chan_props = adc->chan_props; chan_props = adc->chan_props;
iio_chan = adc->iio_chans; 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) if (!adc->data)
adc->data = &adc5_data_pmic; adc->data = &adc5_data_pmic;
for_each_available_child_of_node(node, child) { device_for_each_child_node(adc->dev, child) {
ret = adc5_get_dt_channel_data(adc, &prop, child, adc->data); ret = adc5_get_fw_channel_data(adc, &prop, child, adc->data);
if (ret) { if (ret) {
of_node_put(child); fwnode_handle_put(child);
return ret; return ret;
} }
...@@ -866,7 +864,6 @@ static int adc5_get_dt_data(struct adc5_chip *adc, struct device_node *node) ...@@ -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) static int adc5_probe(struct platform_device *pdev)
{ {
struct device_node *node = pdev->dev.of_node;
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct iio_dev *indio_dev; struct iio_dev *indio_dev;
struct adc5_chip *adc; struct adc5_chip *adc;
...@@ -878,7 +875,7 @@ static int adc5_probe(struct platform_device *pdev) ...@@ -878,7 +875,7 @@ static int adc5_probe(struct platform_device *pdev)
if (!regmap) if (!regmap)
return -ENODEV; return -ENODEV;
ret = of_property_read_u32(node, "reg", &reg); ret = device_property_read_u32(dev, "reg", &reg);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -894,7 +891,7 @@ static int adc5_probe(struct platform_device *pdev) ...@@ -894,7 +891,7 @@ static int adc5_probe(struct platform_device *pdev)
init_completion(&adc->complete); init_completion(&adc->complete);
mutex_init(&adc->lock); mutex_init(&adc->lock);
ret = adc5_get_dt_data(adc, node); ret = adc5_get_fw_data(adc);
if (ret) { if (ret) {
dev_err(dev, "adc get dt data failed\n"); dev_err(dev, "adc get dt data failed\n");
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment