diff options
author | Lars-Peter Clausen <lars@metafoo.de> | 2012-08-10 12:36:00 -0400 |
---|---|---|
committer | Jonathan Cameron <jic23@kernel.org> | 2012-08-27 13:10:42 -0400 |
commit | 525e643e4812cd0ced0f40908fafaf0c4317ac73 (patch) | |
tree | ebf61f50671e15f31e499cc01fd06d6292495a65 | |
parent | 3f7c3306cf385d015d84c741e5433781f83d9254 (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/Kconfig | 6 | ||||
-rw-r--r-- | drivers/staging/iio/adc/ad7793.c | 81 | ||||
-rw-r--r-- | drivers/staging/iio/adc/ad7793.h | 10 |
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 | ||
111 | config AD7793 | 111 | config 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 | ||
39 | struct ad7793_chip_info { | 39 | struct 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 | ||
43 | struct ad7793_state { | 44 | struct ad7793_state { |
@@ -55,6 +56,8 @@ struct ad7793_state { | |||
55 | enum ad7793_supported_device_ids { | 56 | enum 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 | ||
60 | static struct ad7793_state *ad_sigma_delta_to_ad7793(struct ad_sigma_delta *sd) | 63 | 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 | 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) \ | ||
390 | const 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) \ | ||
401 | const 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 | |||
414 | static DECLARE_AD7793_CHANNELS(ad7792, 16, 32); | ||
415 | static DECLARE_AD7793_CHANNELS(ad7793, 24, 32); | ||
416 | static DECLARE_AD7795_CHANNELS(ad7794, 16, 32); | ||
417 | static DECLARE_AD7795_CHANNELS(ad7795, 24, 32); | ||
418 | |||
386 | static const struct ad7793_chip_info ad7793_chip_info_tbl[] = { | 419 | static 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) | |||
510 | static const struct spi_device_id ad7793_id[] = { | 537 | static 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 | }; |
515 | MODULE_DEVICE_TABLE(spi, ad7793_id); | 544 | MODULE_DEVICE_TABLE(spi, ad7793_id); |
@@ -526,5 +555,5 @@ static struct spi_driver ad7793_driver = { | |||
526 | module_spi_driver(ad7793_driver); | 555 | module_spi_driver(ad7793_driver); |
527 | 556 | ||
528 | MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>"); | 557 | MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>"); |
529 | MODULE_DESCRIPTION("Analog Devices AD7792/3 ADC"); | 558 | MODULE_DESCRIPTION("Analog Devices AD7793 and simialr ADCs"); |
530 | MODULE_LICENSE("GPL v2"); | 559 | MODULE_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) */ |