forked from Minki/linux
7989b4bb23
The AD7616 is a 12-bit ADC with 16 channels. The AD7616 can be configured to work in hardware mode by controlling it via gpio pins and read data via spi. No support for software mode yet, but it is a work in progress. This device requires a reset in order to update oversampling, so chip info has got a new attribute to mark this. The current assumption that this driver makes for AD7616, is that it's working in Hardware Mode with Serial, Burst and Sequencer modes activated. To activate them, following pins must be pulled high: -SER/PAR -SEQEN And following must be pulled low: -WR/BURST -DB4/SEQEN Datasheets: Link: https://www.analog.com/media/en/technical-documentation/data-sheets/ad7616.pdf Signed-off-by: Beniamin Bia <beniamin.bia@analog.com> Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com> Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
85 lines
1.9 KiB
C
85 lines
1.9 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* AD7606 SPI ADC driver
|
|
*
|
|
* Copyright 2011 Analog Devices Inc.
|
|
*/
|
|
|
|
#include <linux/module.h>
|
|
#include <linux/spi/spi.h>
|
|
#include <linux/types.h>
|
|
#include <linux/err.h>
|
|
|
|
#include <linux/iio/iio.h>
|
|
#include "ad7606.h"
|
|
|
|
#define MAX_SPI_FREQ_HZ 23500000 /* VDRIVE above 4.75 V */
|
|
|
|
static int ad7606_spi_read_block(struct device *dev,
|
|
int count, void *buf)
|
|
{
|
|
struct spi_device *spi = to_spi_device(dev);
|
|
int i, ret;
|
|
unsigned short *data = buf;
|
|
__be16 *bdata = buf;
|
|
|
|
ret = spi_read(spi, buf, count * 2);
|
|
if (ret < 0) {
|
|
dev_err(&spi->dev, "SPI read error\n");
|
|
return ret;
|
|
}
|
|
|
|
for (i = 0; i < count; i++)
|
|
data[i] = be16_to_cpu(bdata[i]);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static const struct ad7606_bus_ops ad7606_spi_bops = {
|
|
.read_block = ad7606_spi_read_block,
|
|
};
|
|
|
|
static int ad7606_spi_probe(struct spi_device *spi)
|
|
{
|
|
const struct spi_device_id *id = spi_get_device_id(spi);
|
|
|
|
return ad7606_probe(&spi->dev, spi->irq, NULL,
|
|
id->name, id->driver_data,
|
|
&ad7606_spi_bops);
|
|
}
|
|
|
|
static const struct spi_device_id ad7606_id_table[] = {
|
|
{ "ad7605-4", ID_AD7605_4 },
|
|
{ "ad7606-4", ID_AD7606_4 },
|
|
{ "ad7606-6", ID_AD7606_6 },
|
|
{ "ad7606-8", ID_AD7606_8 },
|
|
{ "ad7616", ID_AD7616 },
|
|
{}
|
|
};
|
|
MODULE_DEVICE_TABLE(spi, ad7606_id_table);
|
|
|
|
static const struct of_device_id ad7606_of_match[] = {
|
|
{ .compatible = "adi,ad7605-4" },
|
|
{ .compatible = "adi,ad7606-4" },
|
|
{ .compatible = "adi,ad7606-6" },
|
|
{ .compatible = "adi,ad7606-8" },
|
|
{ .compatible = "adi,ad7616" },
|
|
{ },
|
|
};
|
|
MODULE_DEVICE_TABLE(of, ad7606_of_match);
|
|
|
|
static struct spi_driver ad7606_driver = {
|
|
.driver = {
|
|
.name = "ad7606",
|
|
.of_match_table = ad7606_of_match,
|
|
.pm = AD7606_PM_OPS,
|
|
},
|
|
.probe = ad7606_spi_probe,
|
|
.id_table = ad7606_id_table,
|
|
};
|
|
module_spi_driver(ad7606_driver);
|
|
|
|
MODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>");
|
|
MODULE_DESCRIPTION("Analog Devices AD7606 ADC");
|
|
MODULE_LICENSE("GPL v2");
|