// SPDX-License-Identifier: GPL-2.0-only /* * ltc2497-core.c - Common code for Analog Devices/Linear Technology * LTC2496 and LTC2497 ADCs * * Copyright (C) 2017 Analog Devices Inc.
*/
if (time_elapsed < LTC2497_CONVERSION_TIME_MS) { /* delay if conversion time not passed * since last read or write
*/ if (msleep_interruptible(
LTC2497_CONVERSION_TIME_MS - time_elapsed)) return -ERESTARTSYS;
return 0;
}
if (time_elapsed - LTC2497_CONVERSION_TIME_MS <= 0) { /* We're in automatic mode - * so the last reading is still not outdated
*/ return 0;
}
return 1;
}
staticint ltc2497core_read(struct ltc2497core_driverdata *ddata, u8 address, int *val)
{ int ret;
ret = ltc2497core_wait_conv(ddata); if (ret < 0) return ret;
if (ret || ddata->addr_prev != address) {
ret = ddata->result_and_measure(ddata, address, NULL); if (ret < 0) return ret;
ddata->addr_prev = address;
if (msleep_interruptible(LTC2497_CONVERSION_TIME_MS)) return -ERESTARTSYS;
}
ret = ddata->result_and_measure(ddata, address, val); if (ret < 0) return ret;
ddata->time_prev = ktime_get();
return ret;
}
staticint ltc2497core_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, long mask)
{ struct ltc2497core_driverdata *ddata = iio_priv(indio_dev); int ret;
switch (mask) { case IIO_CHAN_INFO_RAW:
mutex_lock(&ddata->lock);
ret = ltc2497core_read(ddata, chan->address, val);
mutex_unlock(&ddata->lock); if (ret < 0) return ret;
return IIO_VAL_INT;
case IIO_CHAN_INFO_SCALE:
ret = regulator_get_voltage(ddata->ref); if (ret < 0) return ret;
*val = ret / 1000;
*val2 = ddata->chip_info->resolution + 1;
int ltc2497core_probe(struct device *dev, struct iio_dev *indio_dev)
{ struct ltc2497core_driverdata *ddata = iio_priv(indio_dev); struct iio_map *plat_data = dev_get_platdata(dev); int ret;
/* * Keep using dev_name() for the iio_dev's name on some of the parts, * since updating it would result in a ABI breakage.
*/ if (ddata->chip_info->name)
indio_dev->name = ddata->chip_info->name; else
indio_dev->name = dev_name(dev);
ret = ddata->result_and_measure(ddata, LTC2497_CONFIG_DEFAULT, NULL); if (ret < 0) return ret;
ddata->ref = devm_regulator_get(dev, "vref"); if (IS_ERR(ddata->ref)) return dev_err_probe(dev, PTR_ERR(ddata->ref), "Failed to get vref regulator\n");
ret = regulator_enable(ddata->ref); if (ret < 0) {
dev_err(dev, "Failed to enable vref regulator: %pe\n",
ERR_PTR(ret)); return ret;
}
ret = iio_map_array_register(indio_dev, plat_data); if (ret) {
dev_err(&indio_dev->dev, "iio map err: %d\n", ret); goto err_regulator_disable;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.