Lines Matching +full:output +full:- +full:ohms

1 // SPDX-License-Identifier: GPL-2.0
47 if (rescale->chan_processed) in rescale_read_raw()
53 return iio_read_channel_processed(rescale->source, val); in rescale_read_raw()
55 return iio_read_channel_raw(rescale->source, val); in rescale_read_raw()
58 if (rescale->chan_processed) { in rescale_read_raw()
60 * Processed channels are scaled 1-to-1 in rescale_read_raw()
66 ret = iio_read_channel_scale(rescale->source, val, val2); in rescale_read_raw()
70 *val *= rescale->numerator; in rescale_read_raw()
71 *val2 *= rescale->denominator; in rescale_read_raw()
74 *val *= rescale->numerator; in rescale_read_raw()
75 if (rescale->denominator == 1) in rescale_read_raw()
77 *val2 = rescale->denominator; in rescale_read_raw()
81 do_div(tmp, rescale->denominator); in rescale_read_raw()
82 tmp *= rescale->numerator; in rescale_read_raw()
87 return -EOPNOTSUPP; in rescale_read_raw()
90 return -EINVAL; in rescale_read_raw()
104 return iio_read_avail_channel_raw(rescale->source, in rescale_read_avail()
107 return -EINVAL; in rescale_read_avail()
123 return iio_read_channel_ext_info(rescale->source, in rescale_read_ext_info()
124 rescale->ext_info[private].name, in rescale_read_ext_info()
135 return iio_write_channel_ext_info(rescale->source, in rescale_write_ext_info()
136 rescale->ext_info[private].name, in rescale_write_ext_info()
143 struct iio_chan_spec *chan = &rescale->chan; in rescale_configure_channel()
144 struct iio_chan_spec const *schan = rescale->source->channel; in rescale_configure_channel()
146 chan->indexed = 1; in rescale_configure_channel()
147 chan->output = schan->output; in rescale_configure_channel()
148 chan->ext_info = rescale->ext_info; in rescale_configure_channel()
149 chan->type = rescale->cfg->type; in rescale_configure_channel()
156 rescale->chan_processed = true; in rescale_configure_channel()
159 return -EINVAL; in rescale_configure_channel()
162 chan->info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | in rescale_configure_channel()
171 !rescale->chan_processed) in rescale_configure_channel()
172 chan->info_mask_separate_available |= BIT(IIO_CHAN_INFO_RAW); in rescale_configure_channel()
186 ret = device_property_read_u32(dev, "sense-resistor-micro-ohms", in rescale_current_sense_amplifier_props()
193 device_property_read_u32(dev, "sense-gain-mult", &gain_mult); in rescale_current_sense_amplifier_props()
194 device_property_read_u32(dev, "sense-gain-div", &gain_div); in rescale_current_sense_amplifier_props()
202 rescale->numerator = 1000000 / factor; in rescale_current_sense_amplifier_props()
203 rescale->denominator = sense / factor; in rescale_current_sense_amplifier_props()
205 factor = gcd(rescale->numerator, gain_mult); in rescale_current_sense_amplifier_props()
206 rescale->numerator /= factor; in rescale_current_sense_amplifier_props()
207 rescale->denominator *= gain_mult / factor; in rescale_current_sense_amplifier_props()
209 factor = gcd(rescale->denominator, gain_div); in rescale_current_sense_amplifier_props()
210 rescale->numerator *= gain_div / factor; in rescale_current_sense_amplifier_props()
211 rescale->denominator /= factor; in rescale_current_sense_amplifier_props()
223 ret = device_property_read_u32(dev, "shunt-resistor-micro-ohms", in rescale_current_sense_shunt_props()
231 rescale->numerator = 1000000 / factor; in rescale_current_sense_shunt_props()
232 rescale->denominator = shunt / factor; in rescale_current_sense_shunt_props()
243 ret = device_property_read_u32(dev, "output-ohms", in rescale_voltage_divider_props()
244 &rescale->denominator); in rescale_voltage_divider_props()
246 dev_err(dev, "failed to read output-ohms: %d\n", ret); in rescale_voltage_divider_props()
250 ret = device_property_read_u32(dev, "full-ohms", in rescale_voltage_divider_props()
251 &rescale->numerator); in rescale_voltage_divider_props()
253 dev_err(dev, "failed to read full-ohms: %d\n", ret); in rescale_voltage_divider_props()
257 factor = gcd(rescale->numerator, rescale->denominator); in rescale_voltage_divider_props()
258 rescale->numerator /= factor; in rescale_voltage_divider_props()
259 rescale->denominator /= factor; in rescale_voltage_divider_props()
286 { .compatible = "current-sense-amplifier",
288 { .compatible = "current-sense-shunt",
290 { .compatible = "voltage-divider",
298 struct device *dev = &pdev->dev; in rescale_probe()
315 sizeof_ext_info *= sizeof(*rescale->ext_info); in rescale_probe()
322 return -ENOMEM; in rescale_probe()
326 rescale->cfg = of_device_get_match_data(dev); in rescale_probe()
327 rescale->numerator = 1; in rescale_probe()
328 rescale->denominator = 1; in rescale_probe()
330 ret = rescale->cfg->props(dev, rescale); in rescale_probe()
334 if (!rescale->numerator || !rescale->denominator) { in rescale_probe()
336 return -EINVAL; in rescale_probe()
341 rescale->source = source; in rescale_probe()
343 indio_dev->name = dev_name(dev); in rescale_probe()
344 indio_dev->info = &rescale_info; in rescale_probe()
345 indio_dev->modes = INDIO_DIRECT_MODE; in rescale_probe()
346 indio_dev->channels = &rescale->chan; in rescale_probe()
347 indio_dev->num_channels = 1; in rescale_probe()
349 rescale->ext_info = devm_kmemdup(dev, in rescale_probe()
350 source->channel->ext_info, in rescale_probe()
352 if (!rescale->ext_info) in rescale_probe()
353 return -ENOMEM; in rescale_probe()
355 for (i = 0; rescale->ext_info[i].name; ++i) { in rescale_probe()
357 &rescale->ext_info[i]; in rescale_probe()
359 if (source->channel->ext_info[i].read) in rescale_probe()
360 ext_info->read = rescale_read_ext_info; in rescale_probe()
361 if (source->channel->ext_info[i].write) in rescale_probe()
362 ext_info->write = rescale_write_ext_info; in rescale_probe()
363 ext_info->private = i; in rescale_probe()
377 .name = "iio-rescale",