1 /*
2  * AD7606 SPI ADC driver
3  *
4  * Copyright 2011 Analog Devices Inc.
5  *
6  * Licensed under the GPL-2.
7  */
8 
9 #include <linux/interrupt.h>
10 #include <linux/device.h>
11 #include <linux/kernel.h>
12 #include <linux/slab.h>
13 #include <linux/sysfs.h>
14 #include <linux/regulator/consumer.h>
15 #include <linux/err.h>
16 #include <linux/gpio.h>
17 #include <linux/delay.h>
18 #include <linux/sched.h>
19 #include <linux/module.h>
20 
21 #include "../iio.h"
22 #include "../sysfs.h"
23 #include "../buffer.h"
24 
25 #include "ad7606.h"
26 
ad7606_reset(struct ad7606_state * st)27 int ad7606_reset(struct ad7606_state *st)
28 {
29 	if (gpio_is_valid(st->pdata->gpio_reset)) {
30 		gpio_set_value(st->pdata->gpio_reset, 1);
31 		ndelay(100); /* t_reset >= 100ns */
32 		gpio_set_value(st->pdata->gpio_reset, 0);
33 		return 0;
34 	}
35 
36 	return -ENODEV;
37 }
38 
ad7606_scan_direct(struct iio_dev * indio_dev,unsigned ch)39 static int ad7606_scan_direct(struct iio_dev *indio_dev, unsigned ch)
40 {
41 	struct ad7606_state *st = iio_priv(indio_dev);
42 	int ret;
43 
44 	st->done = false;
45 	gpio_set_value(st->pdata->gpio_convst, 1);
46 
47 	ret = wait_event_interruptible(st->wq_data_avail, st->done);
48 	if (ret)
49 		goto error_ret;
50 
51 	if (gpio_is_valid(st->pdata->gpio_frstdata)) {
52 		ret = st->bops->read_block(st->dev, 1, st->data);
53 		if (ret)
54 			goto error_ret;
55 		if (!gpio_get_value(st->pdata->gpio_frstdata)) {
56 			/* This should never happen */
57 			ad7606_reset(st);
58 			ret = -EIO;
59 			goto error_ret;
60 		}
61 		ret = st->bops->read_block(st->dev,
62 			st->chip_info->num_channels - 1, &st->data[1]);
63 		if (ret)
64 			goto error_ret;
65 	} else {
66 		ret = st->bops->read_block(st->dev,
67 			st->chip_info->num_channels, st->data);
68 		if (ret)
69 			goto error_ret;
70 	}
71 
72 	ret = st->data[ch];
73 
74 error_ret:
75 	gpio_set_value(st->pdata->gpio_convst, 0);
76 
77 	return ret;
78 }
79 
ad7606_read_raw(struct iio_dev * indio_dev,struct iio_chan_spec const * chan,int * val,int * val2,long m)80 static int ad7606_read_raw(struct iio_dev *indio_dev,
81 			   struct iio_chan_spec const *chan,
82 			   int *val,
83 			   int *val2,
84 			   long m)
85 {
86 	int ret;
87 	struct ad7606_state *st = iio_priv(indio_dev);
88 	unsigned int scale_uv;
89 
90 	switch (m) {
91 	case 0:
92 		mutex_lock(&indio_dev->mlock);
93 		if (iio_buffer_enabled(indio_dev))
94 			ret = -EBUSY;
95 		else
96 			ret = ad7606_scan_direct(indio_dev, chan->address);
97 		mutex_unlock(&indio_dev->mlock);
98 
99 		if (ret < 0)
100 			return ret;
101 		*val = (short) ret;
102 		return IIO_VAL_INT;
103 	case IIO_CHAN_INFO_SCALE:
104 		scale_uv = (st->range * 1000 * 2)
105 			>> st->chip_info->channels[0].scan_type.realbits;
106 		*val =  scale_uv / 1000;
107 		*val2 = (scale_uv % 1000) * 1000;
108 		return IIO_VAL_INT_PLUS_MICRO;
109 	}
110 	return -EINVAL;
111 }
112 
ad7606_show_range(struct device * dev,struct device_attribute * attr,char * buf)113 static ssize_t ad7606_show_range(struct device *dev,
114 			struct device_attribute *attr, char *buf)
115 {
116 	struct iio_dev *indio_dev = dev_get_drvdata(dev);
117 	struct ad7606_state *st = iio_priv(indio_dev);
118 
119 	return sprintf(buf, "%u\n", st->range);
120 }
121 
ad7606_store_range(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)122 static ssize_t ad7606_store_range(struct device *dev,
123 		struct device_attribute *attr, const char *buf, size_t count)
124 {
125 	struct iio_dev *indio_dev = dev_get_drvdata(dev);
126 	struct ad7606_state *st = iio_priv(indio_dev);
127 	unsigned long lval;
128 
129 	if (strict_strtoul(buf, 10, &lval))
130 		return -EINVAL;
131 	if (!(lval == 5000 || lval == 10000)) {
132 		dev_err(dev, "range is not supported\n");
133 		return -EINVAL;
134 	}
135 	mutex_lock(&indio_dev->mlock);
136 	gpio_set_value(st->pdata->gpio_range, lval == 10000);
137 	st->range = lval;
138 	mutex_unlock(&indio_dev->mlock);
139 
140 	return count;
141 }
142 
143 static IIO_DEVICE_ATTR(in_voltage_range, S_IRUGO | S_IWUSR, \
144 		       ad7606_show_range, ad7606_store_range, 0);
145 static IIO_CONST_ATTR(in_voltage_range_available, "5000 10000");
146 
ad7606_show_oversampling_ratio(struct device * dev,struct device_attribute * attr,char * buf)147 static ssize_t ad7606_show_oversampling_ratio(struct device *dev,
148 			struct device_attribute *attr, char *buf)
149 {
150 	struct iio_dev *indio_dev = dev_get_drvdata(dev);
151 	struct ad7606_state *st = iio_priv(indio_dev);
152 
153 	return sprintf(buf, "%u\n", st->oversampling);
154 }
155 
ad7606_oversampling_get_index(unsigned val)156 static int ad7606_oversampling_get_index(unsigned val)
157 {
158 	unsigned char supported[] = {0, 2, 4, 8, 16, 32, 64};
159 	int i;
160 
161 	for (i = 0; i < ARRAY_SIZE(supported); i++)
162 		if (val == supported[i])
163 			return i;
164 
165 	return -EINVAL;
166 }
167 
ad7606_store_oversampling_ratio(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)168 static ssize_t ad7606_store_oversampling_ratio(struct device *dev,
169 		struct device_attribute *attr, const char *buf, size_t count)
170 {
171 	struct iio_dev *indio_dev = dev_get_drvdata(dev);
172 	struct ad7606_state *st = iio_priv(indio_dev);
173 	unsigned long lval;
174 	int ret;
175 
176 	if (strict_strtoul(buf, 10, &lval))
177 		return -EINVAL;
178 
179 	ret = ad7606_oversampling_get_index(lval);
180 	if (ret < 0) {
181 		dev_err(dev, "oversampling %lu is not supported\n", lval);
182 		return ret;
183 	}
184 
185 	mutex_lock(&indio_dev->mlock);
186 	gpio_set_value(st->pdata->gpio_os0, (ret >> 0) & 1);
187 	gpio_set_value(st->pdata->gpio_os1, (ret >> 1) & 1);
188 	gpio_set_value(st->pdata->gpio_os1, (ret >> 2) & 1);
189 	st->oversampling = lval;
190 	mutex_unlock(&indio_dev->mlock);
191 
192 	return count;
193 }
194 
195 static IIO_DEVICE_ATTR(oversampling_ratio, S_IRUGO | S_IWUSR,
196 		       ad7606_show_oversampling_ratio,
197 		       ad7606_store_oversampling_ratio, 0);
198 static IIO_CONST_ATTR(oversampling_ratio_available, "0 2 4 8 16 32 64");
199 
200 static struct attribute *ad7606_attributes[] = {
201 	&iio_dev_attr_in_voltage_range.dev_attr.attr,
202 	&iio_const_attr_in_voltage_range_available.dev_attr.attr,
203 	&iio_dev_attr_oversampling_ratio.dev_attr.attr,
204 	&iio_const_attr_oversampling_ratio_available.dev_attr.attr,
205 	NULL,
206 };
207 
ad7606_attr_is_visible(struct kobject * kobj,struct attribute * attr,int n)208 static umode_t ad7606_attr_is_visible(struct kobject *kobj,
209 				     struct attribute *attr, int n)
210 {
211 	struct device *dev = container_of(kobj, struct device, kobj);
212 	struct iio_dev *indio_dev = dev_get_drvdata(dev);
213 	struct ad7606_state *st = iio_priv(indio_dev);
214 
215 	umode_t mode = attr->mode;
216 
217 	if (!(gpio_is_valid(st->pdata->gpio_os0) &&
218 	      gpio_is_valid(st->pdata->gpio_os1) &&
219 	      gpio_is_valid(st->pdata->gpio_os2)) &&
220 	    (attr == &iio_dev_attr_oversampling_ratio.dev_attr.attr ||
221 	     attr ==
222 	     &iio_const_attr_oversampling_ratio_available.dev_attr.attr))
223 		mode = 0;
224 	else if (!gpio_is_valid(st->pdata->gpio_range) &&
225 		 (attr == &iio_dev_attr_in_voltage_range.dev_attr.attr ||
226 		  attr ==
227 		  &iio_const_attr_in_voltage_range_available.dev_attr.attr))
228 		mode = 0;
229 
230 	return mode;
231 }
232 
233 static const struct attribute_group ad7606_attribute_group = {
234 	.attrs = ad7606_attributes,
235 	.is_visible = ad7606_attr_is_visible,
236 };
237 
238 #define AD7606_CHANNEL(num)				\
239 	{						\
240 		.type = IIO_VOLTAGE,			\
241 		.indexed = 1,				\
242 		.channel = num,				\
243 		.address = num,				\
244 		.scan_index = num,			\
245 		.scan_type = IIO_ST('s', 16, 16, 0),	\
246 	}
247 
248 static struct iio_chan_spec ad7606_8_channels[] = {
249 	AD7606_CHANNEL(0),
250 	AD7606_CHANNEL(1),
251 	AD7606_CHANNEL(2),
252 	AD7606_CHANNEL(3),
253 	AD7606_CHANNEL(4),
254 	AD7606_CHANNEL(5),
255 	AD7606_CHANNEL(6),
256 	AD7606_CHANNEL(7),
257 	IIO_CHAN_SOFT_TIMESTAMP(8),
258 };
259 
260 static struct iio_chan_spec ad7606_6_channels[] = {
261 	AD7606_CHANNEL(0),
262 	AD7606_CHANNEL(1),
263 	AD7606_CHANNEL(2),
264 	AD7606_CHANNEL(3),
265 	AD7606_CHANNEL(4),
266 	AD7606_CHANNEL(5),
267 	IIO_CHAN_SOFT_TIMESTAMP(6),
268 };
269 
270 static struct iio_chan_spec ad7606_4_channels[] = {
271 	AD7606_CHANNEL(0),
272 	AD7606_CHANNEL(1),
273 	AD7606_CHANNEL(2),
274 	AD7606_CHANNEL(3),
275 	IIO_CHAN_SOFT_TIMESTAMP(4),
276 };
277 
278 static const struct ad7606_chip_info ad7606_chip_info_tbl[] = {
279 	/*
280 	 * More devices added in future
281 	 */
282 	[ID_AD7606_8] = {
283 		.name = "ad7606",
284 		.int_vref_mv = 2500,
285 		.channels = ad7606_8_channels,
286 		.num_channels = 8,
287 	},
288 	[ID_AD7606_6] = {
289 		.name = "ad7606-6",
290 		.int_vref_mv = 2500,
291 		.channels = ad7606_6_channels,
292 		.num_channels = 6,
293 	},
294 	[ID_AD7606_4] = {
295 		.name = "ad7606-4",
296 		.int_vref_mv = 2500,
297 		.channels = ad7606_4_channels,
298 		.num_channels = 4,
299 	},
300 };
301 
ad7606_request_gpios(struct ad7606_state * st)302 static int ad7606_request_gpios(struct ad7606_state *st)
303 {
304 	struct gpio gpio_array[3] = {
305 		[0] = {
306 			.gpio =  st->pdata->gpio_os0,
307 			.flags = GPIOF_DIR_OUT | ((st->oversampling & 1) ?
308 				 GPIOF_INIT_HIGH : GPIOF_INIT_LOW),
309 			.label = "AD7606_OS0",
310 		},
311 		[1] = {
312 			.gpio =  st->pdata->gpio_os1,
313 			.flags = GPIOF_DIR_OUT | ((st->oversampling & 2) ?
314 				 GPIOF_INIT_HIGH : GPIOF_INIT_LOW),
315 			.label = "AD7606_OS1",
316 		},
317 		[2] = {
318 			.gpio =  st->pdata->gpio_os2,
319 			.flags = GPIOF_DIR_OUT | ((st->oversampling & 4) ?
320 				 GPIOF_INIT_HIGH : GPIOF_INIT_LOW),
321 			.label = "AD7606_OS2",
322 		},
323 	};
324 	int ret;
325 
326 	if (gpio_is_valid(st->pdata->gpio_convst)) {
327 		ret = gpio_request_one(st->pdata->gpio_convst,
328 				       GPIOF_OUT_INIT_LOW,
329 				       "AD7606_CONVST");
330 		if (ret) {
331 			dev_err(st->dev, "failed to request GPIO CONVST\n");
332 			goto error_ret;
333 		}
334 	} else {
335 		ret = -EIO;
336 		goto error_ret;
337 	}
338 
339 	if (gpio_is_valid(st->pdata->gpio_os0) &&
340 	    gpio_is_valid(st->pdata->gpio_os1) &&
341 	    gpio_is_valid(st->pdata->gpio_os2)) {
342 		ret = gpio_request_array(gpio_array, ARRAY_SIZE(gpio_array));
343 		if (ret < 0)
344 			goto error_free_convst;
345 	}
346 
347 	if (gpio_is_valid(st->pdata->gpio_reset)) {
348 		ret = gpio_request_one(st->pdata->gpio_reset,
349 				       GPIOF_OUT_INIT_LOW,
350 				       "AD7606_RESET");
351 		if (ret < 0)
352 			goto error_free_os;
353 	}
354 
355 	if (gpio_is_valid(st->pdata->gpio_range)) {
356 		ret = gpio_request_one(st->pdata->gpio_range, GPIOF_DIR_OUT |
357 				       ((st->range == 10000) ? GPIOF_INIT_HIGH :
358 					GPIOF_INIT_LOW), "AD7606_RANGE");
359 		if (ret < 0)
360 			goto error_free_reset;
361 	}
362 	if (gpio_is_valid(st->pdata->gpio_stby)) {
363 		ret = gpio_request_one(st->pdata->gpio_stby,
364 				       GPIOF_OUT_INIT_HIGH,
365 				       "AD7606_STBY");
366 		if (ret < 0)
367 			goto error_free_range;
368 	}
369 
370 	if (gpio_is_valid(st->pdata->gpio_frstdata)) {
371 		ret = gpio_request_one(st->pdata->gpio_frstdata, GPIOF_IN,
372 				       "AD7606_FRSTDATA");
373 		if (ret < 0)
374 			goto error_free_stby;
375 	}
376 
377 	return 0;
378 
379 error_free_stby:
380 	if (gpio_is_valid(st->pdata->gpio_stby))
381 		gpio_free(st->pdata->gpio_stby);
382 error_free_range:
383 	if (gpio_is_valid(st->pdata->gpio_range))
384 		gpio_free(st->pdata->gpio_range);
385 error_free_reset:
386 	if (gpio_is_valid(st->pdata->gpio_reset))
387 		gpio_free(st->pdata->gpio_reset);
388 error_free_os:
389 	if (gpio_is_valid(st->pdata->gpio_os0) &&
390 	    gpio_is_valid(st->pdata->gpio_os1) &&
391 	    gpio_is_valid(st->pdata->gpio_os2))
392 		gpio_free_array(gpio_array, ARRAY_SIZE(gpio_array));
393 error_free_convst:
394 	gpio_free(st->pdata->gpio_convst);
395 error_ret:
396 	return ret;
397 }
398 
ad7606_free_gpios(struct ad7606_state * st)399 static void ad7606_free_gpios(struct ad7606_state *st)
400 {
401 	if (gpio_is_valid(st->pdata->gpio_frstdata))
402 		gpio_free(st->pdata->gpio_frstdata);
403 	if (gpio_is_valid(st->pdata->gpio_stby))
404 		gpio_free(st->pdata->gpio_stby);
405 	if (gpio_is_valid(st->pdata->gpio_range))
406 		gpio_free(st->pdata->gpio_range);
407 	if (gpio_is_valid(st->pdata->gpio_reset))
408 		gpio_free(st->pdata->gpio_reset);
409 	if (gpio_is_valid(st->pdata->gpio_os0) &&
410 	    gpio_is_valid(st->pdata->gpio_os1) &&
411 	    gpio_is_valid(st->pdata->gpio_os2)) {
412 		gpio_free(st->pdata->gpio_os2);
413 		gpio_free(st->pdata->gpio_os1);
414 		gpio_free(st->pdata->gpio_os0);
415 	}
416 	gpio_free(st->pdata->gpio_convst);
417 }
418 
419 /**
420  *  Interrupt handler
421  */
ad7606_interrupt(int irq,void * dev_id)422 static irqreturn_t ad7606_interrupt(int irq, void *dev_id)
423 {
424 	struct iio_dev *indio_dev = dev_id;
425 	struct ad7606_state *st = iio_priv(indio_dev);
426 
427 	if (iio_buffer_enabled(indio_dev)) {
428 		if (!work_pending(&st->poll_work))
429 			schedule_work(&st->poll_work);
430 	} else {
431 		st->done = true;
432 		wake_up_interruptible(&st->wq_data_avail);
433 	}
434 
435 	return IRQ_HANDLED;
436 };
437 
438 static const struct iio_info ad7606_info = {
439 	.driver_module = THIS_MODULE,
440 	.read_raw = &ad7606_read_raw,
441 	.attrs = &ad7606_attribute_group,
442 };
443 
ad7606_probe(struct device * dev,int irq,void __iomem * base_address,unsigned id,const struct ad7606_bus_ops * bops)444 struct iio_dev *ad7606_probe(struct device *dev, int irq,
445 			      void __iomem *base_address,
446 			      unsigned id,
447 			      const struct ad7606_bus_ops *bops)
448 {
449 	struct ad7606_platform_data *pdata = dev->platform_data;
450 	struct ad7606_state *st;
451 	int ret;
452 	struct iio_dev *indio_dev = iio_allocate_device(sizeof(*st));
453 
454 	if (indio_dev == NULL) {
455 		ret = -ENOMEM;
456 		goto error_ret;
457 	}
458 
459 	st = iio_priv(indio_dev);
460 
461 	st->dev = dev;
462 	st->bops = bops;
463 	st->base_address = base_address;
464 	st->range = pdata->default_range == 10000 ? 10000 : 5000;
465 
466 	ret = ad7606_oversampling_get_index(pdata->default_os);
467 	if (ret < 0) {
468 		dev_warn(dev, "oversampling %d is not supported\n",
469 			 pdata->default_os);
470 		st->oversampling = 0;
471 	} else {
472 		st->oversampling = pdata->default_os;
473 	}
474 
475 	st->reg = regulator_get(dev, "vcc");
476 	if (!IS_ERR(st->reg)) {
477 		ret = regulator_enable(st->reg);
478 		if (ret)
479 			goto error_put_reg;
480 	}
481 
482 	st->pdata = pdata;
483 	st->chip_info = &ad7606_chip_info_tbl[id];
484 
485 	indio_dev->dev.parent = dev;
486 	indio_dev->info = &ad7606_info;
487 	indio_dev->modes = INDIO_DIRECT_MODE;
488 	indio_dev->name = st->chip_info->name;
489 	indio_dev->channels = st->chip_info->channels;
490 	indio_dev->num_channels = st->chip_info->num_channels;
491 
492 	init_waitqueue_head(&st->wq_data_avail);
493 
494 	ret = ad7606_request_gpios(st);
495 	if (ret)
496 		goto error_disable_reg;
497 
498 	ret = ad7606_reset(st);
499 	if (ret)
500 		dev_warn(st->dev, "failed to RESET: no RESET GPIO specified\n");
501 
502 	ret = request_irq(irq, ad7606_interrupt,
503 		IRQF_TRIGGER_FALLING, st->chip_info->name, indio_dev);
504 	if (ret)
505 		goto error_free_gpios;
506 
507 	ret = ad7606_register_ring_funcs_and_init(indio_dev);
508 	if (ret)
509 		goto error_free_irq;
510 
511 	ret = iio_buffer_register(indio_dev,
512 				  indio_dev->channels,
513 				  indio_dev->num_channels);
514 	if (ret)
515 		goto error_cleanup_ring;
516 	ret = iio_device_register(indio_dev);
517 	if (ret)
518 		goto error_unregister_ring;
519 
520 	return indio_dev;
521 error_unregister_ring:
522 	iio_buffer_unregister(indio_dev);
523 
524 error_cleanup_ring:
525 	ad7606_ring_cleanup(indio_dev);
526 
527 error_free_irq:
528 	free_irq(irq, indio_dev);
529 
530 error_free_gpios:
531 	ad7606_free_gpios(st);
532 
533 error_disable_reg:
534 	if (!IS_ERR(st->reg))
535 		regulator_disable(st->reg);
536 error_put_reg:
537 	if (!IS_ERR(st->reg))
538 		regulator_put(st->reg);
539 	iio_free_device(indio_dev);
540 error_ret:
541 	return ERR_PTR(ret);
542 }
543 
ad7606_remove(struct iio_dev * indio_dev,int irq)544 int ad7606_remove(struct iio_dev *indio_dev, int irq)
545 {
546 	struct ad7606_state *st = iio_priv(indio_dev);
547 
548 	iio_device_unregister(indio_dev);
549 	iio_buffer_unregister(indio_dev);
550 	ad7606_ring_cleanup(indio_dev);
551 
552 	free_irq(irq, indio_dev);
553 	if (!IS_ERR(st->reg)) {
554 		regulator_disable(st->reg);
555 		regulator_put(st->reg);
556 	}
557 
558 	ad7606_free_gpios(st);
559 	iio_free_device(indio_dev);
560 
561 	return 0;
562 }
563 
ad7606_suspend(struct iio_dev * indio_dev)564 void ad7606_suspend(struct iio_dev *indio_dev)
565 {
566 	struct ad7606_state *st = iio_priv(indio_dev);
567 
568 	if (gpio_is_valid(st->pdata->gpio_stby)) {
569 		if (gpio_is_valid(st->pdata->gpio_range))
570 			gpio_set_value(st->pdata->gpio_range, 1);
571 		gpio_set_value(st->pdata->gpio_stby, 0);
572 	}
573 }
574 
ad7606_resume(struct iio_dev * indio_dev)575 void ad7606_resume(struct iio_dev *indio_dev)
576 {
577 	struct ad7606_state *st = iio_priv(indio_dev);
578 
579 	if (gpio_is_valid(st->pdata->gpio_stby)) {
580 		if (gpio_is_valid(st->pdata->gpio_range))
581 			gpio_set_value(st->pdata->gpio_range,
582 					st->range == 10000);
583 
584 		gpio_set_value(st->pdata->gpio_stby, 1);
585 		ad7606_reset(st);
586 	}
587 }
588 
589 MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
590 MODULE_DESCRIPTION("Analog Devices AD7606 ADC");
591 MODULE_LICENSE("GPL v2");
592