aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars-Peter Clausen <lars@metafoo.de>2012-08-10 12:36:00 -0400
committerJonathan Cameron <jic23@kernel.org>2012-08-27 13:10:42 -0400
commit525e643e4812cd0ced0f40908fafaf0c4317ac73 (patch)
treeebf61f50671e15f31e499cc01fd06d6292495a65
parent3f7c3306cf385d015d84c741e5433781f83d9254 (diff)
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: Lars-Peter Clausen <lars@metafoo.de> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
-rw-r--r--drivers/staging/iio/adc/Kconfig6
-rw-r--r--drivers/staging/iio/adc/ad7793.c81
-rw-r--r--drivers/staging/iio/adc/ad7793.h10
3 files changed, 66 insertions, 31 deletions
diff --git a/drivers/staging/iio/adc/Kconfig b/drivers/staging/iio/adc/Kconfig
index 3f1f2c341dff..0eab0c61c87b 100644
--- a/drivers/staging/iio/adc/Kconfig
+++ b/drivers/staging/iio/adc/Kconfig
@@ -109,12 +109,12 @@ config AD7780
109 module will be called ad7780. 109 module will be called ad7780.
110 110
111config AD7793 111config AD7793
112 tristate "Analog Devices AD7792 AD7793 ADC driver" 112 tristate "Analog Devices AD7793 and similar ADCs driver"
113 depends on SPI 113 depends on SPI
114 select AD_SIGMA_DELTA 114 select AD_SIGMA_DELTA
115 help 115 help
116 Say yes here to build support for Analog Devices 116 Say yes here to build support for Analog Devices AD7792, AD7793, AD7794
117 AD7792 and AD7793 SPI analog to digital converters (ADC). 117 and AD7795 SPI analog to digital converters (ADC).
118 If unsure, say N (but it's safe to say "Y"). 118 If unsure, say N (but it's safe to say "Y").
119 119
120 To compile this driver as a module, choose M here: the 120 To compile this driver as a module, choose M here: the
diff --git a/drivers/staging/iio/adc/ad7793.c b/drivers/staging/iio/adc/ad7793.c
index 90335958d9c9..f11dcaf0fbae 100644
--- a/drivers/staging/iio/adc/ad7793.c
+++ b/drivers/staging/iio/adc/ad7793.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * AD7792/AD7793 SPI ADC driver 2 * AD7792/AD7793/AD7794/AD7795 SPI ADC driver
3 * 3 *
4 * Copyright 2011-2012 Analog Devices Inc. 4 * Copyright 2011-2012 Analog Devices Inc.
5 * 5 *
@@ -37,7 +37,8 @@
37 */ 37 */
38 38
39struct ad7793_chip_info { 39struct ad7793_chip_info {
40 struct iio_chan_spec channel[7]; 40 const struct iio_chan_spec *channels;
41 unsigned int num_channels;
41}; 42};
42 43
43struct ad7793_state { 44struct ad7793_state {
@@ -55,6 +56,8 @@ struct ad7793_state {
55enum ad7793_supported_device_ids { 56enum ad7793_supported_device_ids {
56 ID_AD7792, 57 ID_AD7792,
57 ID_AD7793, 58 ID_AD7793,
59 ID_AD7794,
60 ID_AD7795,
58}; 61};
59 62
60static struct ad7793_state *ad_sigma_delta_to_ad7793(struct ad_sigma_delta *sd) 63static 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 130
128 id &= AD7793_ID_MASK; 131 id &= AD7793_ID_MASK;
129 132
130 if (!((id == AD7792_ID) || (id == AD7793_ID))) { 133 if (!((id == AD7792_ID) || (id == AD7793_ID) || (id == AD7795_ID))) {
131 dev_err(&st->sd.spi->dev, "device ID query failed\n"); 134 dev_err(&st->sd.spi->dev, "device ID query failed\n");
132 goto out; 135 goto out;
133 } 136 }
@@ -155,7 +158,7 @@ static int ad7793_setup(struct iio_dev *indio_dev,
155 /* Populate available ADC input ranges */ 158 /* Populate available ADC input ranges */
156 for (i = 0; i < ARRAY_SIZE(st->scale_avail); i++) { 159 for (i = 0; i < ARRAY_SIZE(st->scale_avail); i++) {
157 scale_uv = ((u64)st->int_vref_mv * 100000000) 160 scale_uv = ((u64)st->int_vref_mv * 100000000)
158 >> (st->chip_info->channel[0].scan_type.realbits - 161 >> (st->chip_info->channels[0].scan_type.realbits -
159 (!!(st->conf & AD7793_CONF_UNIPOLAR) ? 0 : 1)); 162 (!!(st->conf & AD7793_CONF_UNIPOLAR) ? 0 : 1));
160 scale_uv >>= i; 163 scale_uv >>= i;
161 164
@@ -383,28 +386,52 @@ static const struct iio_info ad7793_info = {
383 .driver_module = THIS_MODULE, 386 .driver_module = THIS_MODULE,
384}; 387};
385 388
389#define DECLARE_AD7793_CHANNELS(_name, _b, _sb) \
390const struct iio_chan_spec _name##_channels[] = { \
391 AD_SD_DIFF_CHANNEL(0, 0, 0, AD7793_CH_AIN1P_AIN1M, (_b), (_sb), 0), \
392 AD_SD_DIFF_CHANNEL(1, 1, 1, AD7793_CH_AIN2P_AIN2M, (_b), (_sb), 0), \
393 AD_SD_DIFF_CHANNEL(2, 2, 2, AD7793_CH_AIN3P_AIN3M, (_b), (_sb), 0), \
394 AD_SD_SHORTED_CHANNEL(3, 0, AD7793_CH_AIN1M_AIN1M, (_b), (_sb), 0), \
395 AD_SD_TEMP_CHANNEL(4, AD7793_CH_TEMP, (_b), (_sb), 0), \
396 AD_SD_SUPPLY_CHANNEL(5, 3, AD7793_CH_AVDD_MONITOR, (_b), (_sb), 0), \
397 IIO_CHAN_SOFT_TIMESTAMP(6), \
398}
399
400#define DECLARE_AD7795_CHANNELS(_name, _b, _sb) \
401const struct iio_chan_spec _name##_channels[] = { \
402 AD_SD_DIFF_CHANNEL(0, 0, 0, AD7793_CH_AIN1P_AIN1M, (_b), (_sb), 0), \
403 AD_SD_DIFF_CHANNEL(1, 1, 1, AD7793_CH_AIN2P_AIN2M, (_b), (_sb), 0), \
404 AD_SD_DIFF_CHANNEL(2, 2, 2, AD7793_CH_AIN3P_AIN3M, (_b), (_sb), 0), \
405 AD_SD_DIFF_CHANNEL(3, 3, 3, AD7795_CH_AIN4P_AIN4M, (_b), (_sb), 0), \
406 AD_SD_DIFF_CHANNEL(4, 4, 4, AD7795_CH_AIN5P_AIN5M, (_b), (_sb), 0), \
407 AD_SD_DIFF_CHANNEL(5, 5, 5, AD7795_CH_AIN6P_AIN6M, (_b), (_sb), 0), \
408 AD_SD_SHORTED_CHANNEL(6, 0, AD7795_CH_AIN1M_AIN1M, (_b), (_sb), 0), \
409 AD_SD_TEMP_CHANNEL(7, AD7793_CH_TEMP, (_b), (_sb), 0), \
410 AD_SD_SUPPLY_CHANNEL(8, 3, AD7793_CH_AVDD_MONITOR, (_b), (_sb), 0), \
411 IIO_CHAN_SOFT_TIMESTAMP(9), \
412}
413
414static DECLARE_AD7793_CHANNELS(ad7792, 16, 32);
415static DECLARE_AD7793_CHANNELS(ad7793, 24, 32);
416static DECLARE_AD7795_CHANNELS(ad7794, 16, 32);
417static DECLARE_AD7795_CHANNELS(ad7795, 24, 32);
418
386static const struct ad7793_chip_info ad7793_chip_info_tbl[] = { 419static const struct ad7793_chip_info ad7793_chip_info_tbl[] = {
420 [ID_AD7792] = {
421 .channels = ad7792_channels,
422 .num_channels = ARRAY_SIZE(ad7792_channels),
423 },
387 [ID_AD7793] = { 424 [ID_AD7793] = {
388 .channel = { 425 .channels = ad7793_channels,
389 AD_SD_DIFF_CHANNEL(0, 0, 0, AD7793_CH_AIN1P_AIN1M, 24, 32, 0), 426 .num_channels = ARRAY_SIZE(ad7793_channels),
390 AD_SD_DIFF_CHANNEL(1, 1, 1, AD7793_CH_AIN2P_AIN2M, 24, 32, 0),
391 AD_SD_DIFF_CHANNEL(2, 2, 2, AD7793_CH_AIN3P_AIN3M, 24, 32, 0),
392 AD_SD_SHORTED_CHANNEL(3, 0, AD7793_CH_AIN1M_AIN1M, 24, 32, 0),
393 AD_SD_TEMP_CHANNEL(4, AD7793_CH_TEMP, 24, 32, 0),
394 AD_SD_SUPPLY_CHANNEL(5, 3, AD7793_CH_AVDD_MONITOR, 24, 32, 0),
395 IIO_CHAN_SOFT_TIMESTAMP(6),
396 },
397 }, 427 },
398 [ID_AD7792] = { 428 [ID_AD7794] = {
399 .channel = { 429 .channels = ad7794_channels,
400 AD_SD_DIFF_CHANNEL(0, 0, 0, AD7793_CH_AIN1P_AIN1M, 16, 32, 0), 430 .num_channels = ARRAY_SIZE(ad7794_channels),
401 AD_SD_DIFF_CHANNEL(1, 1, 1, AD7793_CH_AIN2P_AIN2M, 16, 32, 0), 431 },
402 AD_SD_DIFF_CHANNEL(2, 2, 2, AD7793_CH_AIN3P_AIN3M, 16, 32, 0), 432 [ID_AD7795] = {
403 AD_SD_SHORTED_CHANNEL(3, 0, AD7793_CH_AIN1M_AIN1M, 16, 32, 0), 433 .channels = ad7795_channels,
404 AD_SD_TEMP_CHANNEL(4, AD7793_CH_TEMP, 16, 32, 0), 434 .num_channels = ARRAY_SIZE(ad7795_channels),
405 AD_SD_SUPPLY_CHANNEL(5, 3, AD7793_CH_AVDD_MONITOR, 16, 32, 0),
406 IIO_CHAN_SOFT_TIMESTAMP(6),
407 },
408 }, 435 },
409}; 436};
410 437
@@ -457,8 +484,8 @@ static int __devinit ad7793_probe(struct spi_device *spi)
457 indio_dev->dev.parent = &spi->dev; 484 indio_dev->dev.parent = &spi->dev;
458 indio_dev->name = spi_get_device_id(spi)->name; 485 indio_dev->name = spi_get_device_id(spi)->name;
459 indio_dev->modes = INDIO_DIRECT_MODE; 486 indio_dev->modes = INDIO_DIRECT_MODE;
460 indio_dev->channels = st->chip_info->channel; 487 indio_dev->channels = st->chip_info->channels;
461 indio_dev->num_channels = 7; 488 indio_dev->num_channels = st->chip_info->num_channels;
462 indio_dev->info = &ad7793_info; 489 indio_dev->info = &ad7793_info;
463 490
464 ret = ad_sd_setup_buffer_and_trigger(indio_dev); 491 ret = ad_sd_setup_buffer_and_trigger(indio_dev);
@@ -510,6 +537,8 @@ static int ad7793_remove(struct spi_device *spi)
510static const struct spi_device_id ad7793_id[] = { 537static const struct spi_device_id ad7793_id[] = {
511 {"ad7792", ID_AD7792}, 538 {"ad7792", ID_AD7792},
512 {"ad7793", ID_AD7793}, 539 {"ad7793", ID_AD7793},
540 {"ad7794", ID_AD7794},
541 {"ad7795", ID_AD7795},
513 {} 542 {}
514}; 543};
515MODULE_DEVICE_TABLE(spi, ad7793_id); 544MODULE_DEVICE_TABLE(spi, ad7793_id);
@@ -526,5 +555,5 @@ static struct spi_driver ad7793_driver = {
526module_spi_driver(ad7793_driver); 555module_spi_driver(ad7793_driver);
527 556
528MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>"); 557MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
529MODULE_DESCRIPTION("Analog Devices AD7792/3 ADC"); 558MODULE_DESCRIPTION("Analog Devices AD7793 and simialr ADCs");
530MODULE_LICENSE("GPL v2"); 559MODULE_LICENSE("GPL v2");
diff --git a/drivers/staging/iio/adc/ad7793.h b/drivers/staging/iio/adc/ad7793.h
index 0e296d88412b..8fdd450a2cd9 100644
--- a/drivers/staging/iio/adc/ad7793.h
+++ b/drivers/staging/iio/adc/ad7793.h
@@ -70,8 +70,8 @@
70#define AD7793_CONF_GAIN(x) (((x) & 0x7) << 8) /* Gain Select */ 70#define AD7793_CONF_GAIN(x) (((x) & 0x7) << 8) /* Gain Select */
71#define AD7793_CONF_REFSEL (1 << 7) /* INT/EXT Reference Select */ 71#define AD7793_CONF_REFSEL (1 << 7) /* INT/EXT Reference Select */
72#define AD7793_CONF_BUF (1 << 4) /* Buffered Mode Enable */ 72#define AD7793_CONF_BUF (1 << 4) /* Buffered Mode Enable */
73#define AD7793_CONF_CHAN(x) ((x) & 0x7) /* Channel select */ 73#define AD7793_CONF_CHAN(x) ((x) & 0xf) /* Channel select */
74#define AD7793_CONF_CHAN_MASK 0x7 /* Channel select mask */ 74#define AD7793_CONF_CHAN_MASK 0xf /* Channel select mask */
75 75
76#define AD7793_CH_AIN1P_AIN1M 0 /* AIN1(+) - AIN1(-) */ 76#define AD7793_CH_AIN1P_AIN1M 0 /* AIN1(+) - AIN1(-) */
77#define AD7793_CH_AIN2P_AIN2M 1 /* AIN2(+) - AIN2(-) */ 77#define AD7793_CH_AIN2P_AIN2M 1 /* AIN2(+) - AIN2(-) */
@@ -80,9 +80,15 @@
80#define AD7793_CH_TEMP 6 /* Temp Sensor */ 80#define AD7793_CH_TEMP 6 /* Temp Sensor */
81#define AD7793_CH_AVDD_MONITOR 7 /* AVDD Monitor */ 81#define AD7793_CH_AVDD_MONITOR 7 /* AVDD Monitor */
82 82
83#define AD7795_CH_AIN4P_AIN4M 4 /* AIN4(+) - AIN4(-) */
84#define AD7795_CH_AIN5P_AIN5M 5 /* AIN5(+) - AIN5(-) */
85#define AD7795_CH_AIN6P_AIN6M 6 /* AIN6(+) - AIN6(-) */
86#define AD7795_CH_AIN1M_AIN1M 8 /* AIN1(-) - AIN1(-) */
87
83/* ID Register Bit Designations (AD7793_REG_ID) */ 88/* ID Register Bit Designations (AD7793_REG_ID) */
84#define AD7792_ID 0xA 89#define AD7792_ID 0xA
85#define AD7793_ID 0xB 90#define AD7793_ID 0xB
91#define AD7795_ID 0xF
86#define AD7793_ID_MASK 0xF 92#define AD7793_ID_MASK 0xF
87 93
88/* IO (Excitation Current Sources) Register Bit Designations (AD7793_REG_IO) */ 94/* IO (Excitation Current Sources) Register Bit Designations (AD7793_REG_IO) */