in qcom/qcom-spmi-adc-tm5.c [445:527]
static int adc_tm5_get_dt_channel_data(struct adc_tm5_chip *adc_tm,
struct adc_tm5_channel *channel,
struct device_node *node)
{
const char *name = node->name;
u32 chan, value, varr[2];
int ret;
struct device *dev = adc_tm->dev;
struct of_phandle_args args;
ret = of_property_read_u32(node, "reg", &chan);
if (ret) {
dev_err(dev, "%s: invalid channel number %d\n", name, ret);
return ret;
}
if (chan >= ADC_TM5_NUM_CHANNELS) {
dev_err(dev, "%s: channel number too big: %d\n", name, chan);
return -EINVAL;
}
channel->channel = chan;
/*
* We are tied to PMIC's ADC controller, which always use single
* argument for channel number. So don't bother parsing
* #io-channel-cells, just enforce cell_count = 1.
*/
ret = of_parse_phandle_with_fixed_args(node, "io-channels", 1, 0, &args);
if (ret < 0) {
dev_err(dev, "%s: error parsing ADC channel number %d: %d\n", name, chan, ret);
return ret;
}
of_node_put(args.np);
if (args.args_count != 1 || args.args[0] >= ADC5_MAX_CHANNEL) {
dev_err(dev, "%s: invalid ADC channel number %d\n", name, chan);
return -EINVAL;
}
channel->adc_channel = args.args[0];
channel->iio = devm_of_iio_channel_get_by_name(adc_tm->dev, node, NULL);
if (IS_ERR(channel->iio)) {
ret = PTR_ERR(channel->iio);
if (ret != -EPROBE_DEFER)
dev_err(dev, "%s: error getting channel: %d\n", name, ret);
return ret;
}
ret = of_property_read_u32_array(node, "qcom,pre-scaling", varr, 2);
if (!ret) {
ret = qcom_adc5_prescaling_from_dt(varr[0], varr[1]);
if (ret < 0) {
dev_err(dev, "%s: invalid pre-scaling <%d %d>\n",
name, varr[0], varr[1]);
return ret;
}
channel->prescale = ret;
} else {
/* 1:1 prescale is index 0 */
channel->prescale = 0;
}
ret = of_property_read_u32(node, "qcom,hw-settle-time-us", &value);
if (!ret) {
ret = qcom_adc5_hw_settle_time_from_dt(value, adc_tm->data->hw_settle);
if (ret < 0) {
dev_err(dev, "%s invalid hw-settle-time-us %d us\n",
name, value);
return ret;
}
channel->hw_settle_time = ret;
} else {
channel->hw_settle_time = VADC_DEF_HW_SETTLE_TIME;
}
if (of_property_read_bool(node, "qcom,ratiometric"))
channel->cal_method = ADC_TM5_RATIOMETRIC_CAL;
else
channel->cal_method = ADC_TM5_ABSOLUTE_CAL;
return 0;
}