blob: 73b209f23c73f8e9f50840781706a1fb3e900ef4 [file] [log] [blame]
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001 /*
Jonathan Cameron82020b02010-05-04 14:43:03 +01002 * iio/adc/max1363.c
3 * Copyright (C) 2008-2010 Jonathan Cameron
4 *
5 * based on linux/drivers/i2c/chips/max123x
6 * Copyright (C) 2002-2004 Stefan Eletzhofer
7 *
8 * based on linux/drivers/acron/char/pcf8583.c
9 * Copyright (C) 2000 Russell King
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License version 2 as
13 * published by the Free Software Foundation.
14 *
15 * max1363.c
16 *
17 * Partial support for max1363 and similar chips.
18 *
19 * Not currently implemented.
20 *
Jonathan Cameron82020b02010-05-04 14:43:03 +010021 * - Control of internal reference.
22 */
Jonathan Camerond1325cf2009-08-18 18:06:20 +010023
24#include <linux/interrupt.h>
Jonathan Camerond1325cf2009-08-18 18:06:20 +010025#include <linux/device.h>
26#include <linux/kernel.h>
27#include <linux/sysfs.h>
28#include <linux/list.h>
29#include <linux/i2c.h>
Jonathan Camerond1325cf2009-08-18 18:06:20 +010030#include <linux/regulator/consumer.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090031#include <linux/slab.h>
Jonathan Cameronc40ab872010-06-26 12:54:14 +010032#include <linux/err.h>
Paul Gortmaker99c97852011-07-03 15:49:50 -040033#include <linux/module.h>
Jonathan Camerond1325cf2009-08-18 18:06:20 +010034
35#include "../iio.h"
36#include "../sysfs.h"
Jonathan Cameronaf5046a2011-10-26 17:41:32 +010037#include "../events.h"
38#include "../buffer.h"
Jonathan Cameroncdf38702011-08-12 17:08:43 +010039
Jonathan Camerond1325cf2009-08-18 18:06:20 +010040#include "max1363.h"
41
Jonathan Cameron58f0a252011-05-18 14:42:38 +010042#define MAX1363_MODE_SINGLE(_num, _mask) { \
43 .conf = MAX1363_CHANNEL_SEL(_num) \
44 | MAX1363_CONFIG_SCAN_SINGLE_1 \
45 | MAX1363_CONFIG_SE, \
Jonathan Cameron32b5eec2011-09-02 17:14:38 +010046 .modemask[0] = _mask, \
Jonathan Cameron58f0a252011-05-18 14:42:38 +010047 }
48
49#define MAX1363_MODE_SCAN_TO_CHANNEL(_num, _mask) { \
50 .conf = MAX1363_CHANNEL_SEL(_num) \
51 | MAX1363_CONFIG_SCAN_TO_CS \
52 | MAX1363_CONFIG_SE, \
Jonathan Cameron32b5eec2011-09-02 17:14:38 +010053 .modemask[0] = _mask, \
Jonathan Cameron58f0a252011-05-18 14:42:38 +010054 }
55
56/* note not available for max1363 hence naming */
57#define MAX1236_MODE_SCAN_MID_TO_CHANNEL(_mid, _num, _mask) { \
58 .conf = MAX1363_CHANNEL_SEL(_num) \
59 | MAX1236_SCAN_MID_TO_CHANNEL \
60 | MAX1363_CONFIG_SE, \
Jonathan Cameron32b5eec2011-09-02 17:14:38 +010061 .modemask[0] = _mask \
Jonathan Cameron58f0a252011-05-18 14:42:38 +010062}
63
64#define MAX1363_MODE_DIFF_SINGLE(_nump, _numm, _mask) { \
65 .conf = MAX1363_CHANNEL_SEL(_nump) \
66 | MAX1363_CONFIG_SCAN_SINGLE_1 \
67 | MAX1363_CONFIG_DE, \
Jonathan Cameron32b5eec2011-09-02 17:14:38 +010068 .modemask[0] = _mask \
Jonathan Cameron58f0a252011-05-18 14:42:38 +010069 }
70
71/* Can't think how to automate naming so specify for now */
72#define MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(_num, _numvals, _mask) { \
73 .conf = MAX1363_CHANNEL_SEL(_num) \
74 | MAX1363_CONFIG_SCAN_TO_CS \
75 | MAX1363_CONFIG_DE, \
Jonathan Cameron32b5eec2011-09-02 17:14:38 +010076 .modemask[0] = _mask \
Jonathan Cameron58f0a252011-05-18 14:42:38 +010077 }
78
79/* note only available for max1363 hence naming */
80#define MAX1236_MODE_DIFF_SCAN_MID_TO_CHANNEL(_num, _numvals, _mask) { \
81 .conf = MAX1363_CHANNEL_SEL(_num) \
82 | MAX1236_SCAN_MID_TO_CHANNEL \
83 | MAX1363_CONFIG_SE, \
Jonathan Cameron32b5eec2011-09-02 17:14:38 +010084 .modemask[0] = _mask \
Jonathan Cameron58f0a252011-05-18 14:42:38 +010085}
Jonathan Camerond1325cf2009-08-18 18:06:20 +010086
Jonathan Cameron82020b02010-05-04 14:43:03 +010087static const struct max1363_mode max1363_mode_table[] = {
88 /* All of the single channel options first */
89 MAX1363_MODE_SINGLE(0, 1 << 0),
90 MAX1363_MODE_SINGLE(1, 1 << 1),
91 MAX1363_MODE_SINGLE(2, 1 << 2),
92 MAX1363_MODE_SINGLE(3, 1 << 3),
93 MAX1363_MODE_SINGLE(4, 1 << 4),
94 MAX1363_MODE_SINGLE(5, 1 << 5),
95 MAX1363_MODE_SINGLE(6, 1 << 6),
96 MAX1363_MODE_SINGLE(7, 1 << 7),
97 MAX1363_MODE_SINGLE(8, 1 << 8),
98 MAX1363_MODE_SINGLE(9, 1 << 9),
99 MAX1363_MODE_SINGLE(10, 1 << 10),
100 MAX1363_MODE_SINGLE(11, 1 << 11),
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100101
Jonathan Cameron82020b02010-05-04 14:43:03 +0100102 MAX1363_MODE_DIFF_SINGLE(0, 1, 1 << 12),
103 MAX1363_MODE_DIFF_SINGLE(2, 3, 1 << 13),
104 MAX1363_MODE_DIFF_SINGLE(4, 5, 1 << 14),
105 MAX1363_MODE_DIFF_SINGLE(6, 7, 1 << 15),
106 MAX1363_MODE_DIFF_SINGLE(8, 9, 1 << 16),
107 MAX1363_MODE_DIFF_SINGLE(10, 11, 1 << 17),
108 MAX1363_MODE_DIFF_SINGLE(1, 0, 1 << 18),
109 MAX1363_MODE_DIFF_SINGLE(3, 2, 1 << 19),
110 MAX1363_MODE_DIFF_SINGLE(5, 4, 1 << 20),
111 MAX1363_MODE_DIFF_SINGLE(7, 6, 1 << 21),
112 MAX1363_MODE_DIFF_SINGLE(9, 8, 1 << 22),
113 MAX1363_MODE_DIFF_SINGLE(11, 10, 1 << 23),
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100114
Jonathan Cameron82020b02010-05-04 14:43:03 +0100115 /* The multichannel scans next */
116 MAX1363_MODE_SCAN_TO_CHANNEL(1, 0x003),
117 MAX1363_MODE_SCAN_TO_CHANNEL(2, 0x007),
118 MAX1236_MODE_SCAN_MID_TO_CHANNEL(2, 3, 0x00C),
119 MAX1363_MODE_SCAN_TO_CHANNEL(3, 0x00F),
120 MAX1363_MODE_SCAN_TO_CHANNEL(4, 0x01F),
121 MAX1363_MODE_SCAN_TO_CHANNEL(5, 0x03F),
122 MAX1363_MODE_SCAN_TO_CHANNEL(6, 0x07F),
123 MAX1236_MODE_SCAN_MID_TO_CHANNEL(6, 7, 0x0C0),
124 MAX1363_MODE_SCAN_TO_CHANNEL(7, 0x0FF),
125 MAX1236_MODE_SCAN_MID_TO_CHANNEL(6, 8, 0x1C0),
126 MAX1363_MODE_SCAN_TO_CHANNEL(8, 0x1FF),
127 MAX1236_MODE_SCAN_MID_TO_CHANNEL(6, 9, 0x3C0),
128 MAX1363_MODE_SCAN_TO_CHANNEL(9, 0x3FF),
129 MAX1236_MODE_SCAN_MID_TO_CHANNEL(6, 10, 0x7C0),
130 MAX1363_MODE_SCAN_TO_CHANNEL(10, 0x7FF),
131 MAX1236_MODE_SCAN_MID_TO_CHANNEL(6, 11, 0xFC0),
132 MAX1363_MODE_SCAN_TO_CHANNEL(11, 0xFFF),
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100133
Jonathan Cameron82020b02010-05-04 14:43:03 +0100134 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(2, 2, 0x003000),
135 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(4, 3, 0x007000),
136 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(6, 4, 0x00F000),
137 MAX1236_MODE_DIFF_SCAN_MID_TO_CHANNEL(8, 2, 0x018000),
138 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(8, 5, 0x01F000),
139 MAX1236_MODE_DIFF_SCAN_MID_TO_CHANNEL(10, 3, 0x038000),
140 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(10, 6, 0x3F000),
141 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(3, 2, 0x0C0000),
142 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(5, 3, 0x1C0000),
143 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(7, 4, 0x3C0000),
144 MAX1236_MODE_DIFF_SCAN_MID_TO_CHANNEL(9, 2, 0x600000),
145 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(9, 5, 0x7C0000),
146 MAX1236_MODE_DIFF_SCAN_MID_TO_CHANNEL(11, 3, 0xE00000),
147 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(11, 6, 0xFC0000),
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100148};
149
Jonathan Cameron82020b02010-05-04 14:43:03 +0100150const struct max1363_mode
Jonathan Cameron32b5eec2011-09-02 17:14:38 +0100151*max1363_match_mode(unsigned long *mask, const struct max1363_chip_info *ci)
Greg Kroah-Hartman1b183e42010-05-04 22:24:05 -0700152{
Jonathan Cameron82020b02010-05-04 14:43:03 +0100153 int i;
154 if (mask)
155 for (i = 0; i < ci->num_modes; i++)
Jonathan Cameron32b5eec2011-09-02 17:14:38 +0100156 if (bitmap_subset(mask,
157 max1363_mode_table[ci->mode_list[i]].
158 modemask,
159 MAX1363_MAX_CHANNELS))
Greg Kroah-Hartman1b183e42010-05-04 22:24:05 -0700160 return &max1363_mode_table[ci->mode_list[i]];
161 return NULL;
Mike Frysingerc608cb02010-05-23 03:10:30 -0400162}
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100163
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100164static int max1363_write_basic_config(struct i2c_client *client,
165 unsigned char d1,
166 unsigned char d2)
167{
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100168 u8 tx_buf[2] = {d1, d2};
Jonathan Cameron82020b02010-05-04 14:43:03 +0100169
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100170 return i2c_master_send(client, tx_buf, 2);
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100171}
172
Jonathan Cameron82020b02010-05-04 14:43:03 +0100173int max1363_set_scan_mode(struct max1363_state *st)
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100174{
175 st->configbyte &= ~(MAX1363_CHANNEL_SEL_MASK
176 | MAX1363_SCAN_MASK
177 | MAX1363_SE_DE_MASK);
178 st->configbyte |= st->current_mode->conf;
179
180 return max1363_write_basic_config(st->client,
181 st->setupbyte,
182 st->configbyte);
183}
184
Jonathan Cameron298cd972011-05-18 14:40:53 +0100185static int max1363_read_single_chan(struct iio_dev *indio_dev,
186 struct iio_chan_spec const *chan,
187 int *val,
188 long m)
Jonathan Cameron82020b02010-05-04 14:43:03 +0100189{
Jonathan Cameron298cd972011-05-18 14:40:53 +0100190 int ret = 0;
191 s32 data;
Jonathan Cameron82020b02010-05-04 14:43:03 +0100192 char rxbuf[2];
Jonathan Cameron32b5eec2011-09-02 17:14:38 +0100193 const unsigned long *mask;
Jonathan Cameron298cd972011-05-18 14:40:53 +0100194 struct max1363_state *st = iio_priv(indio_dev);
195 struct i2c_client *client = st->client;
Jonathan Cameron82020b02010-05-04 14:43:03 +0100196
Jonathan Cameronb6b70682011-04-15 18:55:58 +0100197 mutex_lock(&indio_dev->mlock);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100198 /*
199 * If monitor mode is enabled, the method for reading a single
200 * channel will have to be rather different and has not yet
201 * been implemented.
202 */
203 if (st->monitor_on) {
204 ret = -EBUSY;
205 goto error_ret;
206 }
207
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300208 /* If ring buffer capture is occurring, query the buffer */
Jonathan Cameron14555b12011-09-21 11:15:57 +0100209 if (iio_buffer_enabled(indio_dev)) {
Jonathan Cameron298cd972011-05-18 14:40:53 +0100210 mask = max1363_mode_table[chan->address].modemask;
Jonathan Cameron82020b02010-05-04 14:43:03 +0100211 data = max1363_single_channel_from_ring(mask, st);
212 if (data < 0) {
213 ret = data;
214 goto error_ret;
215 }
216 } else {
217 /* Check to see if current scan mode is correct */
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100218 if (st->current_mode != &max1363_mode_table[chan->address]) {
Jonathan Cameron82020b02010-05-04 14:43:03 +0100219 /* Update scan mode if needed */
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100220 st->current_mode = &max1363_mode_table[chan->address];
Jonathan Cameron82020b02010-05-04 14:43:03 +0100221 ret = max1363_set_scan_mode(st);
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100222 if (ret < 0)
Jonathan Cameron82020b02010-05-04 14:43:03 +0100223 goto error_ret;
224 }
Jonathan Cameron3bf877c2010-05-04 14:43:10 +0100225 if (st->chip_info->bits != 8) {
226 /* Get reading */
227 data = i2c_master_recv(client, rxbuf, 2);
228 if (data < 0) {
229 ret = data;
230 goto error_ret;
231 }
Jonathan Cameron3bf877c2010-05-04 14:43:10 +0100232 data = (s32)(rxbuf[1]) | ((s32)(rxbuf[0] & 0x0F)) << 8;
233 } else {
234 /* Get reading */
235 data = i2c_master_recv(client, rxbuf, 1);
236 if (data < 0) {
237 ret = data;
238 goto error_ret;
239 }
240 data = rxbuf[0];
Jonathan Cameron82020b02010-05-04 14:43:03 +0100241 }
Jonathan Cameron82020b02010-05-04 14:43:03 +0100242 }
Jonathan Cameron298cd972011-05-18 14:40:53 +0100243 *val = data;
Jonathan Cameron82020b02010-05-04 14:43:03 +0100244error_ret:
Jonathan Cameronb6b70682011-04-15 18:55:58 +0100245 mutex_unlock(&indio_dev->mlock);
Jonathan Cameron298cd972011-05-18 14:40:53 +0100246 return ret;
247
Jonathan Cameron82020b02010-05-04 14:43:03 +0100248}
249
Jonathan Cameron298cd972011-05-18 14:40:53 +0100250static int max1363_read_raw(struct iio_dev *indio_dev,
251 struct iio_chan_spec const *chan,
252 int *val,
253 int *val2,
254 long m)
Jonathan Cameron82020b02010-05-04 14:43:03 +0100255{
Jonathan Cameron298cd972011-05-18 14:40:53 +0100256 struct max1363_state *st = iio_priv(indio_dev);
257 int ret;
258 switch (m) {
259 case 0:
260 ret = max1363_read_single_chan(indio_dev, chan, val, m);
Jonathan Cameroncd038012011-08-12 16:55:29 +0100261 if (ret < 0)
Jonathan Cameron298cd972011-05-18 14:40:53 +0100262 return ret;
263 return IIO_VAL_INT;
264 case (1 << IIO_CHAN_INFO_SCALE_SHARED):
265 if ((1 << (st->chip_info->bits + 1)) >
266 st->chip_info->int_vref_mv) {
267 *val = 0;
268 *val2 = 500000;
269 return IIO_VAL_INT_PLUS_MICRO;
270 } else {
271 *val = (st->chip_info->int_vref_mv)
272 >> st->chip_info->bits;
273 return IIO_VAL_INT;
274 }
275 default:
276 return -EINVAL;
277 }
278 return 0;
Jonathan Cameron82020b02010-05-04 14:43:03 +0100279}
280
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100281/* Applies to max1363 */
282static const enum max1363_modes max1363_mode_list[] = {
283 _s0, _s1, _s2, _s3,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100284 s0to1, s0to2, s0to3,
285 d0m1, d2m3, d1m0, d3m2,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100286 d0m1to2m3, d1m0to3m2,
287};
288
Jonathan Cameron298cd972011-05-18 14:40:53 +0100289#define MAX1363_EV_M \
290 (IIO_EV_BIT(IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING) \
291 | IIO_EV_BIT(IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING))
292#define MAX1363_INFO_MASK (1 << IIO_CHAN_INFO_SCALE_SHARED)
Jonathan Cameronade7ef72011-09-02 17:14:45 +0100293#define MAX1363_CHAN_U(num, addr, si, bits, evmask) \
294 { \
295 .type = IIO_VOLTAGE, \
296 .indexed = 1, \
297 .channel = num, \
298 .address = addr, \
299 .info_mask = MAX1363_INFO_MASK, \
300 .scan_type = IIO_ST('u', bits, (bits > 8) ? 16 : 8, 0), \
301 .scan_index = si, \
302 .event_mask = evmask, \
Jonathan Cameron298cd972011-05-18 14:40:53 +0100303 }
304
Jonathan Cameronade7ef72011-09-02 17:14:45 +0100305/* bipolar channel */
306#define MAX1363_CHAN_B(num, num2, addr, si, bits, evmask) \
307 { \
308 .type = IIO_VOLTAGE, \
309 .differential = 1, \
310 .indexed = 1, \
311 .channel = num, \
312 .channel2 = num2, \
313 .address = addr, \
314 .info_mask = MAX1363_INFO_MASK, \
315 .scan_type = IIO_ST('u', bits, (bits > 8) ? 16 : 8, 0), \
316 .scan_index = si, \
317 .event_mask = evmask, \
318 }
319
320#define MAX1363_4X_CHANS(bits, em) { \
321 MAX1363_CHAN_U(0, _s0, 0, bits, em), \
322 MAX1363_CHAN_U(1, _s1, 1, bits, em), \
323 MAX1363_CHAN_U(2, _s2, 2, bits, em), \
324 MAX1363_CHAN_U(3, _s3, 3, bits, em), \
325 MAX1363_CHAN_B(0, 1, d0m1, 4, bits, em), \
326 MAX1363_CHAN_B(2, 3, d2m3, 5, bits, em), \
327 MAX1363_CHAN_B(1, 0, d1m0, 6, bits, em), \
328 MAX1363_CHAN_B(3, 2, d3m2, 7, bits, em), \
329 IIO_CHAN_SOFT_TIMESTAMP(8) \
330 }
331
332static struct iio_chan_spec max1036_channels[] = MAX1363_4X_CHANS(8, 0);
333static struct iio_chan_spec max1136_channels[] = MAX1363_4X_CHANS(10, 0);
334static struct iio_chan_spec max1236_channels[] = MAX1363_4X_CHANS(12, 0);
335static struct iio_chan_spec max1361_channels[] =
336 MAX1363_4X_CHANS(10, MAX1363_EV_M);
337static struct iio_chan_spec max1363_channels[] =
338 MAX1363_4X_CHANS(12, MAX1363_EV_M);
Jonathan Cameron298cd972011-05-18 14:40:53 +0100339
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100340/* Appies to max1236, max1237 */
341static const enum max1363_modes max1236_mode_list[] = {
342 _s0, _s1, _s2, _s3,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100343 s0to1, s0to2, s0to3,
344 d0m1, d2m3, d1m0, d3m2,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100345 d0m1to2m3, d1m0to3m2,
346 s2to3,
347};
348
349/* Applies to max1238, max1239 */
350static const enum max1363_modes max1238_mode_list[] = {
351 _s0, _s1, _s2, _s3, _s4, _s5, _s6, _s7, _s8, _s9, _s10, _s11,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100352 s0to1, s0to2, s0to3, s0to4, s0to5, s0to6,
353 s0to7, s0to8, s0to9, s0to10, s0to11,
354 d0m1, d2m3, d4m5, d6m7, d8m9, d10m11,
355 d1m0, d3m2, d5m4, d7m6, d9m8, d11m10,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100356 d0m1to2m3, d0m1to4m5, d0m1to6m7, d0m1to8m9, d0m1to10m11,
357 d1m0to3m2, d1m0to5m4, d1m0to7m6, d1m0to9m8, d1m0to11m10,
358 s6to7, s6to8, s6to9, s6to10, s6to11,
Jonathan Cameron82020b02010-05-04 14:43:03 +0100359 d6m7to8m9, d6m7to10m11, d7m6to9m8, d7m6to11m10,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100360};
361
Jonathan Cameron298cd972011-05-18 14:40:53 +0100362#define MAX1363_12X_CHANS(bits) { \
Jonathan Cameronade7ef72011-09-02 17:14:45 +0100363 MAX1363_CHAN_U(0, _s0, 0, bits, 0), \
364 MAX1363_CHAN_U(1, _s1, 1, bits, 0), \
365 MAX1363_CHAN_U(2, _s2, 2, bits, 0), \
366 MAX1363_CHAN_U(3, _s3, 3, bits, 0), \
367 MAX1363_CHAN_U(4, _s4, 4, bits, 0), \
368 MAX1363_CHAN_U(5, _s5, 5, bits, 0), \
369 MAX1363_CHAN_U(6, _s6, 6, bits, 0), \
370 MAX1363_CHAN_U(7, _s7, 7, bits, 0), \
371 MAX1363_CHAN_U(8, _s8, 8, bits, 0), \
372 MAX1363_CHAN_U(9, _s9, 9, bits, 0), \
373 MAX1363_CHAN_U(10, _s10, 10, bits, 0), \
374 MAX1363_CHAN_U(11, _s11, 11, bits, 0), \
375 MAX1363_CHAN_B(0, 1, d0m1, 12, bits, 0), \
376 MAX1363_CHAN_B(2, 3, d2m3, 13, bits, 0), \
377 MAX1363_CHAN_B(4, 5, d4m5, 14, bits, 0), \
378 MAX1363_CHAN_B(6, 7, d6m7, 15, bits, 0), \
379 MAX1363_CHAN_B(8, 9, d8m9, 16, bits, 0), \
380 MAX1363_CHAN_B(10, 11, d10m11, 17, bits, 0), \
381 MAX1363_CHAN_B(1, 0, d1m0, 18, bits, 0), \
382 MAX1363_CHAN_B(3, 2, d3m2, 19, bits, 0), \
383 MAX1363_CHAN_B(5, 4, d5m4, 20, bits, 0), \
384 MAX1363_CHAN_B(7, 6, d7m6, 21, bits, 0), \
385 MAX1363_CHAN_B(9, 8, d9m8, 22, bits, 0), \
386 MAX1363_CHAN_B(11, 10, d11m10, 23, bits, 0), \
Jonathan Cameron298cd972011-05-18 14:40:53 +0100387 IIO_CHAN_SOFT_TIMESTAMP(24) \
388 }
389static struct iio_chan_spec max1038_channels[] = MAX1363_12X_CHANS(8);
390static struct iio_chan_spec max1138_channels[] = MAX1363_12X_CHANS(10);
391static struct iio_chan_spec max1238_channels[] = MAX1363_12X_CHANS(12);
Jonathan Cameronc3fa0fd2010-05-04 14:43:09 +0100392
393static const enum max1363_modes max11607_mode_list[] = {
394 _s0, _s1, _s2, _s3,
395 s0to1, s0to2, s0to3,
396 s2to3,
397 d0m1, d2m3, d1m0, d3m2,
398 d0m1to2m3, d1m0to3m2,
399};
400
401static const enum max1363_modes max11608_mode_list[] = {
402 _s0, _s1, _s2, _s3, _s4, _s5, _s6, _s7,
403 s0to1, s0to2, s0to3, s0to4, s0to5, s0to6, s0to7,
404 s6to7,
405 d0m1, d2m3, d4m5, d6m7,
406 d1m0, d3m2, d5m4, d7m6,
407 d0m1to2m3, d0m1to4m5, d0m1to6m7,
408 d1m0to3m2, d1m0to5m4, d1m0to7m6,
409};
410
Jonathan Cameronade7ef72011-09-02 17:14:45 +0100411#define MAX1363_8X_CHANS(bits) { \
412 MAX1363_CHAN_U(0, _s0, 0, bits, 0), \
413 MAX1363_CHAN_U(1, _s1, 1, bits, 0), \
414 MAX1363_CHAN_U(2, _s2, 2, bits, 0), \
415 MAX1363_CHAN_U(3, _s3, 3, bits, 0), \
416 MAX1363_CHAN_U(4, _s4, 4, bits, 0), \
417 MAX1363_CHAN_U(5, _s5, 5, bits, 0), \
418 MAX1363_CHAN_U(6, _s6, 6, bits, 0), \
419 MAX1363_CHAN_U(7, _s7, 7, bits, 0), \
420 MAX1363_CHAN_B(0, 1, d0m1, 8, bits, 0), \
421 MAX1363_CHAN_B(2, 3, d2m3, 9, bits, 0), \
422 MAX1363_CHAN_B(4, 5, d4m5, 10, bits, 0), \
423 MAX1363_CHAN_B(6, 7, d6m7, 11, bits, 0), \
424 MAX1363_CHAN_B(1, 0, d1m0, 12, bits, 0), \
425 MAX1363_CHAN_B(3, 2, d3m2, 13, bits, 0), \
426 MAX1363_CHAN_B(5, 4, d5m4, 14, bits, 0), \
427 MAX1363_CHAN_B(7, 6, d7m6, 15, bits, 0), \
428 IIO_CHAN_SOFT_TIMESTAMP(16) \
429}
Jonathan Cameron298cd972011-05-18 14:40:53 +0100430static struct iio_chan_spec max11602_channels[] = MAX1363_8X_CHANS(8);
431static struct iio_chan_spec max11608_channels[] = MAX1363_8X_CHANS(10);
432static struct iio_chan_spec max11614_channels[] = MAX1363_8X_CHANS(12);
Jonathan Cameronc3fa0fd2010-05-04 14:43:09 +0100433
Jonathan Cameron586d1522011-05-18 14:42:10 +0100434static const enum max1363_modes max11644_mode_list[] = {
435 _s0, _s1, s0to1, d0m1, d1m0,
436};
437
438#define MAX1363_2X_CHANS(bits) { \
Jonathan Cameronade7ef72011-09-02 17:14:45 +0100439 MAX1363_CHAN_U(0, _s0, 0, bits, 0), \
440 MAX1363_CHAN_U(1, _s1, 1, bits, 0), \
441 MAX1363_CHAN_B(0, 1, d0m1, 2, bits, 0), \
442 MAX1363_CHAN_B(1, 0, d1m0, 3, bits, 0), \
Jonathan Cameron586d1522011-05-18 14:42:10 +0100443 IIO_CHAN_SOFT_TIMESTAMP(4) \
444 }
445
446static struct iio_chan_spec max11646_channels[] = MAX1363_2X_CHANS(10);
447static struct iio_chan_spec max11644_channels[] = MAX1363_2X_CHANS(12);
448
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100449enum { max1361,
450 max1362,
451 max1363,
452 max1364,
Jonathan Cameron3bf877c2010-05-04 14:43:10 +0100453 max1036,
454 max1037,
455 max1038,
456 max1039,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100457 max1136,
458 max1137,
459 max1138,
460 max1139,
461 max1236,
462 max1237,
463 max1238,
464 max1239,
Jonathan Cameron3bf877c2010-05-04 14:43:10 +0100465 max11600,
466 max11601,
467 max11602,
468 max11603,
469 max11604,
470 max11605,
Jonathan Cameronc3fa0fd2010-05-04 14:43:09 +0100471 max11606,
472 max11607,
473 max11608,
474 max11609,
475 max11610,
476 max11611,
477 max11612,
478 max11613,
479 max11614,
480 max11615,
481 max11616,
482 max11617,
Jonathan Cameron586d1522011-05-18 14:42:10 +0100483 max11644,
484 max11645,
485 max11646,
486 max11647
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100487};
488
Jonathan Cameron440a5202010-06-26 12:54:23 +0100489static const int max1363_monitor_speeds[] = { 133000, 665000, 33300, 16600,
490 8300, 4200, 2000, 1000 };
491
492static ssize_t max1363_monitor_show_freq(struct device *dev,
493 struct device_attribute *attr,
494 char *buf)
495{
Jonathan Cameron3dba81b2011-04-15 18:55:59 +0100496 struct max1363_state *st = iio_priv(dev_get_drvdata(dev));
Jonathan Cameron440a5202010-06-26 12:54:23 +0100497 return sprintf(buf, "%d\n", max1363_monitor_speeds[st->monitor_speed]);
498}
499
500static ssize_t max1363_monitor_store_freq(struct device *dev,
501 struct device_attribute *attr,
502 const char *buf,
503 size_t len)
504{
Jonathan Cameronb6b70682011-04-15 18:55:58 +0100505 struct iio_dev *indio_dev = dev_get_drvdata(dev);
Jonathan Cameron3dba81b2011-04-15 18:55:59 +0100506 struct max1363_state *st = iio_priv(indio_dev);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100507 int i, ret;
508 unsigned long val;
509 bool found = false;
510
511 ret = strict_strtoul(buf, 10, &val);
512 if (ret)
513 return -EINVAL;
514 for (i = 0; i < ARRAY_SIZE(max1363_monitor_speeds); i++)
515 if (val == max1363_monitor_speeds[i]) {
516 found = true;
517 break;
518 }
519 if (!found)
520 return -EINVAL;
521
Jonathan Cameronb6b70682011-04-15 18:55:58 +0100522 mutex_lock(&indio_dev->mlock);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100523 st->monitor_speed = i;
Jonathan Cameronb6b70682011-04-15 18:55:58 +0100524 mutex_unlock(&indio_dev->mlock);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100525
526 return 0;
527}
528
529static IIO_DEV_ATTR_SAMP_FREQ(S_IRUGO | S_IWUSR,
530 max1363_monitor_show_freq,
531 max1363_monitor_store_freq);
532
533static IIO_CONST_ATTR(sampling_frequency_available,
534 "133000 665000 33300 16600 8300 4200 2000 1000");
535
Jonathan Cameron298cd972011-05-18 14:40:53 +0100536static int max1363_read_thresh(struct iio_dev *indio_dev,
Jonathan Cameron330c6c52011-09-02 17:14:39 +0100537 u64 event_code,
Jonathan Cameron298cd972011-05-18 14:40:53 +0100538 int *val)
Jonathan Cameron440a5202010-06-26 12:54:23 +0100539{
Jonathan Cameron3dba81b2011-04-15 18:55:59 +0100540 struct max1363_state *st = iio_priv(indio_dev);
Jonathan Cameron298cd972011-05-18 14:40:53 +0100541 if (IIO_EVENT_CODE_EXTRACT_DIR(event_code) == IIO_EV_DIR_FALLING)
542 *val = st->thresh_low[IIO_EVENT_CODE_EXTRACT_NUM(event_code)];
Jonathan Cameron440a5202010-06-26 12:54:23 +0100543 else
Jonathan Cameron298cd972011-05-18 14:40:53 +0100544 *val = st->thresh_high[IIO_EVENT_CODE_EXTRACT_NUM(event_code)];
545 return 0;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100546}
547
Jonathan Cameron298cd972011-05-18 14:40:53 +0100548static int max1363_write_thresh(struct iio_dev *indio_dev,
Jonathan Cameron330c6c52011-09-02 17:14:39 +0100549 u64 event_code,
Jonathan Cameron298cd972011-05-18 14:40:53 +0100550 int val)
Jonathan Cameron440a5202010-06-26 12:54:23 +0100551{
Jonathan Cameron298cd972011-05-18 14:40:53 +0100552 struct max1363_state *st = iio_priv(indio_dev);
553 /* make it handle signed correctly as well */
Jonathan Cameron440a5202010-06-26 12:54:23 +0100554 switch (st->chip_info->bits) {
555 case 10:
556 if (val > 0x3FF)
557 return -EINVAL;
558 break;
559 case 12:
560 if (val > 0xFFF)
561 return -EINVAL;
562 break;
563 }
564
Jonathan Cameron298cd972011-05-18 14:40:53 +0100565 switch (IIO_EVENT_CODE_EXTRACT_DIR(event_code)) {
566 case IIO_EV_DIR_FALLING:
567 st->thresh_low[IIO_EVENT_CODE_EXTRACT_NUM(event_code)] = val;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100568 break;
Jonathan Cameron298cd972011-05-18 14:40:53 +0100569 case IIO_EV_DIR_RISING:
570 st->thresh_high[IIO_EVENT_CODE_EXTRACT_NUM(event_code)] = val;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100571 break;
572 }
573
Jonathan Cameron440a5202010-06-26 12:54:23 +0100574 return 0;
575}
576
Jonathan Cameron330c6c52011-09-02 17:14:39 +0100577static const u64 max1363_event_codes[] = {
Jonathan Cameron6835cb62011-09-27 09:56:41 +0100578 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 0,
579 IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING),
580 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 1,
581 IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING),
582 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 2,
583 IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING),
584 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 3,
585 IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING),
586 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 0,
587 IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING),
588 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 1,
589 IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING),
590 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 2,
591 IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING),
592 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 3,
593 IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING),
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100594};
595
Jonathan Cameronaaf370d2011-05-18 14:41:16 +0100596static irqreturn_t max1363_event_handler(int irq, void *private)
Jonathan Cameron440a5202010-06-26 12:54:23 +0100597{
Jonathan Cameronaaf370d2011-05-18 14:41:16 +0100598 struct iio_dev *indio_dev = private;
599 struct max1363_state *st = iio_priv(indio_dev);
600 s64 timestamp = iio_get_time_ns();
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100601 unsigned long mask, loc;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100602 u8 rx;
603 u8 tx[2] = { st->setupbyte,
604 MAX1363_MON_INT_ENABLE | (st->monitor_speed << 1) | 0xF0 };
605
606 i2c_master_recv(st->client, &rx, 1);
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100607 mask = rx;
608 for_each_set_bit(loc, &mask, 8)
Jonathan Cameron5aa96182011-08-30 12:41:06 +0100609 iio_push_event(indio_dev, max1363_event_codes[loc], timestamp);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100610 i2c_master_send(st->client, tx, 2);
Jonathan Cameronaaf370d2011-05-18 14:41:16 +0100611
612 return IRQ_HANDLED;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100613}
614
Jonathan Cameron298cd972011-05-18 14:40:53 +0100615static int max1363_read_event_config(struct iio_dev *indio_dev,
Jonathan Cameron330c6c52011-09-02 17:14:39 +0100616 u64 event_code)
Jonathan Cameron440a5202010-06-26 12:54:23 +0100617{
Jonathan Cameron3dba81b2011-04-15 18:55:59 +0100618 struct max1363_state *st = iio_priv(indio_dev);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100619
Jonathan Cameron298cd972011-05-18 14:40:53 +0100620 int val;
621 int number = IIO_EVENT_CODE_EXTRACT_NUM(event_code);
Jonathan Cameronb6b70682011-04-15 18:55:58 +0100622 mutex_lock(&indio_dev->mlock);
Jonathan Cameron298cd972011-05-18 14:40:53 +0100623 if (IIO_EVENT_CODE_EXTRACT_DIR(event_code) == IIO_EV_DIR_FALLING)
624 val = (1 << number) & st->mask_low;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100625 else
Jonathan Cameron298cd972011-05-18 14:40:53 +0100626 val = (1 << number) & st->mask_high;
Jonathan Cameronb6b70682011-04-15 18:55:58 +0100627 mutex_unlock(&indio_dev->mlock);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100628
Jonathan Cameron298cd972011-05-18 14:40:53 +0100629 return val;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100630}
631
632static int max1363_monitor_mode_update(struct max1363_state *st, int enabled)
633{
634 u8 *tx_buf;
635 int ret, i = 3, j;
636 unsigned long numelements;
637 int len;
Jonathan Cameron32b5eec2011-09-02 17:14:38 +0100638 const long *modemask;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100639
640 if (!enabled) {
641 /* transition to ring capture is not currently supported */
642 st->setupbyte &= ~MAX1363_SETUP_MONITOR_SETUP;
643 st->configbyte &= ~MAX1363_SCAN_MASK;
644 st->monitor_on = false;
645 return max1363_write_basic_config(st->client,
646 st->setupbyte,
647 st->configbyte);
648 }
649
650 /* Ensure we are in the relevant mode */
651 st->setupbyte |= MAX1363_SETUP_MONITOR_SETUP;
652 st->configbyte &= ~(MAX1363_CHANNEL_SEL_MASK
653 | MAX1363_SCAN_MASK
654 | MAX1363_SE_DE_MASK);
655 st->configbyte |= MAX1363_CONFIG_SCAN_MONITOR_MODE;
656 if ((st->mask_low | st->mask_high) & 0x0F) {
657 st->configbyte |= max1363_mode_table[s0to3].conf;
658 modemask = max1363_mode_table[s0to3].modemask;
659 } else if ((st->mask_low | st->mask_high) & 0x30) {
660 st->configbyte |= max1363_mode_table[d0m1to2m3].conf;
661 modemask = max1363_mode_table[d0m1to2m3].modemask;
662 } else {
663 st->configbyte |= max1363_mode_table[d1m0to3m2].conf;
664 modemask = max1363_mode_table[d1m0to3m2].modemask;
665 }
Jonathan Cameron32b5eec2011-09-02 17:14:38 +0100666 numelements = bitmap_weight(modemask, MAX1363_MAX_CHANNELS);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100667 len = 3 * numelements + 3;
668 tx_buf = kmalloc(len, GFP_KERNEL);
669 if (!tx_buf) {
670 ret = -ENOMEM;
671 goto error_ret;
672 }
673 tx_buf[0] = st->configbyte;
674 tx_buf[1] = st->setupbyte;
675 tx_buf[2] = (st->monitor_speed << 1);
676
677 /*
678 * So we need to do yet another bit of nefarious scan mode
679 * setup to match what we need.
680 */
681 for (j = 0; j < 8; j++)
Jonathan Cameron32b5eec2011-09-02 17:14:38 +0100682 if (test_bit(j, modemask)) {
Jonathan Cameron440a5202010-06-26 12:54:23 +0100683 /* Establish the mode is in the scan */
684 if (st->mask_low & (1 << j)) {
685 tx_buf[i] = (st->thresh_low[j] >> 4) & 0xFF;
686 tx_buf[i + 1] = (st->thresh_low[j] << 4) & 0xF0;
687 } else if (j < 4) {
688 tx_buf[i] = 0;
689 tx_buf[i + 1] = 0;
690 } else {
691 tx_buf[i] = 0x80;
692 tx_buf[i + 1] = 0;
693 }
694 if (st->mask_high & (1 << j)) {
695 tx_buf[i + 1] |=
696 (st->thresh_high[j] >> 8) & 0x0F;
697 tx_buf[i + 2] = st->thresh_high[j] & 0xFF;
698 } else if (j < 4) {
699 tx_buf[i + 1] |= 0x0F;
700 tx_buf[i + 2] = 0xFF;
701 } else {
702 tx_buf[i + 1] |= 0x07;
703 tx_buf[i + 2] = 0xFF;
704 }
705 i += 3;
706 }
707
708
709 ret = i2c_master_send(st->client, tx_buf, len);
710 if (ret < 0)
711 goto error_ret;
712 if (ret != len) {
713 ret = -EIO;
714 goto error_ret;
715 }
716
717 /*
718 * Now that we hopefully have sensible thresholds in place it is
719 * time to turn the interrupts on.
720 * It is unclear from the data sheet if this should be necessary
721 * (i.e. whether monitor mode setup is atomic) but it appears to
722 * be in practice.
723 */
724 tx_buf[0] = st->setupbyte;
725 tx_buf[1] = MAX1363_MON_INT_ENABLE | (st->monitor_speed << 1) | 0xF0;
726 ret = i2c_master_send(st->client, tx_buf, 2);
727 if (ret < 0)
728 goto error_ret;
729 if (ret != 2) {
730 ret = -EIO;
731 goto error_ret;
732 }
733 ret = 0;
734 st->monitor_on = true;
735error_ret:
736
737 kfree(tx_buf);
738
739 return ret;
740}
741
742/*
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300743 * To keep this manageable we always use one of 3 scan modes.
Jonathan Cameron440a5202010-06-26 12:54:23 +0100744 * Scan 0...3, 0-1,2-3 and 1-0,3-2
745 */
Jonathan Cameron298cd972011-05-18 14:40:53 +0100746
Jonathan Cameron440a5202010-06-26 12:54:23 +0100747static inline int __max1363_check_event_mask(int thismask, int checkmask)
748{
749 int ret = 0;
750 /* Is it unipolar */
751 if (thismask < 4) {
752 if (checkmask & ~0x0F) {
753 ret = -EBUSY;
754 goto error_ret;
755 }
756 } else if (thismask < 6) {
757 if (checkmask & ~0x30) {
758 ret = -EBUSY;
759 goto error_ret;
760 }
761 } else if (checkmask & ~0xC0)
762 ret = -EBUSY;
763error_ret:
764 return ret;
765}
766
Jonathan Cameron298cd972011-05-18 14:40:53 +0100767static int max1363_write_event_config(struct iio_dev *indio_dev,
Jonathan Cameron330c6c52011-09-02 17:14:39 +0100768 u64 event_code,
Jonathan Cameron298cd972011-05-18 14:40:53 +0100769 int state)
Jonathan Cameron440a5202010-06-26 12:54:23 +0100770{
Jonathan Cameron298cd972011-05-18 14:40:53 +0100771 int ret = 0;
Jonathan Cameron3dba81b2011-04-15 18:55:59 +0100772 struct max1363_state *st = iio_priv(indio_dev);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100773 u16 unifiedmask;
Jonathan Cameron298cd972011-05-18 14:40:53 +0100774 int number = IIO_EVENT_CODE_EXTRACT_NUM(event_code);
775
Jonathan Cameron3dba81b2011-04-15 18:55:59 +0100776 mutex_lock(&indio_dev->mlock);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100777 unifiedmask = st->mask_low | st->mask_high;
Jonathan Cameron298cd972011-05-18 14:40:53 +0100778 if (IIO_EVENT_CODE_EXTRACT_DIR(event_code) == IIO_EV_DIR_FALLING) {
779
780 if (state == 0)
781 st->mask_low &= ~(1 << number);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100782 else {
Jonathan Cameron298cd972011-05-18 14:40:53 +0100783 ret = __max1363_check_event_mask((1 << number),
784 unifiedmask);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100785 if (ret)
786 goto error_ret;
Jonathan Cameron298cd972011-05-18 14:40:53 +0100787 st->mask_low |= (1 << number);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100788 }
789 } else {
Jonathan Cameron298cd972011-05-18 14:40:53 +0100790 if (state == 0)
791 st->mask_high &= ~(1 << number);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100792 else {
Jonathan Cameron298cd972011-05-18 14:40:53 +0100793 ret = __max1363_check_event_mask((1 << number),
794 unifiedmask);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100795 if (ret)
796 goto error_ret;
Jonathan Cameron298cd972011-05-18 14:40:53 +0100797 st->mask_high |= (1 << number);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100798 }
799 }
Jonathan Cameron440a5202010-06-26 12:54:23 +0100800
801 max1363_monitor_mode_update(st, !!(st->mask_high | st->mask_low));
802error_ret:
Jonathan Cameron3dba81b2011-04-15 18:55:59 +0100803 mutex_unlock(&indio_dev->mlock);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100804
Jonathan Cameron298cd972011-05-18 14:40:53 +0100805 return ret;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100806}
807
Jonathan Cameron440a5202010-06-26 12:54:23 +0100808/*
809 * As with scan_elements, only certain sets of these can
810 * be combined.
811 */
812static struct attribute *max1363_event_attributes[] = {
Jonathan Cameron440a5202010-06-26 12:54:23 +0100813 &iio_dev_attr_sampling_frequency.dev_attr.attr,
814 &iio_const_attr_sampling_frequency_available.dev_attr.attr,
Jonathan Cameron440a5202010-06-26 12:54:23 +0100815 NULL,
816};
817
818static struct attribute_group max1363_event_attribute_group = {
819 .attrs = max1363_event_attributes,
Jonathan Cameron8e7d9672011-08-30 12:32:45 +0100820 .name = "events",
Jonathan Cameron440a5202010-06-26 12:54:23 +0100821};
822
Jonathan Cameron6fe81352011-05-18 14:42:37 +0100823#define MAX1363_EVENT_FUNCS \
824
825
826static const struct iio_info max1238_info = {
827 .read_raw = &max1363_read_raw,
828 .driver_module = THIS_MODULE,
829};
830
831static const struct iio_info max1363_info = {
832 .read_event_value = &max1363_read_thresh,
833 .write_event_value = &max1363_write_thresh,
834 .read_event_config = &max1363_read_event_config,
835 .write_event_config = &max1363_write_event_config,
836 .read_raw = &max1363_read_raw,
837 .driver_module = THIS_MODULE,
Jonathan Cameron6fe81352011-05-18 14:42:37 +0100838 .event_attrs = &max1363_event_attribute_group,
839};
840
841/* max1363 and max1368 tested - rest from data sheet */
842static const struct max1363_chip_info max1363_chip_info_tbl[] = {
843 [max1361] = {
844 .bits = 10,
845 .int_vref_mv = 2048,
846 .mode_list = max1363_mode_list,
847 .num_modes = ARRAY_SIZE(max1363_mode_list),
848 .default_mode = s0to3,
849 .channels = max1361_channels,
850 .num_channels = ARRAY_SIZE(max1361_channels),
851 .info = &max1363_info,
852 },
853 [max1362] = {
854 .bits = 10,
855 .int_vref_mv = 4096,
856 .mode_list = max1363_mode_list,
857 .num_modes = ARRAY_SIZE(max1363_mode_list),
858 .default_mode = s0to3,
859 .channels = max1361_channels,
860 .num_channels = ARRAY_SIZE(max1361_channels),
861 .info = &max1363_info,
862 },
863 [max1363] = {
864 .bits = 12,
865 .int_vref_mv = 2048,
866 .mode_list = max1363_mode_list,
867 .num_modes = ARRAY_SIZE(max1363_mode_list),
868 .default_mode = s0to3,
869 .channels = max1363_channels,
870 .num_channels = ARRAY_SIZE(max1363_channels),
871 .info = &max1363_info,
872 },
873 [max1364] = {
874 .bits = 12,
875 .int_vref_mv = 4096,
876 .mode_list = max1363_mode_list,
877 .num_modes = ARRAY_SIZE(max1363_mode_list),
878 .default_mode = s0to3,
879 .channels = max1363_channels,
880 .num_channels = ARRAY_SIZE(max1363_channels),
881 .info = &max1363_info,
882 },
883 [max1036] = {
884 .bits = 8,
885 .int_vref_mv = 4096,
886 .mode_list = max1236_mode_list,
887 .num_modes = ARRAY_SIZE(max1236_mode_list),
888 .default_mode = s0to3,
889 .info = &max1238_info,
890 .channels = max1036_channels,
891 .num_channels = ARRAY_SIZE(max1036_channels),
892 },
893 [max1037] = {
894 .bits = 8,
895 .int_vref_mv = 2048,
896 .mode_list = max1236_mode_list,
897 .num_modes = ARRAY_SIZE(max1236_mode_list),
898 .default_mode = s0to3,
899 .info = &max1238_info,
900 .channels = max1036_channels,
901 .num_channels = ARRAY_SIZE(max1036_channels),
902 },
903 [max1038] = {
904 .bits = 8,
905 .int_vref_mv = 4096,
906 .mode_list = max1238_mode_list,
907 .num_modes = ARRAY_SIZE(max1238_mode_list),
908 .default_mode = s0to11,
909 .info = &max1238_info,
910 .channels = max1038_channels,
911 .num_channels = ARRAY_SIZE(max1038_channels),
912 },
913 [max1039] = {
914 .bits = 8,
915 .int_vref_mv = 2048,
916 .mode_list = max1238_mode_list,
917 .num_modes = ARRAY_SIZE(max1238_mode_list),
918 .default_mode = s0to11,
919 .info = &max1238_info,
920 .channels = max1038_channels,
921 .num_channels = ARRAY_SIZE(max1038_channels),
922 },
923 [max1136] = {
924 .bits = 10,
925 .int_vref_mv = 4096,
926 .mode_list = max1236_mode_list,
927 .num_modes = ARRAY_SIZE(max1236_mode_list),
928 .default_mode = s0to3,
929 .info = &max1238_info,
930 .channels = max1136_channels,
931 .num_channels = ARRAY_SIZE(max1136_channels),
932 },
933 [max1137] = {
934 .bits = 10,
935 .int_vref_mv = 2048,
936 .mode_list = max1236_mode_list,
937 .num_modes = ARRAY_SIZE(max1236_mode_list),
938 .default_mode = s0to3,
939 .info = &max1238_info,
940 .channels = max1136_channels,
941 .num_channels = ARRAY_SIZE(max1136_channels),
942 },
943 [max1138] = {
944 .bits = 10,
945 .int_vref_mv = 4096,
946 .mode_list = max1238_mode_list,
947 .num_modes = ARRAY_SIZE(max1238_mode_list),
948 .default_mode = s0to11,
949 .info = &max1238_info,
950 .channels = max1138_channels,
951 .num_channels = ARRAY_SIZE(max1138_channels),
952 },
953 [max1139] = {
954 .bits = 10,
955 .int_vref_mv = 2048,
956 .mode_list = max1238_mode_list,
957 .num_modes = ARRAY_SIZE(max1238_mode_list),
958 .default_mode = s0to11,
959 .info = &max1238_info,
960 .channels = max1138_channels,
961 .num_channels = ARRAY_SIZE(max1138_channels),
962 },
963 [max1236] = {
964 .bits = 12,
965 .int_vref_mv = 4096,
966 .mode_list = max1236_mode_list,
967 .num_modes = ARRAY_SIZE(max1236_mode_list),
968 .default_mode = s0to3,
969 .info = &max1238_info,
970 .channels = max1236_channels,
971 .num_channels = ARRAY_SIZE(max1236_channels),
972 },
973 [max1237] = {
974 .bits = 12,
975 .int_vref_mv = 2048,
976 .mode_list = max1236_mode_list,
977 .num_modes = ARRAY_SIZE(max1236_mode_list),
978 .default_mode = s0to3,
979 .info = &max1238_info,
980 .channels = max1236_channels,
981 .num_channels = ARRAY_SIZE(max1236_channels),
982 },
983 [max1238] = {
984 .bits = 12,
985 .int_vref_mv = 4096,
986 .mode_list = max1238_mode_list,
987 .num_modes = ARRAY_SIZE(max1238_mode_list),
988 .default_mode = s0to11,
989 .info = &max1238_info,
990 .channels = max1238_channels,
991 .num_channels = ARRAY_SIZE(max1238_channels),
992 },
993 [max1239] = {
994 .bits = 12,
995 .int_vref_mv = 2048,
996 .mode_list = max1238_mode_list,
997 .num_modes = ARRAY_SIZE(max1238_mode_list),
998 .default_mode = s0to11,
999 .info = &max1238_info,
1000 .channels = max1238_channels,
1001 .num_channels = ARRAY_SIZE(max1238_channels),
1002 },
1003 [max11600] = {
1004 .bits = 8,
1005 .int_vref_mv = 4096,
1006 .mode_list = max11607_mode_list,
1007 .num_modes = ARRAY_SIZE(max11607_mode_list),
1008 .default_mode = s0to3,
1009 .info = &max1238_info,
1010 .channels = max1036_channels,
1011 .num_channels = ARRAY_SIZE(max1036_channels),
1012 },
1013 [max11601] = {
1014 .bits = 8,
1015 .int_vref_mv = 2048,
1016 .mode_list = max11607_mode_list,
1017 .num_modes = ARRAY_SIZE(max11607_mode_list),
1018 .default_mode = s0to3,
1019 .info = &max1238_info,
1020 .channels = max1036_channels,
1021 .num_channels = ARRAY_SIZE(max1036_channels),
1022 },
1023 [max11602] = {
1024 .bits = 8,
1025 .int_vref_mv = 4096,
1026 .mode_list = max11608_mode_list,
1027 .num_modes = ARRAY_SIZE(max11608_mode_list),
1028 .default_mode = s0to7,
1029 .info = &max1238_info,
1030 .channels = max11602_channels,
1031 .num_channels = ARRAY_SIZE(max11602_channels),
1032 },
1033 [max11603] = {
1034 .bits = 8,
1035 .int_vref_mv = 2048,
1036 .mode_list = max11608_mode_list,
1037 .num_modes = ARRAY_SIZE(max11608_mode_list),
1038 .default_mode = s0to7,
1039 .info = &max1238_info,
1040 .channels = max11602_channels,
1041 .num_channels = ARRAY_SIZE(max11602_channels),
1042 },
1043 [max11604] = {
1044 .bits = 8,
1045 .int_vref_mv = 4098,
1046 .mode_list = max1238_mode_list,
1047 .num_modes = ARRAY_SIZE(max1238_mode_list),
1048 .default_mode = s0to11,
1049 .info = &max1238_info,
1050 .channels = max1238_channels,
1051 .num_channels = ARRAY_SIZE(max1238_channels),
1052 },
1053 [max11605] = {
1054 .bits = 8,
1055 .int_vref_mv = 2048,
1056 .mode_list = max1238_mode_list,
1057 .num_modes = ARRAY_SIZE(max1238_mode_list),
1058 .default_mode = s0to11,
1059 .info = &max1238_info,
1060 .channels = max1238_channels,
1061 .num_channels = ARRAY_SIZE(max1238_channels),
1062 },
1063 [max11606] = {
1064 .bits = 10,
1065 .int_vref_mv = 4096,
1066 .mode_list = max11607_mode_list,
1067 .num_modes = ARRAY_SIZE(max11607_mode_list),
1068 .default_mode = s0to3,
1069 .info = &max1238_info,
1070 .channels = max1136_channels,
1071 .num_channels = ARRAY_SIZE(max1136_channels),
1072 },
1073 [max11607] = {
1074 .bits = 10,
1075 .int_vref_mv = 2048,
1076 .mode_list = max11607_mode_list,
1077 .num_modes = ARRAY_SIZE(max11607_mode_list),
1078 .default_mode = s0to3,
1079 .info = &max1238_info,
1080 .channels = max1136_channels,
1081 .num_channels = ARRAY_SIZE(max1136_channels),
1082 },
1083 [max11608] = {
1084 .bits = 10,
1085 .int_vref_mv = 4096,
1086 .mode_list = max11608_mode_list,
1087 .num_modes = ARRAY_SIZE(max11608_mode_list),
1088 .default_mode = s0to7,
1089 .info = &max1238_info,
1090 .channels = max11608_channels,
1091 .num_channels = ARRAY_SIZE(max11608_channels),
1092 },
1093 [max11609] = {
1094 .bits = 10,
1095 .int_vref_mv = 2048,
1096 .mode_list = max11608_mode_list,
1097 .num_modes = ARRAY_SIZE(max11608_mode_list),
1098 .default_mode = s0to7,
1099 .info = &max1238_info,
1100 .channels = max11608_channels,
1101 .num_channels = ARRAY_SIZE(max11608_channels),
1102 },
1103 [max11610] = {
1104 .bits = 10,
1105 .int_vref_mv = 4098,
1106 .mode_list = max1238_mode_list,
1107 .num_modes = ARRAY_SIZE(max1238_mode_list),
1108 .default_mode = s0to11,
1109 .info = &max1238_info,
1110 .channels = max1238_channels,
1111 .num_channels = ARRAY_SIZE(max1238_channels),
1112 },
1113 [max11611] = {
1114 .bits = 10,
1115 .int_vref_mv = 2048,
1116 .mode_list = max1238_mode_list,
1117 .num_modes = ARRAY_SIZE(max1238_mode_list),
1118 .default_mode = s0to11,
1119 .info = &max1238_info,
1120 .channels = max1238_channels,
1121 .num_channels = ARRAY_SIZE(max1238_channels),
1122 },
1123 [max11612] = {
1124 .bits = 12,
1125 .int_vref_mv = 4096,
1126 .mode_list = max11607_mode_list,
1127 .num_modes = ARRAY_SIZE(max11607_mode_list),
1128 .default_mode = s0to3,
1129 .info = &max1238_info,
1130 .channels = max1363_channels,
1131 .num_channels = ARRAY_SIZE(max1363_channels),
1132 },
1133 [max11613] = {
1134 .bits = 12,
1135 .int_vref_mv = 2048,
1136 .mode_list = max11607_mode_list,
1137 .num_modes = ARRAY_SIZE(max11607_mode_list),
1138 .default_mode = s0to3,
1139 .info = &max1238_info,
1140 .channels = max1363_channels,
1141 .num_channels = ARRAY_SIZE(max1363_channels),
1142 },
1143 [max11614] = {
1144 .bits = 12,
1145 .int_vref_mv = 4096,
1146 .mode_list = max11608_mode_list,
1147 .num_modes = ARRAY_SIZE(max11608_mode_list),
1148 .default_mode = s0to7,
1149 .info = &max1238_info,
1150 .channels = max11614_channels,
1151 .num_channels = ARRAY_SIZE(max11614_channels),
1152 },
1153 [max11615] = {
1154 .bits = 12,
1155 .int_vref_mv = 2048,
1156 .mode_list = max11608_mode_list,
1157 .num_modes = ARRAY_SIZE(max11608_mode_list),
1158 .default_mode = s0to7,
1159 .info = &max1238_info,
1160 .channels = max11614_channels,
1161 .num_channels = ARRAY_SIZE(max11614_channels),
1162 },
1163 [max11616] = {
1164 .bits = 12,
1165 .int_vref_mv = 4098,
1166 .mode_list = max1238_mode_list,
1167 .num_modes = ARRAY_SIZE(max1238_mode_list),
1168 .default_mode = s0to11,
1169 .info = &max1238_info,
1170 .channels = max1238_channels,
1171 .num_channels = ARRAY_SIZE(max1238_channels),
1172 },
1173 [max11617] = {
1174 .bits = 12,
1175 .int_vref_mv = 2048,
1176 .mode_list = max1238_mode_list,
1177 .num_modes = ARRAY_SIZE(max1238_mode_list),
1178 .default_mode = s0to11,
1179 .info = &max1238_info,
1180 .channels = max1238_channels,
1181 .num_channels = ARRAY_SIZE(max1238_channels),
1182 },
1183 [max11644] = {
1184 .bits = 12,
1185 .int_vref_mv = 2048,
1186 .mode_list = max11644_mode_list,
1187 .num_modes = ARRAY_SIZE(max11644_mode_list),
1188 .default_mode = s0to1,
1189 .info = &max1238_info,
1190 .channels = max11644_channels,
1191 .num_channels = ARRAY_SIZE(max11644_channels),
1192 },
1193 [max11645] = {
1194 .bits = 12,
1195 .int_vref_mv = 4096,
1196 .mode_list = max11644_mode_list,
1197 .num_modes = ARRAY_SIZE(max11644_mode_list),
1198 .default_mode = s0to1,
1199 .info = &max1238_info,
1200 .channels = max11644_channels,
1201 .num_channels = ARRAY_SIZE(max11644_channels),
1202 },
1203 [max11646] = {
1204 .bits = 10,
1205 .int_vref_mv = 2048,
1206 .mode_list = max11644_mode_list,
1207 .num_modes = ARRAY_SIZE(max11644_mode_list),
1208 .default_mode = s0to1,
1209 .info = &max1238_info,
1210 .channels = max11646_channels,
1211 .num_channels = ARRAY_SIZE(max11646_channels),
1212 },
1213 [max11647] = {
1214 .bits = 10,
1215 .int_vref_mv = 4096,
1216 .mode_list = max11644_mode_list,
1217 .num_modes = ARRAY_SIZE(max11644_mode_list),
1218 .default_mode = s0to1,
1219 .info = &max1238_info,
1220 .channels = max11646_channels,
1221 .num_channels = ARRAY_SIZE(max11646_channels),
1222 },
1223};
1224
1225
1226
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001227static int max1363_initial_setup(struct max1363_state *st)
1228{
1229 st->setupbyte = MAX1363_SETUP_AIN3_IS_AIN3_REF_IS_VDD
1230 | MAX1363_SETUP_POWER_UP_INT_REF
1231 | MAX1363_SETUP_INT_CLOCK
1232 | MAX1363_SETUP_UNIPOLAR
1233 | MAX1363_SETUP_NORESET;
1234
1235 /* Set scan mode writes the config anyway so wait until then*/
1236 st->setupbyte = MAX1363_SETUP_BYTE(st->setupbyte);
1237 st->current_mode = &max1363_mode_table[st->chip_info->default_mode];
1238 st->configbyte = MAX1363_CONFIG_BYTE(st->configbyte);
1239
1240 return max1363_set_scan_mode(st);
1241}
1242
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001243static int __devinit max1363_probe(struct i2c_client *client,
1244 const struct i2c_device_id *id)
1245{
Jonathan Cameron26d25ae2011-09-02 17:14:40 +01001246 int ret, i;
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001247 struct max1363_state *st;
1248 struct iio_dev *indio_dev;
1249 struct regulator *reg;
1250
1251 reg = regulator_get(&client->dev, "vcc");
Dan Carpenterf88af7e2011-06-08 09:42:21 +03001252 if (IS_ERR(reg)) {
1253 ret = PTR_ERR(reg);
1254 goto error_out;
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001255 }
1256
Dan Carpenterf88af7e2011-06-08 09:42:21 +03001257 ret = regulator_enable(reg);
1258 if (ret)
1259 goto error_put_reg;
1260
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001261 indio_dev = iio_allocate_device(sizeof(struct max1363_state));
1262 if (indio_dev == NULL) {
1263 ret = -ENOMEM;
1264 goto error_disable_reg;
1265 }
1266 st = iio_priv(indio_dev);
1267 st->reg = reg;
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001268 /* this is only used for device removal purposes */
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001269 i2c_set_clientdata(client, indio_dev);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001270
Jonathan Cameron962a4cc2010-06-26 12:54:13 +01001271 st->chip_info = &max1363_chip_info_tbl[id->driver_data];
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001272 st->client = client;
1273
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001274 indio_dev->available_scan_masks
Jonathan Cameron9c95e012011-10-14 14:46:59 +01001275 = kzalloc(BITS_TO_LONGS(MAX1363_MAX_CHANNELS)*sizeof(long)*
Greg Kroah-Hartmanf03de822010-05-04 22:26:19 -07001276 (st->chip_info->num_modes + 1), GFP_KERNEL);
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001277 if (!indio_dev->available_scan_masks) {
Jonathan Cameron82020b02010-05-04 14:43:03 +01001278 ret = -ENOMEM;
1279 goto error_free_device;
1280 }
1281
1282 for (i = 0; i < st->chip_info->num_modes; i++)
Jonathan Cameron32b5eec2011-09-02 17:14:38 +01001283 bitmap_copy(indio_dev->available_scan_masks +
1284 BITS_TO_LONGS(MAX1363_MAX_CHANNELS)*i,
1285 max1363_mode_table[st->chip_info->mode_list[i]]
1286 .modemask, MAX1363_MAX_CHANNELS);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001287 /* Estabilish that the iio_dev is a child of the i2c device */
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001288 indio_dev->dev.parent = &client->dev;
Jonathan Cameron845bd122011-05-18 14:41:44 +01001289 indio_dev->name = id->name;
Jonathan Cameron8e7d9672011-08-30 12:32:45 +01001290 indio_dev->channels = st->chip_info->channels;
1291 indio_dev->num_channels = st->chip_info->num_channels;
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001292 indio_dev->info = st->chip_info->info;
1293 indio_dev->modes = INDIO_DIRECT_MODE;
Jonathan Cameroncd038012011-08-12 16:55:29 +01001294 indio_dev->channels = st->chip_info->channels;
1295 indio_dev->num_channels = st->chip_info->num_channels;
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001296 ret = max1363_initial_setup(st);
Jonathan Cameron58f0a252011-05-18 14:42:38 +01001297 if (ret < 0)
Jonathan Cameron82020b02010-05-04 14:43:03 +01001298 goto error_free_available_scan_masks;
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001299
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001300 ret = max1363_register_ring_funcs_and_init(indio_dev);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001301 if (ret)
Jonathan Cameron82020b02010-05-04 14:43:03 +01001302 goto error_free_available_scan_masks;
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001303
Jonathan Cameron14555b12011-09-21 11:15:57 +01001304 ret = iio_buffer_register(indio_dev,
1305 st->chip_info->channels,
1306 st->chip_info->num_channels);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001307 if (ret)
1308 goto error_cleanup_ring;
Jonathan Cameron440a5202010-06-26 12:54:23 +01001309
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001310 if (client->irq) {
Jonathan Cameronaaf370d2011-05-18 14:41:16 +01001311 ret = request_threaded_irq(st->client->irq,
1312 NULL,
1313 &max1363_event_handler,
1314 IRQF_TRIGGER_RISING | IRQF_ONESHOT,
1315 "max1363_event",
1316 indio_dev);
Jonathan Cameron298cd972011-05-18 14:40:53 +01001317
Jonathan Cameron440a5202010-06-26 12:54:23 +01001318 if (ret)
1319 goto error_uninit_ring;
Jonathan Cameron440a5202010-06-26 12:54:23 +01001320 }
1321
Jonathan Cameron26d25ae2011-09-02 17:14:40 +01001322 ret = iio_device_register(indio_dev);
1323 if (ret < 0)
1324 goto error_free_irq;
Dan Carpenterf88af7e2011-06-08 09:42:21 +03001325
Jonathan Cameron26d25ae2011-09-02 17:14:40 +01001326 return 0;
1327error_free_irq:
1328 free_irq(st->client->irq, indio_dev);
Jonathan Cameron440a5202010-06-26 12:54:23 +01001329error_uninit_ring:
Jonathan Cameron14555b12011-09-21 11:15:57 +01001330 iio_buffer_unregister(indio_dev);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001331error_cleanup_ring:
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001332 max1363_ring_cleanup(indio_dev);
Jonathan Cameron82020b02010-05-04 14:43:03 +01001333error_free_available_scan_masks:
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001334 kfree(indio_dev->available_scan_masks);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001335error_free_device:
Jonathan Cameron26d25ae2011-09-02 17:14:40 +01001336 iio_free_device(indio_dev);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001337error_disable_reg:
Dan Carpenterf88af7e2011-06-08 09:42:21 +03001338 regulator_disable(reg);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001339error_put_reg:
Dan Carpenterf88af7e2011-06-08 09:42:21 +03001340 regulator_put(reg);
1341error_out:
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001342 return ret;
1343}
1344
1345static int max1363_remove(struct i2c_client *client)
1346{
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001347 struct iio_dev *indio_dev = i2c_get_clientdata(client);
1348 struct max1363_state *st = iio_priv(indio_dev);
1349 struct regulator *reg = st->reg;
Jonathan Cameron440a5202010-06-26 12:54:23 +01001350
Jonathan Camerond2fffd62011-10-14 14:46:58 +01001351 iio_device_unregister(indio_dev);
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001352 if (client->irq)
Jonathan Cameronaaf370d2011-05-18 14:41:16 +01001353 free_irq(st->client->irq, indio_dev);
Jonathan Cameron14555b12011-09-21 11:15:57 +01001354 iio_buffer_unregister(indio_dev);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001355 max1363_ring_cleanup(indio_dev);
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001356 kfree(indio_dev->available_scan_masks);
1357 if (!IS_ERR(reg)) {
1358 regulator_disable(reg);
1359 regulator_put(reg);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001360 }
Jonathan Camerond2fffd62011-10-14 14:46:58 +01001361 iio_free_device(indio_dev);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001362
1363 return 0;
1364}
1365
1366static const struct i2c_device_id max1363_id[] = {
1367 { "max1361", max1361 },
1368 { "max1362", max1362 },
1369 { "max1363", max1363 },
1370 { "max1364", max1364 },
Jonathan Cameron3bf877c2010-05-04 14:43:10 +01001371 { "max1036", max1036 },
1372 { "max1037", max1037 },
1373 { "max1038", max1038 },
1374 { "max1039", max1039 },
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001375 { "max1136", max1136 },
1376 { "max1137", max1137 },
1377 { "max1138", max1138 },
1378 { "max1139", max1139 },
1379 { "max1236", max1236 },
1380 { "max1237", max1237 },
1381 { "max1238", max1238 },
1382 { "max1239", max1239 },
Jonathan Cameron3bf877c2010-05-04 14:43:10 +01001383 { "max11600", max11600 },
1384 { "max11601", max11601 },
1385 { "max11602", max11602 },
1386 { "max11603", max11603 },
1387 { "max11604", max11604 },
1388 { "max11605", max11605 },
Jonathan Cameronc3fa0fd2010-05-04 14:43:09 +01001389 { "max11606", max11606 },
1390 { "max11607", max11607 },
1391 { "max11608", max11608 },
1392 { "max11609", max11609 },
1393 { "max11610", max11610 },
1394 { "max11611", max11611 },
1395 { "max11612", max11612 },
1396 { "max11613", max11613 },
1397 { "max11614", max11614 },
1398 { "max11615", max11615 },
1399 { "max11616", max11616 },
1400 { "max11617", max11617 },
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001401 {}
1402};
1403
1404MODULE_DEVICE_TABLE(i2c, max1363_id);
1405
1406static struct i2c_driver max1363_driver = {
1407 .driver = {
1408 .name = "max1363",
1409 },
1410 .probe = max1363_probe,
1411 .remove = max1363_remove,
1412 .id_table = max1363_id,
1413};
1414
1415static __init int max1363_init(void)
1416{
1417 return i2c_add_driver(&max1363_driver);
1418}
1419
1420static __exit void max1363_exit(void)
1421{
1422 i2c_del_driver(&max1363_driver);
1423}
1424
1425MODULE_AUTHOR("Jonathan Cameron <jic23@cam.ac.uk>");
1426MODULE_DESCRIPTION("Maxim 1363 ADC");
1427MODULE_LICENSE("GPL v2");
1428
1429module_init(max1363_init);
1430module_exit(max1363_exit);