Commit f2f7a449 authored by Lars-Peter Clausen's avatar Lars-Peter Clausen Committed by Jonathan Cameron
Browse files

iio:adc:ad7923: Add support for the ad7904/ad7914/ad7924



The ad7924 is software compatible with the ad7923. The ad7904 and ad7914 are the
8 and 10 bit version of the ad7924.

While we are at it also drop the "with temperature sensor" from the Kconfig
entry, since the chips do not have a temperature sensor.

Signed-off-by: default avatarLars-Peter Clausen <lars@metafoo.de>
Cc: Patrick Vasseur <patrick.vasseur@c-s.fr>
Cc: Christophe Leroy <christophe.leroy@c-s.fr>
Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
parent ecf6ca25
Loading
Loading
Loading
Loading
+3 −3
Original line number Original line Diff line number Diff line
@@ -31,13 +31,13 @@ config AD7298
	  module will be called ad7298.
	  module will be called ad7298.


config AD7923
config AD7923
	tristate "Analog Devices AD7923 ADC driver"
	tristate "Analog Devices AD7923 and similar ADCs driver"
	depends on SPI
	depends on SPI
	select IIO_BUFFER
	select IIO_BUFFER
	select IIO_TRIGGERED_BUFFER
	select IIO_TRIGGERED_BUFFER
	help
	help
	  Say yes here to build support for Analog Devices AD7923
	  Say yes here to build support for Analog Devices
	  4 Channel ADC with temperature sensor.
	  AD7904, AD7914, AD7923, AD7924 4 Channel ADCs.


	  To compile this driver as a module, choose M here: the
	  To compile this driver as a module, choose M here: the
	  module will be called ad7923.
	  module will be called ad7923.
+50 −13
Original line number Original line Diff line number Diff line
/*
/*
 * AD7923 SPI ADC driver
 * AD7904/AD7914/AD7923/AD7924 SPI ADC driver
 *
 *
 * Copyright 2011 Analog Devices Inc (from AD7923 Driver)
 * Copyright 2011 Analog Devices Inc (from AD7923 Driver)
 * Copyright 2012 CS Systemes d'Information
 * Copyright 2012 CS Systemes d'Information
@@ -70,7 +70,18 @@ struct ad7923_state {
	__be16				tx_buf[4];
	__be16				tx_buf[4];
};
};


#define AD7923_V_CHAN(index)						\
struct ad7923_chip_info {
	const struct iio_chan_spec *channels;
	unsigned int num_channels;
};

enum ad7923_id {
	AD7904,
	AD7914,
	AD7924,
};

#define AD7923_V_CHAN(index, bits)					\
	{								\
	{								\
		.type = IIO_VOLTAGE,					\
		.type = IIO_VOLTAGE,					\
		.indexed = 1,						\
		.indexed = 1,						\
@@ -81,18 +92,38 @@ struct ad7923_state {
		.scan_index = index,					\
		.scan_index = index,					\
		.scan_type = {						\
		.scan_type = {						\
			.sign = 'u',					\
			.sign = 'u',					\
			.realbits = 12,					\
			.realbits = (bits),				\
			.storagebits = 16,				\
			.storagebits = 16,				\
			.endianness = IIO_BE,				\
			.endianness = IIO_BE,				\
		},							\
		},							\
	}
	}


static const struct iio_chan_spec ad7923_channels[] = {
#define DECLARE_AD7923_CHANNELS(name, bits) \
	AD7923_V_CHAN(0),
const struct iio_chan_spec name ## _channels[] = { \
	AD7923_V_CHAN(1),
	AD7923_V_CHAN(0, bits), \
	AD7923_V_CHAN(2),
	AD7923_V_CHAN(1, bits), \
	AD7923_V_CHAN(3),
	AD7923_V_CHAN(2, bits), \
	IIO_CHAN_SOFT_TIMESTAMP(4),
	AD7923_V_CHAN(3, bits), \
	IIO_CHAN_SOFT_TIMESTAMP(4), \
}

static DECLARE_AD7923_CHANNELS(ad7904, 8);
static DECLARE_AD7923_CHANNELS(ad7914, 10);
static DECLARE_AD7923_CHANNELS(ad7924, 12);

static const struct ad7923_chip_info ad7923_chip_info[] = {
	[AD7904] = {
		.channels = ad7904_channels,
		.num_channels = ARRAY_SIZE(ad7904_channels),
	},
	[AD7914] = {
		.channels = ad7914_channels,
		.num_channels = ARRAY_SIZE(ad7914_channels),
	},
	[AD7924] = {
		.channels = ad7924_channels,
		.num_channels = ARRAY_SIZE(ad7924_channels),
	},
};
};


/**
/**
@@ -245,6 +276,7 @@ static int ad7923_probe(struct spi_device *spi)
{
{
	struct ad7923_state *st;
	struct ad7923_state *st;
	struct iio_dev *indio_dev = iio_device_alloc(sizeof(*st));
	struct iio_dev *indio_dev = iio_device_alloc(sizeof(*st));
	const struct ad7923_chip_info *info;
	int ret;
	int ret;


	if (indio_dev == NULL)
	if (indio_dev == NULL)
@@ -258,11 +290,13 @@ static int ad7923_probe(struct spi_device *spi)
	st->settings = AD7923_CODING | AD7923_RANGE |
	st->settings = AD7923_CODING | AD7923_RANGE |
			AD7923_PM_MODE_WRITE(AD7923_PM_MODE_OPS);
			AD7923_PM_MODE_WRITE(AD7923_PM_MODE_OPS);


	info = &ad7923_chip_info[spi_get_device_id(spi)->driver_data];

	indio_dev->name = spi_get_device_id(spi)->name;
	indio_dev->name = spi_get_device_id(spi)->name;
	indio_dev->dev.parent = &spi->dev;
	indio_dev->dev.parent = &spi->dev;
	indio_dev->modes = INDIO_DIRECT_MODE;
	indio_dev->modes = INDIO_DIRECT_MODE;
	indio_dev->channels = ad7923_channels;
	indio_dev->channels = info->channels;
	indio_dev->num_channels = ARRAY_SIZE(ad7923_channels);
	indio_dev->num_channels = info->num_channels;
	indio_dev->info = &ad7923_info;
	indio_dev->info = &ad7923_info;


	/* Setup default message */
	/* Setup default message */
@@ -324,7 +358,10 @@ static int ad7923_remove(struct spi_device *spi)
}
}


static const struct spi_device_id ad7923_id[] = {
static const struct spi_device_id ad7923_id[] = {
	{"ad7923", 0},
	{"ad7904", AD7904},
	{"ad7914", AD7914},
	{"ad7923", AD7924},
	{"ad7924", AD7924},
	{}
	{}
};
};
MODULE_DEVICE_TABLE(spi, ad7923_id);
MODULE_DEVICE_TABLE(spi, ad7923_id);
@@ -342,5 +379,5 @@ module_spi_driver(ad7923_driver);


MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
MODULE_AUTHOR("Patrick Vasseur <patrick.vasseur@c-s.fr>");
MODULE_AUTHOR("Patrick Vasseur <patrick.vasseur@c-s.fr>");
MODULE_DESCRIPTION("Analog Devices AD7923 ADC");
MODULE_DESCRIPTION("Analog Devices AD7904/AD7914/AD7923/AD7924 ADC");
MODULE_LICENSE("GPL v2");
MODULE_LICENSE("GPL v2");