if (mutex_lock_interruptible(&adc->lock)) return -ERESTARTSYS;
if (adc->channels == 1) {
status = spi_read(spi, rx_buf, sizeof(rx_buf));
} else {
tx_buf[0] = attr->index << 3; /* other bits are don't care */
status = spi_write_then_read(spi, tx_buf, sizeof(tx_buf),
rx_buf, sizeof(rx_buf));
} if (status < 0) {
dev_warn(dev, "SPI synch. transfer failed with status %d\n",
status); goto out;
}
value = (rx_buf[0] << 8) + rx_buf[1];
dev_dbg(dev, "raw value = 0x%x\n", value);
value = value * adc->reference >> 12;
status = sprintf(buf, "%d\n", value);
out:
mutex_unlock(&adc->lock); return status;
}
static ssize_t adcxx_min_show(struct device *dev, struct device_attribute *devattr, char *buf)
{ /* The minimum reference is 0 for this chip family */ return sprintf(buf, "0\n");
}
staticint adcxx_probe(struct spi_device *spi)
{ int channels = spi_get_device_id(spi)->driver_data; struct adcxx *adc; int status; int i;
adc = devm_kzalloc(&spi->dev, sizeof(*adc), GFP_KERNEL); if (!adc) return -ENOMEM;
/* set a default value for the reference */
adc->reference = 3300;
adc->channels = channels;
mutex_init(&adc->lock);
mutex_lock(&adc->lock);
spi_set_drvdata(spi, adc);
for (i = 0; i < 3 + adc->channels; i++) {
status = device_create_file(&spi->dev, &ad_input[i].dev_attr); if (status) {
dev_err(&spi->dev, "device_create_file failed.\n"); goto out_err;
}
}
adc->hwmon_dev = hwmon_device_register(&spi->dev); if (IS_ERR(adc->hwmon_dev)) {
dev_err(&spi->dev, "hwmon_device_register failed.\n");
status = PTR_ERR(adc->hwmon_dev); goto out_err;
}
mutex_unlock(&adc->lock); return0;
out_err: for (i--; i >= 0; i--)
device_remove_file(&spi->dev, &ad_input[i].dev_attr);
mutex_lock(&adc->lock);
hwmon_device_unregister(adc->hwmon_dev); for (i = 0; i < 3 + adc->channels; i++)
device_remove_file(&spi->dev, &ad_input[i].dev_attr);
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.