Commit 2a67dfba authored by Urs Fässler's avatar Urs Fässler Committed by Jonathan Cameron

iio:adc128s052: add support for adc122s021

Signed-off-by: default avatarUrs Fässler <urs.fassler@bytesatwork.ch>
Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
parent 1ce87f21
* Texas Instruments' ADC128S052 ADC chip * Texas Instruments' ADC128S052 and ADC122S021 ADC chip
Required properties: Required properties:
- compatible: Should be "ti,adc128s052" - compatible: Should be "ti,adc128s052" or "ti,adc122s021"
- reg: spi chip select number for the device - reg: spi chip select number for the device
- vref-supply: The regulator supply for ADC reference voltage - vref-supply: The regulator supply for ADC reference voltage
......
...@@ -292,11 +292,11 @@ config TI_ADC081C ...@@ -292,11 +292,11 @@ config TI_ADC081C
called ti-adc081c. called ti-adc081c.
config TI_ADC128S052 config TI_ADC128S052
tristate "Texas Instruments ADC128S052" tristate "Texas Instruments ADC128S052/ADC122S021"
depends on SPI depends on SPI
help help
If you say yes here you get support for Texas Instruments ADC128S052 If you say yes here you get support for Texas Instruments ADC128S052
chip. and ADC122S021 chips.
This driver can also be built as a module. If so, the module will be This driver can also be built as a module. If so, the module will be
called ti-adc128s052. called ti-adc128s052.
......
/* /*
* Copyright (C) 2014 Angelo Compagnucci <angelo.compagnucci@gmail.com> * Copyright (C) 2014 Angelo Compagnucci <angelo.compagnucci@gmail.com>
* *
* Driver for Texas Instruments' ADC128S052 ADC chip. * Driver for Texas Instruments' ADC128S052 and ADC122S021 ADC chip.
* Datasheet can be found here: * Datasheets can be found here:
* http://www.ti.com/lit/ds/symlink/adc128s052.pdf * http://www.ti.com/lit/ds/symlink/adc128s052.pdf
* http://www.ti.com/lit/ds/symlink/adc122s021.pdf
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as * it under the terms of the GNU General Public License version 2 as
...@@ -16,6 +17,11 @@ ...@@ -16,6 +17,11 @@
#include <linux/iio/iio.h> #include <linux/iio/iio.h>
#include <linux/regulator/consumer.h> #include <linux/regulator/consumer.h>
struct adc128_configuration {
const struct iio_chan_spec *channels;
u8 num_channels;
};
struct adc128 { struct adc128 {
struct spi_device *spi; struct spi_device *spi;
...@@ -92,7 +98,7 @@ static int adc128_read_raw(struct iio_dev *indio_dev, ...@@ -92,7 +98,7 @@ static int adc128_read_raw(struct iio_dev *indio_dev,
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) \ .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) \
} }
static const struct iio_chan_spec adc128_channels[] = { static const struct iio_chan_spec adc128s052_channels[] = {
ADC128_VOLTAGE_CHANNEL(0), ADC128_VOLTAGE_CHANNEL(0),
ADC128_VOLTAGE_CHANNEL(1), ADC128_VOLTAGE_CHANNEL(1),
ADC128_VOLTAGE_CHANNEL(2), ADC128_VOLTAGE_CHANNEL(2),
...@@ -103,6 +109,16 @@ static const struct iio_chan_spec adc128_channels[] = { ...@@ -103,6 +109,16 @@ static const struct iio_chan_spec adc128_channels[] = {
ADC128_VOLTAGE_CHANNEL(7), ADC128_VOLTAGE_CHANNEL(7),
}; };
static const struct iio_chan_spec adc122s021_channels[] = {
ADC128_VOLTAGE_CHANNEL(0),
ADC128_VOLTAGE_CHANNEL(1),
};
static const struct adc128_configuration adc128_config[] = {
{ adc128s052_channels, ARRAY_SIZE(adc128s052_channels) },
{ adc122s021_channels, ARRAY_SIZE(adc122s021_channels) },
};
static const struct iio_info adc128_info = { static const struct iio_info adc128_info = {
.read_raw = adc128_read_raw, .read_raw = adc128_read_raw,
.driver_module = THIS_MODULE, .driver_module = THIS_MODULE,
...@@ -112,6 +128,7 @@ static int adc128_probe(struct spi_device *spi) ...@@ -112,6 +128,7 @@ static int adc128_probe(struct spi_device *spi)
{ {
struct iio_dev *indio_dev; struct iio_dev *indio_dev;
struct adc128 *adc; struct adc128 *adc;
int config = spi_get_device_id(spi)->driver_data;
int ret; int ret;
indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*adc)); indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*adc));
...@@ -128,8 +145,8 @@ static int adc128_probe(struct spi_device *spi) ...@@ -128,8 +145,8 @@ static int adc128_probe(struct spi_device *spi)
indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->modes = INDIO_DIRECT_MODE;
indio_dev->info = &adc128_info; indio_dev->info = &adc128_info;
indio_dev->channels = adc128_channels; indio_dev->channels = adc128_config[config].channels;
indio_dev->num_channels = ARRAY_SIZE(adc128_channels); indio_dev->num_channels = adc128_config[config].num_channels;
adc->reg = devm_regulator_get(&spi->dev, "vref"); adc->reg = devm_regulator_get(&spi->dev, "vref");
if (IS_ERR(adc->reg)) if (IS_ERR(adc->reg))
...@@ -158,7 +175,8 @@ static int adc128_remove(struct spi_device *spi) ...@@ -158,7 +175,8 @@ static int adc128_remove(struct spi_device *spi)
} }
static const struct spi_device_id adc128_id[] = { static const struct spi_device_id adc128_id[] = {
{ "adc128s052", 0}, { "adc128s052", 0}, /* index into adc128_config */
{ "adc122s021", 1},
{ } { }
}; };
MODULE_DEVICE_TABLE(spi, adc128_id); MODULE_DEVICE_TABLE(spi, adc128_id);
......
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