Commit 525e643e authored by Lars-Peter Clausen's avatar Lars-Peter Clausen Committed by Jonathan Cameron

staging:iio:ad7793: Add support for ad7794/ad7795

The ad7794/ad7795 are similar to the ad7792/ad7793, but have 6 channels instead
of 3.
Signed-off-by: default avatarLars-Peter Clausen <lars@metafoo.de>
Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
parent 3f7c3306
...@@ -109,12 +109,12 @@ config AD7780 ...@@ -109,12 +109,12 @@ config AD7780
module will be called ad7780. module will be called ad7780.
config AD7793 config AD7793
tristate "Analog Devices AD7792 AD7793 ADC driver" tristate "Analog Devices AD7793 and similar ADCs driver"
depends on SPI depends on SPI
select AD_SIGMA_DELTA select AD_SIGMA_DELTA
help help
Say yes here to build support for Analog Devices Say yes here to build support for Analog Devices AD7792, AD7793, AD7794
AD7792 and AD7793 SPI analog to digital converters (ADC). and AD7795 SPI analog to digital converters (ADC).
If unsure, say N (but it's safe to say "Y"). If unsure, say N (but it's safe to say "Y").
To compile this driver as a module, choose M here: the To compile this driver as a module, choose M here: the
......
/* /*
* AD7792/AD7793 SPI ADC driver * AD7792/AD7793/AD7794/AD7795 SPI ADC driver
* *
* Copyright 2011-2012 Analog Devices Inc. * Copyright 2011-2012 Analog Devices Inc.
* *
...@@ -37,7 +37,8 @@ ...@@ -37,7 +37,8 @@
*/ */
struct ad7793_chip_info { struct ad7793_chip_info {
struct iio_chan_spec channel[7]; const struct iio_chan_spec *channels;
unsigned int num_channels;
}; };
struct ad7793_state { struct ad7793_state {
...@@ -55,6 +56,8 @@ struct ad7793_state { ...@@ -55,6 +56,8 @@ struct ad7793_state {
enum ad7793_supported_device_ids { enum ad7793_supported_device_ids {
ID_AD7792, ID_AD7792,
ID_AD7793, ID_AD7793,
ID_AD7794,
ID_AD7795,
}; };
static struct ad7793_state *ad_sigma_delta_to_ad7793(struct ad_sigma_delta *sd) static struct ad7793_state *ad_sigma_delta_to_ad7793(struct ad_sigma_delta *sd)
...@@ -127,7 +130,7 @@ static int ad7793_setup(struct iio_dev *indio_dev, ...@@ -127,7 +130,7 @@ static int ad7793_setup(struct iio_dev *indio_dev,
id &= AD7793_ID_MASK; id &= AD7793_ID_MASK;
if (!((id == AD7792_ID) || (id == AD7793_ID))) { if (!((id == AD7792_ID) || (id == AD7793_ID) || (id == AD7795_ID))) {
dev_err(&st->sd.spi->dev, "device ID query failed\n"); dev_err(&st->sd.spi->dev, "device ID query failed\n");
goto out; goto out;
} }
...@@ -155,7 +158,7 @@ static int ad7793_setup(struct iio_dev *indio_dev, ...@@ -155,7 +158,7 @@ static int ad7793_setup(struct iio_dev *indio_dev,
/* Populate available ADC input ranges */ /* Populate available ADC input ranges */
for (i = 0; i < ARRAY_SIZE(st->scale_avail); i++) { for (i = 0; i < ARRAY_SIZE(st->scale_avail); i++) {
scale_uv = ((u64)st->int_vref_mv * 100000000) scale_uv = ((u64)st->int_vref_mv * 100000000)
>> (st->chip_info->channel[0].scan_type.realbits - >> (st->chip_info->channels[0].scan_type.realbits -
(!!(st->conf & AD7793_CONF_UNIPOLAR) ? 0 : 1)); (!!(st->conf & AD7793_CONF_UNIPOLAR) ? 0 : 1));
scale_uv >>= i; scale_uv >>= i;
...@@ -383,28 +386,52 @@ static const struct iio_info ad7793_info = { ...@@ -383,28 +386,52 @@ static const struct iio_info ad7793_info = {
.driver_module = THIS_MODULE, .driver_module = THIS_MODULE,
}; };
#define DECLARE_AD7793_CHANNELS(_name, _b, _sb) \
const struct iio_chan_spec _name##_channels[] = { \
AD_SD_DIFF_CHANNEL(0, 0, 0, AD7793_CH_AIN1P_AIN1M, (_b), (_sb), 0), \
AD_SD_DIFF_CHANNEL(1, 1, 1, AD7793_CH_AIN2P_AIN2M, (_b), (_sb), 0), \
AD_SD_DIFF_CHANNEL(2, 2, 2, AD7793_CH_AIN3P_AIN3M, (_b), (_sb), 0), \
AD_SD_SHORTED_CHANNEL(3, 0, AD7793_CH_AIN1M_AIN1M, (_b), (_sb), 0), \
AD_SD_TEMP_CHANNEL(4, AD7793_CH_TEMP, (_b), (_sb), 0), \
AD_SD_SUPPLY_CHANNEL(5, 3, AD7793_CH_AVDD_MONITOR, (_b), (_sb), 0), \
IIO_CHAN_SOFT_TIMESTAMP(6), \
}
#define DECLARE_AD7795_CHANNELS(_name, _b, _sb) \
const struct iio_chan_spec _name##_channels[] = { \
AD_SD_DIFF_CHANNEL(0, 0, 0, AD7793_CH_AIN1P_AIN1M, (_b), (_sb), 0), \
AD_SD_DIFF_CHANNEL(1, 1, 1, AD7793_CH_AIN2P_AIN2M, (_b), (_sb), 0), \
AD_SD_DIFF_CHANNEL(2, 2, 2, AD7793_CH_AIN3P_AIN3M, (_b), (_sb), 0), \
AD_SD_DIFF_CHANNEL(3, 3, 3, AD7795_CH_AIN4P_AIN4M, (_b), (_sb), 0), \
AD_SD_DIFF_CHANNEL(4, 4, 4, AD7795_CH_AIN5P_AIN5M, (_b), (_sb), 0), \
AD_SD_DIFF_CHANNEL(5, 5, 5, AD7795_CH_AIN6P_AIN6M, (_b), (_sb), 0), \
AD_SD_SHORTED_CHANNEL(6, 0, AD7795_CH_AIN1M_AIN1M, (_b), (_sb), 0), \
AD_SD_TEMP_CHANNEL(7, AD7793_CH_TEMP, (_b), (_sb), 0), \
AD_SD_SUPPLY_CHANNEL(8, 3, AD7793_CH_AVDD_MONITOR, (_b), (_sb), 0), \
IIO_CHAN_SOFT_TIMESTAMP(9), \
}
static DECLARE_AD7793_CHANNELS(ad7792, 16, 32);
static DECLARE_AD7793_CHANNELS(ad7793, 24, 32);
static DECLARE_AD7795_CHANNELS(ad7794, 16, 32);
static DECLARE_AD7795_CHANNELS(ad7795, 24, 32);
static const struct ad7793_chip_info ad7793_chip_info_tbl[] = { static const struct ad7793_chip_info ad7793_chip_info_tbl[] = {
[ID_AD7793] = { [ID_AD7792] = {
.channel = { .channels = ad7792_channels,
AD_SD_DIFF_CHANNEL(0, 0, 0, AD7793_CH_AIN1P_AIN1M, 24, 32, 0), .num_channels = ARRAY_SIZE(ad7792_channels),
AD_SD_DIFF_CHANNEL(1, 1, 1, AD7793_CH_AIN2P_AIN2M, 24, 32, 0),
AD_SD_DIFF_CHANNEL(2, 2, 2, AD7793_CH_AIN3P_AIN3M, 24, 32, 0),
AD_SD_SHORTED_CHANNEL(3, 0, AD7793_CH_AIN1M_AIN1M, 24, 32, 0),
AD_SD_TEMP_CHANNEL(4, AD7793_CH_TEMP, 24, 32, 0),
AD_SD_SUPPLY_CHANNEL(5, 3, AD7793_CH_AVDD_MONITOR, 24, 32, 0),
IIO_CHAN_SOFT_TIMESTAMP(6),
}, },
[ID_AD7793] = {
.channels = ad7793_channels,
.num_channels = ARRAY_SIZE(ad7793_channels),
}, },
[ID_AD7792] = { [ID_AD7794] = {
.channel = { .channels = ad7794_channels,
AD_SD_DIFF_CHANNEL(0, 0, 0, AD7793_CH_AIN1P_AIN1M, 16, 32, 0), .num_channels = ARRAY_SIZE(ad7794_channels),
AD_SD_DIFF_CHANNEL(1, 1, 1, AD7793_CH_AIN2P_AIN2M, 16, 32, 0),
AD_SD_DIFF_CHANNEL(2, 2, 2, AD7793_CH_AIN3P_AIN3M, 16, 32, 0),
AD_SD_SHORTED_CHANNEL(3, 0, AD7793_CH_AIN1M_AIN1M, 16, 32, 0),
AD_SD_TEMP_CHANNEL(4, AD7793_CH_TEMP, 16, 32, 0),
AD_SD_SUPPLY_CHANNEL(5, 3, AD7793_CH_AVDD_MONITOR, 16, 32, 0),
IIO_CHAN_SOFT_TIMESTAMP(6),
}, },
[ID_AD7795] = {
.channels = ad7795_channels,
.num_channels = ARRAY_SIZE(ad7795_channels),
}, },
}; };
...@@ -457,8 +484,8 @@ static int __devinit ad7793_probe(struct spi_device *spi) ...@@ -457,8 +484,8 @@ static int __devinit ad7793_probe(struct spi_device *spi)
indio_dev->dev.parent = &spi->dev; indio_dev->dev.parent = &spi->dev;
indio_dev->name = spi_get_device_id(spi)->name; indio_dev->name = spi_get_device_id(spi)->name;
indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->modes = INDIO_DIRECT_MODE;
indio_dev->channels = st->chip_info->channel; indio_dev->channels = st->chip_info->channels;
indio_dev->num_channels = 7; indio_dev->num_channels = st->chip_info->num_channels;
indio_dev->info = &ad7793_info; indio_dev->info = &ad7793_info;
ret = ad_sd_setup_buffer_and_trigger(indio_dev); ret = ad_sd_setup_buffer_and_trigger(indio_dev);
...@@ -510,6 +537,8 @@ static int ad7793_remove(struct spi_device *spi) ...@@ -510,6 +537,8 @@ static int ad7793_remove(struct spi_device *spi)
static const struct spi_device_id ad7793_id[] = { static const struct spi_device_id ad7793_id[] = {
{"ad7792", ID_AD7792}, {"ad7792", ID_AD7792},
{"ad7793", ID_AD7793}, {"ad7793", ID_AD7793},
{"ad7794", ID_AD7794},
{"ad7795", ID_AD7795},
{} {}
}; };
MODULE_DEVICE_TABLE(spi, ad7793_id); MODULE_DEVICE_TABLE(spi, ad7793_id);
...@@ -526,5 +555,5 @@ static struct spi_driver ad7793_driver = { ...@@ -526,5 +555,5 @@ static struct spi_driver ad7793_driver = {
module_spi_driver(ad7793_driver); module_spi_driver(ad7793_driver);
MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>"); MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
MODULE_DESCRIPTION("Analog Devices AD7792/3 ADC"); MODULE_DESCRIPTION("Analog Devices AD7793 and simialr ADCs");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
...@@ -70,8 +70,8 @@ ...@@ -70,8 +70,8 @@
#define AD7793_CONF_GAIN(x) (((x) & 0x7) << 8) /* Gain Select */ #define AD7793_CONF_GAIN(x) (((x) & 0x7) << 8) /* Gain Select */
#define AD7793_CONF_REFSEL (1 << 7) /* INT/EXT Reference Select */ #define AD7793_CONF_REFSEL (1 << 7) /* INT/EXT Reference Select */
#define AD7793_CONF_BUF (1 << 4) /* Buffered Mode Enable */ #define AD7793_CONF_BUF (1 << 4) /* Buffered Mode Enable */
#define AD7793_CONF_CHAN(x) ((x) & 0x7) /* Channel select */ #define AD7793_CONF_CHAN(x) ((x) & 0xf) /* Channel select */
#define AD7793_CONF_CHAN_MASK 0x7 /* Channel select mask */ #define AD7793_CONF_CHAN_MASK 0xf /* Channel select mask */
#define AD7793_CH_AIN1P_AIN1M 0 /* AIN1(+) - AIN1(-) */ #define AD7793_CH_AIN1P_AIN1M 0 /* AIN1(+) - AIN1(-) */
#define AD7793_CH_AIN2P_AIN2M 1 /* AIN2(+) - AIN2(-) */ #define AD7793_CH_AIN2P_AIN2M 1 /* AIN2(+) - AIN2(-) */
...@@ -80,9 +80,15 @@ ...@@ -80,9 +80,15 @@
#define AD7793_CH_TEMP 6 /* Temp Sensor */ #define AD7793_CH_TEMP 6 /* Temp Sensor */
#define AD7793_CH_AVDD_MONITOR 7 /* AVDD Monitor */ #define AD7793_CH_AVDD_MONITOR 7 /* AVDD Monitor */
#define AD7795_CH_AIN4P_AIN4M 4 /* AIN4(+) - AIN4(-) */
#define AD7795_CH_AIN5P_AIN5M 5 /* AIN5(+) - AIN5(-) */
#define AD7795_CH_AIN6P_AIN6M 6 /* AIN6(+) - AIN6(-) */
#define AD7795_CH_AIN1M_AIN1M 8 /* AIN1(-) - AIN1(-) */
/* ID Register Bit Designations (AD7793_REG_ID) */ /* ID Register Bit Designations (AD7793_REG_ID) */
#define AD7792_ID 0xA #define AD7792_ID 0xA
#define AD7793_ID 0xB #define AD7793_ID 0xB
#define AD7795_ID 0xF
#define AD7793_ID_MASK 0xF #define AD7793_ID_MASK 0xF
/* IO (Excitation Current Sources) Register Bit Designations (AD7793_REG_IO) */ /* IO (Excitation Current Sources) Register Bit Designations (AD7793_REG_IO) */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment