Skip to content

Commit

Permalink
staging:iio:ad7780: Add support for the ad7170/ad7171
Browse files Browse the repository at this point in the history
The ad7170/ad7171 have a software interface similar to the ad7780. They do not
have an external pin which allows to change the internal gain and the what is
used for the gain bit in the ad7780/ad7781 becomes part of the check pattern.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
  • Loading branch information
Lars-Peter Clausen authored and Jonathan Cameron committed Sep 22, 2012
1 parent 332ed63 commit 7aecec9
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 8 deletions.
4 changes: 2 additions & 2 deletions drivers/staging/iio/adc/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -82,12 +82,12 @@ config AD7887
module will be called ad7887.

config AD7780
tristate "Analog Devices AD7780 AD7781 ADC driver"
tristate "Analog Devices AD7780 and similar ADCs driver"
depends on SPI
depends on GPIOLIB
select AD_SIGMA_DELTA
help
Say yes here to build support for Analog Devices
Say yes here to build support for Analog Devices AD7170, AD7171,
AD7780 and AD7781 SPI analog to digital converters (ADC).
If unsure, say N (but it's safe to say "Y").

Expand Down
36 changes: 30 additions & 6 deletions drivers/staging/iio/adc/ad7780.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* AD7780/AD7781 SPI ADC driver
* AD7170/AD7171 and AD7780/AD7781 SPI ADC driver
*
* Copyright 2011 Analog Devices Inc.
*
Expand Down Expand Up @@ -34,7 +34,9 @@
#define AD7780_PAT0 (1 << 0)

struct ad7780_chip_info {
struct iio_chan_spec channel;
struct iio_chan_spec channel;
unsigned int pattern_mask;
unsigned int pattern;
};

struct ad7780_state {
Expand All @@ -48,6 +50,8 @@ struct ad7780_state {
};

enum ad7780_supported_device_ids {
ID_AD7170,
ID_AD7171,
ID_AD7780,
ID_AD7781,
};
Expand Down Expand Up @@ -109,9 +113,10 @@ static int ad7780_postprocess_sample(struct ad_sigma_delta *sigma_delta,
unsigned int raw_sample)
{
struct ad7780_state *st = ad_sigma_delta_to_ad7780(sigma_delta);
const struct ad7780_chip_info *chip_info = st->chip_info;

if ((raw_sample & AD7780_ERR) ||
!((raw_sample & AD7780_PAT0) && !(raw_sample & AD7780_PAT1)))
((raw_sample & chip_info->pattern_mask) != chip_info->pattern))
return -EIO;

if (raw_sample & AD7780_GAIN)
Expand All @@ -128,12 +133,29 @@ static const struct ad_sigma_delta_info ad7780_sigma_delta_info = {
.has_registers = false,
};

#define AD7780_CHANNEL(bits, wordsize) \
AD_SD_CHANNEL(1, 0, 0, bits, 32, wordsize - bits)

static const struct ad7780_chip_info ad7780_chip_info_tbl[] = {
[ID_AD7170] = {
.channel = AD7780_CHANNEL(12, 24),
.pattern = 0x5,
.pattern_mask = 0x7,
},
[ID_AD7171] = {
.channel = AD7780_CHANNEL(16, 24),
.pattern = 0x5,
.pattern_mask = 0x7,
},
[ID_AD7780] = {
.channel = AD_SD_CHANNEL(1, 0, 0, 24, 32, 8),
.channel = AD7780_CHANNEL(24, 32),
.pattern = 0x1,
.pattern_mask = 0x3,
},
[ID_AD7781] = {
.channel = AD_SD_CHANNEL(1, 0, 0, 20, 32, 12),
.channel = AD7780_CHANNEL(20, 32),
.pattern = 0x1,
.pattern_mask = 0x3,
},
};

Expand Down Expand Up @@ -247,6 +269,8 @@ static int __devexit ad7780_remove(struct spi_device *spi)
}

static const struct spi_device_id ad7780_id[] = {
{"ad7170", ID_AD7170},
{"ad7171", ID_AD7171},
{"ad7780", ID_AD7780},
{"ad7781", ID_AD7781},
{}
Expand All @@ -265,5 +289,5 @@ static struct spi_driver ad7780_driver = {
module_spi_driver(ad7780_driver);

MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
MODULE_DESCRIPTION("Analog Devices AD7780/1 ADC");
MODULE_DESCRIPTION("Analog Devices AD7780 and similar ADCs");
MODULE_LICENSE("GPL v2");

0 comments on commit 7aecec9

Please sign in to comment.