blob: 1a7a0274751d84cfb50f84f6376fe6b53772e263 [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 Cameron0b27d672012-04-10 21:11:07 +010039#include "../driver.h"
Jonathan Cameroncdf38702011-08-12 17:08:43 +010040
Jonathan Camerond1325cf2009-08-18 18:06:20 +010041#include "max1363.h"
42
Jonathan Cameron58f0a252011-05-18 14:42:38 +010043#define MAX1363_MODE_SINGLE(_num, _mask) { \
44 .conf = MAX1363_CHANNEL_SEL(_num) \
45 | MAX1363_CONFIG_SCAN_SINGLE_1 \
46 | MAX1363_CONFIG_SE, \
Jonathan Cameron32b5eec2011-09-02 17:14:38 +010047 .modemask[0] = _mask, \
Jonathan Cameron58f0a252011-05-18 14:42:38 +010048 }
49
50#define MAX1363_MODE_SCAN_TO_CHANNEL(_num, _mask) { \
51 .conf = MAX1363_CHANNEL_SEL(_num) \
52 | MAX1363_CONFIG_SCAN_TO_CS \
53 | MAX1363_CONFIG_SE, \
Jonathan Cameron32b5eec2011-09-02 17:14:38 +010054 .modemask[0] = _mask, \
Jonathan Cameron58f0a252011-05-18 14:42:38 +010055 }
56
57/* note not available for max1363 hence naming */
58#define MAX1236_MODE_SCAN_MID_TO_CHANNEL(_mid, _num, _mask) { \
59 .conf = MAX1363_CHANNEL_SEL(_num) \
60 | MAX1236_SCAN_MID_TO_CHANNEL \
61 | MAX1363_CONFIG_SE, \
Jonathan Cameron32b5eec2011-09-02 17:14:38 +010062 .modemask[0] = _mask \
Jonathan Cameron58f0a252011-05-18 14:42:38 +010063}
64
65#define MAX1363_MODE_DIFF_SINGLE(_nump, _numm, _mask) { \
66 .conf = MAX1363_CHANNEL_SEL(_nump) \
67 | MAX1363_CONFIG_SCAN_SINGLE_1 \
68 | MAX1363_CONFIG_DE, \
Jonathan Cameron32b5eec2011-09-02 17:14:38 +010069 .modemask[0] = _mask \
Jonathan Cameron58f0a252011-05-18 14:42:38 +010070 }
71
72/* Can't think how to automate naming so specify for now */
73#define MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(_num, _numvals, _mask) { \
74 .conf = MAX1363_CHANNEL_SEL(_num) \
75 | MAX1363_CONFIG_SCAN_TO_CS \
76 | MAX1363_CONFIG_DE, \
Jonathan Cameron32b5eec2011-09-02 17:14:38 +010077 .modemask[0] = _mask \
Jonathan Cameron58f0a252011-05-18 14:42:38 +010078 }
79
80/* note only available for max1363 hence naming */
81#define MAX1236_MODE_DIFF_SCAN_MID_TO_CHANNEL(_num, _numvals, _mask) { \
82 .conf = MAX1363_CHANNEL_SEL(_num) \
83 | MAX1236_SCAN_MID_TO_CHANNEL \
84 | MAX1363_CONFIG_SE, \
Jonathan Cameron32b5eec2011-09-02 17:14:38 +010085 .modemask[0] = _mask \
Jonathan Cameron58f0a252011-05-18 14:42:38 +010086}
Jonathan Camerond1325cf2009-08-18 18:06:20 +010087
Jonathan Cameron82020b02010-05-04 14:43:03 +010088static const struct max1363_mode max1363_mode_table[] = {
89 /* All of the single channel options first */
90 MAX1363_MODE_SINGLE(0, 1 << 0),
91 MAX1363_MODE_SINGLE(1, 1 << 1),
92 MAX1363_MODE_SINGLE(2, 1 << 2),
93 MAX1363_MODE_SINGLE(3, 1 << 3),
94 MAX1363_MODE_SINGLE(4, 1 << 4),
95 MAX1363_MODE_SINGLE(5, 1 << 5),
96 MAX1363_MODE_SINGLE(6, 1 << 6),
97 MAX1363_MODE_SINGLE(7, 1 << 7),
98 MAX1363_MODE_SINGLE(8, 1 << 8),
99 MAX1363_MODE_SINGLE(9, 1 << 9),
100 MAX1363_MODE_SINGLE(10, 1 << 10),
101 MAX1363_MODE_SINGLE(11, 1 << 11),
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100102
Jonathan Cameron82020b02010-05-04 14:43:03 +0100103 MAX1363_MODE_DIFF_SINGLE(0, 1, 1 << 12),
104 MAX1363_MODE_DIFF_SINGLE(2, 3, 1 << 13),
105 MAX1363_MODE_DIFF_SINGLE(4, 5, 1 << 14),
106 MAX1363_MODE_DIFF_SINGLE(6, 7, 1 << 15),
107 MAX1363_MODE_DIFF_SINGLE(8, 9, 1 << 16),
108 MAX1363_MODE_DIFF_SINGLE(10, 11, 1 << 17),
109 MAX1363_MODE_DIFF_SINGLE(1, 0, 1 << 18),
110 MAX1363_MODE_DIFF_SINGLE(3, 2, 1 << 19),
111 MAX1363_MODE_DIFF_SINGLE(5, 4, 1 << 20),
112 MAX1363_MODE_DIFF_SINGLE(7, 6, 1 << 21),
113 MAX1363_MODE_DIFF_SINGLE(9, 8, 1 << 22),
114 MAX1363_MODE_DIFF_SINGLE(11, 10, 1 << 23),
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100115
Jonathan Cameron82020b02010-05-04 14:43:03 +0100116 /* The multichannel scans next */
117 MAX1363_MODE_SCAN_TO_CHANNEL(1, 0x003),
118 MAX1363_MODE_SCAN_TO_CHANNEL(2, 0x007),
119 MAX1236_MODE_SCAN_MID_TO_CHANNEL(2, 3, 0x00C),
120 MAX1363_MODE_SCAN_TO_CHANNEL(3, 0x00F),
121 MAX1363_MODE_SCAN_TO_CHANNEL(4, 0x01F),
122 MAX1363_MODE_SCAN_TO_CHANNEL(5, 0x03F),
123 MAX1363_MODE_SCAN_TO_CHANNEL(6, 0x07F),
124 MAX1236_MODE_SCAN_MID_TO_CHANNEL(6, 7, 0x0C0),
125 MAX1363_MODE_SCAN_TO_CHANNEL(7, 0x0FF),
126 MAX1236_MODE_SCAN_MID_TO_CHANNEL(6, 8, 0x1C0),
127 MAX1363_MODE_SCAN_TO_CHANNEL(8, 0x1FF),
128 MAX1236_MODE_SCAN_MID_TO_CHANNEL(6, 9, 0x3C0),
129 MAX1363_MODE_SCAN_TO_CHANNEL(9, 0x3FF),
130 MAX1236_MODE_SCAN_MID_TO_CHANNEL(6, 10, 0x7C0),
131 MAX1363_MODE_SCAN_TO_CHANNEL(10, 0x7FF),
132 MAX1236_MODE_SCAN_MID_TO_CHANNEL(6, 11, 0xFC0),
133 MAX1363_MODE_SCAN_TO_CHANNEL(11, 0xFFF),
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100134
Jonathan Cameron82020b02010-05-04 14:43:03 +0100135 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(2, 2, 0x003000),
136 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(4, 3, 0x007000),
137 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(6, 4, 0x00F000),
138 MAX1236_MODE_DIFF_SCAN_MID_TO_CHANNEL(8, 2, 0x018000),
139 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(8, 5, 0x01F000),
140 MAX1236_MODE_DIFF_SCAN_MID_TO_CHANNEL(10, 3, 0x038000),
141 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(10, 6, 0x3F000),
142 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(3, 2, 0x0C0000),
143 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(5, 3, 0x1C0000),
144 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(7, 4, 0x3C0000),
145 MAX1236_MODE_DIFF_SCAN_MID_TO_CHANNEL(9, 2, 0x600000),
146 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(9, 5, 0x7C0000),
147 MAX1236_MODE_DIFF_SCAN_MID_TO_CHANNEL(11, 3, 0xE00000),
148 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(11, 6, 0xFC0000),
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100149};
150
Jonathan Cameron82020b02010-05-04 14:43:03 +0100151const struct max1363_mode
Jonathan Cameronc52cfb62011-12-05 21:37:15 +0000152*max1363_match_mode(const unsigned long *mask,
153const struct max1363_chip_info *ci)
Greg Kroah-Hartman1b183e42010-05-04 22:24:05 -0700154{
Jonathan Cameron82020b02010-05-04 14:43:03 +0100155 int i;
156 if (mask)
157 for (i = 0; i < ci->num_modes; i++)
Jonathan Cameron32b5eec2011-09-02 17:14:38 +0100158 if (bitmap_subset(mask,
159 max1363_mode_table[ci->mode_list[i]].
160 modemask,
161 MAX1363_MAX_CHANNELS))
Greg Kroah-Hartman1b183e42010-05-04 22:24:05 -0700162 return &max1363_mode_table[ci->mode_list[i]];
163 return NULL;
Mike Frysingerc608cb02010-05-23 03:10:30 -0400164}
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100165
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100166static int max1363_write_basic_config(struct i2c_client *client,
167 unsigned char d1,
168 unsigned char d2)
169{
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100170 u8 tx_buf[2] = {d1, d2};
Jonathan Cameron82020b02010-05-04 14:43:03 +0100171
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100172 return i2c_master_send(client, tx_buf, 2);
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100173}
174
Jonathan Cameron82020b02010-05-04 14:43:03 +0100175int max1363_set_scan_mode(struct max1363_state *st)
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100176{
177 st->configbyte &= ~(MAX1363_CHANNEL_SEL_MASK
178 | MAX1363_SCAN_MASK
179 | MAX1363_SE_DE_MASK);
180 st->configbyte |= st->current_mode->conf;
181
182 return max1363_write_basic_config(st->client,
183 st->setupbyte,
184 st->configbyte);
185}
186
Jonathan Cameron298cd972011-05-18 14:40:53 +0100187static int max1363_read_single_chan(struct iio_dev *indio_dev,
188 struct iio_chan_spec const *chan,
189 int *val,
190 long m)
Jonathan Cameron82020b02010-05-04 14:43:03 +0100191{
Jonathan Cameron298cd972011-05-18 14:40:53 +0100192 int ret = 0;
193 s32 data;
Jonathan Cameron82020b02010-05-04 14:43:03 +0100194 char rxbuf[2];
Jonathan Cameron298cd972011-05-18 14:40:53 +0100195 struct max1363_state *st = iio_priv(indio_dev);
196 struct i2c_client *client = st->client;
Jonathan Cameron82020b02010-05-04 14:43:03 +0100197
Jonathan Cameronb6b70682011-04-15 18:55:58 +0100198 mutex_lock(&indio_dev->mlock);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100199 /*
200 * If monitor mode is enabled, the method for reading a single
201 * channel will have to be rather different and has not yet
202 * been implemented.
Jonathan Cameron3ca34cc2011-12-05 22:18:25 +0000203 *
204 * Also, cannot read directly if buffered capture enabled.
Jonathan Cameron440a5202010-06-26 12:54:23 +0100205 */
Jonathan Cameron3ca34cc2011-12-05 22:18:25 +0000206 if (st->monitor_on || iio_buffer_enabled(indio_dev)) {
Jonathan Cameron440a5202010-06-26 12:54:23 +0100207 ret = -EBUSY;
208 goto error_ret;
209 }
210
Jonathan Cameron3ca34cc2011-12-05 22:18:25 +0000211 /* Check to see if current scan mode is correct */
212 if (st->current_mode != &max1363_mode_table[chan->address]) {
213 /* Update scan mode if needed */
214 st->current_mode = &max1363_mode_table[chan->address];
215 ret = max1363_set_scan_mode(st);
216 if (ret < 0)
217 goto error_ret;
218 }
219 if (st->chip_info->bits != 8) {
220 /* Get reading */
221 data = i2c_master_recv(client, rxbuf, 2);
Jonathan Cameron82020b02010-05-04 14:43:03 +0100222 if (data < 0) {
223 ret = data;
224 goto error_ret;
225 }
Jonathan Cameron3ca34cc2011-12-05 22:18:25 +0000226 data = (s32)(rxbuf[1]) | ((s32)(rxbuf[0] & 0x0F)) << 8;
Jonathan Cameron82020b02010-05-04 14:43:03 +0100227 } else {
Jonathan Cameron3ca34cc2011-12-05 22:18:25 +0000228 /* Get reading */
229 data = i2c_master_recv(client, rxbuf, 1);
230 if (data < 0) {
231 ret = data;
232 goto error_ret;
Jonathan Cameron82020b02010-05-04 14:43:03 +0100233 }
Jonathan Cameron3ca34cc2011-12-05 22:18:25 +0000234 data = rxbuf[0];
Jonathan Cameron82020b02010-05-04 14:43:03 +0100235 }
Jonathan Cameron298cd972011-05-18 14:40:53 +0100236 *val = data;
Jonathan Cameron82020b02010-05-04 14:43:03 +0100237error_ret:
Jonathan Cameronb6b70682011-04-15 18:55:58 +0100238 mutex_unlock(&indio_dev->mlock);
Jonathan Cameron298cd972011-05-18 14:40:53 +0100239 return ret;
240
Jonathan Cameron82020b02010-05-04 14:43:03 +0100241}
242
Jonathan Cameron298cd972011-05-18 14:40:53 +0100243static int max1363_read_raw(struct iio_dev *indio_dev,
244 struct iio_chan_spec const *chan,
245 int *val,
246 int *val2,
247 long m)
Jonathan Cameron82020b02010-05-04 14:43:03 +0100248{
Jonathan Cameron298cd972011-05-18 14:40:53 +0100249 struct max1363_state *st = iio_priv(indio_dev);
250 int ret;
251 switch (m) {
Jonathan Cameronb11f98f2012-04-15 17:41:18 +0100252 case IIO_CHAN_INFO_RAW:
Jonathan Cameron298cd972011-05-18 14:40:53 +0100253 ret = max1363_read_single_chan(indio_dev, chan, val, m);
Jonathan Cameroncd038012011-08-12 16:55:29 +0100254 if (ret < 0)
Jonathan Cameron298cd972011-05-18 14:40:53 +0100255 return ret;
256 return IIO_VAL_INT;
Jonathan Cameronc8a9f802011-10-26 17:41:36 +0100257 case IIO_CHAN_INFO_SCALE:
Jonathan Cameron298cd972011-05-18 14:40:53 +0100258 if ((1 << (st->chip_info->bits + 1)) >
259 st->chip_info->int_vref_mv) {
260 *val = 0;
261 *val2 = 500000;
262 return IIO_VAL_INT_PLUS_MICRO;
263 } else {
264 *val = (st->chip_info->int_vref_mv)
265 >> st->chip_info->bits;
266 return IIO_VAL_INT;
267 }
268 default:
269 return -EINVAL;
270 }
271 return 0;
Jonathan Cameron82020b02010-05-04 14:43:03 +0100272}
273
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100274/* Applies to max1363 */
275static const enum max1363_modes max1363_mode_list[] = {
276 _s0, _s1, _s2, _s3,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100277 s0to1, s0to2, s0to3,
278 d0m1, d2m3, d1m0, d3m2,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100279 d0m1to2m3, d1m0to3m2,
280};
281
Jonathan Cameron298cd972011-05-18 14:40:53 +0100282#define MAX1363_EV_M \
283 (IIO_EV_BIT(IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING) \
284 | IIO_EV_BIT(IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING))
Jonathan Cameronb11f98f2012-04-15 17:41:18 +0100285#define MAX1363_INFO_MASK (IIO_CHAN_INFO_RAW_SEPARATE_BIT | \
286 IIO_CHAN_INFO_SCALE_SHARED_BIT)
Jonathan Cameronade7ef72011-09-02 17:14:45 +0100287#define MAX1363_CHAN_U(num, addr, si, bits, evmask) \
288 { \
289 .type = IIO_VOLTAGE, \
290 .indexed = 1, \
291 .channel = num, \
292 .address = addr, \
293 .info_mask = MAX1363_INFO_MASK, \
Jonathan Cameronbc234e72011-12-05 21:56:01 +0000294 .datasheet_name = "AIN"#num, \
Jonathan Cameron18cffbed2011-12-05 21:37:16 +0000295 .scan_type = { \
296 .sign = 'u', \
297 .realbits = bits, \
298 .storagebits = (bits > 8) ? 16 : 8, \
299 .endianness = IIO_BE, \
300 }, \
Jonathan Cameronade7ef72011-09-02 17:14:45 +0100301 .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, \
Jonathan Cameronbc234e72011-12-05 21:56:01 +0000315 .datasheet_name = "AIN"#num"-AIN"#num2, \
Jonathan Cameron18cffbed2011-12-05 21:37:16 +0000316 .scan_type = { \
317 .sign = 's', \
318 .realbits = bits, \
319 .storagebits = (bits > 8) ? 16 : 8, \
320 .endianness = IIO_BE, \
321 }, \
Jonathan Cameronade7ef72011-09-02 17:14:45 +0100322 .scan_index = si, \
323 .event_mask = evmask, \
324 }
325
326#define MAX1363_4X_CHANS(bits, em) { \
327 MAX1363_CHAN_U(0, _s0, 0, bits, em), \
328 MAX1363_CHAN_U(1, _s1, 1, bits, em), \
329 MAX1363_CHAN_U(2, _s2, 2, bits, em), \
330 MAX1363_CHAN_U(3, _s3, 3, bits, em), \
331 MAX1363_CHAN_B(0, 1, d0m1, 4, bits, em), \
332 MAX1363_CHAN_B(2, 3, d2m3, 5, bits, em), \
333 MAX1363_CHAN_B(1, 0, d1m0, 6, bits, em), \
334 MAX1363_CHAN_B(3, 2, d3m2, 7, bits, em), \
335 IIO_CHAN_SOFT_TIMESTAMP(8) \
336 }
337
338static struct iio_chan_spec max1036_channels[] = MAX1363_4X_CHANS(8, 0);
339static struct iio_chan_spec max1136_channels[] = MAX1363_4X_CHANS(10, 0);
340static struct iio_chan_spec max1236_channels[] = MAX1363_4X_CHANS(12, 0);
341static struct iio_chan_spec max1361_channels[] =
342 MAX1363_4X_CHANS(10, MAX1363_EV_M);
343static struct iio_chan_spec max1363_channels[] =
344 MAX1363_4X_CHANS(12, MAX1363_EV_M);
Jonathan Cameron298cd972011-05-18 14:40:53 +0100345
Justin P. Mattock4abf6f82012-02-29 22:00:38 -0800346/* Applies to max1236, max1237 */
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100347static const enum max1363_modes max1236_mode_list[] = {
348 _s0, _s1, _s2, _s3,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100349 s0to1, s0to2, s0to3,
350 d0m1, d2m3, d1m0, d3m2,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100351 d0m1to2m3, d1m0to3m2,
352 s2to3,
353};
354
355/* Applies to max1238, max1239 */
356static const enum max1363_modes max1238_mode_list[] = {
357 _s0, _s1, _s2, _s3, _s4, _s5, _s6, _s7, _s8, _s9, _s10, _s11,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100358 s0to1, s0to2, s0to3, s0to4, s0to5, s0to6,
359 s0to7, s0to8, s0to9, s0to10, s0to11,
360 d0m1, d2m3, d4m5, d6m7, d8m9, d10m11,
361 d1m0, d3m2, d5m4, d7m6, d9m8, d11m10,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100362 d0m1to2m3, d0m1to4m5, d0m1to6m7, d0m1to8m9, d0m1to10m11,
363 d1m0to3m2, d1m0to5m4, d1m0to7m6, d1m0to9m8, d1m0to11m10,
364 s6to7, s6to8, s6to9, s6to10, s6to11,
Jonathan Cameron82020b02010-05-04 14:43:03 +0100365 d6m7to8m9, d6m7to10m11, d7m6to9m8, d7m6to11m10,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100366};
367
Jonathan Cameron298cd972011-05-18 14:40:53 +0100368#define MAX1363_12X_CHANS(bits) { \
Jonathan Cameronade7ef72011-09-02 17:14:45 +0100369 MAX1363_CHAN_U(0, _s0, 0, bits, 0), \
370 MAX1363_CHAN_U(1, _s1, 1, bits, 0), \
371 MAX1363_CHAN_U(2, _s2, 2, bits, 0), \
372 MAX1363_CHAN_U(3, _s3, 3, bits, 0), \
373 MAX1363_CHAN_U(4, _s4, 4, bits, 0), \
374 MAX1363_CHAN_U(5, _s5, 5, bits, 0), \
375 MAX1363_CHAN_U(6, _s6, 6, bits, 0), \
376 MAX1363_CHAN_U(7, _s7, 7, bits, 0), \
377 MAX1363_CHAN_U(8, _s8, 8, bits, 0), \
378 MAX1363_CHAN_U(9, _s9, 9, bits, 0), \
379 MAX1363_CHAN_U(10, _s10, 10, bits, 0), \
380 MAX1363_CHAN_U(11, _s11, 11, bits, 0), \
381 MAX1363_CHAN_B(0, 1, d0m1, 12, bits, 0), \
382 MAX1363_CHAN_B(2, 3, d2m3, 13, bits, 0), \
383 MAX1363_CHAN_B(4, 5, d4m5, 14, bits, 0), \
384 MAX1363_CHAN_B(6, 7, d6m7, 15, bits, 0), \
385 MAX1363_CHAN_B(8, 9, d8m9, 16, bits, 0), \
386 MAX1363_CHAN_B(10, 11, d10m11, 17, bits, 0), \
387 MAX1363_CHAN_B(1, 0, d1m0, 18, bits, 0), \
388 MAX1363_CHAN_B(3, 2, d3m2, 19, bits, 0), \
389 MAX1363_CHAN_B(5, 4, d5m4, 20, bits, 0), \
390 MAX1363_CHAN_B(7, 6, d7m6, 21, bits, 0), \
391 MAX1363_CHAN_B(9, 8, d9m8, 22, bits, 0), \
392 MAX1363_CHAN_B(11, 10, d11m10, 23, bits, 0), \
Jonathan Cameron298cd972011-05-18 14:40:53 +0100393 IIO_CHAN_SOFT_TIMESTAMP(24) \
394 }
395static struct iio_chan_spec max1038_channels[] = MAX1363_12X_CHANS(8);
396static struct iio_chan_spec max1138_channels[] = MAX1363_12X_CHANS(10);
397static struct iio_chan_spec max1238_channels[] = MAX1363_12X_CHANS(12);
Jonathan Cameronc3fa0fdd2010-05-04 14:43:09 +0100398
399static const enum max1363_modes max11607_mode_list[] = {
400 _s0, _s1, _s2, _s3,
401 s0to1, s0to2, s0to3,
402 s2to3,
403 d0m1, d2m3, d1m0, d3m2,
404 d0m1to2m3, d1m0to3m2,
405};
406
407static const enum max1363_modes max11608_mode_list[] = {
408 _s0, _s1, _s2, _s3, _s4, _s5, _s6, _s7,
409 s0to1, s0to2, s0to3, s0to4, s0to5, s0to6, s0to7,
410 s6to7,
411 d0m1, d2m3, d4m5, d6m7,
412 d1m0, d3m2, d5m4, d7m6,
413 d0m1to2m3, d0m1to4m5, d0m1to6m7,
414 d1m0to3m2, d1m0to5m4, d1m0to7m6,
415};
416
Jonathan Cameronade7ef72011-09-02 17:14:45 +0100417#define MAX1363_8X_CHANS(bits) { \
418 MAX1363_CHAN_U(0, _s0, 0, bits, 0), \
419 MAX1363_CHAN_U(1, _s1, 1, bits, 0), \
420 MAX1363_CHAN_U(2, _s2, 2, bits, 0), \
421 MAX1363_CHAN_U(3, _s3, 3, bits, 0), \
422 MAX1363_CHAN_U(4, _s4, 4, bits, 0), \
423 MAX1363_CHAN_U(5, _s5, 5, bits, 0), \
424 MAX1363_CHAN_U(6, _s6, 6, bits, 0), \
425 MAX1363_CHAN_U(7, _s7, 7, bits, 0), \
426 MAX1363_CHAN_B(0, 1, d0m1, 8, bits, 0), \
427 MAX1363_CHAN_B(2, 3, d2m3, 9, bits, 0), \
428 MAX1363_CHAN_B(4, 5, d4m5, 10, bits, 0), \
429 MAX1363_CHAN_B(6, 7, d6m7, 11, bits, 0), \
430 MAX1363_CHAN_B(1, 0, d1m0, 12, bits, 0), \
431 MAX1363_CHAN_B(3, 2, d3m2, 13, bits, 0), \
432 MAX1363_CHAN_B(5, 4, d5m4, 14, bits, 0), \
433 MAX1363_CHAN_B(7, 6, d7m6, 15, bits, 0), \
434 IIO_CHAN_SOFT_TIMESTAMP(16) \
435}
Jonathan Cameron298cd972011-05-18 14:40:53 +0100436static struct iio_chan_spec max11602_channels[] = MAX1363_8X_CHANS(8);
437static struct iio_chan_spec max11608_channels[] = MAX1363_8X_CHANS(10);
438static struct iio_chan_spec max11614_channels[] = MAX1363_8X_CHANS(12);
Jonathan Cameronc3fa0fdd2010-05-04 14:43:09 +0100439
Jonathan Cameron586d1522011-05-18 14:42:10 +0100440static const enum max1363_modes max11644_mode_list[] = {
441 _s0, _s1, s0to1, d0m1, d1m0,
442};
443
444#define MAX1363_2X_CHANS(bits) { \
Jonathan Cameronade7ef72011-09-02 17:14:45 +0100445 MAX1363_CHAN_U(0, _s0, 0, bits, 0), \
446 MAX1363_CHAN_U(1, _s1, 1, bits, 0), \
447 MAX1363_CHAN_B(0, 1, d0m1, 2, bits, 0), \
448 MAX1363_CHAN_B(1, 0, d1m0, 3, bits, 0), \
Jonathan Cameron586d1522011-05-18 14:42:10 +0100449 IIO_CHAN_SOFT_TIMESTAMP(4) \
450 }
451
452static struct iio_chan_spec max11646_channels[] = MAX1363_2X_CHANS(10);
453static struct iio_chan_spec max11644_channels[] = MAX1363_2X_CHANS(12);
454
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100455enum { max1361,
456 max1362,
457 max1363,
458 max1364,
Jonathan Cameron3bf877c2010-05-04 14:43:10 +0100459 max1036,
460 max1037,
461 max1038,
462 max1039,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100463 max1136,
464 max1137,
465 max1138,
466 max1139,
467 max1236,
468 max1237,
469 max1238,
470 max1239,
Jonathan Cameron3bf877c2010-05-04 14:43:10 +0100471 max11600,
472 max11601,
473 max11602,
474 max11603,
475 max11604,
476 max11605,
Jonathan Cameronc3fa0fdd2010-05-04 14:43:09 +0100477 max11606,
478 max11607,
479 max11608,
480 max11609,
481 max11610,
482 max11611,
483 max11612,
484 max11613,
485 max11614,
486 max11615,
487 max11616,
488 max11617,
Jonathan Cameron586d1522011-05-18 14:42:10 +0100489 max11644,
490 max11645,
491 max11646,
492 max11647
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100493};
494
Jonathan Cameron440a5202010-06-26 12:54:23 +0100495static const int max1363_monitor_speeds[] = { 133000, 665000, 33300, 16600,
496 8300, 4200, 2000, 1000 };
497
498static ssize_t max1363_monitor_show_freq(struct device *dev,
499 struct device_attribute *attr,
500 char *buf)
501{
Jonathan Cameron3dba81b2011-04-15 18:55:59 +0100502 struct max1363_state *st = iio_priv(dev_get_drvdata(dev));
Jonathan Cameron440a5202010-06-26 12:54:23 +0100503 return sprintf(buf, "%d\n", max1363_monitor_speeds[st->monitor_speed]);
504}
505
506static ssize_t max1363_monitor_store_freq(struct device *dev,
507 struct device_attribute *attr,
508 const char *buf,
509 size_t len)
510{
Jonathan Cameronb6b70682011-04-15 18:55:58 +0100511 struct iio_dev *indio_dev = dev_get_drvdata(dev);
Jonathan Cameron3dba81b2011-04-15 18:55:59 +0100512 struct max1363_state *st = iio_priv(indio_dev);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100513 int i, ret;
514 unsigned long val;
515 bool found = false;
516
517 ret = strict_strtoul(buf, 10, &val);
518 if (ret)
519 return -EINVAL;
520 for (i = 0; i < ARRAY_SIZE(max1363_monitor_speeds); i++)
521 if (val == max1363_monitor_speeds[i]) {
522 found = true;
523 break;
524 }
525 if (!found)
526 return -EINVAL;
527
Jonathan Cameronb6b70682011-04-15 18:55:58 +0100528 mutex_lock(&indio_dev->mlock);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100529 st->monitor_speed = i;
Jonathan Cameronb6b70682011-04-15 18:55:58 +0100530 mutex_unlock(&indio_dev->mlock);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100531
532 return 0;
533}
534
535static IIO_DEV_ATTR_SAMP_FREQ(S_IRUGO | S_IWUSR,
536 max1363_monitor_show_freq,
537 max1363_monitor_store_freq);
538
539static IIO_CONST_ATTR(sampling_frequency_available,
540 "133000 665000 33300 16600 8300 4200 2000 1000");
541
Jonathan Cameron298cd972011-05-18 14:40:53 +0100542static int max1363_read_thresh(struct iio_dev *indio_dev,
Jonathan Cameron330c6c52011-09-02 17:14:39 +0100543 u64 event_code,
Jonathan Cameron298cd972011-05-18 14:40:53 +0100544 int *val)
Jonathan Cameron440a5202010-06-26 12:54:23 +0100545{
Jonathan Cameron3dba81b2011-04-15 18:55:59 +0100546 struct max1363_state *st = iio_priv(indio_dev);
Jonathan Cameron298cd972011-05-18 14:40:53 +0100547 if (IIO_EVENT_CODE_EXTRACT_DIR(event_code) == IIO_EV_DIR_FALLING)
Lars-Peter Clausenda367162012-02-13 10:25:32 +0100548 *val = st->thresh_low[IIO_EVENT_CODE_EXTRACT_CHAN(event_code)];
Jonathan Cameron440a5202010-06-26 12:54:23 +0100549 else
Lars-Peter Clausenda367162012-02-13 10:25:32 +0100550 *val = st->thresh_high[IIO_EVENT_CODE_EXTRACT_CHAN(event_code)];
Jonathan Cameron298cd972011-05-18 14:40:53 +0100551 return 0;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100552}
553
Jonathan Cameron298cd972011-05-18 14:40:53 +0100554static int max1363_write_thresh(struct iio_dev *indio_dev,
Jonathan Cameron330c6c52011-09-02 17:14:39 +0100555 u64 event_code,
Jonathan Cameron298cd972011-05-18 14:40:53 +0100556 int val)
Jonathan Cameron440a5202010-06-26 12:54:23 +0100557{
Jonathan Cameron298cd972011-05-18 14:40:53 +0100558 struct max1363_state *st = iio_priv(indio_dev);
559 /* make it handle signed correctly as well */
Jonathan Cameron440a5202010-06-26 12:54:23 +0100560 switch (st->chip_info->bits) {
561 case 10:
562 if (val > 0x3FF)
563 return -EINVAL;
564 break;
565 case 12:
566 if (val > 0xFFF)
567 return -EINVAL;
568 break;
569 }
570
Jonathan Cameron298cd972011-05-18 14:40:53 +0100571 switch (IIO_EVENT_CODE_EXTRACT_DIR(event_code)) {
572 case IIO_EV_DIR_FALLING:
Lars-Peter Clausenda367162012-02-13 10:25:32 +0100573 st->thresh_low[IIO_EVENT_CODE_EXTRACT_CHAN(event_code)] = val;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100574 break;
Jonathan Cameron298cd972011-05-18 14:40:53 +0100575 case IIO_EV_DIR_RISING:
Lars-Peter Clausenda367162012-02-13 10:25:32 +0100576 st->thresh_high[IIO_EVENT_CODE_EXTRACT_CHAN(event_code)] = val;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100577 break;
578 }
579
Jonathan Cameron440a5202010-06-26 12:54:23 +0100580 return 0;
581}
582
Jonathan Cameron330c6c52011-09-02 17:14:39 +0100583static const u64 max1363_event_codes[] = {
Jonathan Cameron6835cb62011-09-27 09:56:41 +0100584 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 0,
585 IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING),
586 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 1,
587 IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING),
588 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 2,
589 IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING),
590 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 3,
591 IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING),
592 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 0,
593 IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING),
594 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 1,
595 IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING),
596 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 2,
597 IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING),
598 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 3,
599 IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING),
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100600};
601
Jonathan Cameronaaf370d2011-05-18 14:41:16 +0100602static irqreturn_t max1363_event_handler(int irq, void *private)
Jonathan Cameron440a5202010-06-26 12:54:23 +0100603{
Jonathan Cameronaaf370d2011-05-18 14:41:16 +0100604 struct iio_dev *indio_dev = private;
605 struct max1363_state *st = iio_priv(indio_dev);
606 s64 timestamp = iio_get_time_ns();
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100607 unsigned long mask, loc;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100608 u8 rx;
609 u8 tx[2] = { st->setupbyte,
610 MAX1363_MON_INT_ENABLE | (st->monitor_speed << 1) | 0xF0 };
611
612 i2c_master_recv(st->client, &rx, 1);
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100613 mask = rx;
614 for_each_set_bit(loc, &mask, 8)
Jonathan Cameron5aa96182011-08-30 12:41:06 +0100615 iio_push_event(indio_dev, max1363_event_codes[loc], timestamp);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100616 i2c_master_send(st->client, tx, 2);
Jonathan Cameronaaf370d2011-05-18 14:41:16 +0100617
618 return IRQ_HANDLED;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100619}
620
Jonathan Cameron298cd972011-05-18 14:40:53 +0100621static int max1363_read_event_config(struct iio_dev *indio_dev,
Jonathan Cameron330c6c52011-09-02 17:14:39 +0100622 u64 event_code)
Jonathan Cameron440a5202010-06-26 12:54:23 +0100623{
Jonathan Cameron3dba81b2011-04-15 18:55:59 +0100624 struct max1363_state *st = iio_priv(indio_dev);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100625
Jonathan Cameron298cd972011-05-18 14:40:53 +0100626 int val;
Lars-Peter Clausenda367162012-02-13 10:25:32 +0100627 int number = IIO_EVENT_CODE_EXTRACT_CHAN(event_code);
Jonathan Cameronb6b70682011-04-15 18:55:58 +0100628 mutex_lock(&indio_dev->mlock);
Jonathan Cameron298cd972011-05-18 14:40:53 +0100629 if (IIO_EVENT_CODE_EXTRACT_DIR(event_code) == IIO_EV_DIR_FALLING)
630 val = (1 << number) & st->mask_low;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100631 else
Jonathan Cameron298cd972011-05-18 14:40:53 +0100632 val = (1 << number) & st->mask_high;
Jonathan Cameronb6b70682011-04-15 18:55:58 +0100633 mutex_unlock(&indio_dev->mlock);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100634
Jonathan Cameron298cd972011-05-18 14:40:53 +0100635 return val;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100636}
637
638static int max1363_monitor_mode_update(struct max1363_state *st, int enabled)
639{
640 u8 *tx_buf;
641 int ret, i = 3, j;
642 unsigned long numelements;
643 int len;
Jonathan Cameron32b5eec2011-09-02 17:14:38 +0100644 const long *modemask;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100645
646 if (!enabled) {
647 /* transition to ring capture is not currently supported */
648 st->setupbyte &= ~MAX1363_SETUP_MONITOR_SETUP;
649 st->configbyte &= ~MAX1363_SCAN_MASK;
650 st->monitor_on = false;
651 return max1363_write_basic_config(st->client,
652 st->setupbyte,
653 st->configbyte);
654 }
655
656 /* Ensure we are in the relevant mode */
657 st->setupbyte |= MAX1363_SETUP_MONITOR_SETUP;
658 st->configbyte &= ~(MAX1363_CHANNEL_SEL_MASK
659 | MAX1363_SCAN_MASK
660 | MAX1363_SE_DE_MASK);
661 st->configbyte |= MAX1363_CONFIG_SCAN_MONITOR_MODE;
662 if ((st->mask_low | st->mask_high) & 0x0F) {
663 st->configbyte |= max1363_mode_table[s0to3].conf;
664 modemask = max1363_mode_table[s0to3].modemask;
665 } else if ((st->mask_low | st->mask_high) & 0x30) {
666 st->configbyte |= max1363_mode_table[d0m1to2m3].conf;
667 modemask = max1363_mode_table[d0m1to2m3].modemask;
668 } else {
669 st->configbyte |= max1363_mode_table[d1m0to3m2].conf;
670 modemask = max1363_mode_table[d1m0to3m2].modemask;
671 }
Jonathan Cameron32b5eec2011-09-02 17:14:38 +0100672 numelements = bitmap_weight(modemask, MAX1363_MAX_CHANNELS);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100673 len = 3 * numelements + 3;
674 tx_buf = kmalloc(len, GFP_KERNEL);
675 if (!tx_buf) {
676 ret = -ENOMEM;
677 goto error_ret;
678 }
679 tx_buf[0] = st->configbyte;
680 tx_buf[1] = st->setupbyte;
681 tx_buf[2] = (st->monitor_speed << 1);
682
683 /*
684 * So we need to do yet another bit of nefarious scan mode
685 * setup to match what we need.
686 */
687 for (j = 0; j < 8; j++)
Jonathan Cameron32b5eec2011-09-02 17:14:38 +0100688 if (test_bit(j, modemask)) {
Jonathan Cameron440a5202010-06-26 12:54:23 +0100689 /* Establish the mode is in the scan */
690 if (st->mask_low & (1 << j)) {
691 tx_buf[i] = (st->thresh_low[j] >> 4) & 0xFF;
692 tx_buf[i + 1] = (st->thresh_low[j] << 4) & 0xF0;
693 } else if (j < 4) {
694 tx_buf[i] = 0;
695 tx_buf[i + 1] = 0;
696 } else {
697 tx_buf[i] = 0x80;
698 tx_buf[i + 1] = 0;
699 }
700 if (st->mask_high & (1 << j)) {
701 tx_buf[i + 1] |=
702 (st->thresh_high[j] >> 8) & 0x0F;
703 tx_buf[i + 2] = st->thresh_high[j] & 0xFF;
704 } else if (j < 4) {
705 tx_buf[i + 1] |= 0x0F;
706 tx_buf[i + 2] = 0xFF;
707 } else {
708 tx_buf[i + 1] |= 0x07;
709 tx_buf[i + 2] = 0xFF;
710 }
711 i += 3;
712 }
713
714
715 ret = i2c_master_send(st->client, tx_buf, len);
716 if (ret < 0)
717 goto error_ret;
718 if (ret != len) {
719 ret = -EIO;
720 goto error_ret;
721 }
722
723 /*
724 * Now that we hopefully have sensible thresholds in place it is
725 * time to turn the interrupts on.
726 * It is unclear from the data sheet if this should be necessary
727 * (i.e. whether monitor mode setup is atomic) but it appears to
728 * be in practice.
729 */
730 tx_buf[0] = st->setupbyte;
731 tx_buf[1] = MAX1363_MON_INT_ENABLE | (st->monitor_speed << 1) | 0xF0;
732 ret = i2c_master_send(st->client, tx_buf, 2);
733 if (ret < 0)
734 goto error_ret;
735 if (ret != 2) {
736 ret = -EIO;
737 goto error_ret;
738 }
739 ret = 0;
740 st->monitor_on = true;
741error_ret:
742
743 kfree(tx_buf);
744
745 return ret;
746}
747
748/*
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300749 * To keep this manageable we always use one of 3 scan modes.
Jonathan Cameron440a5202010-06-26 12:54:23 +0100750 * Scan 0...3, 0-1,2-3 and 1-0,3-2
751 */
Jonathan Cameron298cd972011-05-18 14:40:53 +0100752
Jonathan Cameron440a5202010-06-26 12:54:23 +0100753static inline int __max1363_check_event_mask(int thismask, int checkmask)
754{
755 int ret = 0;
756 /* Is it unipolar */
757 if (thismask < 4) {
758 if (checkmask & ~0x0F) {
759 ret = -EBUSY;
760 goto error_ret;
761 }
762 } else if (thismask < 6) {
763 if (checkmask & ~0x30) {
764 ret = -EBUSY;
765 goto error_ret;
766 }
767 } else if (checkmask & ~0xC0)
768 ret = -EBUSY;
769error_ret:
770 return ret;
771}
772
Jonathan Cameron298cd972011-05-18 14:40:53 +0100773static int max1363_write_event_config(struct iio_dev *indio_dev,
Jonathan Cameron330c6c52011-09-02 17:14:39 +0100774 u64 event_code,
Jonathan Cameron298cd972011-05-18 14:40:53 +0100775 int state)
Jonathan Cameron440a5202010-06-26 12:54:23 +0100776{
Jonathan Cameron298cd972011-05-18 14:40:53 +0100777 int ret = 0;
Jonathan Cameron3dba81b2011-04-15 18:55:59 +0100778 struct max1363_state *st = iio_priv(indio_dev);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100779 u16 unifiedmask;
Lars-Peter Clausenda367162012-02-13 10:25:32 +0100780 int number = IIO_EVENT_CODE_EXTRACT_CHAN(event_code);
Jonathan Cameron298cd972011-05-18 14:40:53 +0100781
Jonathan Cameron3dba81b2011-04-15 18:55:59 +0100782 mutex_lock(&indio_dev->mlock);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100783 unifiedmask = st->mask_low | st->mask_high;
Jonathan Cameron298cd972011-05-18 14:40:53 +0100784 if (IIO_EVENT_CODE_EXTRACT_DIR(event_code) == IIO_EV_DIR_FALLING) {
785
786 if (state == 0)
787 st->mask_low &= ~(1 << number);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100788 else {
Jonathan Cameron298cd972011-05-18 14:40:53 +0100789 ret = __max1363_check_event_mask((1 << number),
790 unifiedmask);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100791 if (ret)
792 goto error_ret;
Jonathan Cameron298cd972011-05-18 14:40:53 +0100793 st->mask_low |= (1 << number);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100794 }
795 } else {
Jonathan Cameron298cd972011-05-18 14:40:53 +0100796 if (state == 0)
797 st->mask_high &= ~(1 << number);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100798 else {
Jonathan Cameron298cd972011-05-18 14:40:53 +0100799 ret = __max1363_check_event_mask((1 << number),
800 unifiedmask);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100801 if (ret)
802 goto error_ret;
Jonathan Cameron298cd972011-05-18 14:40:53 +0100803 st->mask_high |= (1 << number);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100804 }
805 }
Jonathan Cameron440a5202010-06-26 12:54:23 +0100806
807 max1363_monitor_mode_update(st, !!(st->mask_high | st->mask_low));
808error_ret:
Jonathan Cameron3dba81b2011-04-15 18:55:59 +0100809 mutex_unlock(&indio_dev->mlock);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100810
Jonathan Cameron298cd972011-05-18 14:40:53 +0100811 return ret;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100812}
813
Jonathan Cameron440a5202010-06-26 12:54:23 +0100814/*
815 * As with scan_elements, only certain sets of these can
816 * be combined.
817 */
818static struct attribute *max1363_event_attributes[] = {
Jonathan Cameron440a5202010-06-26 12:54:23 +0100819 &iio_dev_attr_sampling_frequency.dev_attr.attr,
820 &iio_const_attr_sampling_frequency_available.dev_attr.attr,
Jonathan Cameron440a5202010-06-26 12:54:23 +0100821 NULL,
822};
823
824static struct attribute_group max1363_event_attribute_group = {
825 .attrs = max1363_event_attributes,
Jonathan Cameron8e7d9672011-08-30 12:32:45 +0100826 .name = "events",
Jonathan Cameron440a5202010-06-26 12:54:23 +0100827};
828
Jonathan Cameron6fe81352011-05-18 14:42:37 +0100829#define MAX1363_EVENT_FUNCS \
830
831
832static const struct iio_info max1238_info = {
833 .read_raw = &max1363_read_raw,
834 .driver_module = THIS_MODULE,
Jonathan Camerona9ea1b12012-04-10 21:11:05 +0100835 .update_scan_mode = &max1363_update_scan_mode,
Jonathan Cameron6fe81352011-05-18 14:42:37 +0100836};
837
838static const struct iio_info max1363_info = {
839 .read_event_value = &max1363_read_thresh,
840 .write_event_value = &max1363_write_thresh,
841 .read_event_config = &max1363_read_event_config,
842 .write_event_config = &max1363_write_event_config,
843 .read_raw = &max1363_read_raw,
Jonathan Cameronc52cfb62011-12-05 21:37:15 +0000844 .update_scan_mode = &max1363_update_scan_mode,
Jonathan Cameron6fe81352011-05-18 14:42:37 +0100845 .driver_module = THIS_MODULE,
Jonathan Cameron6fe81352011-05-18 14:42:37 +0100846 .event_attrs = &max1363_event_attribute_group,
847};
848
849/* max1363 and max1368 tested - rest from data sheet */
850static const struct max1363_chip_info max1363_chip_info_tbl[] = {
851 [max1361] = {
852 .bits = 10,
853 .int_vref_mv = 2048,
854 .mode_list = max1363_mode_list,
855 .num_modes = ARRAY_SIZE(max1363_mode_list),
856 .default_mode = s0to3,
857 .channels = max1361_channels,
858 .num_channels = ARRAY_SIZE(max1361_channels),
859 .info = &max1363_info,
860 },
861 [max1362] = {
862 .bits = 10,
863 .int_vref_mv = 4096,
864 .mode_list = max1363_mode_list,
865 .num_modes = ARRAY_SIZE(max1363_mode_list),
866 .default_mode = s0to3,
867 .channels = max1361_channels,
868 .num_channels = ARRAY_SIZE(max1361_channels),
869 .info = &max1363_info,
870 },
871 [max1363] = {
872 .bits = 12,
873 .int_vref_mv = 2048,
874 .mode_list = max1363_mode_list,
875 .num_modes = ARRAY_SIZE(max1363_mode_list),
876 .default_mode = s0to3,
877 .channels = max1363_channels,
878 .num_channels = ARRAY_SIZE(max1363_channels),
879 .info = &max1363_info,
880 },
881 [max1364] = {
882 .bits = 12,
883 .int_vref_mv = 4096,
884 .mode_list = max1363_mode_list,
885 .num_modes = ARRAY_SIZE(max1363_mode_list),
886 .default_mode = s0to3,
887 .channels = max1363_channels,
888 .num_channels = ARRAY_SIZE(max1363_channels),
889 .info = &max1363_info,
890 },
891 [max1036] = {
892 .bits = 8,
893 .int_vref_mv = 4096,
894 .mode_list = max1236_mode_list,
895 .num_modes = ARRAY_SIZE(max1236_mode_list),
896 .default_mode = s0to3,
897 .info = &max1238_info,
898 .channels = max1036_channels,
899 .num_channels = ARRAY_SIZE(max1036_channels),
900 },
901 [max1037] = {
902 .bits = 8,
903 .int_vref_mv = 2048,
904 .mode_list = max1236_mode_list,
905 .num_modes = ARRAY_SIZE(max1236_mode_list),
906 .default_mode = s0to3,
907 .info = &max1238_info,
908 .channels = max1036_channels,
909 .num_channels = ARRAY_SIZE(max1036_channels),
910 },
911 [max1038] = {
912 .bits = 8,
913 .int_vref_mv = 4096,
914 .mode_list = max1238_mode_list,
915 .num_modes = ARRAY_SIZE(max1238_mode_list),
916 .default_mode = s0to11,
917 .info = &max1238_info,
918 .channels = max1038_channels,
919 .num_channels = ARRAY_SIZE(max1038_channels),
920 },
921 [max1039] = {
922 .bits = 8,
923 .int_vref_mv = 2048,
924 .mode_list = max1238_mode_list,
925 .num_modes = ARRAY_SIZE(max1238_mode_list),
926 .default_mode = s0to11,
927 .info = &max1238_info,
928 .channels = max1038_channels,
929 .num_channels = ARRAY_SIZE(max1038_channels),
930 },
931 [max1136] = {
932 .bits = 10,
933 .int_vref_mv = 4096,
934 .mode_list = max1236_mode_list,
935 .num_modes = ARRAY_SIZE(max1236_mode_list),
936 .default_mode = s0to3,
937 .info = &max1238_info,
938 .channels = max1136_channels,
939 .num_channels = ARRAY_SIZE(max1136_channels),
940 },
941 [max1137] = {
942 .bits = 10,
943 .int_vref_mv = 2048,
944 .mode_list = max1236_mode_list,
945 .num_modes = ARRAY_SIZE(max1236_mode_list),
946 .default_mode = s0to3,
947 .info = &max1238_info,
948 .channels = max1136_channels,
949 .num_channels = ARRAY_SIZE(max1136_channels),
950 },
951 [max1138] = {
952 .bits = 10,
953 .int_vref_mv = 4096,
954 .mode_list = max1238_mode_list,
955 .num_modes = ARRAY_SIZE(max1238_mode_list),
956 .default_mode = s0to11,
957 .info = &max1238_info,
958 .channels = max1138_channels,
959 .num_channels = ARRAY_SIZE(max1138_channels),
960 },
961 [max1139] = {
962 .bits = 10,
963 .int_vref_mv = 2048,
964 .mode_list = max1238_mode_list,
965 .num_modes = ARRAY_SIZE(max1238_mode_list),
966 .default_mode = s0to11,
967 .info = &max1238_info,
968 .channels = max1138_channels,
969 .num_channels = ARRAY_SIZE(max1138_channels),
970 },
971 [max1236] = {
972 .bits = 12,
973 .int_vref_mv = 4096,
974 .mode_list = max1236_mode_list,
975 .num_modes = ARRAY_SIZE(max1236_mode_list),
976 .default_mode = s0to3,
977 .info = &max1238_info,
978 .channels = max1236_channels,
979 .num_channels = ARRAY_SIZE(max1236_channels),
980 },
981 [max1237] = {
982 .bits = 12,
983 .int_vref_mv = 2048,
984 .mode_list = max1236_mode_list,
985 .num_modes = ARRAY_SIZE(max1236_mode_list),
986 .default_mode = s0to3,
987 .info = &max1238_info,
988 .channels = max1236_channels,
989 .num_channels = ARRAY_SIZE(max1236_channels),
990 },
991 [max1238] = {
992 .bits = 12,
993 .int_vref_mv = 4096,
994 .mode_list = max1238_mode_list,
995 .num_modes = ARRAY_SIZE(max1238_mode_list),
996 .default_mode = s0to11,
997 .info = &max1238_info,
998 .channels = max1238_channels,
999 .num_channels = ARRAY_SIZE(max1238_channels),
1000 },
1001 [max1239] = {
1002 .bits = 12,
1003 .int_vref_mv = 2048,
1004 .mode_list = max1238_mode_list,
1005 .num_modes = ARRAY_SIZE(max1238_mode_list),
1006 .default_mode = s0to11,
1007 .info = &max1238_info,
1008 .channels = max1238_channels,
1009 .num_channels = ARRAY_SIZE(max1238_channels),
1010 },
1011 [max11600] = {
1012 .bits = 8,
1013 .int_vref_mv = 4096,
1014 .mode_list = max11607_mode_list,
1015 .num_modes = ARRAY_SIZE(max11607_mode_list),
1016 .default_mode = s0to3,
1017 .info = &max1238_info,
1018 .channels = max1036_channels,
1019 .num_channels = ARRAY_SIZE(max1036_channels),
1020 },
1021 [max11601] = {
1022 .bits = 8,
1023 .int_vref_mv = 2048,
1024 .mode_list = max11607_mode_list,
1025 .num_modes = ARRAY_SIZE(max11607_mode_list),
1026 .default_mode = s0to3,
1027 .info = &max1238_info,
1028 .channels = max1036_channels,
1029 .num_channels = ARRAY_SIZE(max1036_channels),
1030 },
1031 [max11602] = {
1032 .bits = 8,
1033 .int_vref_mv = 4096,
1034 .mode_list = max11608_mode_list,
1035 .num_modes = ARRAY_SIZE(max11608_mode_list),
1036 .default_mode = s0to7,
1037 .info = &max1238_info,
1038 .channels = max11602_channels,
1039 .num_channels = ARRAY_SIZE(max11602_channels),
1040 },
1041 [max11603] = {
1042 .bits = 8,
1043 .int_vref_mv = 2048,
1044 .mode_list = max11608_mode_list,
1045 .num_modes = ARRAY_SIZE(max11608_mode_list),
1046 .default_mode = s0to7,
1047 .info = &max1238_info,
1048 .channels = max11602_channels,
1049 .num_channels = ARRAY_SIZE(max11602_channels),
1050 },
1051 [max11604] = {
1052 .bits = 8,
1053 .int_vref_mv = 4098,
1054 .mode_list = max1238_mode_list,
1055 .num_modes = ARRAY_SIZE(max1238_mode_list),
1056 .default_mode = s0to11,
1057 .info = &max1238_info,
1058 .channels = max1238_channels,
1059 .num_channels = ARRAY_SIZE(max1238_channels),
1060 },
1061 [max11605] = {
1062 .bits = 8,
1063 .int_vref_mv = 2048,
1064 .mode_list = max1238_mode_list,
1065 .num_modes = ARRAY_SIZE(max1238_mode_list),
1066 .default_mode = s0to11,
1067 .info = &max1238_info,
1068 .channels = max1238_channels,
1069 .num_channels = ARRAY_SIZE(max1238_channels),
1070 },
1071 [max11606] = {
1072 .bits = 10,
1073 .int_vref_mv = 4096,
1074 .mode_list = max11607_mode_list,
1075 .num_modes = ARRAY_SIZE(max11607_mode_list),
1076 .default_mode = s0to3,
1077 .info = &max1238_info,
1078 .channels = max1136_channels,
1079 .num_channels = ARRAY_SIZE(max1136_channels),
1080 },
1081 [max11607] = {
1082 .bits = 10,
1083 .int_vref_mv = 2048,
1084 .mode_list = max11607_mode_list,
1085 .num_modes = ARRAY_SIZE(max11607_mode_list),
1086 .default_mode = s0to3,
1087 .info = &max1238_info,
1088 .channels = max1136_channels,
1089 .num_channels = ARRAY_SIZE(max1136_channels),
1090 },
1091 [max11608] = {
1092 .bits = 10,
1093 .int_vref_mv = 4096,
1094 .mode_list = max11608_mode_list,
1095 .num_modes = ARRAY_SIZE(max11608_mode_list),
1096 .default_mode = s0to7,
1097 .info = &max1238_info,
1098 .channels = max11608_channels,
1099 .num_channels = ARRAY_SIZE(max11608_channels),
1100 },
1101 [max11609] = {
1102 .bits = 10,
1103 .int_vref_mv = 2048,
1104 .mode_list = max11608_mode_list,
1105 .num_modes = ARRAY_SIZE(max11608_mode_list),
1106 .default_mode = s0to7,
1107 .info = &max1238_info,
1108 .channels = max11608_channels,
1109 .num_channels = ARRAY_SIZE(max11608_channels),
1110 },
1111 [max11610] = {
1112 .bits = 10,
1113 .int_vref_mv = 4098,
1114 .mode_list = max1238_mode_list,
1115 .num_modes = ARRAY_SIZE(max1238_mode_list),
1116 .default_mode = s0to11,
1117 .info = &max1238_info,
1118 .channels = max1238_channels,
1119 .num_channels = ARRAY_SIZE(max1238_channels),
1120 },
1121 [max11611] = {
1122 .bits = 10,
1123 .int_vref_mv = 2048,
1124 .mode_list = max1238_mode_list,
1125 .num_modes = ARRAY_SIZE(max1238_mode_list),
1126 .default_mode = s0to11,
1127 .info = &max1238_info,
1128 .channels = max1238_channels,
1129 .num_channels = ARRAY_SIZE(max1238_channels),
1130 },
1131 [max11612] = {
1132 .bits = 12,
1133 .int_vref_mv = 4096,
1134 .mode_list = max11607_mode_list,
1135 .num_modes = ARRAY_SIZE(max11607_mode_list),
1136 .default_mode = s0to3,
1137 .info = &max1238_info,
1138 .channels = max1363_channels,
1139 .num_channels = ARRAY_SIZE(max1363_channels),
1140 },
1141 [max11613] = {
1142 .bits = 12,
1143 .int_vref_mv = 2048,
1144 .mode_list = max11607_mode_list,
1145 .num_modes = ARRAY_SIZE(max11607_mode_list),
1146 .default_mode = s0to3,
1147 .info = &max1238_info,
1148 .channels = max1363_channels,
1149 .num_channels = ARRAY_SIZE(max1363_channels),
1150 },
1151 [max11614] = {
1152 .bits = 12,
1153 .int_vref_mv = 4096,
1154 .mode_list = max11608_mode_list,
1155 .num_modes = ARRAY_SIZE(max11608_mode_list),
1156 .default_mode = s0to7,
1157 .info = &max1238_info,
1158 .channels = max11614_channels,
1159 .num_channels = ARRAY_SIZE(max11614_channels),
1160 },
1161 [max11615] = {
1162 .bits = 12,
1163 .int_vref_mv = 2048,
1164 .mode_list = max11608_mode_list,
1165 .num_modes = ARRAY_SIZE(max11608_mode_list),
1166 .default_mode = s0to7,
1167 .info = &max1238_info,
1168 .channels = max11614_channels,
1169 .num_channels = ARRAY_SIZE(max11614_channels),
1170 },
1171 [max11616] = {
1172 .bits = 12,
1173 .int_vref_mv = 4098,
1174 .mode_list = max1238_mode_list,
1175 .num_modes = ARRAY_SIZE(max1238_mode_list),
1176 .default_mode = s0to11,
1177 .info = &max1238_info,
1178 .channels = max1238_channels,
1179 .num_channels = ARRAY_SIZE(max1238_channels),
1180 },
1181 [max11617] = {
1182 .bits = 12,
1183 .int_vref_mv = 2048,
1184 .mode_list = max1238_mode_list,
1185 .num_modes = ARRAY_SIZE(max1238_mode_list),
1186 .default_mode = s0to11,
1187 .info = &max1238_info,
1188 .channels = max1238_channels,
1189 .num_channels = ARRAY_SIZE(max1238_channels),
1190 },
1191 [max11644] = {
1192 .bits = 12,
1193 .int_vref_mv = 2048,
1194 .mode_list = max11644_mode_list,
1195 .num_modes = ARRAY_SIZE(max11644_mode_list),
1196 .default_mode = s0to1,
1197 .info = &max1238_info,
1198 .channels = max11644_channels,
1199 .num_channels = ARRAY_SIZE(max11644_channels),
1200 },
1201 [max11645] = {
1202 .bits = 12,
1203 .int_vref_mv = 4096,
1204 .mode_list = max11644_mode_list,
1205 .num_modes = ARRAY_SIZE(max11644_mode_list),
1206 .default_mode = s0to1,
1207 .info = &max1238_info,
1208 .channels = max11644_channels,
1209 .num_channels = ARRAY_SIZE(max11644_channels),
1210 },
1211 [max11646] = {
1212 .bits = 10,
1213 .int_vref_mv = 2048,
1214 .mode_list = max11644_mode_list,
1215 .num_modes = ARRAY_SIZE(max11644_mode_list),
1216 .default_mode = s0to1,
1217 .info = &max1238_info,
1218 .channels = max11646_channels,
1219 .num_channels = ARRAY_SIZE(max11646_channels),
1220 },
1221 [max11647] = {
1222 .bits = 10,
1223 .int_vref_mv = 4096,
1224 .mode_list = max11644_mode_list,
1225 .num_modes = ARRAY_SIZE(max11644_mode_list),
1226 .default_mode = s0to1,
1227 .info = &max1238_info,
1228 .channels = max11646_channels,
1229 .num_channels = ARRAY_SIZE(max11646_channels),
1230 },
1231};
1232
1233
1234
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001235static int max1363_initial_setup(struct max1363_state *st)
1236{
1237 st->setupbyte = MAX1363_SETUP_AIN3_IS_AIN3_REF_IS_VDD
1238 | MAX1363_SETUP_POWER_UP_INT_REF
1239 | MAX1363_SETUP_INT_CLOCK
1240 | MAX1363_SETUP_UNIPOLAR
1241 | MAX1363_SETUP_NORESET;
1242
1243 /* Set scan mode writes the config anyway so wait until then*/
1244 st->setupbyte = MAX1363_SETUP_BYTE(st->setupbyte);
1245 st->current_mode = &max1363_mode_table[st->chip_info->default_mode];
1246 st->configbyte = MAX1363_CONFIG_BYTE(st->configbyte);
1247
1248 return max1363_set_scan_mode(st);
1249}
1250
Michael Hennerichcd4361c2012-02-22 13:16:49 +01001251static int __devinit max1363_alloc_scan_masks(struct iio_dev *indio_dev)
1252{
1253 struct max1363_state *st = iio_priv(indio_dev);
1254 unsigned long *masks;
1255 int i;
1256
1257 masks = kzalloc(BITS_TO_LONGS(MAX1363_MAX_CHANNELS)*sizeof(long)*
1258 (st->chip_info->num_modes + 1), GFP_KERNEL);
1259 if (!masks)
1260 return -ENOMEM;
1261
1262 for (i = 0; i < st->chip_info->num_modes; i++)
1263 bitmap_copy(masks + BITS_TO_LONGS(MAX1363_MAX_CHANNELS)*i,
1264 max1363_mode_table[st->chip_info->mode_list[i]]
1265 .modemask, MAX1363_MAX_CHANNELS);
1266
1267 indio_dev->available_scan_masks = masks;
1268
1269 return 0;
1270}
1271
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001272static int __devinit max1363_probe(struct i2c_client *client,
1273 const struct i2c_device_id *id)
1274{
Michael Hennerichcd4361c2012-02-22 13:16:49 +01001275 int ret;
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001276 struct max1363_state *st;
1277 struct iio_dev *indio_dev;
1278 struct regulator *reg;
1279
1280 reg = regulator_get(&client->dev, "vcc");
Dan Carpenterf88af7e2011-06-08 09:42:21 +03001281 if (IS_ERR(reg)) {
1282 ret = PTR_ERR(reg);
1283 goto error_out;
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001284 }
1285
Dan Carpenterf88af7e2011-06-08 09:42:21 +03001286 ret = regulator_enable(reg);
1287 if (ret)
1288 goto error_put_reg;
1289
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001290 indio_dev = iio_allocate_device(sizeof(struct max1363_state));
1291 if (indio_dev == NULL) {
1292 ret = -ENOMEM;
1293 goto error_disable_reg;
1294 }
Jonathan Cameron0b27d672012-04-10 21:11:07 +01001295 ret = iio_map_array_register(indio_dev, client->dev.platform_data);
1296 if (ret < 0)
1297 goto error_free_device;
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001298 st = iio_priv(indio_dev);
1299 st->reg = reg;
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001300 /* this is only used for device removal purposes */
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001301 i2c_set_clientdata(client, indio_dev);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001302
Jonathan Cameron962a4cc2010-06-26 12:54:13 +01001303 st->chip_info = &max1363_chip_info_tbl[id->driver_data];
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001304 st->client = client;
1305
Michael Hennerichcd4361c2012-02-22 13:16:49 +01001306 ret = max1363_alloc_scan_masks(indio_dev);
1307 if (ret)
Jonathan Cameron0b27d672012-04-10 21:11:07 +01001308 goto error_unregister_map;
Jonathan Cameron82020b02010-05-04 14:43:03 +01001309
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001310 /* Estabilish that the iio_dev is a child of the i2c device */
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001311 indio_dev->dev.parent = &client->dev;
Jonathan Cameron845bd122011-05-18 14:41:44 +01001312 indio_dev->name = id->name;
Jonathan Cameron8e7d9672011-08-30 12:32:45 +01001313 indio_dev->channels = st->chip_info->channels;
1314 indio_dev->num_channels = st->chip_info->num_channels;
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001315 indio_dev->info = st->chip_info->info;
1316 indio_dev->modes = INDIO_DIRECT_MODE;
Jonathan Cameroncd038012011-08-12 16:55:29 +01001317 indio_dev->channels = st->chip_info->channels;
1318 indio_dev->num_channels = st->chip_info->num_channels;
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001319 ret = max1363_initial_setup(st);
Jonathan Cameron58f0a252011-05-18 14:42:38 +01001320 if (ret < 0)
Jonathan Cameron82020b02010-05-04 14:43:03 +01001321 goto error_free_available_scan_masks;
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001322
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001323 ret = max1363_register_ring_funcs_and_init(indio_dev);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001324 if (ret)
Jonathan Cameron82020b02010-05-04 14:43:03 +01001325 goto error_free_available_scan_masks;
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001326
Jonathan Cameron14555b12011-09-21 11:15:57 +01001327 ret = iio_buffer_register(indio_dev,
1328 st->chip_info->channels,
1329 st->chip_info->num_channels);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001330 if (ret)
1331 goto error_cleanup_ring;
Jonathan Cameron440a5202010-06-26 12:54:23 +01001332
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001333 if (client->irq) {
Jonathan Cameronaaf370d2011-05-18 14:41:16 +01001334 ret = request_threaded_irq(st->client->irq,
1335 NULL,
1336 &max1363_event_handler,
1337 IRQF_TRIGGER_RISING | IRQF_ONESHOT,
1338 "max1363_event",
1339 indio_dev);
Jonathan Cameron298cd972011-05-18 14:40:53 +01001340
Jonathan Cameron440a5202010-06-26 12:54:23 +01001341 if (ret)
1342 goto error_uninit_ring;
Jonathan Cameron440a5202010-06-26 12:54:23 +01001343 }
1344
Jonathan Cameron26d25ae2011-09-02 17:14:40 +01001345 ret = iio_device_register(indio_dev);
1346 if (ret < 0)
1347 goto error_free_irq;
Dan Carpenterf88af7e2011-06-08 09:42:21 +03001348
Jonathan Cameron26d25ae2011-09-02 17:14:40 +01001349 return 0;
1350error_free_irq:
1351 free_irq(st->client->irq, indio_dev);
Jonathan Cameron440a5202010-06-26 12:54:23 +01001352error_uninit_ring:
Jonathan Cameron14555b12011-09-21 11:15:57 +01001353 iio_buffer_unregister(indio_dev);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001354error_cleanup_ring:
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001355 max1363_ring_cleanup(indio_dev);
Jonathan Cameron82020b02010-05-04 14:43:03 +01001356error_free_available_scan_masks:
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001357 kfree(indio_dev->available_scan_masks);
Jonathan Cameron0b27d672012-04-10 21:11:07 +01001358error_unregister_map:
1359 iio_map_array_unregister(indio_dev, client->dev.platform_data);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001360error_free_device:
Jonathan Cameron26d25ae2011-09-02 17:14:40 +01001361 iio_free_device(indio_dev);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001362error_disable_reg:
Dan Carpenterf88af7e2011-06-08 09:42:21 +03001363 regulator_disable(reg);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001364error_put_reg:
Dan Carpenterf88af7e2011-06-08 09:42:21 +03001365 regulator_put(reg);
1366error_out:
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001367 return ret;
1368}
1369
1370static int max1363_remove(struct i2c_client *client)
1371{
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001372 struct iio_dev *indio_dev = i2c_get_clientdata(client);
1373 struct max1363_state *st = iio_priv(indio_dev);
1374 struct regulator *reg = st->reg;
Jonathan Cameron440a5202010-06-26 12:54:23 +01001375
Jonathan Camerond2fffd62011-10-14 14:46:58 +01001376 iio_device_unregister(indio_dev);
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001377 if (client->irq)
Jonathan Cameronaaf370d2011-05-18 14:41:16 +01001378 free_irq(st->client->irq, indio_dev);
Jonathan Cameron14555b12011-09-21 11:15:57 +01001379 iio_buffer_unregister(indio_dev);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001380 max1363_ring_cleanup(indio_dev);
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001381 kfree(indio_dev->available_scan_masks);
1382 if (!IS_ERR(reg)) {
1383 regulator_disable(reg);
1384 regulator_put(reg);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001385 }
Jonathan Cameron0b27d672012-04-10 21:11:07 +01001386 iio_map_array_unregister(indio_dev, client->dev.platform_data);
Jonathan Camerond2fffd62011-10-14 14:46:58 +01001387 iio_free_device(indio_dev);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001388
1389 return 0;
1390}
1391
1392static const struct i2c_device_id max1363_id[] = {
1393 { "max1361", max1361 },
1394 { "max1362", max1362 },
1395 { "max1363", max1363 },
1396 { "max1364", max1364 },
Jonathan Cameron3bf877c2010-05-04 14:43:10 +01001397 { "max1036", max1036 },
1398 { "max1037", max1037 },
1399 { "max1038", max1038 },
1400 { "max1039", max1039 },
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001401 { "max1136", max1136 },
1402 { "max1137", max1137 },
1403 { "max1138", max1138 },
1404 { "max1139", max1139 },
1405 { "max1236", max1236 },
1406 { "max1237", max1237 },
1407 { "max1238", max1238 },
1408 { "max1239", max1239 },
Jonathan Cameron3bf877c2010-05-04 14:43:10 +01001409 { "max11600", max11600 },
1410 { "max11601", max11601 },
1411 { "max11602", max11602 },
1412 { "max11603", max11603 },
1413 { "max11604", max11604 },
1414 { "max11605", max11605 },
Jonathan Cameronc3fa0fdd2010-05-04 14:43:09 +01001415 { "max11606", max11606 },
1416 { "max11607", max11607 },
1417 { "max11608", max11608 },
1418 { "max11609", max11609 },
1419 { "max11610", max11610 },
1420 { "max11611", max11611 },
1421 { "max11612", max11612 },
1422 { "max11613", max11613 },
1423 { "max11614", max11614 },
1424 { "max11615", max11615 },
1425 { "max11616", max11616 },
1426 { "max11617", max11617 },
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001427 {}
1428};
1429
1430MODULE_DEVICE_TABLE(i2c, max1363_id);
1431
1432static struct i2c_driver max1363_driver = {
1433 .driver = {
1434 .name = "max1363",
1435 },
1436 .probe = max1363_probe,
1437 .remove = max1363_remove,
1438 .id_table = max1363_id,
1439};
Lars-Peter Clausen6e5af182011-11-16 10:13:38 +01001440module_i2c_driver(max1363_driver);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001441
1442MODULE_AUTHOR("Jonathan Cameron <jic23@cam.ac.uk>");
1443MODULE_DESCRIPTION("Maxim 1363 ADC");
1444MODULE_LICENSE("GPL v2");