ad7298.c 9.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/*
 * AD7298 SPI ADC driver
 *
 * Copyright 2011 Analog Devices Inc.
 *
 * Licensed under the GPL-2.
 */

#include <linux/device.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/sysfs.h>
#include <linux/spi/spi.h>
#include <linux/regulator/consumer.h>
#include <linux/err.h>
#include <linux/delay.h>
17
#include <linux/module.h>
18
#include <linux/interrupt.h>
19

20 21 22
#include <linux/iio/iio.h>
#include <linux/iio/sysfs.h>
#include <linux/iio/buffer.h>
23 24
#include <linux/iio/trigger_consumer.h>
#include <linux/iio/triggered_buffer.h>
25

26
#include <linux/platform_data/ad7298.h>
27

28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
#define AD7298_WRITE	(1 << 15) /* write to the control register */
#define AD7298_REPEAT	(1 << 14) /* repeated conversion enable */
#define AD7298_CH(x)	(1 << (13 - (x))) /* channel select */
#define AD7298_TSENSE	(1 << 5) /* temperature conversion enable */
#define AD7298_EXTREF	(1 << 2) /* external reference enable */
#define AD7298_TAVG	(1 << 1) /* temperature sensor averaging enable */
#define AD7298_PDD	(1 << 0) /* partial power down enable */

#define AD7298_MAX_CHAN		8
#define AD7298_BITS		12
#define AD7298_STORAGE_BITS	16
#define AD7298_INTREF_mV	2500

#define AD7298_CH_TEMP		9

#define RES_MASK(bits)	((1 << (bits)) - 1)

struct ad7298_state {
	struct spi_device		*spi;
	struct regulator		*reg;
	unsigned			ext_ref;
	struct spi_transfer		ring_xfer[10];
	struct spi_transfer		scan_single_xfer[3];
	struct spi_message		ring_msg;
	struct spi_message		scan_single_msg;
	/*
	 * DMA (thus cache coherency maintenance) requires the
	 * transfer buffers to live in their own cache lines.
	 */
57 58
	__be16				rx_buf[12] ____cacheline_aligned;
	__be16				tx_buf[2];
59 60
};

61 62 63 64 65
#define AD7298_V_CHAN(index)						\
	{								\
		.type = IIO_VOLTAGE,					\
		.indexed = 1,						\
		.channel = index,					\
66 67
		.info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT |		\
		IIO_CHAN_INFO_SCALE_SHARED_BIT,				\
68 69 70 71 72 73
		.address = index,					\
		.scan_index = index,					\
		.scan_type = {						\
			.sign = 'u',					\
			.realbits = 12,					\
			.storagebits = 16,				\
74
			.endianness = IIO_BE,				\
75 76 77
		},							\
	}

78
static const struct iio_chan_spec ad7298_channels[] = {
79 80 81 82
	{
		.type = IIO_TEMP,
		.indexed = 1,
		.channel = 0,
83
		.info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT |
84 85
			IIO_CHAN_INFO_SCALE_SEPARATE_BIT |
			IIO_CHAN_INFO_OFFSET_SEPARATE_BIT,
86 87
		.address = AD7298_CH_TEMP,
		.scan_index = -1,
88 89 90 91 92 93 94 95 96 97 98 99 100 101
		.scan_type = {
			.sign = 's',
			.realbits = 32,
			.storagebits = 32,
		},
	},
	AD7298_V_CHAN(0),
	AD7298_V_CHAN(1),
	AD7298_V_CHAN(2),
	AD7298_V_CHAN(3),
	AD7298_V_CHAN(4),
	AD7298_V_CHAN(5),
	AD7298_V_CHAN(6),
	AD7298_V_CHAN(7),
102 103 104
	IIO_CHAN_SOFT_TIMESTAMP(8),
};

105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
/**
 * ad7298_update_scan_mode() setup the spi transfer buffer for the new scan mask
 **/
static int ad7298_update_scan_mode(struct iio_dev *indio_dev,
	const unsigned long *active_scan_mask)
{
	struct ad7298_state *st = iio_priv(indio_dev);
	int i, m;
	unsigned short command;
	int scan_count;

	/* Now compute overall size */
	scan_count = bitmap_weight(active_scan_mask, indio_dev->masklength);

	command = AD7298_WRITE | st->ext_ref;

	for (i = 0, m = AD7298_CH(0); i < AD7298_MAX_CHAN; i++, m >>= 1)
		if (test_bit(i, active_scan_mask))
			command |= m;

	st->tx_buf[0] = cpu_to_be16(command);

	/* build spi ring message */
	st->ring_xfer[0].tx_buf = &st->tx_buf[0];
	st->ring_xfer[0].len = 2;
	st->ring_xfer[0].cs_change = 1;
	st->ring_xfer[1].tx_buf = &st->tx_buf[1];
	st->ring_xfer[1].len = 2;
	st->ring_xfer[1].cs_change = 1;

	spi_message_init(&st->ring_msg);
	spi_message_add_tail(&st->ring_xfer[0], &st->ring_msg);
	spi_message_add_tail(&st->ring_xfer[1], &st->ring_msg);

	for (i = 0; i < scan_count; i++) {
		st->ring_xfer[i + 2].rx_buf = &st->rx_buf[i];
		st->ring_xfer[i + 2].len = 2;
		st->ring_xfer[i + 2].cs_change = 1;
		spi_message_add_tail(&st->ring_xfer[i + 2], &st->ring_msg);
	}
	/* make sure last transfer cs_change is not set */
	st->ring_xfer[i + 1].cs_change = 0;

	return 0;
}

