blob: 998dc3caad4c15cabe58f7922a594e6976de23ec [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 *
Vivien Didelot82b7afb2014-10-01 20:59:00 +010011 * Driver for max1363 and similar chips.
12 *
Jonathan Cameron82020b02010-05-04 14:43:03 +010013 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License version 2 as
15 * published by the Free Software Foundation.
Jonathan Cameron82020b02010-05-04 14:43:03 +010016 */
Jonathan Camerond1325cf2009-08-18 18:06:20 +010017
18#include <linux/interrupt.h>
Jonathan Camerond1325cf2009-08-18 18:06:20 +010019#include <linux/device.h>
20#include <linux/kernel.h>
21#include <linux/sysfs.h>
22#include <linux/list.h>
23#include <linux/i2c.h>
Jonathan Camerond1325cf2009-08-18 18:06:20 +010024#include <linux/regulator/consumer.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090025#include <linux/slab.h>
Jonathan Cameronc40ab872010-06-26 12:54:14 +010026#include <linux/err.h>
Paul Gortmaker99c97852011-07-03 15:49:50 -040027#include <linux/module.h>
Jonathan Camerond1325cf2009-08-18 18:06:20 +010028
Jonathan Cameron06458e22012-04-25 15:54:58 +010029#include <linux/iio/iio.h>
30#include <linux/iio/sysfs.h>
31#include <linux/iio/events.h>
32#include <linux/iio/buffer.h>
33#include <linux/iio/driver.h>
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +010034#include <linux/iio/kfifo_buf.h>
35#include <linux/iio/trigger_consumer.h>
Peter Meerwald4389fbe2012-12-30 23:26:00 +000036#include <linux/iio/triggered_buffer.h>
Jonathan Cameroncdf38702011-08-12 17:08:43 +010037
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +010038#define MAX1363_SETUP_BYTE(a) ((a) | 0x80)
39
40/* There is a fair bit more defined here than currently
41 * used, but the intention is to support everything these
42 * chips do in the long run */
43
44/* see data sheets */
45/* max1363 and max1236, max1237, max1238, max1239 */
46#define MAX1363_SETUP_AIN3_IS_AIN3_REF_IS_VDD 0x00
47#define MAX1363_SETUP_AIN3_IS_REF_EXT_TO_REF 0x20
48#define MAX1363_SETUP_AIN3_IS_AIN3_REF_IS_INT 0x40
49#define MAX1363_SETUP_AIN3_IS_REF_REF_IS_INT 0x60
50#define MAX1363_SETUP_POWER_UP_INT_REF 0x10
51#define MAX1363_SETUP_POWER_DOWN_INT_REF 0x00
52
Peter Meerwald71d2c122012-12-30 23:26:00 +000053/* think about including max11600 etc - more settings */
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +010054#define MAX1363_SETUP_EXT_CLOCK 0x08
55#define MAX1363_SETUP_INT_CLOCK 0x00
56#define MAX1363_SETUP_UNIPOLAR 0x00
57#define MAX1363_SETUP_BIPOLAR 0x04
58#define MAX1363_SETUP_RESET 0x00
59#define MAX1363_SETUP_NORESET 0x02
60/* max1363 only - though don't care on others.
61 * For now monitor modes are not implemented as the relevant
62 * line is not connected on my test board.
63 * The definitions are here as I intend to add this soon.
64 */
65#define MAX1363_SETUP_MONITOR_SETUP 0x01
66
67/* Specific to the max1363 */
68#define MAX1363_MON_RESET_CHAN(a) (1 << ((a) + 4))
69#define MAX1363_MON_INT_ENABLE 0x01
70
71/* defined for readability reasons */
72/* All chips */
73#define MAX1363_CONFIG_BYTE(a) ((a))
74
75#define MAX1363_CONFIG_SE 0x01
76#define MAX1363_CONFIG_DE 0x00
77#define MAX1363_CONFIG_SCAN_TO_CS 0x00
78#define MAX1363_CONFIG_SCAN_SINGLE_8 0x20
79#define MAX1363_CONFIG_SCAN_MONITOR_MODE 0x40
80#define MAX1363_CONFIG_SCAN_SINGLE_1 0x60
81/* max123{6-9} only */
82#define MAX1236_SCAN_MID_TO_CHANNEL 0x40
83
Peter Meerwald71d2c122012-12-30 23:26:00 +000084/* max1363 only - merely part of channel selects or don't care for others */
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +010085#define MAX1363_CONFIG_EN_MON_MODE_READ 0x18
86
87#define MAX1363_CHANNEL_SEL(a) ((a) << 1)
88
89/* max1363 strictly 0x06 - but doesn't matter */
90#define MAX1363_CHANNEL_SEL_MASK 0x1E
91#define MAX1363_SCAN_MASK 0x60
92#define MAX1363_SE_DE_MASK 0x01
93
94#define MAX1363_MAX_CHANNELS 25
95/**
96 * struct max1363_mode - scan mode information
97 * @conf: The corresponding value of the configuration register
98 * @modemask: Bit mask corresponding to channels enabled in this mode
99 */
100struct max1363_mode {
101 int8_t conf;
102 DECLARE_BITMAP(modemask, MAX1363_MAX_CHANNELS);
103};
104
105/* This must be maintained along side the max1363_mode_table in max1363_core */
106enum max1363_modes {
107 /* Single read of a single channel */
108 _s0, _s1, _s2, _s3, _s4, _s5, _s6, _s7, _s8, _s9, _s10, _s11,
109 /* Differential single read */
110 d0m1, d2m3, d4m5, d6m7, d8m9, d10m11,
111 d1m0, d3m2, d5m4, d7m6, d9m8, d11m10,
112 /* Scan to channel and mid to channel where overlapping */
113 s0to1, s0to2, s2to3, s0to3, s0to4, s0to5, s0to6,
114 s6to7, s0to7, s6to8, s0to8, s6to9,
115 s0to9, s6to10, s0to10, s6to11, s0to11,
116 /* Differential scan to channel and mid to channel where overlapping */
117 d0m1to2m3, d0m1to4m5, d0m1to6m7, d6m7to8m9,
118 d0m1to8m9, d6m7to10m11, d0m1to10m11, d1m0to3m2,
119 d1m0to5m4, d1m0to7m6, d7m6to9m8, d1m0to9m8,
120 d7m6to11m10, d1m0to11m10,
121};
122
123/**
124 * struct max1363_chip_info - chip specifc information
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +0100125 * @info: iio core function callbacks structure
Jonathan Cameron2593b132012-10-06 14:37:44 +0100126 * @channels: channel specification
127 * @num_channels: number of channels
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +0100128 * @mode_list: array of available scan modes
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +0100129 * @default_mode: the scan mode in which the chip starts up
Jonathan Cameron2593b132012-10-06 14:37:44 +0100130 * @int_vref_mv: the internal reference voltage
Peter Meerwald71d2c122012-12-30 23:26:00 +0000131 * @num_modes: number of modes
Jonathan Cameron2593b132012-10-06 14:37:44 +0100132 * @bits: accuracy of the adc in bits
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +0100133 */
134struct max1363_chip_info {
135 const struct iio_info *info;
Jonathan Cameron2593b132012-10-06 14:37:44 +0100136 const struct iio_chan_spec *channels;
137 int num_channels;
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +0100138 const enum max1363_modes *mode_list;
139 enum max1363_modes default_mode;
140 u16 int_vref_mv;
141 u8 num_modes;
142 u8 bits;
143};
144
145/**
146 * struct max1363_state - driver instance specific data
147 * @client: i2c_client
148 * @setupbyte: cache of current device setup byte
149 * @configbyte: cache of current device config byte
Peter Meerwald71d2c122012-12-30 23:26:00 +0000150 * @chip_info: chip model specific constants, available modes, etc.
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +0100151 * @current_mode: the scan mode of this chip
152 * @requestedmask: a valid requested set of channels
153 * @reg: supply regulator
154 * @monitor_on: whether monitor mode is enabled
155 * @monitor_speed: parameter corresponding to device monitor speed setting
156 * @mask_high: bitmask for enabled high thresholds
157 * @mask_low: bitmask for enabled low thresholds
158 * @thresh_high: high threshold values
159 * @thresh_low: low threshold values
Guenter Roecka405b002013-02-03 00:59:00 +0000160 * @vref: Reference voltage regulator
161 * @vref_uv: Actual (external or internal) reference voltage
Vivien Didelot61bdda62013-10-20 19:02:00 +0100162 * @send: function used to send data to the chip
163 * @recv: function used to receive data from the chip
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +0100164 */
165struct max1363_state {
166 struct i2c_client *client;
167 u8 setupbyte;
168 u8 configbyte;
169 const struct max1363_chip_info *chip_info;
170 const struct max1363_mode *current_mode;
171 u32 requestedmask;
172 struct regulator *reg;
173
174 /* Using monitor modes and buffer at the same time is
175 currently not supported */
176 bool monitor_on;
177 unsigned int monitor_speed:3;
178 u8 mask_high;
179 u8 mask_low;
180 /* 4x unipolar first then the fours bipolar ones */
181 s16 thresh_high[8];
182 s16 thresh_low[8];
Guenter Roecka405b002013-02-03 00:59:00 +0000183 struct regulator *vref;
184 u32 vref_uv;
Vivien Didelot61bdda62013-10-20 19:02:00 +0100185 int (*send)(const struct i2c_client *client,
186 const char *buf, int count);
187 int (*recv)(const struct i2c_client *client,
188 char *buf, int count);
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +0100189};
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100190
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100191#define MAX1363_MODE_SINGLE(_num, _mask) { \
192 .conf = MAX1363_CHANNEL_SEL(_num) \
193 | MAX1363_CONFIG_SCAN_SINGLE_1 \
194 | MAX1363_CONFIG_SE, \
Jonathan Cameron32b5eec2011-09-02 17:14:38 +0100195 .modemask[0] = _mask, \
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100196 }
197
198#define MAX1363_MODE_SCAN_TO_CHANNEL(_num, _mask) { \
199 .conf = MAX1363_CHANNEL_SEL(_num) \
200 | MAX1363_CONFIG_SCAN_TO_CS \
201 | MAX1363_CONFIG_SE, \
Jonathan Cameron32b5eec2011-09-02 17:14:38 +0100202 .modemask[0] = _mask, \
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100203 }
204
205/* note not available for max1363 hence naming */
206#define MAX1236_MODE_SCAN_MID_TO_CHANNEL(_mid, _num, _mask) { \
207 .conf = MAX1363_CHANNEL_SEL(_num) \
208 | MAX1236_SCAN_MID_TO_CHANNEL \
209 | MAX1363_CONFIG_SE, \
Jonathan Cameron32b5eec2011-09-02 17:14:38 +0100210 .modemask[0] = _mask \
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100211}
212
213#define MAX1363_MODE_DIFF_SINGLE(_nump, _numm, _mask) { \
214 .conf = MAX1363_CHANNEL_SEL(_nump) \
215 | MAX1363_CONFIG_SCAN_SINGLE_1 \
216 | MAX1363_CONFIG_DE, \
Jonathan Cameron32b5eec2011-09-02 17:14:38 +0100217 .modemask[0] = _mask \
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100218 }
219
220/* Can't think how to automate naming so specify for now */
221#define MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(_num, _numvals, _mask) { \
222 .conf = MAX1363_CHANNEL_SEL(_num) \
223 | MAX1363_CONFIG_SCAN_TO_CS \
224 | MAX1363_CONFIG_DE, \
Jonathan Cameron32b5eec2011-09-02 17:14:38 +0100225 .modemask[0] = _mask \
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100226 }
227
228/* note only available for max1363 hence naming */
229#define MAX1236_MODE_DIFF_SCAN_MID_TO_CHANNEL(_num, _numvals, _mask) { \
230 .conf = MAX1363_CHANNEL_SEL(_num) \
231 | MAX1236_SCAN_MID_TO_CHANNEL \
232 | MAX1363_CONFIG_SE, \
Jonathan Cameron32b5eec2011-09-02 17:14:38 +0100233 .modemask[0] = _mask \
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100234}
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100235
Jonathan Cameron82020b02010-05-04 14:43:03 +0100236static const struct max1363_mode max1363_mode_table[] = {
237 /* All of the single channel options first */
238 MAX1363_MODE_SINGLE(0, 1 << 0),
239 MAX1363_MODE_SINGLE(1, 1 << 1),
240 MAX1363_MODE_SINGLE(2, 1 << 2),
241 MAX1363_MODE_SINGLE(3, 1 << 3),
242 MAX1363_MODE_SINGLE(4, 1 << 4),
243 MAX1363_MODE_SINGLE(5, 1 << 5),
244 MAX1363_MODE_SINGLE(6, 1 << 6),
245 MAX1363_MODE_SINGLE(7, 1 << 7),
246 MAX1363_MODE_SINGLE(8, 1 << 8),
247 MAX1363_MODE_SINGLE(9, 1 << 9),
248 MAX1363_MODE_SINGLE(10, 1 << 10),
249 MAX1363_MODE_SINGLE(11, 1 << 11),
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100250
Jonathan Cameron82020b02010-05-04 14:43:03 +0100251 MAX1363_MODE_DIFF_SINGLE(0, 1, 1 << 12),
252 MAX1363_MODE_DIFF_SINGLE(2, 3, 1 << 13),
253 MAX1363_MODE_DIFF_SINGLE(4, 5, 1 << 14),
254 MAX1363_MODE_DIFF_SINGLE(6, 7, 1 << 15),
255 MAX1363_MODE_DIFF_SINGLE(8, 9, 1 << 16),
256 MAX1363_MODE_DIFF_SINGLE(10, 11, 1 << 17),
257 MAX1363_MODE_DIFF_SINGLE(1, 0, 1 << 18),
258 MAX1363_MODE_DIFF_SINGLE(3, 2, 1 << 19),
259 MAX1363_MODE_DIFF_SINGLE(5, 4, 1 << 20),
260 MAX1363_MODE_DIFF_SINGLE(7, 6, 1 << 21),
261 MAX1363_MODE_DIFF_SINGLE(9, 8, 1 << 22),
262 MAX1363_MODE_DIFF_SINGLE(11, 10, 1 << 23),
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100263
Jonathan Cameron82020b02010-05-04 14:43:03 +0100264 /* The multichannel scans next */
265 MAX1363_MODE_SCAN_TO_CHANNEL(1, 0x003),
266 MAX1363_MODE_SCAN_TO_CHANNEL(2, 0x007),
267 MAX1236_MODE_SCAN_MID_TO_CHANNEL(2, 3, 0x00C),
268 MAX1363_MODE_SCAN_TO_CHANNEL(3, 0x00F),
269 MAX1363_MODE_SCAN_TO_CHANNEL(4, 0x01F),
270 MAX1363_MODE_SCAN_TO_CHANNEL(5, 0x03F),
271 MAX1363_MODE_SCAN_TO_CHANNEL(6, 0x07F),
272 MAX1236_MODE_SCAN_MID_TO_CHANNEL(6, 7, 0x0C0),
273 MAX1363_MODE_SCAN_TO_CHANNEL(7, 0x0FF),
274 MAX1236_MODE_SCAN_MID_TO_CHANNEL(6, 8, 0x1C0),
275 MAX1363_MODE_SCAN_TO_CHANNEL(8, 0x1FF),
276 MAX1236_MODE_SCAN_MID_TO_CHANNEL(6, 9, 0x3C0),
277 MAX1363_MODE_SCAN_TO_CHANNEL(9, 0x3FF),
278 MAX1236_MODE_SCAN_MID_TO_CHANNEL(6, 10, 0x7C0),
279 MAX1363_MODE_SCAN_TO_CHANNEL(10, 0x7FF),
280 MAX1236_MODE_SCAN_MID_TO_CHANNEL(6, 11, 0xFC0),
281 MAX1363_MODE_SCAN_TO_CHANNEL(11, 0xFFF),
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100282
Jonathan Cameron82020b02010-05-04 14:43:03 +0100283 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(2, 2, 0x003000),
284 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(4, 3, 0x007000),
285 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(6, 4, 0x00F000),
286 MAX1236_MODE_DIFF_SCAN_MID_TO_CHANNEL(8, 2, 0x018000),
287 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(8, 5, 0x01F000),
288 MAX1236_MODE_DIFF_SCAN_MID_TO_CHANNEL(10, 3, 0x038000),
289 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(10, 6, 0x3F000),
290 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(3, 2, 0x0C0000),
291 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(5, 3, 0x1C0000),
292 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(7, 4, 0x3C0000),
293 MAX1236_MODE_DIFF_SCAN_MID_TO_CHANNEL(9, 2, 0x600000),
294 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(9, 5, 0x7C0000),
295 MAX1236_MODE_DIFF_SCAN_MID_TO_CHANNEL(11, 3, 0xE00000),
296 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(11, 6, 0xFC0000),
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100297};
298
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +0100299static const struct max1363_mode
Jonathan Cameronc52cfb62011-12-05 21:37:15 +0000300*max1363_match_mode(const unsigned long *mask,
Peter Meerwald71d2c122012-12-30 23:26:00 +0000301 const struct max1363_chip_info *ci)
Greg Kroah-Hartman1b183e42010-05-04 22:24:05 -0700302{
Jonathan Cameron82020b02010-05-04 14:43:03 +0100303 int i;
304 if (mask)
305 for (i = 0; i < ci->num_modes; i++)
Jonathan Cameron32b5eec2011-09-02 17:14:38 +0100306 if (bitmap_subset(mask,
307 max1363_mode_table[ci->mode_list[i]].
308 modemask,
309 MAX1363_MAX_CHANNELS))
Greg Kroah-Hartman1b183e42010-05-04 22:24:05 -0700310 return &max1363_mode_table[ci->mode_list[i]];
311 return NULL;
Mike Frysingerc608cb02010-05-23 03:10:30 -0400312}
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100313
Vivien Didelot61bdda62013-10-20 19:02:00 +0100314static int max1363_smbus_send(const struct i2c_client *client, const char *buf,
315 int count)
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100316{
Vivien Didelot61bdda62013-10-20 19:02:00 +0100317 int i, err;
Jonathan Cameron82020b02010-05-04 14:43:03 +0100318
Vivien Didelot61bdda62013-10-20 19:02:00 +0100319 for (i = err = 0; err == 0 && i < count; ++i)
320 err = i2c_smbus_write_byte(client, buf[i]);
321
322 return err ? err : count;
323}
324
325static int max1363_smbus_recv(const struct i2c_client *client, char *buf,
326 int count)
327{
328 int i, ret;
329
330 for (i = 0; i < count; ++i) {
331 ret = i2c_smbus_read_byte(client);
332 if (ret < 0)
333 return ret;
334 buf[i] = ret;
335 }
336
337 return count;
338}
339
340static int max1363_write_basic_config(struct max1363_state *st)
341{
342 u8 tx_buf[2] = { st->setupbyte, st->configbyte };
343
344 return st->send(st->client, tx_buf, 2);
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100345}
346
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +0100347static int max1363_set_scan_mode(struct max1363_state *st)
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100348{
349 st->configbyte &= ~(MAX1363_CHANNEL_SEL_MASK
350 | MAX1363_SCAN_MASK
351 | MAX1363_SE_DE_MASK);
352 st->configbyte |= st->current_mode->conf;
353
Vivien Didelot61bdda62013-10-20 19:02:00 +0100354 return max1363_write_basic_config(st);
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100355}
356
Jonathan Cameron298cd972011-05-18 14:40:53 +0100357static int max1363_read_single_chan(struct iio_dev *indio_dev,
358 struct iio_chan_spec const *chan,
359 int *val,
360 long m)
Jonathan Cameron82020b02010-05-04 14:43:03 +0100361{
Jonathan Cameron298cd972011-05-18 14:40:53 +0100362 int ret = 0;
363 s32 data;
Guenter Roeck482bb4e2013-01-31 21:43:00 +0000364 u8 rxbuf[2];
Jonathan Cameron298cd972011-05-18 14:40:53 +0100365 struct max1363_state *st = iio_priv(indio_dev);
366 struct i2c_client *client = st->client;
Jonathan Cameron82020b02010-05-04 14:43:03 +0100367
Jonathan Cameronb6b70682011-04-15 18:55:58 +0100368 mutex_lock(&indio_dev->mlock);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100369 /*
370 * If monitor mode is enabled, the method for reading a single
371 * channel will have to be rather different and has not yet
372 * been implemented.
Jonathan Cameron3ca34cc2011-12-05 22:18:25 +0000373 *
374 * Also, cannot read directly if buffered capture enabled.
Jonathan Cameron440a5202010-06-26 12:54:23 +0100375 */
Jonathan Cameron3ca34cc2011-12-05 22:18:25 +0000376 if (st->monitor_on || iio_buffer_enabled(indio_dev)) {
Jonathan Cameron440a5202010-06-26 12:54:23 +0100377 ret = -EBUSY;
378 goto error_ret;
379 }
380
Jonathan Cameron3ca34cc2011-12-05 22:18:25 +0000381 /* Check to see if current scan mode is correct */
382 if (st->current_mode != &max1363_mode_table[chan->address]) {
383 /* Update scan mode if needed */
384 st->current_mode = &max1363_mode_table[chan->address];
385 ret = max1363_set_scan_mode(st);
386 if (ret < 0)
387 goto error_ret;
388 }
389 if (st->chip_info->bits != 8) {
390 /* Get reading */
Vivien Didelot61bdda62013-10-20 19:02:00 +0100391 data = st->recv(client, rxbuf, 2);
Jonathan Cameron82020b02010-05-04 14:43:03 +0100392 if (data < 0) {
393 ret = data;
394 goto error_ret;
395 }
Guenter Roeck482bb4e2013-01-31 21:43:00 +0000396 data = (rxbuf[1] | rxbuf[0] << 8) &
397 ((1 << st->chip_info->bits) - 1);
Jonathan Cameron82020b02010-05-04 14:43:03 +0100398 } else {
Jonathan Cameron3ca34cc2011-12-05 22:18:25 +0000399 /* Get reading */
Vivien Didelot61bdda62013-10-20 19:02:00 +0100400 data = st->recv(client, rxbuf, 1);
Jonathan Cameron3ca34cc2011-12-05 22:18:25 +0000401 if (data < 0) {
402 ret = data;
403 goto error_ret;
Jonathan Cameron82020b02010-05-04 14:43:03 +0100404 }
Jonathan Cameron3ca34cc2011-12-05 22:18:25 +0000405 data = rxbuf[0];
Jonathan Cameron82020b02010-05-04 14:43:03 +0100406 }
Jonathan Cameron298cd972011-05-18 14:40:53 +0100407 *val = data;
Jonathan Cameron82020b02010-05-04 14:43:03 +0100408error_ret:
Jonathan Cameronb6b70682011-04-15 18:55:58 +0100409 mutex_unlock(&indio_dev->mlock);
Jonathan Cameron298cd972011-05-18 14:40:53 +0100410 return ret;
411
Jonathan Cameron82020b02010-05-04 14:43:03 +0100412}
413
Jonathan Cameron298cd972011-05-18 14:40:53 +0100414static int max1363_read_raw(struct iio_dev *indio_dev,
415 struct iio_chan_spec const *chan,
416 int *val,
417 int *val2,
418 long m)
Jonathan Cameron82020b02010-05-04 14:43:03 +0100419{
Jonathan Cameron298cd972011-05-18 14:40:53 +0100420 struct max1363_state *st = iio_priv(indio_dev);
421 int ret;
Guenter Roecka405b002013-02-03 00:59:00 +0000422
Jonathan Cameron298cd972011-05-18 14:40:53 +0100423 switch (m) {
Jonathan Cameronb11f98f2012-04-15 17:41:18 +0100424 case IIO_CHAN_INFO_RAW:
Jonathan Cameron298cd972011-05-18 14:40:53 +0100425 ret = max1363_read_single_chan(indio_dev, chan, val, m);
Jonathan Cameroncd038012011-08-12 16:55:29 +0100426 if (ret < 0)
Jonathan Cameron298cd972011-05-18 14:40:53 +0100427 return ret;
428 return IIO_VAL_INT;
Jonathan Cameronc8a9f802011-10-26 17:41:36 +0100429 case IIO_CHAN_INFO_SCALE:
Lars-Peter Clausenb2171672013-09-28 10:31:00 +0100430 *val = st->vref_uv / 1000;
431 *val2 = st->chip_info->bits;
432 return IIO_VAL_FRACTIONAL_LOG2;
Jonathan Cameron298cd972011-05-18 14:40:53 +0100433 default:
434 return -EINVAL;
435 }
436 return 0;
Jonathan Cameron82020b02010-05-04 14:43:03 +0100437}
438
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100439/* Applies to max1363 */
440static const enum max1363_modes max1363_mode_list[] = {
441 _s0, _s1, _s2, _s3,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100442 s0to1, s0to2, s0to3,
443 d0m1, d2m3, d1m0, d3m2,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100444 d0m1to2m3, d1m0to3m2,
445};
446
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100447static const struct iio_event_spec max1363_events[] = {
448 {
449 .type = IIO_EV_TYPE_THRESH,
450 .dir = IIO_EV_DIR_RISING,
451 .mask_separate = BIT(IIO_EV_INFO_VALUE) |
452 BIT(IIO_EV_INFO_ENABLE),
453 }, {
454 .type = IIO_EV_TYPE_THRESH,
455 .dir = IIO_EV_DIR_FALLING,
456 .mask_separate = BIT(IIO_EV_INFO_VALUE) |
457 BIT(IIO_EV_INFO_ENABLE),
458 },
459};
Jonathan Cameronf6e52e52013-02-19 21:11:35 +0000460
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100461#define MAX1363_CHAN_U(num, addr, si, bits, ev_spec, num_ev_spec) \
Jonathan Cameronade7ef72011-09-02 17:14:45 +0100462 { \
463 .type = IIO_VOLTAGE, \
464 .indexed = 1, \
465 .channel = num, \
466 .address = addr, \
Jonathan Cameronf6e52e52013-02-19 21:11:35 +0000467 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
468 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
Jonathan Cameronbc234e72011-12-05 21:56:01 +0000469 .datasheet_name = "AIN"#num, \
Jonathan Cameron18cffbed2011-12-05 21:37:16 +0000470 .scan_type = { \
471 .sign = 'u', \
472 .realbits = bits, \
473 .storagebits = (bits > 8) ? 16 : 8, \
474 .endianness = IIO_BE, \
475 }, \
Jonathan Cameronade7ef72011-09-02 17:14:45 +0100476 .scan_index = si, \
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100477 .event_spec = ev_spec, \
478 .num_event_specs = num_ev_spec, \
Jonathan Cameron298cd972011-05-18 14:40:53 +0100479 }
480
Jonathan Cameronade7ef72011-09-02 17:14:45 +0100481/* bipolar channel */
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100482#define MAX1363_CHAN_B(num, num2, addr, si, bits, ev_spec, num_ev_spec) \
Jonathan Cameronade7ef72011-09-02 17:14:45 +0100483 { \
484 .type = IIO_VOLTAGE, \
485 .differential = 1, \
486 .indexed = 1, \
487 .channel = num, \
488 .channel2 = num2, \
489 .address = addr, \
Jonathan Cameronf6e52e52013-02-19 21:11:35 +0000490 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
491 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
Jonathan Cameronbc234e72011-12-05 21:56:01 +0000492 .datasheet_name = "AIN"#num"-AIN"#num2, \
Jonathan Cameron18cffbed2011-12-05 21:37:16 +0000493 .scan_type = { \
494 .sign = 's', \
495 .realbits = bits, \
496 .storagebits = (bits > 8) ? 16 : 8, \
497 .endianness = IIO_BE, \
498 }, \
Jonathan Cameronade7ef72011-09-02 17:14:45 +0100499 .scan_index = si, \
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100500 .event_spec = ev_spec, \
501 .num_event_specs = num_ev_spec, \
Jonathan Cameronade7ef72011-09-02 17:14:45 +0100502 }
503
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100504#define MAX1363_4X_CHANS(bits, ev_spec, num_ev_spec) { \
505 MAX1363_CHAN_U(0, _s0, 0, bits, ev_spec, num_ev_spec), \
506 MAX1363_CHAN_U(1, _s1, 1, bits, ev_spec, num_ev_spec), \
507 MAX1363_CHAN_U(2, _s2, 2, bits, ev_spec, num_ev_spec), \
508 MAX1363_CHAN_U(3, _s3, 3, bits, ev_spec, num_ev_spec), \
509 MAX1363_CHAN_B(0, 1, d0m1, 4, bits, ev_spec, num_ev_spec), \
510 MAX1363_CHAN_B(2, 3, d2m3, 5, bits, ev_spec, num_ev_spec), \
511 MAX1363_CHAN_B(1, 0, d1m0, 6, bits, ev_spec, num_ev_spec), \
512 MAX1363_CHAN_B(3, 2, d3m2, 7, bits, ev_spec, num_ev_spec), \
513 IIO_CHAN_SOFT_TIMESTAMP(8) \
Jonathan Cameronade7ef72011-09-02 17:14:45 +0100514 }
515
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100516static const struct iio_chan_spec max1036_channels[] =
517 MAX1363_4X_CHANS(8, NULL, 0);
518static const struct iio_chan_spec max1136_channels[] =
519 MAX1363_4X_CHANS(10, NULL, 0);
520static const struct iio_chan_spec max1236_channels[] =
521 MAX1363_4X_CHANS(12, NULL, 0);
Lars-Peter Clausenf4e4b952012-08-09 08:51:00 +0100522static const struct iio_chan_spec max1361_channels[] =
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100523 MAX1363_4X_CHANS(10, max1363_events, ARRAY_SIZE(max1363_events));
Lars-Peter Clausenf4e4b952012-08-09 08:51:00 +0100524static const struct iio_chan_spec max1363_channels[] =
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100525 MAX1363_4X_CHANS(12, max1363_events, ARRAY_SIZE(max1363_events));
Jonathan Cameron298cd972011-05-18 14:40:53 +0100526
Justin P. Mattock4abf6f82012-02-29 22:00:38 -0800527/* Applies to max1236, max1237 */
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100528static const enum max1363_modes max1236_mode_list[] = {
529 _s0, _s1, _s2, _s3,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100530 s0to1, s0to2, s0to3,
531 d0m1, d2m3, d1m0, d3m2,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100532 d0m1to2m3, d1m0to3m2,
533 s2to3,
534};
535
536/* Applies to max1238, max1239 */
537static const enum max1363_modes max1238_mode_list[] = {
538 _s0, _s1, _s2, _s3, _s4, _s5, _s6, _s7, _s8, _s9, _s10, _s11,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100539 s0to1, s0to2, s0to3, s0to4, s0to5, s0to6,
540 s0to7, s0to8, s0to9, s0to10, s0to11,
541 d0m1, d2m3, d4m5, d6m7, d8m9, d10m11,
542 d1m0, d3m2, d5m4, d7m6, d9m8, d11m10,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100543 d0m1to2m3, d0m1to4m5, d0m1to6m7, d0m1to8m9, d0m1to10m11,
544 d1m0to3m2, d1m0to5m4, d1m0to7m6, d1m0to9m8, d1m0to11m10,
545 s6to7, s6to8, s6to9, s6to10, s6to11,
Jonathan Cameron82020b02010-05-04 14:43:03 +0100546 d6m7to8m9, d6m7to10m11, d7m6to9m8, d7m6to11m10,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100547};
548
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100549#define MAX1363_12X_CHANS(bits) { \
550 MAX1363_CHAN_U(0, _s0, 0, bits, NULL, 0), \
551 MAX1363_CHAN_U(1, _s1, 1, bits, NULL, 0), \
552 MAX1363_CHAN_U(2, _s2, 2, bits, NULL, 0), \
553 MAX1363_CHAN_U(3, _s3, 3, bits, NULL, 0), \
554 MAX1363_CHAN_U(4, _s4, 4, bits, NULL, 0), \
555 MAX1363_CHAN_U(5, _s5, 5, bits, NULL, 0), \
556 MAX1363_CHAN_U(6, _s6, 6, bits, NULL, 0), \
557 MAX1363_CHAN_U(7, _s7, 7, bits, NULL, 0), \
558 MAX1363_CHAN_U(8, _s8, 8, bits, NULL, 0), \
559 MAX1363_CHAN_U(9, _s9, 9, bits, NULL, 0), \
560 MAX1363_CHAN_U(10, _s10, 10, bits, NULL, 0), \
561 MAX1363_CHAN_U(11, _s11, 11, bits, NULL, 0), \
562 MAX1363_CHAN_B(0, 1, d0m1, 12, bits, NULL, 0), \
563 MAX1363_CHAN_B(2, 3, d2m3, 13, bits, NULL, 0), \
564 MAX1363_CHAN_B(4, 5, d4m5, 14, bits, NULL, 0), \
565 MAX1363_CHAN_B(6, 7, d6m7, 15, bits, NULL, 0), \
566 MAX1363_CHAN_B(8, 9, d8m9, 16, bits, NULL, 0), \
567 MAX1363_CHAN_B(10, 11, d10m11, 17, bits, NULL, 0), \
568 MAX1363_CHAN_B(1, 0, d1m0, 18, bits, NULL, 0), \
569 MAX1363_CHAN_B(3, 2, d3m2, 19, bits, NULL, 0), \
570 MAX1363_CHAN_B(5, 4, d5m4, 20, bits, NULL, 0), \
571 MAX1363_CHAN_B(7, 6, d7m6, 21, bits, NULL, 0), \
572 MAX1363_CHAN_B(9, 8, d9m8, 22, bits, NULL, 0), \
573 MAX1363_CHAN_B(11, 10, d11m10, 23, bits, NULL, 0), \
574 IIO_CHAN_SOFT_TIMESTAMP(24) \
Jonathan Cameron298cd972011-05-18 14:40:53 +0100575 }
Lars-Peter Clausenf4e4b952012-08-09 08:51:00 +0100576static const struct iio_chan_spec max1038_channels[] = MAX1363_12X_CHANS(8);
577static const struct iio_chan_spec max1138_channels[] = MAX1363_12X_CHANS(10);
578static const struct iio_chan_spec max1238_channels[] = MAX1363_12X_CHANS(12);
Jonathan Cameronc3fa0fdd2010-05-04 14:43:09 +0100579
580static const enum max1363_modes max11607_mode_list[] = {
581 _s0, _s1, _s2, _s3,
582 s0to1, s0to2, s0to3,
583 s2to3,
584 d0m1, d2m3, d1m0, d3m2,
585 d0m1to2m3, d1m0to3m2,
586};
587
588static const enum max1363_modes max11608_mode_list[] = {
589 _s0, _s1, _s2, _s3, _s4, _s5, _s6, _s7,
590 s0to1, s0to2, s0to3, s0to4, s0to5, s0to6, s0to7,
591 s6to7,
592 d0m1, d2m3, d4m5, d6m7,
593 d1m0, d3m2, d5m4, d7m6,
594 d0m1to2m3, d0m1to4m5, d0m1to6m7,
595 d1m0to3m2, d1m0to5m4, d1m0to7m6,
596};
597
Jonathan Cameronade7ef72011-09-02 17:14:45 +0100598#define MAX1363_8X_CHANS(bits) { \
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100599 MAX1363_CHAN_U(0, _s0, 0, bits, NULL, 0), \
600 MAX1363_CHAN_U(1, _s1, 1, bits, NULL, 0), \
601 MAX1363_CHAN_U(2, _s2, 2, bits, NULL, 0), \
602 MAX1363_CHAN_U(3, _s3, 3, bits, NULL, 0), \
603 MAX1363_CHAN_U(4, _s4, 4, bits, NULL, 0), \
604 MAX1363_CHAN_U(5, _s5, 5, bits, NULL, 0), \
605 MAX1363_CHAN_U(6, _s6, 6, bits, NULL, 0), \
606 MAX1363_CHAN_U(7, _s7, 7, bits, NULL, 0), \
607 MAX1363_CHAN_B(0, 1, d0m1, 8, bits, NULL, 0), \
608 MAX1363_CHAN_B(2, 3, d2m3, 9, bits, NULL, 0), \
609 MAX1363_CHAN_B(4, 5, d4m5, 10, bits, NULL, 0), \
610 MAX1363_CHAN_B(6, 7, d6m7, 11, bits, NULL, 0), \
611 MAX1363_CHAN_B(1, 0, d1m0, 12, bits, NULL, 0), \
612 MAX1363_CHAN_B(3, 2, d3m2, 13, bits, NULL, 0), \
613 MAX1363_CHAN_B(5, 4, d5m4, 14, bits, NULL, 0), \
614 MAX1363_CHAN_B(7, 6, d7m6, 15, bits, NULL, 0), \
Jonathan Cameronade7ef72011-09-02 17:14:45 +0100615 IIO_CHAN_SOFT_TIMESTAMP(16) \
616}
Lars-Peter Clausenf4e4b952012-08-09 08:51:00 +0100617static const struct iio_chan_spec max11602_channels[] = MAX1363_8X_CHANS(8);
618static const struct iio_chan_spec max11608_channels[] = MAX1363_8X_CHANS(10);
619static const struct iio_chan_spec max11614_channels[] = MAX1363_8X_CHANS(12);
Jonathan Cameronc3fa0fdd2010-05-04 14:43:09 +0100620
Jonathan Cameron586d1522011-05-18 14:42:10 +0100621static const enum max1363_modes max11644_mode_list[] = {
622 _s0, _s1, s0to1, d0m1, d1m0,
623};
624
625#define MAX1363_2X_CHANS(bits) { \
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100626 MAX1363_CHAN_U(0, _s0, 0, bits, NULL, 0), \
627 MAX1363_CHAN_U(1, _s1, 1, bits, NULL, 0), \
628 MAX1363_CHAN_B(0, 1, d0m1, 2, bits, NULL, 0), \
629 MAX1363_CHAN_B(1, 0, d1m0, 3, bits, NULL, 0), \
Jonathan Cameron586d1522011-05-18 14:42:10 +0100630 IIO_CHAN_SOFT_TIMESTAMP(4) \
631 }
632
Lars-Peter Clausenf4e4b952012-08-09 08:51:00 +0100633static const struct iio_chan_spec max11646_channels[] = MAX1363_2X_CHANS(10);
634static const struct iio_chan_spec max11644_channels[] = MAX1363_2X_CHANS(12);
Jonathan Cameron586d1522011-05-18 14:42:10 +0100635
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100636enum { max1361,
637 max1362,
638 max1363,
639 max1364,
Jonathan Cameron3bf877c2010-05-04 14:43:10 +0100640 max1036,
641 max1037,
642 max1038,
643 max1039,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100644 max1136,
645 max1137,
646 max1138,
647 max1139,
648 max1236,
649 max1237,
650 max1238,
651 max1239,
Jonathan Cameron3bf877c2010-05-04 14:43:10 +0100652 max11600,
653 max11601,
654 max11602,
655 max11603,
656 max11604,
657 max11605,
Jonathan Cameronc3fa0fdd2010-05-04 14:43:09 +0100658 max11606,
659 max11607,
660 max11608,
661 max11609,
662 max11610,
663 max11611,
664 max11612,
665 max11613,
666 max11614,
667 max11615,
668 max11616,
669 max11617,
Jonathan Cameron586d1522011-05-18 14:42:10 +0100670 max11644,
671 max11645,
672 max11646,
673 max11647
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100674};
675
Jonathan Cameron440a5202010-06-26 12:54:23 +0100676static const int max1363_monitor_speeds[] = { 133000, 665000, 33300, 16600,
677 8300, 4200, 2000, 1000 };
678
679static ssize_t max1363_monitor_show_freq(struct device *dev,
680 struct device_attribute *attr,
681 char *buf)
682{
Lars-Peter Clausen62c51832012-05-12 15:39:42 +0200683 struct max1363_state *st = iio_priv(dev_to_iio_dev(dev));
Jonathan Cameron440a5202010-06-26 12:54:23 +0100684 return sprintf(buf, "%d\n", max1363_monitor_speeds[st->monitor_speed]);
685}
686
687static ssize_t max1363_monitor_store_freq(struct device *dev,
688 struct device_attribute *attr,
689 const char *buf,
690 size_t len)
691{
Lars-Peter Clausen62c51832012-05-12 15:39:42 +0200692 struct iio_dev *indio_dev = dev_to_iio_dev(dev);
Jonathan Cameron3dba81b2011-04-15 18:55:59 +0100693 struct max1363_state *st = iio_priv(indio_dev);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100694 int i, ret;
695 unsigned long val;
696 bool found = false;
697
Jingoo Handdeb64f2013-06-01 08:10:00 +0100698 ret = kstrtoul(buf, 10, &val);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100699 if (ret)
700 return -EINVAL;
701 for (i = 0; i < ARRAY_SIZE(max1363_monitor_speeds); i++)
702 if (val == max1363_monitor_speeds[i]) {
703 found = true;
704 break;
705 }
706 if (!found)
707 return -EINVAL;
708
Jonathan Cameronb6b70682011-04-15 18:55:58 +0100709 mutex_lock(&indio_dev->mlock);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100710 st->monitor_speed = i;
Jonathan Cameronb6b70682011-04-15 18:55:58 +0100711 mutex_unlock(&indio_dev->mlock);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100712
713 return 0;
714}
715
716static IIO_DEV_ATTR_SAMP_FREQ(S_IRUGO | S_IWUSR,
717 max1363_monitor_show_freq,
718 max1363_monitor_store_freq);
719
720static IIO_CONST_ATTR(sampling_frequency_available,
721 "133000 665000 33300 16600 8300 4200 2000 1000");
722
Jonathan Cameron298cd972011-05-18 14:40:53 +0100723static int max1363_read_thresh(struct iio_dev *indio_dev,
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100724 const struct iio_chan_spec *chan, enum iio_event_type type,
725 enum iio_event_direction dir, enum iio_event_info info, int *val,
726 int *val2)
Jonathan Cameron440a5202010-06-26 12:54:23 +0100727{
Jonathan Cameron3dba81b2011-04-15 18:55:59 +0100728 struct max1363_state *st = iio_priv(indio_dev);
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100729 if (dir == IIO_EV_DIR_FALLING)
730 *val = st->thresh_low[chan->channel];
Jonathan Cameron440a5202010-06-26 12:54:23 +0100731 else
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100732 *val = st->thresh_high[chan->channel];
733 return IIO_VAL_INT;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100734}
735
Jonathan Cameron298cd972011-05-18 14:40:53 +0100736static int max1363_write_thresh(struct iio_dev *indio_dev,
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100737 const struct iio_chan_spec *chan, enum iio_event_type type,
738 enum iio_event_direction dir, enum iio_event_info info, int val,
739 int val2)
Jonathan Cameron440a5202010-06-26 12:54:23 +0100740{
Jonathan Cameron298cd972011-05-18 14:40:53 +0100741 struct max1363_state *st = iio_priv(indio_dev);
742 /* make it handle signed correctly as well */
Jonathan Cameron440a5202010-06-26 12:54:23 +0100743 switch (st->chip_info->bits) {
744 case 10:
745 if (val > 0x3FF)
746 return -EINVAL;
747 break;
748 case 12:
749 if (val > 0xFFF)
750 return -EINVAL;
751 break;
752 }
753
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100754 switch (dir) {
Jonathan Cameron298cd972011-05-18 14:40:53 +0100755 case IIO_EV_DIR_FALLING:
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100756 st->thresh_low[chan->channel] = val;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100757 break;
Jonathan Cameron298cd972011-05-18 14:40:53 +0100758 case IIO_EV_DIR_RISING:
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100759 st->thresh_high[chan->channel] = val;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100760 break;
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100761 default:
762 return -EINVAL;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100763 }
764
Jonathan Cameron440a5202010-06-26 12:54:23 +0100765 return 0;
766}
767
Jonathan Cameron330c6c52011-09-02 17:14:39 +0100768static const u64 max1363_event_codes[] = {
Jonathan Cameron6835cb62011-09-27 09:56:41 +0100769 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 0,
770 IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING),
771 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 1,
772 IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING),
773 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 2,
774 IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING),
775 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 3,
776 IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING),
777 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 0,
778 IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING),
779 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 1,
780 IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING),
781 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 2,
782 IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING),
783 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 3,
784 IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING),
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100785};
786
Jonathan Cameronaaf370d2011-05-18 14:41:16 +0100787static irqreturn_t max1363_event_handler(int irq, void *private)
Jonathan Cameron440a5202010-06-26 12:54:23 +0100788{
Jonathan Cameronaaf370d2011-05-18 14:41:16 +0100789 struct iio_dev *indio_dev = private;
790 struct max1363_state *st = iio_priv(indio_dev);
791 s64 timestamp = iio_get_time_ns();
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100792 unsigned long mask, loc;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100793 u8 rx;
794 u8 tx[2] = { st->setupbyte,
795 MAX1363_MON_INT_ENABLE | (st->monitor_speed << 1) | 0xF0 };
796
Vivien Didelot61bdda62013-10-20 19:02:00 +0100797 st->recv(st->client, &rx, 1);
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100798 mask = rx;
799 for_each_set_bit(loc, &mask, 8)
Jonathan Cameron5aa96182011-08-30 12:41:06 +0100800 iio_push_event(indio_dev, max1363_event_codes[loc], timestamp);
Vivien Didelot61bdda62013-10-20 19:02:00 +0100801 st->send(st->client, tx, 2);
Jonathan Cameronaaf370d2011-05-18 14:41:16 +0100802
803 return IRQ_HANDLED;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100804}
805
Jonathan Cameron298cd972011-05-18 14:40:53 +0100806static int max1363_read_event_config(struct iio_dev *indio_dev,
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100807 const struct iio_chan_spec *chan, enum iio_event_type type,
808 enum iio_event_direction dir)
Jonathan Cameron440a5202010-06-26 12:54:23 +0100809{
Jonathan Cameron3dba81b2011-04-15 18:55:59 +0100810 struct max1363_state *st = iio_priv(indio_dev);
Jonathan Cameron298cd972011-05-18 14:40:53 +0100811 int val;
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100812 int number = chan->channel;
Jonathan Cameron0d9fa2c2012-10-06 14:38:11 +0100813
Jonathan Cameronb6b70682011-04-15 18:55:58 +0100814 mutex_lock(&indio_dev->mlock);
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100815 if (dir == IIO_EV_DIR_FALLING)
Jonathan Cameron298cd972011-05-18 14:40:53 +0100816 val = (1 << number) & st->mask_low;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100817 else
Jonathan Cameron298cd972011-05-18 14:40:53 +0100818 val = (1 << number) & st->mask_high;
Jonathan Cameronb6b70682011-04-15 18:55:58 +0100819 mutex_unlock(&indio_dev->mlock);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100820
Jonathan Cameron298cd972011-05-18 14:40:53 +0100821 return val;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100822}
823
824static int max1363_monitor_mode_update(struct max1363_state *st, int enabled)
825{
826 u8 *tx_buf;
827 int ret, i = 3, j;
828 unsigned long numelements;
829 int len;
Jonathan Cameron32b5eec2011-09-02 17:14:38 +0100830 const long *modemask;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100831
832 if (!enabled) {
Jonathan Cameronec443722012-10-06 14:19:01 +0100833 /* transition to buffered capture is not currently supported */
Jonathan Cameron440a5202010-06-26 12:54:23 +0100834 st->setupbyte &= ~MAX1363_SETUP_MONITOR_SETUP;
835 st->configbyte &= ~MAX1363_SCAN_MASK;
836 st->monitor_on = false;
Vivien Didelot61bdda62013-10-20 19:02:00 +0100837 return max1363_write_basic_config(st);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100838 }
839
840 /* Ensure we are in the relevant mode */
841 st->setupbyte |= MAX1363_SETUP_MONITOR_SETUP;
842 st->configbyte &= ~(MAX1363_CHANNEL_SEL_MASK
843 | MAX1363_SCAN_MASK
844 | MAX1363_SE_DE_MASK);
845 st->configbyte |= MAX1363_CONFIG_SCAN_MONITOR_MODE;
846 if ((st->mask_low | st->mask_high) & 0x0F) {
847 st->configbyte |= max1363_mode_table[s0to3].conf;
848 modemask = max1363_mode_table[s0to3].modemask;
849 } else if ((st->mask_low | st->mask_high) & 0x30) {
850 st->configbyte |= max1363_mode_table[d0m1to2m3].conf;
851 modemask = max1363_mode_table[d0m1to2m3].modemask;
852 } else {
853 st->configbyte |= max1363_mode_table[d1m0to3m2].conf;
854 modemask = max1363_mode_table[d1m0to3m2].modemask;
855 }
Jonathan Cameron32b5eec2011-09-02 17:14:38 +0100856 numelements = bitmap_weight(modemask, MAX1363_MAX_CHANNELS);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100857 len = 3 * numelements + 3;
858 tx_buf = kmalloc(len, GFP_KERNEL);
859 if (!tx_buf) {
860 ret = -ENOMEM;
861 goto error_ret;
862 }
863 tx_buf[0] = st->configbyte;
864 tx_buf[1] = st->setupbyte;
865 tx_buf[2] = (st->monitor_speed << 1);
866
867 /*
868 * So we need to do yet another bit of nefarious scan mode
869 * setup to match what we need.
870 */
871 for (j = 0; j < 8; j++)
Jonathan Cameron32b5eec2011-09-02 17:14:38 +0100872 if (test_bit(j, modemask)) {
Jonathan Cameron440a5202010-06-26 12:54:23 +0100873 /* Establish the mode is in the scan */
874 if (st->mask_low & (1 << j)) {
875 tx_buf[i] = (st->thresh_low[j] >> 4) & 0xFF;
876 tx_buf[i + 1] = (st->thresh_low[j] << 4) & 0xF0;
877 } else if (j < 4) {
878 tx_buf[i] = 0;
879 tx_buf[i + 1] = 0;
880 } else {
881 tx_buf[i] = 0x80;
882 tx_buf[i + 1] = 0;
883 }
884 if (st->mask_high & (1 << j)) {
885 tx_buf[i + 1] |=
886 (st->thresh_high[j] >> 8) & 0x0F;
887 tx_buf[i + 2] = st->thresh_high[j] & 0xFF;
888 } else if (j < 4) {
889 tx_buf[i + 1] |= 0x0F;
890 tx_buf[i + 2] = 0xFF;
891 } else {
892 tx_buf[i + 1] |= 0x07;
893 tx_buf[i + 2] = 0xFF;
894 }
895 i += 3;
896 }
897
898
Vivien Didelot61bdda62013-10-20 19:02:00 +0100899 ret = st->send(st->client, tx_buf, len);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100900 if (ret < 0)
901 goto error_ret;
902 if (ret != len) {
903 ret = -EIO;
904 goto error_ret;
905 }
906
907 /*
908 * Now that we hopefully have sensible thresholds in place it is
909 * time to turn the interrupts on.
910 * It is unclear from the data sheet if this should be necessary
911 * (i.e. whether monitor mode setup is atomic) but it appears to
912 * be in practice.
913 */
914 tx_buf[0] = st->setupbyte;
915 tx_buf[1] = MAX1363_MON_INT_ENABLE | (st->monitor_speed << 1) | 0xF0;
Vivien Didelot61bdda62013-10-20 19:02:00 +0100916 ret = st->send(st->client, tx_buf, 2);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100917 if (ret < 0)
918 goto error_ret;
919 if (ret != 2) {
920 ret = -EIO;
921 goto error_ret;
922 }
923 ret = 0;
924 st->monitor_on = true;
925error_ret:
926
927 kfree(tx_buf);
928
929 return ret;
930}
931
932/*
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300933 * To keep this manageable we always use one of 3 scan modes.
Jonathan Cameron440a5202010-06-26 12:54:23 +0100934 * Scan 0...3, 0-1,2-3 and 1-0,3-2
935 */
Jonathan Cameron298cd972011-05-18 14:40:53 +0100936
Jonathan Cameron440a5202010-06-26 12:54:23 +0100937static inline int __max1363_check_event_mask(int thismask, int checkmask)
938{
939 int ret = 0;
940 /* Is it unipolar */
941 if (thismask < 4) {
942 if (checkmask & ~0x0F) {
943 ret = -EBUSY;
944 goto error_ret;
945 }
946 } else if (thismask < 6) {
947 if (checkmask & ~0x30) {
948 ret = -EBUSY;
949 goto error_ret;
950 }
951 } else if (checkmask & ~0xC0)
952 ret = -EBUSY;
953error_ret:
954 return ret;
955}
956
Jonathan Cameron298cd972011-05-18 14:40:53 +0100957static int max1363_write_event_config(struct iio_dev *indio_dev,
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100958 const struct iio_chan_spec *chan, enum iio_event_type type,
959 enum iio_event_direction dir, int state)
Jonathan Cameron440a5202010-06-26 12:54:23 +0100960{
Jonathan Cameron298cd972011-05-18 14:40:53 +0100961 int ret = 0;
Jonathan Cameron3dba81b2011-04-15 18:55:59 +0100962 struct max1363_state *st = iio_priv(indio_dev);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100963 u16 unifiedmask;
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100964 int number = chan->channel;
Jonathan Cameron298cd972011-05-18 14:40:53 +0100965
Jonathan Cameron3dba81b2011-04-15 18:55:59 +0100966 mutex_lock(&indio_dev->mlock);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100967 unifiedmask = st->mask_low | st->mask_high;
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100968 if (dir == IIO_EV_DIR_FALLING) {
Jonathan Cameron298cd972011-05-18 14:40:53 +0100969
970 if (state == 0)
971 st->mask_low &= ~(1 << number);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100972 else {
Jonathan Cameron298cd972011-05-18 14:40:53 +0100973 ret = __max1363_check_event_mask((1 << number),
974 unifiedmask);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100975 if (ret)
976 goto error_ret;
Jonathan Cameron298cd972011-05-18 14:40:53 +0100977 st->mask_low |= (1 << number);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100978 }
979 } else {
Jonathan Cameron298cd972011-05-18 14:40:53 +0100980 if (state == 0)
981 st->mask_high &= ~(1 << number);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100982 else {
Jonathan Cameron298cd972011-05-18 14:40:53 +0100983 ret = __max1363_check_event_mask((1 << number),
984 unifiedmask);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100985 if (ret)
986 goto error_ret;
Jonathan Cameron298cd972011-05-18 14:40:53 +0100987 st->mask_high |= (1 << number);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100988 }
989 }
Jonathan Cameron440a5202010-06-26 12:54:23 +0100990
991 max1363_monitor_mode_update(st, !!(st->mask_high | st->mask_low));
992error_ret:
Jonathan Cameron3dba81b2011-04-15 18:55:59 +0100993 mutex_unlock(&indio_dev->mlock);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100994
Jonathan Cameron298cd972011-05-18 14:40:53 +0100995 return ret;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100996}
997
Jonathan Cameron440a5202010-06-26 12:54:23 +0100998/*
999 * As with scan_elements, only certain sets of these can
1000 * be combined.
1001 */
1002static struct attribute *max1363_event_attributes[] = {
Jonathan Cameron440a5202010-06-26 12:54:23 +01001003 &iio_dev_attr_sampling_frequency.dev_attr.attr,
1004 &iio_const_attr_sampling_frequency_available.dev_attr.attr,
Jonathan Cameron440a5202010-06-26 12:54:23 +01001005 NULL,
1006};
1007
1008static struct attribute_group max1363_event_attribute_group = {
1009 .attrs = max1363_event_attributes,
1010};
1011
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +01001012static int max1363_update_scan_mode(struct iio_dev *indio_dev,
1013 const unsigned long *scan_mask)
1014{
1015 struct max1363_state *st = iio_priv(indio_dev);
1016
1017 /*
1018 * Need to figure out the current mode based upon the requested
1019 * scan mask in iio_dev
1020 */
1021 st->current_mode = max1363_match_mode(scan_mask, st->chip_info);
1022 if (!st->current_mode)
1023 return -EINVAL;
1024 max1363_set_scan_mode(st);
1025 return 0;
1026}
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001027
1028static const struct iio_info max1238_info = {
1029 .read_raw = &max1363_read_raw,
1030 .driver_module = THIS_MODULE,
Jonathan Camerona9ea1b12012-04-10 21:11:05 +01001031 .update_scan_mode = &max1363_update_scan_mode,
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001032};
1033
1034static const struct iio_info max1363_info = {
Lars-Peter Clausencb955852013-12-07 10:45:00 +00001035 .read_event_value = &max1363_read_thresh,
1036 .write_event_value = &max1363_write_thresh,
1037 .read_event_config = &max1363_read_event_config,
1038 .write_event_config = &max1363_write_event_config,
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001039 .read_raw = &max1363_read_raw,
Jonathan Cameronc52cfb62011-12-05 21:37:15 +00001040 .update_scan_mode = &max1363_update_scan_mode,
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001041 .driver_module = THIS_MODULE,
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001042 .event_attrs = &max1363_event_attribute_group,
1043};
1044
1045/* max1363 and max1368 tested - rest from data sheet */
1046static const struct max1363_chip_info max1363_chip_info_tbl[] = {
1047 [max1361] = {
1048 .bits = 10,
1049 .int_vref_mv = 2048,
1050 .mode_list = max1363_mode_list,
1051 .num_modes = ARRAY_SIZE(max1363_mode_list),
1052 .default_mode = s0to3,
1053 .channels = max1361_channels,
1054 .num_channels = ARRAY_SIZE(max1361_channels),
1055 .info = &max1363_info,
1056 },
1057 [max1362] = {
1058 .bits = 10,
1059 .int_vref_mv = 4096,
1060 .mode_list = max1363_mode_list,
1061 .num_modes = ARRAY_SIZE(max1363_mode_list),
1062 .default_mode = s0to3,
1063 .channels = max1361_channels,
1064 .num_channels = ARRAY_SIZE(max1361_channels),
1065 .info = &max1363_info,
1066 },
1067 [max1363] = {
1068 .bits = 12,
1069 .int_vref_mv = 2048,
1070 .mode_list = max1363_mode_list,
1071 .num_modes = ARRAY_SIZE(max1363_mode_list),
1072 .default_mode = s0to3,
1073 .channels = max1363_channels,
1074 .num_channels = ARRAY_SIZE(max1363_channels),
1075 .info = &max1363_info,
1076 },
1077 [max1364] = {
1078 .bits = 12,
1079 .int_vref_mv = 4096,
1080 .mode_list = max1363_mode_list,
1081 .num_modes = ARRAY_SIZE(max1363_mode_list),
1082 .default_mode = s0to3,
1083 .channels = max1363_channels,
1084 .num_channels = ARRAY_SIZE(max1363_channels),
1085 .info = &max1363_info,
1086 },
1087 [max1036] = {
1088 .bits = 8,
1089 .int_vref_mv = 4096,
1090 .mode_list = max1236_mode_list,
1091 .num_modes = ARRAY_SIZE(max1236_mode_list),
1092 .default_mode = s0to3,
1093 .info = &max1238_info,
1094 .channels = max1036_channels,
1095 .num_channels = ARRAY_SIZE(max1036_channels),
1096 },
1097 [max1037] = {
1098 .bits = 8,
1099 .int_vref_mv = 2048,
1100 .mode_list = max1236_mode_list,
1101 .num_modes = ARRAY_SIZE(max1236_mode_list),
1102 .default_mode = s0to3,
1103 .info = &max1238_info,
1104 .channels = max1036_channels,
1105 .num_channels = ARRAY_SIZE(max1036_channels),
1106 },
1107 [max1038] = {
1108 .bits = 8,
1109 .int_vref_mv = 4096,
1110 .mode_list = max1238_mode_list,
1111 .num_modes = ARRAY_SIZE(max1238_mode_list),
1112 .default_mode = s0to11,
1113 .info = &max1238_info,
1114 .channels = max1038_channels,
1115 .num_channels = ARRAY_SIZE(max1038_channels),
1116 },
1117 [max1039] = {
1118 .bits = 8,
1119 .int_vref_mv = 2048,
1120 .mode_list = max1238_mode_list,
1121 .num_modes = ARRAY_SIZE(max1238_mode_list),
1122 .default_mode = s0to11,
1123 .info = &max1238_info,
1124 .channels = max1038_channels,
1125 .num_channels = ARRAY_SIZE(max1038_channels),
1126 },
1127 [max1136] = {
1128 .bits = 10,
1129 .int_vref_mv = 4096,
1130 .mode_list = max1236_mode_list,
1131 .num_modes = ARRAY_SIZE(max1236_mode_list),
1132 .default_mode = s0to3,
1133 .info = &max1238_info,
1134 .channels = max1136_channels,
1135 .num_channels = ARRAY_SIZE(max1136_channels),
1136 },
1137 [max1137] = {
1138 .bits = 10,
1139 .int_vref_mv = 2048,
1140 .mode_list = max1236_mode_list,
1141 .num_modes = ARRAY_SIZE(max1236_mode_list),
1142 .default_mode = s0to3,
1143 .info = &max1238_info,
1144 .channels = max1136_channels,
1145 .num_channels = ARRAY_SIZE(max1136_channels),
1146 },
1147 [max1138] = {
1148 .bits = 10,
1149 .int_vref_mv = 4096,
1150 .mode_list = max1238_mode_list,
1151 .num_modes = ARRAY_SIZE(max1238_mode_list),
1152 .default_mode = s0to11,
1153 .info = &max1238_info,
1154 .channels = max1138_channels,
1155 .num_channels = ARRAY_SIZE(max1138_channels),
1156 },
1157 [max1139] = {
1158 .bits = 10,
1159 .int_vref_mv = 2048,
1160 .mode_list = max1238_mode_list,
1161 .num_modes = ARRAY_SIZE(max1238_mode_list),
1162 .default_mode = s0to11,
1163 .info = &max1238_info,
1164 .channels = max1138_channels,
1165 .num_channels = ARRAY_SIZE(max1138_channels),
1166 },
1167 [max1236] = {
1168 .bits = 12,
1169 .int_vref_mv = 4096,
1170 .mode_list = max1236_mode_list,
1171 .num_modes = ARRAY_SIZE(max1236_mode_list),
1172 .default_mode = s0to3,
1173 .info = &max1238_info,
1174 .channels = max1236_channels,
1175 .num_channels = ARRAY_SIZE(max1236_channels),
1176 },
1177 [max1237] = {
1178 .bits = 12,
1179 .int_vref_mv = 2048,
1180 .mode_list = max1236_mode_list,
1181 .num_modes = ARRAY_SIZE(max1236_mode_list),
1182 .default_mode = s0to3,
1183 .info = &max1238_info,
1184 .channels = max1236_channels,
1185 .num_channels = ARRAY_SIZE(max1236_channels),
1186 },
1187 [max1238] = {
1188 .bits = 12,
1189 .int_vref_mv = 4096,
1190 .mode_list = max1238_mode_list,
1191 .num_modes = ARRAY_SIZE(max1238_mode_list),
1192 .default_mode = s0to11,
1193 .info = &max1238_info,
1194 .channels = max1238_channels,
1195 .num_channels = ARRAY_SIZE(max1238_channels),
1196 },
1197 [max1239] = {
1198 .bits = 12,
1199 .int_vref_mv = 2048,
1200 .mode_list = max1238_mode_list,
1201 .num_modes = ARRAY_SIZE(max1238_mode_list),
1202 .default_mode = s0to11,
1203 .info = &max1238_info,
1204 .channels = max1238_channels,
1205 .num_channels = ARRAY_SIZE(max1238_channels),
1206 },
1207 [max11600] = {
1208 .bits = 8,
1209 .int_vref_mv = 4096,
1210 .mode_list = max11607_mode_list,
1211 .num_modes = ARRAY_SIZE(max11607_mode_list),
1212 .default_mode = s0to3,
1213 .info = &max1238_info,
1214 .channels = max1036_channels,
1215 .num_channels = ARRAY_SIZE(max1036_channels),
1216 },
1217 [max11601] = {
1218 .bits = 8,
1219 .int_vref_mv = 2048,
1220 .mode_list = max11607_mode_list,
1221 .num_modes = ARRAY_SIZE(max11607_mode_list),
1222 .default_mode = s0to3,
1223 .info = &max1238_info,
1224 .channels = max1036_channels,
1225 .num_channels = ARRAY_SIZE(max1036_channels),
1226 },
1227 [max11602] = {
1228 .bits = 8,
1229 .int_vref_mv = 4096,
1230 .mode_list = max11608_mode_list,
1231 .num_modes = ARRAY_SIZE(max11608_mode_list),
1232 .default_mode = s0to7,
1233 .info = &max1238_info,
1234 .channels = max11602_channels,
1235 .num_channels = ARRAY_SIZE(max11602_channels),
1236 },
1237 [max11603] = {
1238 .bits = 8,
1239 .int_vref_mv = 2048,
1240 .mode_list = max11608_mode_list,
1241 .num_modes = ARRAY_SIZE(max11608_mode_list),
1242 .default_mode = s0to7,
1243 .info = &max1238_info,
1244 .channels = max11602_channels,
1245 .num_channels = ARRAY_SIZE(max11602_channels),
1246 },
1247 [max11604] = {
1248 .bits = 8,
Hartmut Knaackb8a70ae2014-02-16 11:47:00 +00001249 .int_vref_mv = 4096,
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001250 .mode_list = max1238_mode_list,
1251 .num_modes = ARRAY_SIZE(max1238_mode_list),
1252 .default_mode = s0to11,
1253 .info = &max1238_info,
Jonathan Camerona91a73c2014-05-24 12:52:10 +01001254 .channels = max1038_channels,
1255 .num_channels = ARRAY_SIZE(max1038_channels),
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001256 },
1257 [max11605] = {
1258 .bits = 8,
1259 .int_vref_mv = 2048,
1260 .mode_list = max1238_mode_list,
1261 .num_modes = ARRAY_SIZE(max1238_mode_list),
1262 .default_mode = s0to11,
1263 .info = &max1238_info,
Jonathan Camerona91a73c2014-05-24 12:52:10 +01001264 .channels = max1038_channels,
1265 .num_channels = ARRAY_SIZE(max1038_channels),
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001266 },
1267 [max11606] = {
1268 .bits = 10,
1269 .int_vref_mv = 4096,
1270 .mode_list = max11607_mode_list,
1271 .num_modes = ARRAY_SIZE(max11607_mode_list),
1272 .default_mode = s0to3,
1273 .info = &max1238_info,
1274 .channels = max1136_channels,
1275 .num_channels = ARRAY_SIZE(max1136_channels),
1276 },
1277 [max11607] = {
1278 .bits = 10,
1279 .int_vref_mv = 2048,
1280 .mode_list = max11607_mode_list,
1281 .num_modes = ARRAY_SIZE(max11607_mode_list),
1282 .default_mode = s0to3,
1283 .info = &max1238_info,
1284 .channels = max1136_channels,
1285 .num_channels = ARRAY_SIZE(max1136_channels),
1286 },
1287 [max11608] = {
1288 .bits = 10,
1289 .int_vref_mv = 4096,
1290 .mode_list = max11608_mode_list,
1291 .num_modes = ARRAY_SIZE(max11608_mode_list),
1292 .default_mode = s0to7,
1293 .info = &max1238_info,
1294 .channels = max11608_channels,
1295 .num_channels = ARRAY_SIZE(max11608_channels),
1296 },
1297 [max11609] = {
1298 .bits = 10,
1299 .int_vref_mv = 2048,
1300 .mode_list = max11608_mode_list,
1301 .num_modes = ARRAY_SIZE(max11608_mode_list),
1302 .default_mode = s0to7,
1303 .info = &max1238_info,
1304 .channels = max11608_channels,
1305 .num_channels = ARRAY_SIZE(max11608_channels),
1306 },
1307 [max11610] = {
1308 .bits = 10,
Hartmut Knaackb8a70ae2014-02-16 11:47:00 +00001309 .int_vref_mv = 4096,
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001310 .mode_list = max1238_mode_list,
1311 .num_modes = ARRAY_SIZE(max1238_mode_list),
1312 .default_mode = s0to11,
1313 .info = &max1238_info,
Jonathan Camerona91a73c2014-05-24 12:52:10 +01001314 .channels = max1138_channels,
1315 .num_channels = ARRAY_SIZE(max1138_channels),
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001316 },
1317 [max11611] = {
1318 .bits = 10,
1319 .int_vref_mv = 2048,
1320 .mode_list = max1238_mode_list,
1321 .num_modes = ARRAY_SIZE(max1238_mode_list),
1322 .default_mode = s0to11,
1323 .info = &max1238_info,
Jonathan Camerona91a73c2014-05-24 12:52:10 +01001324 .channels = max1138_channels,
1325 .num_channels = ARRAY_SIZE(max1138_channels),
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001326 },
1327 [max11612] = {
1328 .bits = 12,
1329 .int_vref_mv = 4096,
1330 .mode_list = max11607_mode_list,
1331 .num_modes = ARRAY_SIZE(max11607_mode_list),
1332 .default_mode = s0to3,
1333 .info = &max1238_info,
1334 .channels = max1363_channels,
1335 .num_channels = ARRAY_SIZE(max1363_channels),
1336 },
1337 [max11613] = {
1338 .bits = 12,
1339 .int_vref_mv = 2048,
1340 .mode_list = max11607_mode_list,
1341 .num_modes = ARRAY_SIZE(max11607_mode_list),
1342 .default_mode = s0to3,
1343 .info = &max1238_info,
1344 .channels = max1363_channels,
1345 .num_channels = ARRAY_SIZE(max1363_channels),
1346 },
1347 [max11614] = {
1348 .bits = 12,
1349 .int_vref_mv = 4096,
1350 .mode_list = max11608_mode_list,
1351 .num_modes = ARRAY_SIZE(max11608_mode_list),
1352 .default_mode = s0to7,
1353 .info = &max1238_info,
1354 .channels = max11614_channels,
1355 .num_channels = ARRAY_SIZE(max11614_channels),
1356 },
1357 [max11615] = {
1358 .bits = 12,
1359 .int_vref_mv = 2048,
1360 .mode_list = max11608_mode_list,
1361 .num_modes = ARRAY_SIZE(max11608_mode_list),
1362 .default_mode = s0to7,
1363 .info = &max1238_info,
1364 .channels = max11614_channels,
1365 .num_channels = ARRAY_SIZE(max11614_channels),
1366 },
1367 [max11616] = {
1368 .bits = 12,
Hartmut Knaackb8a70ae2014-02-16 11:47:00 +00001369 .int_vref_mv = 4096,
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001370 .mode_list = max1238_mode_list,
1371 .num_modes = ARRAY_SIZE(max1238_mode_list),
1372 .default_mode = s0to11,
1373 .info = &max1238_info,
1374 .channels = max1238_channels,
1375 .num_channels = ARRAY_SIZE(max1238_channels),
1376 },
1377 [max11617] = {
1378 .bits = 12,
1379 .int_vref_mv = 2048,
1380 .mode_list = max1238_mode_list,
1381 .num_modes = ARRAY_SIZE(max1238_mode_list),
1382 .default_mode = s0to11,
1383 .info = &max1238_info,
1384 .channels = max1238_channels,
1385 .num_channels = ARRAY_SIZE(max1238_channels),
1386 },
1387 [max11644] = {
1388 .bits = 12,
Stefan Eichenberger5c913eb2016-03-18 16:51:04 +01001389 .int_vref_mv = 4096,
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001390 .mode_list = max11644_mode_list,
1391 .num_modes = ARRAY_SIZE(max11644_mode_list),
1392 .default_mode = s0to1,
1393 .info = &max1238_info,
1394 .channels = max11644_channels,
1395 .num_channels = ARRAY_SIZE(max11644_channels),
1396 },
1397 [max11645] = {
1398 .bits = 12,
Stefan Eichenberger5c913eb2016-03-18 16:51:04 +01001399 .int_vref_mv = 2048,
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001400 .mode_list = max11644_mode_list,
1401 .num_modes = ARRAY_SIZE(max11644_mode_list),
1402 .default_mode = s0to1,
1403 .info = &max1238_info,
1404 .channels = max11644_channels,
1405 .num_channels = ARRAY_SIZE(max11644_channels),
1406 },
1407 [max11646] = {
1408 .bits = 10,
Stefan Eichenberger5c913eb2016-03-18 16:51:04 +01001409 .int_vref_mv = 4096,
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001410 .mode_list = max11644_mode_list,
1411 .num_modes = ARRAY_SIZE(max11644_mode_list),
1412 .default_mode = s0to1,
1413 .info = &max1238_info,
1414 .channels = max11646_channels,
1415 .num_channels = ARRAY_SIZE(max11646_channels),
1416 },
1417 [max11647] = {
1418 .bits = 10,
Stefan Eichenberger5c913eb2016-03-18 16:51:04 +01001419 .int_vref_mv = 2048,
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001420 .mode_list = max11644_mode_list,
1421 .num_modes = ARRAY_SIZE(max11644_mode_list),
1422 .default_mode = s0to1,
1423 .info = &max1238_info,
1424 .channels = max11646_channels,
1425 .num_channels = ARRAY_SIZE(max11646_channels),
1426 },
1427};
1428
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001429static int max1363_initial_setup(struct max1363_state *st)
1430{
Guenter Roecka405b002013-02-03 00:59:00 +00001431 st->setupbyte = MAX1363_SETUP_INT_CLOCK
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001432 | MAX1363_SETUP_UNIPOLAR
1433 | MAX1363_SETUP_NORESET;
1434
Guenter Roecka405b002013-02-03 00:59:00 +00001435 if (st->vref)
1436 st->setupbyte |= MAX1363_SETUP_AIN3_IS_REF_EXT_TO_REF;
1437 else
1438 st->setupbyte |= MAX1363_SETUP_POWER_UP_INT_REF
1439 | MAX1363_SETUP_AIN3_IS_AIN3_REF_IS_INT;
1440
Peter Meerwald71d2c122012-12-30 23:26:00 +00001441 /* Set scan mode writes the config anyway so wait until then */
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001442 st->setupbyte = MAX1363_SETUP_BYTE(st->setupbyte);
1443 st->current_mode = &max1363_mode_table[st->chip_info->default_mode];
1444 st->configbyte = MAX1363_CONFIG_BYTE(st->configbyte);
1445
1446 return max1363_set_scan_mode(st);
1447}
1448
Greg Kroah-Hartmanfc526922012-12-21 13:21:43 -08001449static int max1363_alloc_scan_masks(struct iio_dev *indio_dev)
Michael Hennerichcd4361c2012-02-22 13:16:49 +01001450{
1451 struct max1363_state *st = iio_priv(indio_dev);
1452 unsigned long *masks;
1453 int i;
1454
Guenter Roeck7c3e8672013-02-03 00:59:00 +00001455 masks = devm_kzalloc(&indio_dev->dev,
1456 BITS_TO_LONGS(MAX1363_MAX_CHANNELS) * sizeof(long) *
1457 (st->chip_info->num_modes + 1), GFP_KERNEL);
Michael Hennerichcd4361c2012-02-22 13:16:49 +01001458 if (!masks)
1459 return -ENOMEM;
1460
1461 for (i = 0; i < st->chip_info->num_modes; i++)
1462 bitmap_copy(masks + BITS_TO_LONGS(MAX1363_MAX_CHANNELS)*i,
1463 max1363_mode_table[st->chip_info->mode_list[i]]
1464 .modemask, MAX1363_MAX_CHANNELS);
1465
1466 indio_dev->available_scan_masks = masks;
1467
1468 return 0;
1469}
1470
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +01001471static irqreturn_t max1363_trigger_handler(int irq, void *p)
1472{
1473 struct iio_poll_func *pf = p;
1474 struct iio_dev *indio_dev = pf->indio_dev;
1475 struct max1363_state *st = iio_priv(indio_dev);
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +01001476 __u8 *rxbuf;
1477 int b_sent;
1478 size_t d_size;
1479 unsigned long numvals = bitmap_weight(st->current_mode->modemask,
1480 MAX1363_MAX_CHANNELS);
1481
1482 /* Ensure the timestamp is 8 byte aligned */
1483 if (st->chip_info->bits != 8)
1484 d_size = numvals*2;
1485 else
1486 d_size = numvals;
1487 if (indio_dev->scan_timestamp) {
1488 d_size += sizeof(s64);
1489 if (d_size % sizeof(s64))
1490 d_size += sizeof(s64) - (d_size % sizeof(s64));
1491 }
1492 /* Monitor mode prevents reading. Whilst not currently implemented
1493 * might as well have this test in here in the meantime as it does
1494 * no harm.
1495 */
1496 if (numvals == 0)
1497 goto done;
1498
1499 rxbuf = kmalloc(d_size, GFP_KERNEL);
1500 if (rxbuf == NULL)
1501 goto done;
1502 if (st->chip_info->bits != 8)
Vivien Didelot61bdda62013-10-20 19:02:00 +01001503 b_sent = st->recv(st->client, rxbuf, numvals * 2);
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +01001504 else
Vivien Didelot61bdda62013-10-20 19:02:00 +01001505 b_sent = st->recv(st->client, rxbuf, numvals);
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +01001506 if (b_sent < 0)
1507 goto done_free;
1508
Lars-Peter Clausend49d95c2013-09-19 13:59:00 +01001509 iio_push_to_buffers_with_timestamp(indio_dev, rxbuf, iio_get_time_ns());
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +01001510
1511done_free:
1512 kfree(rxbuf);
1513done:
1514 iio_trigger_notify_done(indio_dev->trig);
1515
1516 return IRQ_HANDLED;
1517}
1518
Greg Kroah-Hartmanfc526922012-12-21 13:21:43 -08001519static int max1363_probe(struct i2c_client *client,
1520 const struct i2c_device_id *id)
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001521{
Michael Hennerichcd4361c2012-02-22 13:16:49 +01001522 int ret;
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001523 struct max1363_state *st;
1524 struct iio_dev *indio_dev;
Guenter Roecka405b002013-02-03 00:59:00 +00001525 struct regulator *vref;
Dan Carpenterf88af7e2011-06-08 09:42:21 +03001526
Sachin Kamat6917e1d2013-07-22 12:02:00 +01001527 indio_dev = devm_iio_device_alloc(&client->dev,
1528 sizeof(struct max1363_state));
1529 if (!indio_dev)
1530 return -ENOMEM;
Jonathan Cameronb77b8f82012-10-06 14:39:19 +01001531
Guenter Roeck315ce4b2013-01-31 21:43:00 +00001532 indio_dev->dev.of_node = client->dev.of_node;
Jonathan Cameron0b27d672012-04-10 21:11:07 +01001533 ret = iio_map_array_register(indio_dev, client->dev.platform_data);
1534 if (ret < 0)
Sachin Kamat6917e1d2013-07-22 12:02:00 +01001535 return ret;
Jonathan Cameronb77b8f82012-10-06 14:39:19 +01001536
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001537 st = iio_priv(indio_dev);
Jonathan Cameronb77b8f82012-10-06 14:39:19 +01001538
Guenter Roeck7c3e8672013-02-03 00:59:00 +00001539 st->reg = devm_regulator_get(&client->dev, "vcc");
Jonathan Cameronb77b8f82012-10-06 14:39:19 +01001540 if (IS_ERR(st->reg)) {
1541 ret = PTR_ERR(st->reg);
1542 goto error_unregister_map;
1543 }
1544
1545 ret = regulator_enable(st->reg);
1546 if (ret)
Guenter Roeck7c3e8672013-02-03 00:59:00 +00001547 goto error_unregister_map;
Jonathan Cameronb77b8f82012-10-06 14:39:19 +01001548
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001549 /* this is only used for device removal purposes */
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001550 i2c_set_clientdata(client, indio_dev);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001551
Jonathan Cameron962a4cc2010-06-26 12:54:13 +01001552 st->chip_info = &max1363_chip_info_tbl[id->driver_data];
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001553 st->client = client;
1554
Guenter Roecka405b002013-02-03 00:59:00 +00001555 st->vref_uv = st->chip_info->int_vref_mv * 1000;
Guenter Roeck55b40d32014-01-27 18:10:00 +00001556 vref = devm_regulator_get_optional(&client->dev, "vref");
Guenter Roecka405b002013-02-03 00:59:00 +00001557 if (!IS_ERR(vref)) {
1558 int vref_uv;
1559
1560 ret = regulator_enable(vref);
1561 if (ret)
1562 goto error_disable_reg;
1563 st->vref = vref;
1564 vref_uv = regulator_get_voltage(vref);
1565 if (vref_uv <= 0) {
1566 ret = -EINVAL;
1567 goto error_disable_reg;
1568 }
1569 st->vref_uv = vref_uv;
1570 }
1571
Vivien Didelot61bdda62013-10-20 19:02:00 +01001572 if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
1573 st->send = i2c_master_send;
1574 st->recv = i2c_master_recv;
1575 } else if (i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE)
1576 && st->chip_info->bits == 8) {
1577 st->send = max1363_smbus_send;
1578 st->recv = max1363_smbus_recv;
1579 } else {
1580 ret = -EOPNOTSUPP;
1581 goto error_disable_reg;
1582 }
1583
Michael Hennerichcd4361c2012-02-22 13:16:49 +01001584 ret = max1363_alloc_scan_masks(indio_dev);
1585 if (ret)
Jonathan Cameronb77b8f82012-10-06 14:39:19 +01001586 goto error_disable_reg;
Jonathan Cameron82020b02010-05-04 14:43:03 +01001587
Peter Meerwald71d2c122012-12-30 23:26:00 +00001588 /* Establish that the iio_dev is a child of the i2c device */
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001589 indio_dev->dev.parent = &client->dev;
Jonathan Cameron845bd122011-05-18 14:41:44 +01001590 indio_dev->name = id->name;
Jonathan Cameron8e7d9672011-08-30 12:32:45 +01001591 indio_dev->channels = st->chip_info->channels;
1592 indio_dev->num_channels = st->chip_info->num_channels;
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001593 indio_dev->info = st->chip_info->info;
1594 indio_dev->modes = INDIO_DIRECT_MODE;
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001595 ret = max1363_initial_setup(st);
Jonathan Cameron58f0a252011-05-18 14:42:38 +01001596 if (ret < 0)
Guenter Roeck7c3e8672013-02-03 00:59:00 +00001597 goto error_disable_reg;
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001598
Peter Meerwald4389fbe2012-12-30 23:26:00 +00001599 ret = iio_triggered_buffer_setup(indio_dev, NULL,
Lars-Peter Clausen7a1aeba2013-09-16 09:34:00 +01001600 &max1363_trigger_handler, NULL);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001601 if (ret)
Guenter Roeck7c3e8672013-02-03 00:59:00 +00001602 goto error_disable_reg;
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001603
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001604 if (client->irq) {
Guenter Roeck7c3e8672013-02-03 00:59:00 +00001605 ret = devm_request_threaded_irq(&client->dev, st->client->irq,
Jonathan Cameronaaf370d2011-05-18 14:41:16 +01001606 NULL,
1607 &max1363_event_handler,
1608 IRQF_TRIGGER_RISING | IRQF_ONESHOT,
1609 "max1363_event",
1610 indio_dev);
Jonathan Cameron298cd972011-05-18 14:40:53 +01001611
Jonathan Cameron440a5202010-06-26 12:54:23 +01001612 if (ret)
Jonathan Cameronec443722012-10-06 14:19:01 +01001613 goto error_uninit_buffer;
Jonathan Cameron440a5202010-06-26 12:54:23 +01001614 }
1615
Jonathan Cameron26d25ae2011-09-02 17:14:40 +01001616 ret = iio_device_register(indio_dev);
1617 if (ret < 0)
Guenter Roeck7c3e8672013-02-03 00:59:00 +00001618 goto error_uninit_buffer;
Dan Carpenterf88af7e2011-06-08 09:42:21 +03001619
Jonathan Cameron26d25ae2011-09-02 17:14:40 +01001620 return 0;
Guenter Roeck7c3e8672013-02-03 00:59:00 +00001621
Jonathan Cameronec443722012-10-06 14:19:01 +01001622error_uninit_buffer:
Peter Meerwald4389fbe2012-12-30 23:26:00 +00001623 iio_triggered_buffer_cleanup(indio_dev);
Jonathan Cameronb77b8f82012-10-06 14:39:19 +01001624error_disable_reg:
Guenter Roecka405b002013-02-03 00:59:00 +00001625 if (st->vref)
1626 regulator_disable(st->vref);
Jonathan Cameronb77b8f82012-10-06 14:39:19 +01001627 regulator_disable(st->reg);
Guenter Roeck678fb422012-12-24 06:24:00 +00001628error_unregister_map:
Guenter Roeck6cb2afd2013-01-31 21:43:00 +00001629 iio_map_array_unregister(indio_dev);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001630 return ret;
1631}
1632
Greg Kroah-Hartmanfc526922012-12-21 13:21:43 -08001633static int max1363_remove(struct i2c_client *client)
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001634{
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001635 struct iio_dev *indio_dev = i2c_get_clientdata(client);
1636 struct max1363_state *st = iio_priv(indio_dev);
Jonathan Cameron440a5202010-06-26 12:54:23 +01001637
Jonathan Camerond2fffd62011-10-14 14:46:58 +01001638 iio_device_unregister(indio_dev);
Peter Meerwald4389fbe2012-12-30 23:26:00 +00001639 iio_triggered_buffer_cleanup(indio_dev);
Guenter Roecka405b002013-02-03 00:59:00 +00001640 if (st->vref)
1641 regulator_disable(st->vref);
Guenter Roeck678fb422012-12-24 06:24:00 +00001642 regulator_disable(st->reg);
Guenter Roeck6cb2afd2013-01-31 21:43:00 +00001643 iio_map_array_unregister(indio_dev);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001644
1645 return 0;
1646}
1647
1648static const struct i2c_device_id max1363_id[] = {
1649 { "max1361", max1361 },
1650 { "max1362", max1362 },
1651 { "max1363", max1363 },
1652 { "max1364", max1364 },
Jonathan Cameron3bf877c2010-05-04 14:43:10 +01001653 { "max1036", max1036 },
1654 { "max1037", max1037 },
1655 { "max1038", max1038 },
1656 { "max1039", max1039 },
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001657 { "max1136", max1136 },
1658 { "max1137", max1137 },
1659 { "max1138", max1138 },
1660 { "max1139", max1139 },
1661 { "max1236", max1236 },
1662 { "max1237", max1237 },
1663 { "max1238", max1238 },
1664 { "max1239", max1239 },
Jonathan Cameron3bf877c2010-05-04 14:43:10 +01001665 { "max11600", max11600 },
1666 { "max11601", max11601 },
1667 { "max11602", max11602 },
1668 { "max11603", max11603 },
1669 { "max11604", max11604 },
1670 { "max11605", max11605 },
Jonathan Cameronc3fa0fdd2010-05-04 14:43:09 +01001671 { "max11606", max11606 },
1672 { "max11607", max11607 },
1673 { "max11608", max11608 },
1674 { "max11609", max11609 },
1675 { "max11610", max11610 },
1676 { "max11611", max11611 },
1677 { "max11612", max11612 },
1678 { "max11613", max11613 },
1679 { "max11614", max11614 },
1680 { "max11615", max11615 },
1681 { "max11616", max11616 },
1682 { "max11617", max11617 },
Stefan Eichenberger3fb77e22016-03-18 16:51:03 +01001683 { "max11644", max11644 },
1684 { "max11645", max11645 },
1685 { "max11646", max11646 },
1686 { "max11647", max11647 },
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001687 {}
1688};
1689
1690MODULE_DEVICE_TABLE(i2c, max1363_id);
1691
1692static struct i2c_driver max1363_driver = {
1693 .driver = {
1694 .name = "max1363",
1695 },
1696 .probe = max1363_probe,
Greg Kroah-Hartmanfc526922012-12-21 13:21:43 -08001697 .remove = max1363_remove,
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001698 .id_table = max1363_id,
1699};
Lars-Peter Clausen6e5af182011-11-16 10:13:38 +01001700module_i2c_driver(max1363_driver);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001701
Jonathan Cameron0f8c9622012-09-02 21:34:59 +01001702MODULE_AUTHOR("Jonathan Cameron <jic23@kernel.org>");
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001703MODULE_DESCRIPTION("Maxim 1363 ADC");
1704MODULE_LICENSE("GPL v2");