blob: 3f28f1ab52a24995813b267470eee440e6a6852d [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 Cameron3811cd62011-09-21 11:15:56 +010037#include "../buffer_generic.h"
Jonathan Cameroncdf38702011-08-12 17:08:43 +010038
Jonathan Camerond1325cf2009-08-18 18:06:20 +010039#include "max1363.h"
40
Jonathan Cameron58f0a252011-05-18 14:42:38 +010041#define MAX1363_MODE_SINGLE(_num, _mask) { \
42 .conf = MAX1363_CHANNEL_SEL(_num) \
43 | MAX1363_CONFIG_SCAN_SINGLE_1 \
44 | MAX1363_CONFIG_SE, \
Jonathan Cameron32b5eec2011-09-02 17:14:38 +010045 .modemask[0] = _mask, \
Jonathan Cameron58f0a252011-05-18 14:42:38 +010046 }
47
48#define MAX1363_MODE_SCAN_TO_CHANNEL(_num, _mask) { \
49 .conf = MAX1363_CHANNEL_SEL(_num) \
50 | MAX1363_CONFIG_SCAN_TO_CS \
51 | MAX1363_CONFIG_SE, \
Jonathan Cameron32b5eec2011-09-02 17:14:38 +010052 .modemask[0] = _mask, \
Jonathan Cameron58f0a252011-05-18 14:42:38 +010053 }
54
55/* note not available for max1363 hence naming */
56#define MAX1236_MODE_SCAN_MID_TO_CHANNEL(_mid, _num, _mask) { \
57 .conf = MAX1363_CHANNEL_SEL(_num) \
58 | MAX1236_SCAN_MID_TO_CHANNEL \
59 | MAX1363_CONFIG_SE, \
Jonathan Cameron32b5eec2011-09-02 17:14:38 +010060 .modemask[0] = _mask \
Jonathan Cameron58f0a252011-05-18 14:42:38 +010061}
62
63#define MAX1363_MODE_DIFF_SINGLE(_nump, _numm, _mask) { \
64 .conf = MAX1363_CHANNEL_SEL(_nump) \
65 | MAX1363_CONFIG_SCAN_SINGLE_1 \
66 | MAX1363_CONFIG_DE, \
Jonathan Cameron32b5eec2011-09-02 17:14:38 +010067 .modemask[0] = _mask \
Jonathan Cameron58f0a252011-05-18 14:42:38 +010068 }
69
70/* Can't think how to automate naming so specify for now */
71#define MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(_num, _numvals, _mask) { \
72 .conf = MAX1363_CHANNEL_SEL(_num) \
73 | MAX1363_CONFIG_SCAN_TO_CS \
74 | MAX1363_CONFIG_DE, \
Jonathan Cameron32b5eec2011-09-02 17:14:38 +010075 .modemask[0] = _mask \
Jonathan Cameron58f0a252011-05-18 14:42:38 +010076 }
77
78/* note only available for max1363 hence naming */
79#define MAX1236_MODE_DIFF_SCAN_MID_TO_CHANNEL(_num, _numvals, _mask) { \
80 .conf = MAX1363_CHANNEL_SEL(_num) \
81 | MAX1236_SCAN_MID_TO_CHANNEL \
82 | MAX1363_CONFIG_SE, \
Jonathan Cameron32b5eec2011-09-02 17:14:38 +010083 .modemask[0] = _mask \
Jonathan Cameron58f0a252011-05-18 14:42:38 +010084}
Jonathan Camerond1325cf2009-08-18 18:06:20 +010085
Jonathan Cameron82020b02010-05-04 14:43:03 +010086static const struct max1363_mode max1363_mode_table[] = {
87 /* All of the single channel options first */
88 MAX1363_MODE_SINGLE(0, 1 << 0),
89 MAX1363_MODE_SINGLE(1, 1 << 1),
90 MAX1363_MODE_SINGLE(2, 1 << 2),
91 MAX1363_MODE_SINGLE(3, 1 << 3),
92 MAX1363_MODE_SINGLE(4, 1 << 4),
93 MAX1363_MODE_SINGLE(5, 1 << 5),
94 MAX1363_MODE_SINGLE(6, 1 << 6),
95 MAX1363_MODE_SINGLE(7, 1 << 7),
96 MAX1363_MODE_SINGLE(8, 1 << 8),
97 MAX1363_MODE_SINGLE(9, 1 << 9),
98 MAX1363_MODE_SINGLE(10, 1 << 10),
99 MAX1363_MODE_SINGLE(11, 1 << 11),
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100100
Jonathan Cameron82020b02010-05-04 14:43:03 +0100101 MAX1363_MODE_DIFF_SINGLE(0, 1, 1 << 12),
102 MAX1363_MODE_DIFF_SINGLE(2, 3, 1 << 13),
103 MAX1363_MODE_DIFF_SINGLE(4, 5, 1 << 14),
104 MAX1363_MODE_DIFF_SINGLE(6, 7, 1 << 15),
105 MAX1363_MODE_DIFF_SINGLE(8, 9, 1 << 16),
106 MAX1363_MODE_DIFF_SINGLE(10, 11, 1 << 17),
107 MAX1363_MODE_DIFF_SINGLE(1, 0, 1 << 18),
108 MAX1363_MODE_DIFF_SINGLE(3, 2, 1 << 19),
109 MAX1363_MODE_DIFF_SINGLE(5, 4, 1 << 20),
110 MAX1363_MODE_DIFF_SINGLE(7, 6, 1 << 21),
111 MAX1363_MODE_DIFF_SINGLE(9, 8, 1 << 22),
112 MAX1363_MODE_DIFF_SINGLE(11, 10, 1 << 23),
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100113
Jonathan Cameron82020b02010-05-04 14:43:03 +0100114 /* The multichannel scans next */
115 MAX1363_MODE_SCAN_TO_CHANNEL(1, 0x003),
116 MAX1363_MODE_SCAN_TO_CHANNEL(2, 0x007),
117 MAX1236_MODE_SCAN_MID_TO_CHANNEL(2, 3, 0x00C),
118 MAX1363_MODE_SCAN_TO_CHANNEL(3, 0x00F),
119 MAX1363_MODE_SCAN_TO_CHANNEL(4, 0x01F),
120 MAX1363_MODE_SCAN_TO_CHANNEL(5, 0x03F),
121 MAX1363_MODE_SCAN_TO_CHANNEL(6, 0x07F),
122 MAX1236_MODE_SCAN_MID_TO_CHANNEL(6, 7, 0x0C0),
123 MAX1363_MODE_SCAN_TO_CHANNEL(7, 0x0FF),
124 MAX1236_MODE_SCAN_MID_TO_CHANNEL(6, 8, 0x1C0),
125 MAX1363_MODE_SCAN_TO_CHANNEL(8, 0x1FF),
126 MAX1236_MODE_SCAN_MID_TO_CHANNEL(6, 9, 0x3C0),
127 MAX1363_MODE_SCAN_TO_CHANNEL(9, 0x3FF),
128 MAX1236_MODE_SCAN_MID_TO_CHANNEL(6, 10, 0x7C0),
129 MAX1363_MODE_SCAN_TO_CHANNEL(10, 0x7FF),
130 MAX1236_MODE_SCAN_MID_TO_CHANNEL(6, 11, 0xFC0),
131 MAX1363_MODE_SCAN_TO_CHANNEL(11, 0xFFF),
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100132
Jonathan Cameron82020b02010-05-04 14:43:03 +0100133 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(2, 2, 0x003000),
134 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(4, 3, 0x007000),
135 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(6, 4, 0x00F000),
136 MAX1236_MODE_DIFF_SCAN_MID_TO_CHANNEL(8, 2, 0x018000),
137 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(8, 5, 0x01F000),
138 MAX1236_MODE_DIFF_SCAN_MID_TO_CHANNEL(10, 3, 0x038000),
139 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(10, 6, 0x3F000),
140 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(3, 2, 0x0C0000),
141 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(5, 3, 0x1C0000),
142 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(7, 4, 0x3C0000),
143 MAX1236_MODE_DIFF_SCAN_MID_TO_CHANNEL(9, 2, 0x600000),
144 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(9, 5, 0x7C0000),
145 MAX1236_MODE_DIFF_SCAN_MID_TO_CHANNEL(11, 3, 0xE00000),
146 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(11, 6, 0xFC0000),
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100147};
148
Jonathan Cameron82020b02010-05-04 14:43:03 +0100149const struct max1363_mode
Jonathan Cameron32b5eec2011-09-02 17:14:38 +0100150*max1363_match_mode(unsigned long *mask, const struct max1363_chip_info *ci)
Greg Kroah-Hartman1b183e42010-05-04 22:24:05 -0700151{
Jonathan Cameron82020b02010-05-04 14:43:03 +0100152 int i;
153 if (mask)
154 for (i = 0; i < ci->num_modes; i++)
Jonathan Cameron32b5eec2011-09-02 17:14:38 +0100155 if (bitmap_subset(mask,
156 max1363_mode_table[ci->mode_list[i]].
157 modemask,
158 MAX1363_MAX_CHANNELS))
Greg Kroah-Hartman1b183e42010-05-04 22:24:05 -0700159 return &max1363_mode_table[ci->mode_list[i]];
160 return NULL;
Mike Frysingerc608cb02010-05-23 03:10:30 -0400161}
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100162
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100163static int max1363_write_basic_config(struct i2c_client *client,
164 unsigned char d1,
165 unsigned char d2)
166{
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100167 u8 tx_buf[2] = {d1, d2};
Jonathan Cameron82020b02010-05-04 14:43:03 +0100168
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100169 return i2c_master_send(client, tx_buf, 2);
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100170}
171
Jonathan Cameron82020b02010-05-04 14:43:03 +0100172int max1363_set_scan_mode(struct max1363_state *st)
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100173{
174 st->configbyte &= ~(MAX1363_CHANNEL_SEL_MASK
175 | MAX1363_SCAN_MASK
176 | MAX1363_SE_DE_MASK);
177 st->configbyte |= st->current_mode->conf;
178
179 return max1363_write_basic_config(st->client,
180 st->setupbyte,
181 st->configbyte);
182}
183
Jonathan Cameron298cd972011-05-18 14:40:53 +0100184static int max1363_read_single_chan(struct iio_dev *indio_dev,
185 struct iio_chan_spec const *chan,
186 int *val,
187 long m)
Jonathan Cameron82020b02010-05-04 14:43:03 +0100188{
Jonathan Cameron298cd972011-05-18 14:40:53 +0100189 int ret = 0;
190 s32 data;
Jonathan Cameron82020b02010-05-04 14:43:03 +0100191 char rxbuf[2];
Jonathan Cameron32b5eec2011-09-02 17:14:38 +0100192 const unsigned long *mask;
Jonathan Cameron298cd972011-05-18 14:40:53 +0100193 struct max1363_state *st = iio_priv(indio_dev);
194 struct i2c_client *client = st->client;
Jonathan Cameron82020b02010-05-04 14:43:03 +0100195
Jonathan Cameronb6b70682011-04-15 18:55:58 +0100196 mutex_lock(&indio_dev->mlock);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100197 /*
198 * If monitor mode is enabled, the method for reading a single
199 * channel will have to be rather different and has not yet
200 * been implemented.
201 */
202 if (st->monitor_on) {
203 ret = -EBUSY;
204 goto error_ret;
205 }
206
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300207 /* If ring buffer capture is occurring, query the buffer */
Jonathan Cameron14555b12011-09-21 11:15:57 +0100208 if (iio_buffer_enabled(indio_dev)) {
Jonathan Cameron298cd972011-05-18 14:40:53 +0100209 mask = max1363_mode_table[chan->address].modemask;
Jonathan Cameron82020b02010-05-04 14:43:03 +0100210 data = max1363_single_channel_from_ring(mask, st);
211 if (data < 0) {
212 ret = data;
213 goto error_ret;
214 }
215 } else {
216 /* Check to see if current scan mode is correct */
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100217 if (st->current_mode != &max1363_mode_table[chan->address]) {
Jonathan Cameron82020b02010-05-04 14:43:03 +0100218 /* Update scan mode if needed */
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100219 st->current_mode = &max1363_mode_table[chan->address];
Jonathan Cameron82020b02010-05-04 14:43:03 +0100220 ret = max1363_set_scan_mode(st);
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100221 if (ret < 0)
Jonathan Cameron82020b02010-05-04 14:43:03 +0100222 goto error_ret;
223 }
Jonathan Cameron3bf877c2010-05-04 14:43:10 +0100224 if (st->chip_info->bits != 8) {
225 /* Get reading */
226 data = i2c_master_recv(client, rxbuf, 2);
227 if (data < 0) {
228 ret = data;
229 goto error_ret;
230 }
Jonathan Cameron3bf877c2010-05-04 14:43:10 +0100231 data = (s32)(rxbuf[1]) | ((s32)(rxbuf[0] & 0x0F)) << 8;
232 } else {
233 /* Get reading */
234 data = i2c_master_recv(client, rxbuf, 1);
235 if (data < 0) {
236 ret = data;
237 goto error_ret;
238 }
239 data = rxbuf[0];
Jonathan Cameron82020b02010-05-04 14:43:03 +0100240 }
Jonathan Cameron82020b02010-05-04 14:43:03 +0100241 }
Jonathan Cameron298cd972011-05-18 14:40:53 +0100242 *val = data;
Jonathan Cameron82020b02010-05-04 14:43:03 +0100243error_ret:
Jonathan Cameronb6b70682011-04-15 18:55:58 +0100244 mutex_unlock(&indio_dev->mlock);
Jonathan Cameron298cd972011-05-18 14:40:53 +0100245 return ret;
246
Jonathan Cameron82020b02010-05-04 14:43:03 +0100247}
248
Jonathan Cameron298cd972011-05-18 14:40:53 +0100249static int max1363_read_raw(struct iio_dev *indio_dev,
250 struct iio_chan_spec const *chan,
251 int *val,
252 int *val2,
253 long m)
Jonathan Cameron82020b02010-05-04 14:43:03 +0100254{
Jonathan Cameron298cd972011-05-18 14:40:53 +0100255 struct max1363_state *st = iio_priv(indio_dev);
256 int ret;
257 switch (m) {
258 case 0:
259 ret = max1363_read_single_chan(indio_dev, chan, val, m);
Jonathan Cameroncd038012011-08-12 16:55:29 +0100260 if (ret < 0)
Jonathan Cameron298cd972011-05-18 14:40:53 +0100261 return ret;
262 return IIO_VAL_INT;
263 case (1 << IIO_CHAN_INFO_SCALE_SHARED):
264 if ((1 << (st->chip_info->bits + 1)) >
265 st->chip_info->int_vref_mv) {
266 *val = 0;
267 *val2 = 500000;
268 return IIO_VAL_INT_PLUS_MICRO;
269 } else {
270 *val = (st->chip_info->int_vref_mv)
271 >> st->chip_info->bits;
272 return IIO_VAL_INT;
273 }
274 default:
275 return -EINVAL;
276 }
277 return 0;
Jonathan Cameron82020b02010-05-04 14:43:03 +0100278}
279
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100280/* Applies to max1363 */
281static const enum max1363_modes max1363_mode_list[] = {
282 _s0, _s1, _s2, _s3,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100283 s0to1, s0to2, s0to3,
284 d0m1, d2m3, d1m0, d3m2,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100285 d0m1to2m3, d1m0to3m2,
286};
287
Jonathan Cameron298cd972011-05-18 14:40:53 +0100288#define MAX1363_EV_M \
289 (IIO_EV_BIT(IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING) \
290 | IIO_EV_BIT(IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING))
291#define MAX1363_INFO_MASK (1 << IIO_CHAN_INFO_SCALE_SHARED)
Jonathan Cameronade7ef72011-09-02 17:14:45 +0100292#define MAX1363_CHAN_U(num, addr, si, bits, evmask) \
293 { \
294 .type = IIO_VOLTAGE, \
295 .indexed = 1, \
296 .channel = num, \
297 .address = addr, \
298 .info_mask = MAX1363_INFO_MASK, \
299 .scan_type = IIO_ST('u', bits, (bits > 8) ? 16 : 8, 0), \
300 .scan_index = si, \
301 .event_mask = evmask, \
Jonathan Cameron298cd972011-05-18 14:40:53 +0100302 }
303
Jonathan Cameronade7ef72011-09-02 17:14:45 +0100304/* bipolar channel */
305#define MAX1363_CHAN_B(num, num2, addr, si, bits, evmask) \
306 { \
307 .type = IIO_VOLTAGE, \
308 .differential = 1, \
309 .indexed = 1, \
310 .channel = num, \
311 .channel2 = num2, \
312 .address = addr, \
313 .info_mask = MAX1363_INFO_MASK, \
314 .scan_type = IIO_ST('u', bits, (bits > 8) ? 16 : 8, 0), \
315 .scan_index = si, \
316 .event_mask = evmask, \
317 }
318
319#define MAX1363_4X_CHANS(bits, em) { \
320 MAX1363_CHAN_U(0, _s0, 0, bits, em), \
321 MAX1363_CHAN_U(1, _s1, 1, bits, em), \
322 MAX1363_CHAN_U(2, _s2, 2, bits, em), \
323 MAX1363_CHAN_U(3, _s3, 3, bits, em), \
324 MAX1363_CHAN_B(0, 1, d0m1, 4, bits, em), \
325 MAX1363_CHAN_B(2, 3, d2m3, 5, bits, em), \
326 MAX1363_CHAN_B(1, 0, d1m0, 6, bits, em), \
327 MAX1363_CHAN_B(3, 2, d3m2, 7, bits, em), \
328 IIO_CHAN_SOFT_TIMESTAMP(8) \
329 }
330
331static struct iio_chan_spec max1036_channels[] = MAX1363_4X_CHANS(8, 0);
332static struct iio_chan_spec max1136_channels[] = MAX1363_4X_CHANS(10, 0);
333static struct iio_chan_spec max1236_channels[] = MAX1363_4X_CHANS(12, 0);
334static struct iio_chan_spec max1361_channels[] =
335 MAX1363_4X_CHANS(10, MAX1363_EV_M);
336static struct iio_chan_spec max1363_channels[] =
337 MAX1363_4X_CHANS(12, MAX1363_EV_M);
Jonathan Cameron298cd972011-05-18 14:40:53 +0100338
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100339/* Appies to max1236, max1237 */
340static const enum max1363_modes max1236_mode_list[] = {
341 _s0, _s1, _s2, _s3,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100342 s0to1, s0to2, s0to3,
343 d0m1, d2m3, d1m0, d3m2,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100344 d0m1to2m3, d1m0to3m2,
345 s2to3,
346};
347
348/* Applies to max1238, max1239 */
349static const enum max1363_modes max1238_mode_list[] = {
350 _s0, _s1, _s2, _s3, _s4, _s5, _s6, _s7, _s8, _s9, _s10, _s11,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100351 s0to1, s0to2, s0to3, s0to4, s0to5, s0to6,
352 s0to7, s0to8, s0to9, s0to10, s0to11,
353 d0m1, d2m3, d4m5, d6m7, d8m9, d10m11,
354 d1m0, d3m2, d5m4, d7m6, d9m8, d11m10,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100355 d0m1to2m3, d0m1to4m5, d0m1to6m7, d0m1to8m9, d0m1to10m11,
356 d1m0to3m2, d1m0to5m4, d1m0to7m6, d1m0to9m8, d1m0to11m10,
357 s6to7, s6to8, s6to9, s6to10, s6to11,
Jonathan Cameron82020b02010-05-04 14:43:03 +0100358 d6m7to8m9, d6m7to10m11, d7m6to9m8, d7m6to11m10,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100359};
360
Jonathan Cameron298cd972011-05-18 14:40:53 +0100361#define MAX1363_12X_CHANS(bits) { \
Jonathan Cameronade7ef72011-09-02 17:14:45 +0100362 MAX1363_CHAN_U(0, _s0, 0, bits, 0), \
363 MAX1363_CHAN_U(1, _s1, 1, bits, 0), \
364 MAX1363_CHAN_U(2, _s2, 2, bits, 0), \
365 MAX1363_CHAN_U(3, _s3, 3, bits, 0), \
366 MAX1363_CHAN_U(4, _s4, 4, bits, 0), \
367 MAX1363_CHAN_U(5, _s5, 5, bits, 0), \
368 MAX1363_CHAN_U(6, _s6, 6, bits, 0), \
369 MAX1363_CHAN_U(7, _s7, 7, bits, 0), \
370 MAX1363_CHAN_U(8, _s8, 8, bits, 0), \
371 MAX1363_CHAN_U(9, _s9, 9, bits, 0), \
372 MAX1363_CHAN_U(10, _s10, 10, bits, 0), \
373 MAX1363_CHAN_U(11, _s11, 11, bits, 0), \
374 MAX1363_CHAN_B(0, 1, d0m1, 12, bits, 0), \
375 MAX1363_CHAN_B(2, 3, d2m3, 13, bits, 0), \
376 MAX1363_CHAN_B(4, 5, d4m5, 14, bits, 0), \
377 MAX1363_CHAN_B(6, 7, d6m7, 15, bits, 0), \
378 MAX1363_CHAN_B(8, 9, d8m9, 16, bits, 0), \
379 MAX1363_CHAN_B(10, 11, d10m11, 17, bits, 0), \
380 MAX1363_CHAN_B(1, 0, d1m0, 18, bits, 0), \
381 MAX1363_CHAN_B(3, 2, d3m2, 19, bits, 0), \
382 MAX1363_CHAN_B(5, 4, d5m4, 20, bits, 0), \
383 MAX1363_CHAN_B(7, 6, d7m6, 21, bits, 0), \
384 MAX1363_CHAN_B(9, 8, d9m8, 22, bits, 0), \
385 MAX1363_CHAN_B(11, 10, d11m10, 23, bits, 0), \
Jonathan Cameron298cd972011-05-18 14:40:53 +0100386 IIO_CHAN_SOFT_TIMESTAMP(24) \
387 }
388static struct iio_chan_spec max1038_channels[] = MAX1363_12X_CHANS(8);
389static struct iio_chan_spec max1138_channels[] = MAX1363_12X_CHANS(10);
390static struct iio_chan_spec max1238_channels[] = MAX1363_12X_CHANS(12);
Jonathan Cameronc3fa0fdd2010-05-04 14:43:09 +0100391
392static const enum max1363_modes max11607_mode_list[] = {
393 _s0, _s1, _s2, _s3,
394 s0to1, s0to2, s0to3,
395 s2to3,
396 d0m1, d2m3, d1m0, d3m2,
397 d0m1to2m3, d1m0to3m2,
398};
399
400static const enum max1363_modes max11608_mode_list[] = {
401 _s0, _s1, _s2, _s3, _s4, _s5, _s6, _s7,
402 s0to1, s0to2, s0to3, s0to4, s0to5, s0to6, s0to7,
403 s6to7,
404 d0m1, d2m3, d4m5, d6m7,
405 d1m0, d3m2, d5m4, d7m6,
406 d0m1to2m3, d0m1to4m5, d0m1to6m7,
407 d1m0to3m2, d1m0to5m4, d1m0to7m6,
408};
409
Jonathan Cameronade7ef72011-09-02 17:14:45 +0100410#define MAX1363_8X_CHANS(bits) { \
411 MAX1363_CHAN_U(0, _s0, 0, bits, 0), \
412 MAX1363_CHAN_U(1, _s1, 1, bits, 0), \
413 MAX1363_CHAN_U(2, _s2, 2, bits, 0), \
414 MAX1363_CHAN_U(3, _s3, 3, bits, 0), \
415 MAX1363_CHAN_U(4, _s4, 4, bits, 0), \
416 MAX1363_CHAN_U(5, _s5, 5, bits, 0), \
417 MAX1363_CHAN_U(6, _s6, 6, bits, 0), \
418 MAX1363_CHAN_U(7, _s7, 7, bits, 0), \
419 MAX1363_CHAN_B(0, 1, d0m1, 8, bits, 0), \
420 MAX1363_CHAN_B(2, 3, d2m3, 9, bits, 0), \
421 MAX1363_CHAN_B(4, 5, d4m5, 10, bits, 0), \
422 MAX1363_CHAN_B(6, 7, d6m7, 11, bits, 0), \
423 MAX1363_CHAN_B(1, 0, d1m0, 12, bits, 0), \
424 MAX1363_CHAN_B(3, 2, d3m2, 13, bits, 0), \
425 MAX1363_CHAN_B(5, 4, d5m4, 14, bits, 0), \
426 MAX1363_CHAN_B(7, 6, d7m6, 15, bits, 0), \
427 IIO_CHAN_SOFT_TIMESTAMP(16) \
428}
Jonathan Cameron298cd972011-05-18 14:40:53 +0100429static struct iio_chan_spec max11602_channels[] = MAX1363_8X_CHANS(8);
430static struct iio_chan_spec max11608_channels[] = MAX1363_8X_CHANS(10);
431static struct iio_chan_spec max11614_channels[] = MAX1363_8X_CHANS(12);
Jonathan Cameronc3fa0fdd2010-05-04 14:43:09 +0100432
Jonathan Cameron586d1522011-05-18 14:42:10 +0100433static const enum max1363_modes max11644_mode_list[] = {
434 _s0, _s1, s0to1, d0m1, d1m0,
435};
436
437#define MAX1363_2X_CHANS(bits) { \
Jonathan Cameronade7ef72011-09-02 17:14:45 +0100438 MAX1363_CHAN_U(0, _s0, 0, bits, 0), \
439 MAX1363_CHAN_U(1, _s1, 1, bits, 0), \
440 MAX1363_CHAN_B(0, 1, d0m1, 2, bits, 0), \
441 MAX1363_CHAN_B(1, 0, d1m0, 3, bits, 0), \
Jonathan Cameron586d1522011-05-18 14:42:10 +0100442 IIO_CHAN_SOFT_TIMESTAMP(4) \
443 }
444
445static struct iio_chan_spec max11646_channels[] = MAX1363_2X_CHANS(10);
446static struct iio_chan_spec max11644_channels[] = MAX1363_2X_CHANS(12);
447
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100448enum { max1361,
449 max1362,
450 max1363,
451 max1364,
Jonathan Cameron3bf877c2010-05-04 14:43:10 +0100452 max1036,
453 max1037,
454 max1038,
455 max1039,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100456 max1136,
457 max1137,
458 max1138,
459 max1139,
460 max1236,
461 max1237,
462 max1238,
463 max1239,
Jonathan Cameron3bf877c2010-05-04 14:43:10 +0100464 max11600,
465 max11601,
466 max11602,
467 max11603,
468 max11604,
469 max11605,
Jonathan Cameronc3fa0fdd2010-05-04 14:43:09 +0100470 max11606,
471 max11607,
472 max11608,
473 max11609,
474 max11610,
475 max11611,
476 max11612,
477 max11613,
478 max11614,
479 max11615,
480 max11616,
481 max11617,
Jonathan Cameron586d1522011-05-18 14:42:10 +0100482 max11644,
483 max11645,
484 max11646,
485 max11647
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100486};
487
Jonathan Cameron440a5202010-06-26 12:54:23 +0100488static const int max1363_monitor_speeds[] = { 133000, 665000, 33300, 16600,
489 8300, 4200, 2000, 1000 };
490
491static ssize_t max1363_monitor_show_freq(struct device *dev,
492 struct device_attribute *attr,
493 char *buf)
494{
Jonathan Cameron3dba81b2011-04-15 18:55:59 +0100495 struct max1363_state *st = iio_priv(dev_get_drvdata(dev));
Jonathan Cameron440a5202010-06-26 12:54:23 +0100496 return sprintf(buf, "%d\n", max1363_monitor_speeds[st->monitor_speed]);
497}
498
499static ssize_t max1363_monitor_store_freq(struct device *dev,
500 struct device_attribute *attr,
501 const char *buf,
502 size_t len)
503{
Jonathan Cameronb6b70682011-04-15 18:55:58 +0100504 struct iio_dev *indio_dev = dev_get_drvdata(dev);
Jonathan Cameron3dba81b2011-04-15 18:55:59 +0100505 struct max1363_state *st = iio_priv(indio_dev);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100506 int i, ret;
507 unsigned long val;
508 bool found = false;
509
510 ret = strict_strtoul(buf, 10, &val);
511 if (ret)
512 return -EINVAL;
513 for (i = 0; i < ARRAY_SIZE(max1363_monitor_speeds); i++)
514 if (val == max1363_monitor_speeds[i]) {
515 found = true;
516 break;
517 }
518 if (!found)
519 return -EINVAL;
520
Jonathan Cameronb6b70682011-04-15 18:55:58 +0100521 mutex_lock(&indio_dev->mlock);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100522 st->monitor_speed = i;
Jonathan Cameronb6b70682011-04-15 18:55:58 +0100523 mutex_unlock(&indio_dev->mlock);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100524
525 return 0;
526}
527
528static IIO_DEV_ATTR_SAMP_FREQ(S_IRUGO | S_IWUSR,
529 max1363_monitor_show_freq,
530 max1363_monitor_store_freq);
531
532static IIO_CONST_ATTR(sampling_frequency_available,
533 "133000 665000 33300 16600 8300 4200 2000 1000");
534
Jonathan Cameron298cd972011-05-18 14:40:53 +0100535static int max1363_read_thresh(struct iio_dev *indio_dev,
Jonathan Cameron330c6c52011-09-02 17:14:39 +0100536 u64 event_code,
Jonathan Cameron298cd972011-05-18 14:40:53 +0100537 int *val)
Jonathan Cameron440a5202010-06-26 12:54:23 +0100538{
Jonathan Cameron3dba81b2011-04-15 18:55:59 +0100539 struct max1363_state *st = iio_priv(indio_dev);
Jonathan Cameron298cd972011-05-18 14:40:53 +0100540 if (IIO_EVENT_CODE_EXTRACT_DIR(event_code) == IIO_EV_DIR_FALLING)
541 *val = st->thresh_low[IIO_EVENT_CODE_EXTRACT_NUM(event_code)];
Jonathan Cameron440a5202010-06-26 12:54:23 +0100542 else
Jonathan Cameron298cd972011-05-18 14:40:53 +0100543 *val = st->thresh_high[IIO_EVENT_CODE_EXTRACT_NUM(event_code)];
544 return 0;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100545}
546
Jonathan Cameron298cd972011-05-18 14:40:53 +0100547static int max1363_write_thresh(struct iio_dev *indio_dev,
Jonathan Cameron330c6c52011-09-02 17:14:39 +0100548 u64 event_code,
Jonathan Cameron298cd972011-05-18 14:40:53 +0100549 int val)
Jonathan Cameron440a5202010-06-26 12:54:23 +0100550{
Jonathan Cameron298cd972011-05-18 14:40:53 +0100551 struct max1363_state *st = iio_priv(indio_dev);
552 /* make it handle signed correctly as well */
Jonathan Cameron440a5202010-06-26 12:54:23 +0100553 switch (st->chip_info->bits) {
554 case 10:
555 if (val > 0x3FF)
556 return -EINVAL;
557 break;
558 case 12:
559 if (val > 0xFFF)
560 return -EINVAL;
561 break;
562 }
563
Jonathan Cameron298cd972011-05-18 14:40:53 +0100564 switch (IIO_EVENT_CODE_EXTRACT_DIR(event_code)) {
565 case IIO_EV_DIR_FALLING:
566 st->thresh_low[IIO_EVENT_CODE_EXTRACT_NUM(event_code)] = val;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100567 break;
Jonathan Cameron298cd972011-05-18 14:40:53 +0100568 case IIO_EV_DIR_RISING:
569 st->thresh_high[IIO_EVENT_CODE_EXTRACT_NUM(event_code)] = val;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100570 break;
571 }
572
Jonathan Cameron440a5202010-06-26 12:54:23 +0100573 return 0;
574}
575
Jonathan Cameron330c6c52011-09-02 17:14:39 +0100576static const u64 max1363_event_codes[] = {
Jonathan Cameron6835cb62011-09-27 09:56:41 +0100577 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 0,
578 IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING),
579 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 1,
580 IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING),
581 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 2,
582 IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING),
583 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 3,
584 IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING),
585 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 0,
586 IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING),
587 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 1,
588 IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING),
589 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 2,
590 IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING),
591 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 3,
592 IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING),
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100593};
594
Jonathan Cameronaaf370d2011-05-18 14:41:16 +0100595static irqreturn_t max1363_event_handler(int irq, void *private)
Jonathan Cameron440a5202010-06-26 12:54:23 +0100596{
Jonathan Cameronaaf370d2011-05-18 14:41:16 +0100597 struct iio_dev *indio_dev = private;
598 struct max1363_state *st = iio_priv(indio_dev);
599 s64 timestamp = iio_get_time_ns();
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100600 unsigned long mask, loc;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100601 u8 rx;
602 u8 tx[2] = { st->setupbyte,
603 MAX1363_MON_INT_ENABLE | (st->monitor_speed << 1) | 0xF0 };
604
605 i2c_master_recv(st->client, &rx, 1);
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100606 mask = rx;
607 for_each_set_bit(loc, &mask, 8)
Jonathan Cameron5aa96182011-08-30 12:41:06 +0100608 iio_push_event(indio_dev, max1363_event_codes[loc], timestamp);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100609 i2c_master_send(st->client, tx, 2);
Jonathan Cameronaaf370d2011-05-18 14:41:16 +0100610
611 return IRQ_HANDLED;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100612}
613
Jonathan Cameron298cd972011-05-18 14:40:53 +0100614static int max1363_read_event_config(struct iio_dev *indio_dev,
Jonathan Cameron330c6c52011-09-02 17:14:39 +0100615 u64 event_code)
Jonathan Cameron440a5202010-06-26 12:54:23 +0100616{
Jonathan Cameron3dba81b2011-04-15 18:55:59 +0100617 struct max1363_state *st = iio_priv(indio_dev);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100618
Jonathan Cameron298cd972011-05-18 14:40:53 +0100619 int val;
620 int number = IIO_EVENT_CODE_EXTRACT_NUM(event_code);
Jonathan Cameronb6b70682011-04-15 18:55:58 +0100621 mutex_lock(&indio_dev->mlock);
Jonathan Cameron298cd972011-05-18 14:40:53 +0100622 if (IIO_EVENT_CODE_EXTRACT_DIR(event_code) == IIO_EV_DIR_FALLING)
623 val = (1 << number) & st->mask_low;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100624 else
Jonathan Cameron298cd972011-05-18 14:40:53 +0100625 val = (1 << number) & st->mask_high;
Jonathan Cameronb6b70682011-04-15 18:55:58 +0100626 mutex_unlock(&indio_dev->mlock);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100627
Jonathan Cameron298cd972011-05-18 14:40:53 +0100628 return val;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100629}
630
631static int max1363_monitor_mode_update(struct max1363_state *st, int enabled)
632{
633 u8 *tx_buf;
634 int ret, i = 3, j;
635 unsigned long numelements;
636 int len;
Jonathan Cameron32b5eec2011-09-02 17:14:38 +0100637 const long *modemask;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100638
639 if (!enabled) {
640 /* transition to ring capture is not currently supported */
641 st->setupbyte &= ~MAX1363_SETUP_MONITOR_SETUP;
642 st->configbyte &= ~MAX1363_SCAN_MASK;
643 st->monitor_on = false;
644 return max1363_write_basic_config(st->client,
645 st->setupbyte,
646 st->configbyte);
647 }
648
649 /* Ensure we are in the relevant mode */
650 st->setupbyte |= MAX1363_SETUP_MONITOR_SETUP;
651 st->configbyte &= ~(MAX1363_CHANNEL_SEL_MASK
652 | MAX1363_SCAN_MASK
653 | MAX1363_SE_DE_MASK);
654 st->configbyte |= MAX1363_CONFIG_SCAN_MONITOR_MODE;
655 if ((st->mask_low | st->mask_high) & 0x0F) {
656 st->configbyte |= max1363_mode_table[s0to3].conf;
657 modemask = max1363_mode_table[s0to3].modemask;
658 } else if ((st->mask_low | st->mask_high) & 0x30) {
659 st->configbyte |= max1363_mode_table[d0m1to2m3].conf;
660 modemask = max1363_mode_table[d0m1to2m3].modemask;
661 } else {
662 st->configbyte |= max1363_mode_table[d1m0to3m2].conf;
663 modemask = max1363_mode_table[d1m0to3m2].modemask;
664 }
Jonathan Cameron32b5eec2011-09-02 17:14:38 +0100665 numelements = bitmap_weight(modemask, MAX1363_MAX_CHANNELS);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100666 len = 3 * numelements + 3;
667 tx_buf = kmalloc(len, GFP_KERNEL);
668 if (!tx_buf) {
669 ret = -ENOMEM;
670 goto error_ret;
671 }
672 tx_buf[0] = st->configbyte;
673 tx_buf[1] = st->setupbyte;
674 tx_buf[2] = (st->monitor_speed << 1);
675
676 /*
677 * So we need to do yet another bit of nefarious scan mode
678 * setup to match what we need.
679 */
680 for (j = 0; j < 8; j++)
Jonathan Cameron32b5eec2011-09-02 17:14:38 +0100681 if (test_bit(j, modemask)) {
Jonathan Cameron440a5202010-06-26 12:54:23 +0100682 /* Establish the mode is in the scan */
683 if (st->mask_low & (1 << j)) {
684 tx_buf[i] = (st->thresh_low[j] >> 4) & 0xFF;
685 tx_buf[i + 1] = (st->thresh_low[j] << 4) & 0xF0;
686 } else if (j < 4) {
687 tx_buf[i] = 0;
688 tx_buf[i + 1] = 0;
689 } else {
690 tx_buf[i] = 0x80;
691 tx_buf[i + 1] = 0;
692 }
693 if (st->mask_high & (1 << j)) {
694 tx_buf[i + 1] |=
695 (st->thresh_high[j] >> 8) & 0x0F;
696 tx_buf[i + 2] = st->thresh_high[j] & 0xFF;
697 } else if (j < 4) {
698 tx_buf[i + 1] |= 0x0F;
699 tx_buf[i + 2] = 0xFF;
700 } else {
701 tx_buf[i + 1] |= 0x07;
702 tx_buf[i + 2] = 0xFF;
703 }
704 i += 3;
705 }
706
707
708 ret = i2c_master_send(st->client, tx_buf, len);
709 if (ret < 0)
710 goto error_ret;
711 if (ret != len) {
712 ret = -EIO;
713 goto error_ret;
714 }
715
716 /*
717 * Now that we hopefully have sensible thresholds in place it is
718 * time to turn the interrupts on.
719 * It is unclear from the data sheet if this should be necessary
720 * (i.e. whether monitor mode setup is atomic) but it appears to
721 * be in practice.
722 */
723 tx_buf[0] = st->setupbyte;
724 tx_buf[1] = MAX1363_MON_INT_ENABLE | (st->monitor_speed << 1) | 0xF0;
725 ret = i2c_master_send(st->client, tx_buf, 2);
726 if (ret < 0)
727 goto error_ret;
728 if (ret != 2) {
729 ret = -EIO;
730 goto error_ret;
731 }
732 ret = 0;
733 st->monitor_on = true;
734error_ret:
735
736 kfree(tx_buf);
737
738 return ret;
739}
740
741/*
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300742 * To keep this manageable we always use one of 3 scan modes.
Jonathan Cameron440a5202010-06-26 12:54:23 +0100743 * Scan 0...3, 0-1,2-3 and 1-0,3-2
744 */
Jonathan Cameron298cd972011-05-18 14:40:53 +0100745
Jonathan Cameron440a5202010-06-26 12:54:23 +0100746static inline int __max1363_check_event_mask(int thismask, int checkmask)
747{
748 int ret = 0;
749 /* Is it unipolar */
750 if (thismask < 4) {
751 if (checkmask & ~0x0F) {
752 ret = -EBUSY;
753 goto error_ret;
754 }
755 } else if (thismask < 6) {
756 if (checkmask & ~0x30) {
757 ret = -EBUSY;
758 goto error_ret;
759 }
760 } else if (checkmask & ~0xC0)
761 ret = -EBUSY;
762error_ret:
763 return ret;
764}
765
Jonathan Cameron298cd972011-05-18 14:40:53 +0100766static int max1363_write_event_config(struct iio_dev *indio_dev,
Jonathan Cameron330c6c52011-09-02 17:14:39 +0100767 u64 event_code,
Jonathan Cameron298cd972011-05-18 14:40:53 +0100768 int state)
Jonathan Cameron440a5202010-06-26 12:54:23 +0100769{
Jonathan Cameron298cd972011-05-18 14:40:53 +0100770 int ret = 0;
Jonathan Cameron3dba81b2011-04-15 18:55:59 +0100771 struct max1363_state *st = iio_priv(indio_dev);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100772 u16 unifiedmask;
Jonathan Cameron298cd972011-05-18 14:40:53 +0100773 int number = IIO_EVENT_CODE_EXTRACT_NUM(event_code);
774
Jonathan Cameron3dba81b2011-04-15 18:55:59 +0100775 mutex_lock(&indio_dev->mlock);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100776 unifiedmask = st->mask_low | st->mask_high;
Jonathan Cameron298cd972011-05-18 14:40:53 +0100777 if (IIO_EVENT_CODE_EXTRACT_DIR(event_code) == IIO_EV_DIR_FALLING) {
778
779 if (state == 0)
780 st->mask_low &= ~(1 << number);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100781 else {
Jonathan Cameron298cd972011-05-18 14:40:53 +0100782 ret = __max1363_check_event_mask((1 << number),
783 unifiedmask);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100784 if (ret)
785 goto error_ret;
Jonathan Cameron298cd972011-05-18 14:40:53 +0100786 st->mask_low |= (1 << number);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100787 }
788 } else {
Jonathan Cameron298cd972011-05-18 14:40:53 +0100789 if (state == 0)
790 st->mask_high &= ~(1 << number);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100791 else {
Jonathan Cameron298cd972011-05-18 14:40:53 +0100792 ret = __max1363_check_event_mask((1 << number),
793 unifiedmask);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100794 if (ret)
795 goto error_ret;
Jonathan Cameron298cd972011-05-18 14:40:53 +0100796 st->mask_high |= (1 << number);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100797 }
798 }
Jonathan Cameron440a5202010-06-26 12:54:23 +0100799
800 max1363_monitor_mode_update(st, !!(st->mask_high | st->mask_low));
801error_ret:
Jonathan Cameron3dba81b2011-04-15 18:55:59 +0100802 mutex_unlock(&indio_dev->mlock);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100803
Jonathan Cameron298cd972011-05-18 14:40:53 +0100804 return ret;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100805}
806
Jonathan Cameron440a5202010-06-26 12:54:23 +0100807/*
808 * As with scan_elements, only certain sets of these can
809 * be combined.
810 */
811static struct attribute *max1363_event_attributes[] = {
Jonathan Cameron440a5202010-06-26 12:54:23 +0100812 &iio_dev_attr_sampling_frequency.dev_attr.attr,
813 &iio_const_attr_sampling_frequency_available.dev_attr.attr,
Jonathan Cameron440a5202010-06-26 12:54:23 +0100814 NULL,
815};
816
817static struct attribute_group max1363_event_attribute_group = {
818 .attrs = max1363_event_attributes,
Jonathan Cameron8e7d9672011-08-30 12:32:45 +0100819 .name = "events",
Jonathan Cameron440a5202010-06-26 12:54:23 +0100820};
821
Jonathan Cameron6fe81352011-05-18 14:42:37 +0100822#define MAX1363_EVENT_FUNCS \
823
824
825static const struct iio_info max1238_info = {
826 .read_raw = &max1363_read_raw,
827 .driver_module = THIS_MODULE,
828};
829
830static const struct iio_info max1363_info = {
831 .read_event_value = &max1363_read_thresh,
832 .write_event_value = &max1363_write_thresh,
833 .read_event_config = &max1363_read_event_config,
834 .write_event_config = &max1363_write_event_config,
835 .read_raw = &max1363_read_raw,
836 .driver_module = THIS_MODULE,
Jonathan Cameron6fe81352011-05-18 14:42:37 +0100837 .event_attrs = &max1363_event_attribute_group,
838};
839
840/* max1363 and max1368 tested - rest from data sheet */
841static const struct max1363_chip_info max1363_chip_info_tbl[] = {
842 [max1361] = {
843 .bits = 10,
844 .int_vref_mv = 2048,
845 .mode_list = max1363_mode_list,
846 .num_modes = ARRAY_SIZE(max1363_mode_list),
847 .default_mode = s0to3,
848 .channels = max1361_channels,
849 .num_channels = ARRAY_SIZE(max1361_channels),
850 .info = &max1363_info,
851 },
852 [max1362] = {
853 .bits = 10,
854 .int_vref_mv = 4096,
855 .mode_list = max1363_mode_list,
856 .num_modes = ARRAY_SIZE(max1363_mode_list),
857 .default_mode = s0to3,
858 .channels = max1361_channels,
859 .num_channels = ARRAY_SIZE(max1361_channels),
860 .info = &max1363_info,
861 },
862 [max1363] = {
863 .bits = 12,
864 .int_vref_mv = 2048,
865 .mode_list = max1363_mode_list,
866 .num_modes = ARRAY_SIZE(max1363_mode_list),
867 .default_mode = s0to3,
868 .channels = max1363_channels,
869 .num_channels = ARRAY_SIZE(max1363_channels),
870 .info = &max1363_info,
871 },
872 [max1364] = {
873 .bits = 12,
874 .int_vref_mv = 4096,
875 .mode_list = max1363_mode_list,
876 .num_modes = ARRAY_SIZE(max1363_mode_list),
877 .default_mode = s0to3,
878 .channels = max1363_channels,
879 .num_channels = ARRAY_SIZE(max1363_channels),
880 .info = &max1363_info,
881 },
882 [max1036] = {
883 .bits = 8,
884 .int_vref_mv = 4096,
885 .mode_list = max1236_mode_list,
886 .num_modes = ARRAY_SIZE(max1236_mode_list),
887 .default_mode = s0to3,
888 .info = &max1238_info,
889 .channels = max1036_channels,
890 .num_channels = ARRAY_SIZE(max1036_channels),
891 },
892 [max1037] = {
893 .bits = 8,
894 .int_vref_mv = 2048,
895 .mode_list = max1236_mode_list,
896 .num_modes = ARRAY_SIZE(max1236_mode_list),
897 .default_mode = s0to3,
898 .info = &max1238_info,
899 .channels = max1036_channels,
900 .num_channels = ARRAY_SIZE(max1036_channels),
901 },
902 [max1038] = {
903 .bits = 8,
904 .int_vref_mv = 4096,
905 .mode_list = max1238_mode_list,
906 .num_modes = ARRAY_SIZE(max1238_mode_list),
907 .default_mode = s0to11,
908 .info = &max1238_info,
909 .channels = max1038_channels,
910 .num_channels = ARRAY_SIZE(max1038_channels),
911 },
912 [max1039] = {
913 .bits = 8,
914 .int_vref_mv = 2048,
915 .mode_list = max1238_mode_list,
916 .num_modes = ARRAY_SIZE(max1238_mode_list),
917 .default_mode = s0to11,
918 .info = &max1238_info,
919 .channels = max1038_channels,
920 .num_channels = ARRAY_SIZE(max1038_channels),
921 },
922 [max1136] = {
923 .bits = 10,
924 .int_vref_mv = 4096,
925 .mode_list = max1236_mode_list,
926 .num_modes = ARRAY_SIZE(max1236_mode_list),
927 .default_mode = s0to3,
928 .info = &max1238_info,
929 .channels = max1136_channels,
930 .num_channels = ARRAY_SIZE(max1136_channels),
931 },
932 [max1137] = {
933 .bits = 10,
934 .int_vref_mv = 2048,
935 .mode_list = max1236_mode_list,
936 .num_modes = ARRAY_SIZE(max1236_mode_list),
937 .default_mode = s0to3,
938 .info = &max1238_info,
939 .channels = max1136_channels,
940 .num_channels = ARRAY_SIZE(max1136_channels),
941 },
942 [max1138] = {
943 .bits = 10,
944 .int_vref_mv = 4096,
945 .mode_list = max1238_mode_list,
946 .num_modes = ARRAY_SIZE(max1238_mode_list),
947 .default_mode = s0to11,
948 .info = &max1238_info,
949 .channels = max1138_channels,
950 .num_channels = ARRAY_SIZE(max1138_channels),
951 },
952 [max1139] = {
953 .bits = 10,
954 .int_vref_mv = 2048,
955 .mode_list = max1238_mode_list,
956 .num_modes = ARRAY_SIZE(max1238_mode_list),
957 .default_mode = s0to11,
958 .info = &max1238_info,
959 .channels = max1138_channels,
960 .num_channels = ARRAY_SIZE(max1138_channels),
961 },
962 [max1236] = {
963 .bits = 12,
964 .int_vref_mv = 4096,
965 .mode_list = max1236_mode_list,
966 .num_modes = ARRAY_SIZE(max1236_mode_list),
967 .default_mode = s0to3,
968 .info = &max1238_info,
969 .channels = max1236_channels,
970 .num_channels = ARRAY_SIZE(max1236_channels),
971 },
972 [max1237] = {
973 .bits = 12,
974 .int_vref_mv = 2048,
975 .mode_list = max1236_mode_list,
976 .num_modes = ARRAY_SIZE(max1236_mode_list),
977 .default_mode = s0to3,
978 .info = &max1238_info,
979 .channels = max1236_channels,
980 .num_channels = ARRAY_SIZE(max1236_channels),
981 },
982 [max1238] = {
983 .bits = 12,
984 .int_vref_mv = 4096,
985 .mode_list = max1238_mode_list,
986 .num_modes = ARRAY_SIZE(max1238_mode_list),
987 .default_mode = s0to11,
988 .info = &max1238_info,
989 .channels = max1238_channels,
990 .num_channels = ARRAY_SIZE(max1238_channels),
991 },
992 [max1239] = {
993 .bits = 12,
994 .int_vref_mv = 2048,
995 .mode_list = max1238_mode_list,
996 .num_modes = ARRAY_SIZE(max1238_mode_list),
997 .default_mode = s0to11,
998 .info = &max1238_info,
999 .channels = max1238_channels,
1000 .num_channels = ARRAY_SIZE(max1238_channels),
1001 },
1002 [max11600] = {
1003 .bits = 8,
1004 .int_vref_mv = 4096,
1005 .mode_list = max11607_mode_list,
1006 .num_modes = ARRAY_SIZE(max11607_mode_list),
1007 .default_mode = s0to3,
1008 .info = &max1238_info,
1009 .channels = max1036_channels,
1010 .num_channels = ARRAY_SIZE(max1036_channels),
1011 },
1012 [max11601] = {
1013 .bits = 8,
1014 .int_vref_mv = 2048,
1015 .mode_list = max11607_mode_list,
1016 .num_modes = ARRAY_SIZE(max11607_mode_list),
1017 .default_mode = s0to3,
1018 .info = &max1238_info,
1019 .channels = max1036_channels,
1020 .num_channels = ARRAY_SIZE(max1036_channels),
1021 },
1022 [max11602] = {
1023 .bits = 8,
1024 .int_vref_mv = 4096,
1025 .mode_list = max11608_mode_list,
1026 .num_modes = ARRAY_SIZE(max11608_mode_list),
1027 .default_mode = s0to7,
1028 .info = &max1238_info,
1029 .channels = max11602_channels,
1030 .num_channels = ARRAY_SIZE(max11602_channels),
1031 },
1032 [max11603] = {
1033 .bits = 8,
1034 .int_vref_mv = 2048,
1035 .mode_list = max11608_mode_list,
1036 .num_modes = ARRAY_SIZE(max11608_mode_list),
1037 .default_mode = s0to7,
1038 .info = &max1238_info,
1039 .channels = max11602_channels,
1040 .num_channels = ARRAY_SIZE(max11602_channels),
1041 },
1042 [max11604] = {
1043 .bits = 8,
1044 .int_vref_mv = 4098,
1045 .mode_list = max1238_mode_list,
1046 .num_modes = ARRAY_SIZE(max1238_mode_list),
1047 .default_mode = s0to11,
1048 .info = &max1238_info,
1049 .channels = max1238_channels,
1050 .num_channels = ARRAY_SIZE(max1238_channels),
1051 },
1052 [max11605] = {
1053 .bits = 8,
1054 .int_vref_mv = 2048,
1055 .mode_list = max1238_mode_list,
1056 .num_modes = ARRAY_SIZE(max1238_mode_list),
1057 .default_mode = s0to11,
1058 .info = &max1238_info,
1059 .channels = max1238_channels,
1060 .num_channels = ARRAY_SIZE(max1238_channels),
1061 },
1062 [max11606] = {
1063 .bits = 10,
1064 .int_vref_mv = 4096,
1065 .mode_list = max11607_mode_list,
1066 .num_modes = ARRAY_SIZE(max11607_mode_list),
1067 .default_mode = s0to3,
1068 .info = &max1238_info,
1069 .channels = max1136_channels,
1070 .num_channels = ARRAY_SIZE(max1136_channels),
1071 },
1072 [max11607] = {
1073 .bits = 10,
1074 .int_vref_mv = 2048,
1075 .mode_list = max11607_mode_list,
1076 .num_modes = ARRAY_SIZE(max11607_mode_list),
1077 .default_mode = s0to3,
1078 .info = &max1238_info,
1079 .channels = max1136_channels,
1080 .num_channels = ARRAY_SIZE(max1136_channels),
1081 },
1082 [max11608] = {
1083 .bits = 10,
1084 .int_vref_mv = 4096,
1085 .mode_list = max11608_mode_list,
1086 .num_modes = ARRAY_SIZE(max11608_mode_list),
1087 .default_mode = s0to7,
1088 .info = &max1238_info,
1089 .channels = max11608_channels,
1090 .num_channels = ARRAY_SIZE(max11608_channels),
1091 },
1092 [max11609] = {
1093 .bits = 10,
1094 .int_vref_mv = 2048,
1095 .mode_list = max11608_mode_list,
1096 .num_modes = ARRAY_SIZE(max11608_mode_list),
1097 .default_mode = s0to7,
1098 .info = &max1238_info,
1099 .channels = max11608_channels,
1100 .num_channels = ARRAY_SIZE(max11608_channels),
1101 },
1102 [max11610] = {
1103 .bits = 10,
1104 .int_vref_mv = 4098,
1105 .mode_list = max1238_mode_list,
1106 .num_modes = ARRAY_SIZE(max1238_mode_list),
1107 .default_mode = s0to11,
1108 .info = &max1238_info,
1109 .channels = max1238_channels,
1110 .num_channels = ARRAY_SIZE(max1238_channels),
1111 },
1112 [max11611] = {
1113 .bits = 10,
1114 .int_vref_mv = 2048,
1115 .mode_list = max1238_mode_list,
1116 .num_modes = ARRAY_SIZE(max1238_mode_list),
1117 .default_mode = s0to11,
1118 .info = &max1238_info,
1119 .channels = max1238_channels,
1120 .num_channels = ARRAY_SIZE(max1238_channels),
1121 },
1122 [max11612] = {
1123 .bits = 12,
1124 .int_vref_mv = 4096,
1125 .mode_list = max11607_mode_list,
1126 .num_modes = ARRAY_SIZE(max11607_mode_list),
1127 .default_mode = s0to3,
1128 .info = &max1238_info,
1129 .channels = max1363_channels,
1130 .num_channels = ARRAY_SIZE(max1363_channels),
1131 },
1132 [max11613] = {
1133 .bits = 12,
1134 .int_vref_mv = 2048,
1135 .mode_list = max11607_mode_list,
1136 .num_modes = ARRAY_SIZE(max11607_mode_list),
1137 .default_mode = s0to3,
1138 .info = &max1238_info,
1139 .channels = max1363_channels,
1140 .num_channels = ARRAY_SIZE(max1363_channels),
1141 },
1142 [max11614] = {
1143 .bits = 12,
1144 .int_vref_mv = 4096,
1145 .mode_list = max11608_mode_list,
1146 .num_modes = ARRAY_SIZE(max11608_mode_list),
1147 .default_mode = s0to7,
1148 .info = &max1238_info,
1149 .channels = max11614_channels,
1150 .num_channels = ARRAY_SIZE(max11614_channels),
1151 },
1152 [max11615] = {
1153 .bits = 12,
1154 .int_vref_mv = 2048,
1155 .mode_list = max11608_mode_list,
1156 .num_modes = ARRAY_SIZE(max11608_mode_list),
1157 .default_mode = s0to7,
1158 .info = &max1238_info,
1159 .channels = max11614_channels,
1160 .num_channels = ARRAY_SIZE(max11614_channels),
1161 },
1162 [max11616] = {
1163 .bits = 12,
1164 .int_vref_mv = 4098,
1165 .mode_list = max1238_mode_list,
1166 .num_modes = ARRAY_SIZE(max1238_mode_list),
1167 .default_mode = s0to11,
1168 .info = &max1238_info,
1169 .channels = max1238_channels,
1170 .num_channels = ARRAY_SIZE(max1238_channels),
1171 },
1172 [max11617] = {
1173 .bits = 12,
1174 .int_vref_mv = 2048,
1175 .mode_list = max1238_mode_list,
1176 .num_modes = ARRAY_SIZE(max1238_mode_list),
1177 .default_mode = s0to11,
1178 .info = &max1238_info,
1179 .channels = max1238_channels,
1180 .num_channels = ARRAY_SIZE(max1238_channels),
1181 },
1182 [max11644] = {
1183 .bits = 12,
1184 .int_vref_mv = 2048,
1185 .mode_list = max11644_mode_list,
1186 .num_modes = ARRAY_SIZE(max11644_mode_list),
1187 .default_mode = s0to1,
1188 .info = &max1238_info,
1189 .channels = max11644_channels,
1190 .num_channels = ARRAY_SIZE(max11644_channels),
1191 },
1192 [max11645] = {
1193 .bits = 12,
1194 .int_vref_mv = 4096,
1195 .mode_list = max11644_mode_list,
1196 .num_modes = ARRAY_SIZE(max11644_mode_list),
1197 .default_mode = s0to1,
1198 .info = &max1238_info,
1199 .channels = max11644_channels,
1200 .num_channels = ARRAY_SIZE(max11644_channels),
1201 },
1202 [max11646] = {
1203 .bits = 10,
1204 .int_vref_mv = 2048,
1205 .mode_list = max11644_mode_list,
1206 .num_modes = ARRAY_SIZE(max11644_mode_list),
1207 .default_mode = s0to1,
1208 .info = &max1238_info,
1209 .channels = max11646_channels,
1210 .num_channels = ARRAY_SIZE(max11646_channels),
1211 },
1212 [max11647] = {
1213 .bits = 10,
1214 .int_vref_mv = 4096,
1215 .mode_list = max11644_mode_list,
1216 .num_modes = ARRAY_SIZE(max11644_mode_list),
1217 .default_mode = s0to1,
1218 .info = &max1238_info,
1219 .channels = max11646_channels,
1220 .num_channels = ARRAY_SIZE(max11646_channels),
1221 },
1222};
1223
1224
1225
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001226static int max1363_initial_setup(struct max1363_state *st)
1227{
1228 st->setupbyte = MAX1363_SETUP_AIN3_IS_AIN3_REF_IS_VDD
1229 | MAX1363_SETUP_POWER_UP_INT_REF
1230 | MAX1363_SETUP_INT_CLOCK
1231 | MAX1363_SETUP_UNIPOLAR
1232 | MAX1363_SETUP_NORESET;
1233
1234 /* Set scan mode writes the config anyway so wait until then*/
1235 st->setupbyte = MAX1363_SETUP_BYTE(st->setupbyte);
1236 st->current_mode = &max1363_mode_table[st->chip_info->default_mode];
1237 st->configbyte = MAX1363_CONFIG_BYTE(st->configbyte);
1238
1239 return max1363_set_scan_mode(st);
1240}
1241
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001242static int __devinit max1363_probe(struct i2c_client *client,
1243 const struct i2c_device_id *id)
1244{
Jonathan Cameron26d25ae2011-09-02 17:14:40 +01001245 int ret, i;
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001246 struct max1363_state *st;
1247 struct iio_dev *indio_dev;
1248 struct regulator *reg;
1249
1250 reg = regulator_get(&client->dev, "vcc");
Dan Carpenterf88af7e2011-06-08 09:42:21 +03001251 if (IS_ERR(reg)) {
1252 ret = PTR_ERR(reg);
1253 goto error_out;
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001254 }
1255
Dan Carpenterf88af7e2011-06-08 09:42:21 +03001256 ret = regulator_enable(reg);
1257 if (ret)
1258 goto error_put_reg;
1259
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001260 indio_dev = iio_allocate_device(sizeof(struct max1363_state));
1261 if (indio_dev == NULL) {
1262 ret = -ENOMEM;
1263 goto error_disable_reg;
1264 }
1265 st = iio_priv(indio_dev);
1266 st->reg = reg;
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001267 /* this is only used for device removal purposes */
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001268 i2c_set_clientdata(client, indio_dev);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001269
Jonathan Cameron962a4cc2010-06-26 12:54:13 +01001270 st->chip_info = &max1363_chip_info_tbl[id->driver_data];
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001271 st->client = client;
1272
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001273 indio_dev->available_scan_masks
Jonathan Cameron9c95e012011-10-14 14:46:59 +01001274 = kzalloc(BITS_TO_LONGS(MAX1363_MAX_CHANNELS)*sizeof(long)*
Greg Kroah-Hartmanf03de822010-05-04 22:26:19 -07001275 (st->chip_info->num_modes + 1), GFP_KERNEL);
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001276 if (!indio_dev->available_scan_masks) {
Jonathan Cameron82020b02010-05-04 14:43:03 +01001277 ret = -ENOMEM;
1278 goto error_free_device;
1279 }
1280
1281 for (i = 0; i < st->chip_info->num_modes; i++)
Jonathan Cameron32b5eec2011-09-02 17:14:38 +01001282 bitmap_copy(indio_dev->available_scan_masks +
1283 BITS_TO_LONGS(MAX1363_MAX_CHANNELS)*i,
1284 max1363_mode_table[st->chip_info->mode_list[i]]
1285 .modemask, MAX1363_MAX_CHANNELS);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001286 /* Estabilish that the iio_dev is a child of the i2c device */
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001287 indio_dev->dev.parent = &client->dev;
Jonathan Cameron845bd122011-05-18 14:41:44 +01001288 indio_dev->name = id->name;
Jonathan Cameron8e7d9672011-08-30 12:32:45 +01001289 indio_dev->channels = st->chip_info->channels;
1290 indio_dev->num_channels = st->chip_info->num_channels;
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001291 indio_dev->info = st->chip_info->info;
1292 indio_dev->modes = INDIO_DIRECT_MODE;
Jonathan Cameroncd038012011-08-12 16:55:29 +01001293 indio_dev->channels = st->chip_info->channels;
1294 indio_dev->num_channels = st->chip_info->num_channels;
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001295 ret = max1363_initial_setup(st);
Jonathan Cameron58f0a252011-05-18 14:42:38 +01001296 if (ret < 0)
Jonathan Cameron82020b02010-05-04 14:43:03 +01001297 goto error_free_available_scan_masks;
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001298
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001299 ret = max1363_register_ring_funcs_and_init(indio_dev);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001300 if (ret)
Jonathan Cameron82020b02010-05-04 14:43:03 +01001301 goto error_free_available_scan_masks;
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001302
Jonathan Cameron14555b12011-09-21 11:15:57 +01001303 ret = iio_buffer_register(indio_dev,
1304 st->chip_info->channels,
1305 st->chip_info->num_channels);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001306 if (ret)
1307 goto error_cleanup_ring;
Jonathan Cameron440a5202010-06-26 12:54:23 +01001308
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001309 if (client->irq) {
Jonathan Cameronaaf370d2011-05-18 14:41:16 +01001310 ret = request_threaded_irq(st->client->irq,
1311 NULL,
1312 &max1363_event_handler,
1313 IRQF_TRIGGER_RISING | IRQF_ONESHOT,
1314 "max1363_event",
1315 indio_dev);
Jonathan Cameron298cd972011-05-18 14:40:53 +01001316
Jonathan Cameron440a5202010-06-26 12:54:23 +01001317 if (ret)
1318 goto error_uninit_ring;
Jonathan Cameron440a5202010-06-26 12:54:23 +01001319 }
1320
Jonathan Cameron26d25ae2011-09-02 17:14:40 +01001321 ret = iio_device_register(indio_dev);
1322 if (ret < 0)
1323 goto error_free_irq;
Dan Carpenterf88af7e2011-06-08 09:42:21 +03001324
Jonathan Cameron26d25ae2011-09-02 17:14:40 +01001325 return 0;
1326error_free_irq:
1327 free_irq(st->client->irq, indio_dev);
Jonathan Cameron440a5202010-06-26 12:54:23 +01001328error_uninit_ring:
Jonathan Cameron14555b12011-09-21 11:15:57 +01001329 iio_buffer_unregister(indio_dev);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001330error_cleanup_ring:
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001331 max1363_ring_cleanup(indio_dev);
Jonathan Cameron82020b02010-05-04 14:43:03 +01001332error_free_available_scan_masks:
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001333 kfree(indio_dev->available_scan_masks);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001334error_free_device:
Jonathan Cameron26d25ae2011-09-02 17:14:40 +01001335 iio_free_device(indio_dev);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001336error_disable_reg:
Dan Carpenterf88af7e2011-06-08 09:42:21 +03001337 regulator_disable(reg);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001338error_put_reg:
Dan Carpenterf88af7e2011-06-08 09:42:21 +03001339 regulator_put(reg);
1340error_out:
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001341 return ret;
1342}
1343
1344static int max1363_remove(struct i2c_client *client)
1345{
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001346 struct iio_dev *indio_dev = i2c_get_clientdata(client);
1347 struct max1363_state *st = iio_priv(indio_dev);
1348 struct regulator *reg = st->reg;
Jonathan Cameron440a5202010-06-26 12:54:23 +01001349
Jonathan Camerond2fffd62011-10-14 14:46:58 +01001350 iio_device_unregister(indio_dev);
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001351 if (client->irq)
Jonathan Cameronaaf370d2011-05-18 14:41:16 +01001352 free_irq(st->client->irq, indio_dev);
Jonathan Cameron14555b12011-09-21 11:15:57 +01001353 iio_buffer_unregister(indio_dev);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001354 max1363_ring_cleanup(indio_dev);
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001355 kfree(indio_dev->available_scan_masks);
1356 if (!IS_ERR(reg)) {
1357 regulator_disable(reg);
1358 regulator_put(reg);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001359 }
Jonathan Camerond2fffd62011-10-14 14:46:58 +01001360 iio_free_device(indio_dev);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001361
1362 return 0;
1363}
1364
1365static const struct i2c_device_id max1363_id[] = {
1366 { "max1361", max1361 },
1367 { "max1362", max1362 },
1368 { "max1363", max1363 },
1369 { "max1364", max1364 },
Jonathan Cameron3bf877c2010-05-04 14:43:10 +01001370 { "max1036", max1036 },
1371 { "max1037", max1037 },
1372 { "max1038", max1038 },
1373 { "max1039", max1039 },
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001374 { "max1136", max1136 },
1375 { "max1137", max1137 },
1376 { "max1138", max1138 },
1377 { "max1139", max1139 },
1378 { "max1236", max1236 },
1379 { "max1237", max1237 },
1380 { "max1238", max1238 },
1381 { "max1239", max1239 },
Jonathan Cameron3bf877c2010-05-04 14:43:10 +01001382 { "max11600", max11600 },
1383 { "max11601", max11601 },
1384 { "max11602", max11602 },
1385 { "max11603", max11603 },
1386 { "max11604", max11604 },
1387 { "max11605", max11605 },
Jonathan Cameronc3fa0fdd2010-05-04 14:43:09 +01001388 { "max11606", max11606 },
1389 { "max11607", max11607 },
1390 { "max11608", max11608 },
1391 { "max11609", max11609 },
1392 { "max11610", max11610 },
1393 { "max11611", max11611 },
1394 { "max11612", max11612 },
1395 { "max11613", max11613 },
1396 { "max11614", max11614 },
1397 { "max11615", max11615 },
1398 { "max11616", max11616 },
1399 { "max11617", max11617 },
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001400 {}
1401};
1402
1403MODULE_DEVICE_TABLE(i2c, max1363_id);
1404
1405static struct i2c_driver max1363_driver = {
1406 .driver = {
1407 .name = "max1363",
1408 },
1409 .probe = max1363_probe,
1410 .remove = max1363_remove,
1411 .id_table = max1363_id,
1412};
Lars-Peter Clausen6e5af182011-11-16 10:13:38 +01001413module_i2c_driver(max1363_driver);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001414
1415MODULE_AUTHOR("Jonathan Cameron <jic23@cam.ac.uk>");
1416MODULE_DESCRIPTION("Maxim 1363 ADC");
1417MODULE_LICENSE("GPL v2");