/**
 * ad7298_trigger_handler() bh of trigger launched polling to ring buffer
 *
 * Currently there is no option in this driver to disable the saving of
 * timestamps within the ring.
 **/
static irqreturn_t ad7298_trigger_handler(int irq, void *p)
{
	struct iio_poll_func *pf = p;
	struct iio_dev *indio_dev = pf->indio_dev;
	struct ad7298_state *st = iio_priv(indio_dev);
	s64 time_ns = 0;
	int b_sent;

	b_sent = spi_sync(st->spi, &st->ring_msg);
	if (b_sent)
		goto done;

	if (indio_dev->scan_timestamp) {
		time_ns = iio_get_time_ns();
		memcpy((u8 *)st->rx_buf + indio_dev->scan_bytes - sizeof(s64),
			&time_ns, sizeof(time_ns));
	}

	iio_push_to_buffers(indio_dev, (u8 *)st->rx_buf);

done:
	iio_trigger_notify_done(indio_dev->trig);

	return IRQ_HANDLED;
}

183 184 185 186 187 188 189 190 191 192 193 194 195
static int ad7298_scan_direct(struct ad7298_state *st, unsigned ch)
{
	int ret;
	st->tx_buf[0] = cpu_to_be16(AD7298_WRITE | st->ext_ref |
				   (AD7298_CH(0) >> ch));

	ret = spi_sync(st->spi, &st->scan_single_msg);
	if (ret)
		return ret;

	return be16_to_cpu(st->rx_buf[0]);
}

196
static int ad7298_scan_temp(struct ad7298_state *st, int *val)
197
{
198
	int ret;
199
	__be16 buf;
200

201
	buf = cpu_to_be16(AD7298_WRITE | AD7298_TSENSE |
202
			  AD7298_TAVG | st->ext_ref);
203

204
	ret = spi_write(st->spi, (u8 *)&buf, 2);
205
	if (ret)
206 207
		return ret;

208
	buf = cpu_to_be16(0);
209

210
	ret = spi_write(st->spi, (u8 *)&buf, 2);
211 212
	if (ret)
		return ret;
213 214

	usleep_range(101, 1000); /* sleep > 100us */
215

216
	ret = spi_read(st->spi, (u8 *)&buf, 2);
217 218
	if (ret)
		return ret;
219

220
	*val = sign_extend32(be16_to_cpu(buf), 11);
221

222 223 224 225 226 227
	return 0;
}

static int ad7298_get_ref_voltage(struct ad7298_state *st)
{
	int vref;
228

229 230 231 232
	if (st->ext_ref) {
		vref = regulator_get_voltage(st->reg);
		if (vref < 0)
			return vref;
233

234
		return vref / 1000;
235
	} else {
236
		return AD7298_INTREF_mV;
237
	}
238
}
239

240
static int ad7298_read_raw(struct iio_dev *indio_dev,
241 242 243 244
			   struct iio_chan_spec const *chan,
			   int *val,
			   int *val2,
			   long m)
245
{
246
	int ret;
247
	struct ad7298_state *st = iio_priv(indio_dev);
248 249

	switch (m) {
250
	case IIO_CHAN_INFO_RAW:
251
		mutex_lock(&indio_dev->mlock);
252 253
		if (indio_dev->currentmode == INDIO_BUFFER_TRIGGERED) {
			ret = -EBUSY;
254 255 256 257 258 259
		} else {
			if (chan->address == AD7298_CH_TEMP)
				ret = ad7298_scan_temp(st, val);
			else
				ret = ad7298_scan_direct(st, chan->address);
		}
260
		mutex_unlock(&indio_dev->mlock);
261 262 263 264 265 266 267 268

		if (ret < 0)
			return ret;

		if (chan->address != AD7298_CH_TEMP)
			*val = ret & RES_MASK(AD7298_BITS);

		return IIO_VAL_INT;
269 270 271
	case IIO_CHAN_INFO_SCALE:
		switch (chan->type) {
		case IIO_VOLTAGE:
272
			*val = ad7298_get_ref_voltage(st);
273 274
			*val2 = chan->scan_type.realbits;
			return IIO_VAL_FRACTIONAL_LOG2;
275
		case IIO_TEMP:
276 277 278
			*val = ad7298_get_ref_voltage(st);
			*val2 = 10;
			return IIO_VAL_FRACTIONAL;
279 280 281
		default:
			return -EINVAL;
		}
282 283 284
	case IIO_CHAN_INFO_OFFSET:
		*val = 1093 - 2732500 / ad7298_get_ref_voltage(st);
		return IIO_VAL_INT;
285 286
	}
	return -EINVAL;
287 288
}

