blob: ec89d055cf585b8201f42cdf303cab13609eb3b5 [file] [log] [blame]
Michael Hennerichb9618c02011-02-22 21:46:18 +01001/*
2 * AD7606 ADC driver
3 *
4 * Copyright 2011 Analog Devices Inc.
5 *
6 * Licensed under the GPL-2.
7 */
8
9#ifndef IIO_ADC_AD7606_H_
10#define IIO_ADC_AD7606_H_
11
12/*
13 * TODO: struct ad7606_platform_data needs to go into include/linux/iio
14 */
15
16/**
Masanari Iidae3c5be22014-04-22 12:23:00 +010017 * struct ad7606_platform_data - platform/board specific information
Michael Hennerichb9618c02011-02-22 21:46:18 +010018 * @default_os: default oversampling value {0, 2, 4, 8, 16, 32, 64}
19 * @default_range: default range +/-{5000, 10000} mVolt
20 * @gpio_convst: number of gpio connected to the CONVST pin
21 * @gpio_reset: gpio connected to the RESET pin, if not used set to -1
22 * @gpio_range: gpio connected to the RANGE pin, if not used set to -1
23 * @gpio_os0: gpio connected to the OS0 pin, if not used set to -1
24 * @gpio_os1: gpio connected to the OS1 pin, if not used set to -1
25 * @gpio_os2: gpio connected to the OS2 pin, if not used set to -1
26 * @gpio_frstdata: gpio connected to the FRSTDAT pin, if not used set to -1
27 * @gpio_stby: gpio connected to the STBY pin, if not used set to -1
28 */
29
30struct ad7606_platform_data {
31 unsigned default_os;
32 unsigned default_range;
33 unsigned gpio_convst;
34 unsigned gpio_reset;
35 unsigned gpio_range;
36 unsigned gpio_os0;
37 unsigned gpio_os1;
38 unsigned gpio_os2;
39 unsigned gpio_frstdata;
40 unsigned gpio_stby;
41};
42
43/**
Masanari Iidae3c5be22014-04-22 12:23:00 +010044 * struct ad7606_chip_info - chip specific information
Maxime Jayat3f794102013-10-12 01:29:46 +020045 * @name: identification string for chip
Michael Hennerichb9618c02011-02-22 21:46:18 +010046 * @int_vref_mv: the internal reference voltage
Michael Hennerich1caf7cb2011-05-18 14:42:00 +010047 * @channels: channel specification
48 * @num_channels: number of channels
Michael Hennerichb9618c02011-02-22 21:46:18 +010049 */
50
51struct ad7606_chip_info {
Jonathan Cameron13cfac22011-05-18 14:41:38 +010052 const char *name;
Michael Hennerichb9618c02011-02-22 21:46:18 +010053 u16 int_vref_mv;
Lars-Peter Clausenf4e4b952012-08-09 08:51:00 +010054 const struct iio_chan_spec *channels;
Michael Hennerichb9618c02011-02-22 21:46:18 +010055 unsigned num_channels;
56};
57
58/**
59 * struct ad7606_state - driver instance specific data
60 */
61
62struct ad7606_state {
Michael Hennerichb9618c02011-02-22 21:46:18 +010063 struct device *dev;
64 const struct ad7606_chip_info *chip_info;
65 struct ad7606_platform_data *pdata;
66 struct regulator *reg;
67 struct work_struct poll_work;
68 wait_queue_head_t wq_data_avail;
Michael Hennerichb9618c02011-02-22 21:46:18 +010069 const struct ad7606_bus_ops *bops;
Michael Hennerichb9618c02011-02-22 21:46:18 +010070 unsigned range;
71 unsigned oversampling;
72 bool done;
Michael Hennerichb9618c02011-02-22 21:46:18 +010073 void __iomem *base_address;
74
75 /*
76 * DMA (thus cache coherency maintenance) requires the
77 * transfer buffers to live in their own cache lines.
78 */
79
80 unsigned short data[8] ____cacheline_aligned;
81};
82
83struct ad7606_bus_ops {
84 /* more methods added in future? */
85 int (*read_block)(struct device *, int, void *);
86};
87
Michael Henneriche61181d2011-05-18 14:42:01 +010088void ad7606_suspend(struct iio_dev *indio_dev);
89void ad7606_resume(struct iio_dev *indio_dev);
90struct iio_dev *ad7606_probe(struct device *dev, int irq,
Michael Hennerichb9618c02011-02-22 21:46:18 +010091 void __iomem *base_address, unsigned id,
92 const struct ad7606_bus_ops *bops);
Jonathan Cameron8cbb36a2011-09-30 10:05:42 +010093int ad7606_remove(struct iio_dev *indio_dev, int irq);
Michael Hennerichb9618c02011-02-22 21:46:18 +010094int ad7606_reset(struct ad7606_state *st);
95
96enum ad7606_supported_device_ids {
97 ID_AD7606_8,
98 ID_AD7606_6,
99 ID_AD7606_4
100};
101
Michael Hennerichb9618c02011-02-22 21:46:18 +0100102int ad7606_register_ring_funcs_and_init(struct iio_dev *indio_dev);
103void ad7606_ring_cleanup(struct iio_dev *indio_dev);
104#endif /* IIO_ADC_AD7606_H_ */