// SPDX-License-Identifier: GPL-2.0-only /* * Maxim MAX197 A/D Converter driver * * Copyright (c) 2012 Savoir-faire Linux Inc. * Vivien Didelot <vivien.didelot@savoirfairelinux.com> * * For further information, see the Documentation/hwmon/max197.rst file.
*/
/* Function called on read access on in{0,1,2,3,4,5,6,7}_{min,max} */ static ssize_t max197_show_range(struct device *dev, struct device_attribute *devattr, char *buf)
{ struct max197_data *data = dev_get_drvdata(dev); struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr); int channel = attr->index; bool is_min = attr->nr; int range;
if (mutex_lock_interruptible(&data->lock)) return -ERESTARTSYS;
range = max197_is_full_range(data, channel) ?
data->limit : data->limit / 2; if (is_min) { if (max197_is_bipolar(data, channel))
range = -range; else
range = 0;
}
mutex_unlock(&data->lock);
return sprintf(buf, "%d\n", range);
}
/* Function called on write access on in{0,1,2,3,4,5,6,7}_{min,max} */ static ssize_t max197_store_range(struct device *dev, struct device_attribute *devattr, constchar *buf, size_t count)
{ struct max197_data *data = dev_get_drvdata(dev); struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr); int channel = attr->index; bool is_min = attr->nr; long value; int half = data->limit / 2; int full = data->limit;
if (kstrtol(buf, 10, &value)) return -EINVAL;
if (is_min) { if (value <= -full)
value = -full; elseif (value < 0)
value = -half; else
value = 0;
} else { if (value >= full)
value = full; else
value = half;
}
if (mutex_lock_interruptible(&data->lock)) return -ERESTARTSYS;
if (value == 0) { /* We can deduce only the polarity */
max197_set_unipolarity(data, channel);
} elseif (value == -half) {
max197_set_bipolarity(data, channel);
max197_set_half_range(data, channel);
} elseif (value == -full) {
max197_set_bipolarity(data, channel);
max197_set_full_range(data, channel);
} elseif (value == half) { /* We can deduce only the range */
max197_set_half_range(data, channel);
} elseif (value == full) { /* We can deduce only the range */
max197_set_full_range(data, channel);
}
mutex_unlock(&data->lock);
return count;
}
/* Function called on read access on in{0,1,2,3,4,5,6,7}_input */ static ssize_t max197_show_input(struct device *dev, struct device_attribute *devattr, char *buf)
{ struct max197_data *data = dev_get_drvdata(dev); struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); int channel = attr->index;
s32 value; int ret;
if (mutex_lock_interruptible(&data->lock)) return -ERESTARTSYS;
ret = data->pdata->convert(data->ctrl_bytes[channel]); if (ret < 0) {
dev_err(dev, "conversion failed\n"); goto unlock;
}
value = ret;
/* * Coefficient to apply on raw value. * See Table 1. Full Scale and Zero Scale in the MAX197 datasheet.
*/ if (data->scale) {
value *= MAX197_SCALE; if (max197_is_full_range(data, channel))
value *= 2;
value /= 10000;
}
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.