289 290
static const struct iio_info ad7298_info = {
	.read_raw = &ad7298_read_raw,
291
	.update_scan_mode = ad7298_update_scan_mode,
292 293 294
	.driver_module = THIS_MODULE,
};

295 296 297 298
static int __devinit ad7298_probe(struct spi_device *spi)
{
	struct ad7298_platform_data *pdata = spi->dev.platform_data;
	struct ad7298_state *st;
299
	struct iio_dev *indio_dev = iio_device_alloc(sizeof(*st));
300
	int ret;
301

302 303 304 305
	if (indio_dev == NULL)
		return -ENOMEM;

	st = iio_priv(indio_dev);
306

307 308 309 310 311 312 313 314 315
	if (pdata && pdata->ext_ref)
		st->ext_ref = AD7298_EXTREF;

	if (st->ext_ref) {
		st->reg = regulator_get(&spi->dev, "vref");
		if (IS_ERR(st->reg)) {
			ret = PTR_ERR(st->reg);
			goto error_free;
		}
316 317 318 319 320
		ret = regulator_enable(st->reg);
		if (ret)
			goto error_put_reg;
	}

321
	spi_set_drvdata(spi, indio_dev);
322 323 324

	st->spi = spi;

325 326 327 328 329
	indio_dev->name = spi_get_device_id(spi)->name;
	indio_dev->dev.parent = &spi->dev;
	indio_dev->modes = INDIO_DIRECT_MODE;
	indio_dev->channels = ad7298_channels;
	indio_dev->num_channels = ARRAY_SIZE(ad7298_channels);
330
	indio_dev->info = &ad7298_info;
331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347

	/* Setup default message */

	st->scan_single_xfer[0].tx_buf = &st->tx_buf[0];
	st->scan_single_xfer[0].len = 2;
	st->scan_single_xfer[0].cs_change = 1;
	st->scan_single_xfer[1].tx_buf = &st->tx_buf[1];
	st->scan_single_xfer[1].len = 2;
	st->scan_single_xfer[1].cs_change = 1;
	st->scan_single_xfer[2].rx_buf = &st->rx_buf[0];
	st->scan_single_xfer[2].len = 2;

	spi_message_init(&st->scan_single_msg);
	spi_message_add_tail(&st->scan_single_xfer[0], &st->scan_single_msg);
	spi_message_add_tail(&st->scan_single_xfer[1], &st->scan_single_msg);
	spi_message_add_tail(&st->scan_single_xfer[2], &st->scan_single_msg);

348 349
	ret = iio_triggered_buffer_setup(indio_dev, NULL,
			&ad7298_trigger_handler, NULL);
350
	if (ret)
351
		goto error_disable_reg;
352

353 354
	ret = iio_device_register(indio_dev);
	if (ret)
355
		goto error_cleanup_ring;
356

357 358 359
	return 0;

error_cleanup_ring:
360
	iio_triggered_buffer_cleanup(indio_dev);
361
error_disable_reg:
362
	if (st->ext_ref)
363 364
		regulator_disable(st->reg);
error_put_reg:
365
	if (st->ext_ref)
366
		regulator_put(st->reg);
367
error_free:
368
	iio_device_free(indio_dev);
369

370 371 372 373 374
	return ret;
}

static int __devexit ad7298_remove(struct spi_device *spi)
{
375 376
	struct iio_dev *indio_dev = spi_get_drvdata(spi);
	struct ad7298_state *st = iio_priv(indio_dev);
377

378
	iio_device_unregister(indio_dev);
379
	iio_triggered_buffer_cleanup(indio_dev);
380
	if (st->ext_ref) {
381 382 383
		regulator_disable(st->reg);
		regulator_put(st->reg);
	}
384
	iio_device_free(indio_dev);
385

386 387 388 389 390 391 392
	return 0;
}

static const struct spi_device_id ad7298_id[] = {
	{"ad7298", 0},
	{}
};
393
MODULE_DEVICE_TABLE(spi, ad7298_id);
394 395 396 397 398 399 400 401 402 403

static struct spi_driver ad7298_driver = {
	.driver = {
		.name	= "ad7298",
		.owner	= THIS_MODULE,
	},
	.probe		= ad7298_probe,
	.remove		= __devexit_p(ad7298_remove),
	.id_table	= ad7298_id,
};
404
module_spi_driver(ad7298_driver);
405 406 407 408

MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
MODULE_DESCRIPTION("Analog Devices AD7298 ADC");
MODULE_LICENSE("GPL v2");