blob: 5c2cc61b666e74c8fd0bdd5db00c460507331b90 [file] [log] [blame]
Thomas Gleixnerd2912cb2019-06-04 10:11:33 +02001// SPDX-License-Identifier: GPL-2.0-only
Jonathan Camerond1325cf2009-08-18 18:06:20 +01002 /*
Jonathan Cameron82020b02010-05-04 14:43:03 +01003 * iio/adc/max1363.c
4 * Copyright (C) 2008-2010 Jonathan Cameron
5 *
6 * based on linux/drivers/i2c/chips/max123x
7 * Copyright (C) 2002-2004 Stefan Eletzhofer
8 *
9 * based on linux/drivers/acron/char/pcf8583.c
10 * Copyright (C) 2000 Russell King
11 *
Vivien Didelot82b7afb2014-10-01 20:59:00 +010012 * Driver for max1363 and similar chips.
Jonathan Cameron82020b02010-05-04 14:43:03 +010013 */
Jonathan Camerond1325cf2009-08-18 18:06:20 +010014
15#include <linux/interrupt.h>
Jonathan Camerond1325cf2009-08-18 18:06:20 +010016#include <linux/device.h>
17#include <linux/kernel.h>
18#include <linux/sysfs.h>
19#include <linux/list.h>
20#include <linux/i2c.h>
Jonathan Camerond1325cf2009-08-18 18:06:20 +010021#include <linux/regulator/consumer.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090022#include <linux/slab.h>
Jonathan Cameronc40ab872010-06-26 12:54:14 +010023#include <linux/err.h>
Paul Gortmaker99c97852011-07-03 15:49:50 -040024#include <linux/module.h>
Florian Vaussard152c9aa2016-06-30 09:43:06 +020025#include <linux/of.h>
26#include <linux/of_device.h>
Jonathan Camerond1325cf2009-08-18 18:06:20 +010027
Jonathan Cameron06458e22012-04-25 15:54:58 +010028#include <linux/iio/iio.h>
29#include <linux/iio/sysfs.h>
30#include <linux/iio/events.h>
31#include <linux/iio/buffer.h>
32#include <linux/iio/driver.h>
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +010033#include <linux/iio/kfifo_buf.h>
34#include <linux/iio/trigger_consumer.h>
Peter Meerwald4389fbe2012-12-30 23:26:00 +000035#include <linux/iio/triggered_buffer.h>
Jonathan Cameroncdf38702011-08-12 17:08:43 +010036
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +010037#define MAX1363_SETUP_BYTE(a) ((a) | 0x80)
38
39/* There is a fair bit more defined here than currently
40 * used, but the intention is to support everything these
41 * chips do in the long run */
42
43/* see data sheets */
44/* max1363 and max1236, max1237, max1238, max1239 */
45#define MAX1363_SETUP_AIN3_IS_AIN3_REF_IS_VDD 0x00
46#define MAX1363_SETUP_AIN3_IS_REF_EXT_TO_REF 0x20
47#define MAX1363_SETUP_AIN3_IS_AIN3_REF_IS_INT 0x40
48#define MAX1363_SETUP_AIN3_IS_REF_REF_IS_INT 0x60
49#define MAX1363_SETUP_POWER_UP_INT_REF 0x10
50#define MAX1363_SETUP_POWER_DOWN_INT_REF 0x00
51
Peter Meerwald71d2c122012-12-30 23:26:00 +000052/* think about including max11600 etc - more settings */
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +010053#define MAX1363_SETUP_EXT_CLOCK 0x08
54#define MAX1363_SETUP_INT_CLOCK 0x00
55#define MAX1363_SETUP_UNIPOLAR 0x00
56#define MAX1363_SETUP_BIPOLAR 0x04
57#define MAX1363_SETUP_RESET 0x00
58#define MAX1363_SETUP_NORESET 0x02
59/* max1363 only - though don't care on others.
60 * For now monitor modes are not implemented as the relevant
61 * line is not connected on my test board.
62 * The definitions are here as I intend to add this soon.
63 */
64#define MAX1363_SETUP_MONITOR_SETUP 0x01
65
66/* Specific to the max1363 */
67#define MAX1363_MON_RESET_CHAN(a) (1 << ((a) + 4))
68#define MAX1363_MON_INT_ENABLE 0x01
69
70/* defined for readability reasons */
71/* All chips */
72#define MAX1363_CONFIG_BYTE(a) ((a))
73
74#define MAX1363_CONFIG_SE 0x01
75#define MAX1363_CONFIG_DE 0x00
76#define MAX1363_CONFIG_SCAN_TO_CS 0x00
77#define MAX1363_CONFIG_SCAN_SINGLE_8 0x20
78#define MAX1363_CONFIG_SCAN_MONITOR_MODE 0x40
79#define MAX1363_CONFIG_SCAN_SINGLE_1 0x60
80/* max123{6-9} only */
81#define MAX1236_SCAN_MID_TO_CHANNEL 0x40
82
Peter Meerwald71d2c122012-12-30 23:26:00 +000083/* max1363 only - merely part of channel selects or don't care for others */
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +010084#define MAX1363_CONFIG_EN_MON_MODE_READ 0x18
85
86#define MAX1363_CHANNEL_SEL(a) ((a) << 1)
87
88/* max1363 strictly 0x06 - but doesn't matter */
89#define MAX1363_CHANNEL_SEL_MASK 0x1E
90#define MAX1363_SCAN_MASK 0x60
91#define MAX1363_SE_DE_MASK 0x01
92
93#define MAX1363_MAX_CHANNELS 25
94/**
95 * struct max1363_mode - scan mode information
96 * @conf: The corresponding value of the configuration register
97 * @modemask: Bit mask corresponding to channels enabled in this mode
98 */
99struct max1363_mode {
100 int8_t conf;
101 DECLARE_BITMAP(modemask, MAX1363_MAX_CHANNELS);
102};
103
104/* This must be maintained along side the max1363_mode_table in max1363_core */
105enum max1363_modes {
106 /* Single read of a single channel */
107 _s0, _s1, _s2, _s3, _s4, _s5, _s6, _s7, _s8, _s9, _s10, _s11,
108 /* Differential single read */
109 d0m1, d2m3, d4m5, d6m7, d8m9, d10m11,
110 d1m0, d3m2, d5m4, d7m6, d9m8, d11m10,
111 /* Scan to channel and mid to channel where overlapping */
112 s0to1, s0to2, s2to3, s0to3, s0to4, s0to5, s0to6,
113 s6to7, s0to7, s6to8, s0to8, s6to9,
114 s0to9, s6to10, s0to10, s6to11, s0to11,
115 /* Differential scan to channel and mid to channel where overlapping */
116 d0m1to2m3, d0m1to4m5, d0m1to6m7, d6m7to8m9,
117 d0m1to8m9, d6m7to10m11, d0m1to10m11, d1m0to3m2,
118 d1m0to5m4, d1m0to7m6, d7m6to9m8, d1m0to9m8,
119 d7m6to11m10, d1m0to11m10,
120};
121
122/**
123 * struct max1363_chip_info - chip specifc information
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +0100124 * @info: iio core function callbacks structure
Jonathan Cameron2593b132012-10-06 14:37:44 +0100125 * @channels: channel specification
126 * @num_channels: number of channels
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +0100127 * @mode_list: array of available scan modes
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +0100128 * @default_mode: the scan mode in which the chip starts up
Jonathan Cameron2593b132012-10-06 14:37:44 +0100129 * @int_vref_mv: the internal reference voltage
Peter Meerwald71d2c122012-12-30 23:26:00 +0000130 * @num_modes: number of modes
Jonathan Cameron2593b132012-10-06 14:37:44 +0100131 * @bits: accuracy of the adc in bits
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +0100132 */
133struct max1363_chip_info {
134 const struct iio_info *info;
Jonathan Cameron2593b132012-10-06 14:37:44 +0100135 const struct iio_chan_spec *channels;
136 int num_channels;
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +0100137 const enum max1363_modes *mode_list;
138 enum max1363_modes default_mode;
139 u16 int_vref_mv;
140 u8 num_modes;
141 u8 bits;
142};
143
144/**
145 * struct max1363_state - driver instance specific data
146 * @client: i2c_client
147 * @setupbyte: cache of current device setup byte
148 * @configbyte: cache of current device config byte
Peter Meerwald71d2c122012-12-30 23:26:00 +0000149 * @chip_info: chip model specific constants, available modes, etc.
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +0100150 * @current_mode: the scan mode of this chip
151 * @requestedmask: a valid requested set of channels
152 * @reg: supply regulator
153 * @monitor_on: whether monitor mode is enabled
154 * @monitor_speed: parameter corresponding to device monitor speed setting
155 * @mask_high: bitmask for enabled high thresholds
156 * @mask_low: bitmask for enabled low thresholds
157 * @thresh_high: high threshold values
158 * @thresh_low: low threshold values
Guenter Roecka405b002013-02-03 00:59:00 +0000159 * @vref: Reference voltage regulator
160 * @vref_uv: Actual (external or internal) reference voltage
Vivien Didelot61bdda62013-10-20 19:02:00 +0100161 * @send: function used to send data to the chip
162 * @recv: function used to receive data from the chip
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +0100163 */
164struct max1363_state {
165 struct i2c_client *client;
166 u8 setupbyte;
167 u8 configbyte;
168 const struct max1363_chip_info *chip_info;
169 const struct max1363_mode *current_mode;
170 u32 requestedmask;
171 struct regulator *reg;
172
173 /* Using monitor modes and buffer at the same time is
174 currently not supported */
175 bool monitor_on;
176 unsigned int monitor_speed:3;
177 u8 mask_high;
178 u8 mask_low;
179 /* 4x unipolar first then the fours bipolar ones */
180 s16 thresh_high[8];
181 s16 thresh_low[8];
Guenter Roecka405b002013-02-03 00:59:00 +0000182 struct regulator *vref;
183 u32 vref_uv;
Vivien Didelot61bdda62013-10-20 19:02:00 +0100184 int (*send)(const struct i2c_client *client,
185 const char *buf, int count);
186 int (*recv)(const struct i2c_client *client,
187 char *buf, int count);
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +0100188};
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100189
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100190#define MAX1363_MODE_SINGLE(_num, _mask) { \
191 .conf = MAX1363_CHANNEL_SEL(_num) \
192 | MAX1363_CONFIG_SCAN_SINGLE_1 \
193 | MAX1363_CONFIG_SE, \
Jonathan Cameron32b5eec2011-09-02 17:14:38 +0100194 .modemask[0] = _mask, \
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100195 }
196
197#define MAX1363_MODE_SCAN_TO_CHANNEL(_num, _mask) { \
198 .conf = MAX1363_CHANNEL_SEL(_num) \
199 | MAX1363_CONFIG_SCAN_TO_CS \
200 | MAX1363_CONFIG_SE, \
Jonathan Cameron32b5eec2011-09-02 17:14:38 +0100201 .modemask[0] = _mask, \
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100202 }
203
204/* note not available for max1363 hence naming */
205#define MAX1236_MODE_SCAN_MID_TO_CHANNEL(_mid, _num, _mask) { \
206 .conf = MAX1363_CHANNEL_SEL(_num) \
207 | MAX1236_SCAN_MID_TO_CHANNEL \
208 | MAX1363_CONFIG_SE, \
Jonathan Cameron32b5eec2011-09-02 17:14:38 +0100209 .modemask[0] = _mask \
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100210}
211
212#define MAX1363_MODE_DIFF_SINGLE(_nump, _numm, _mask) { \
213 .conf = MAX1363_CHANNEL_SEL(_nump) \
214 | MAX1363_CONFIG_SCAN_SINGLE_1 \
215 | MAX1363_CONFIG_DE, \
Jonathan Cameron32b5eec2011-09-02 17:14:38 +0100216 .modemask[0] = _mask \
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100217 }
218
219/* Can't think how to automate naming so specify for now */
220#define MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(_num, _numvals, _mask) { \
221 .conf = MAX1363_CHANNEL_SEL(_num) \
222 | MAX1363_CONFIG_SCAN_TO_CS \
223 | MAX1363_CONFIG_DE, \
Jonathan Cameron32b5eec2011-09-02 17:14:38 +0100224 .modemask[0] = _mask \
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100225 }
226
227/* note only available for max1363 hence naming */
228#define MAX1236_MODE_DIFF_SCAN_MID_TO_CHANNEL(_num, _numvals, _mask) { \
229 .conf = MAX1363_CHANNEL_SEL(_num) \
230 | MAX1236_SCAN_MID_TO_CHANNEL \
231 | MAX1363_CONFIG_SE, \
Jonathan Cameron32b5eec2011-09-02 17:14:38 +0100232 .modemask[0] = _mask \
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100233}
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100234
Jonathan Cameron82020b02010-05-04 14:43:03 +0100235static const struct max1363_mode max1363_mode_table[] = {
236 /* All of the single channel options first */
237 MAX1363_MODE_SINGLE(0, 1 << 0),
238 MAX1363_MODE_SINGLE(1, 1 << 1),
239 MAX1363_MODE_SINGLE(2, 1 << 2),
240 MAX1363_MODE_SINGLE(3, 1 << 3),
241 MAX1363_MODE_SINGLE(4, 1 << 4),
242 MAX1363_MODE_SINGLE(5, 1 << 5),
243 MAX1363_MODE_SINGLE(6, 1 << 6),
244 MAX1363_MODE_SINGLE(7, 1 << 7),
245 MAX1363_MODE_SINGLE(8, 1 << 8),
246 MAX1363_MODE_SINGLE(9, 1 << 9),
247 MAX1363_MODE_SINGLE(10, 1 << 10),
248 MAX1363_MODE_SINGLE(11, 1 << 11),
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100249
Jonathan Cameron82020b02010-05-04 14:43:03 +0100250 MAX1363_MODE_DIFF_SINGLE(0, 1, 1 << 12),
251 MAX1363_MODE_DIFF_SINGLE(2, 3, 1 << 13),
252 MAX1363_MODE_DIFF_SINGLE(4, 5, 1 << 14),
253 MAX1363_MODE_DIFF_SINGLE(6, 7, 1 << 15),
254 MAX1363_MODE_DIFF_SINGLE(8, 9, 1 << 16),
255 MAX1363_MODE_DIFF_SINGLE(10, 11, 1 << 17),
256 MAX1363_MODE_DIFF_SINGLE(1, 0, 1 << 18),
257 MAX1363_MODE_DIFF_SINGLE(3, 2, 1 << 19),
258 MAX1363_MODE_DIFF_SINGLE(5, 4, 1 << 20),
259 MAX1363_MODE_DIFF_SINGLE(7, 6, 1 << 21),
260 MAX1363_MODE_DIFF_SINGLE(9, 8, 1 << 22),
261 MAX1363_MODE_DIFF_SINGLE(11, 10, 1 << 23),
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100262
Jonathan Cameron82020b02010-05-04 14:43:03 +0100263 /* The multichannel scans next */
264 MAX1363_MODE_SCAN_TO_CHANNEL(1, 0x003),
265 MAX1363_MODE_SCAN_TO_CHANNEL(2, 0x007),
266 MAX1236_MODE_SCAN_MID_TO_CHANNEL(2, 3, 0x00C),
267 MAX1363_MODE_SCAN_TO_CHANNEL(3, 0x00F),
268 MAX1363_MODE_SCAN_TO_CHANNEL(4, 0x01F),
269 MAX1363_MODE_SCAN_TO_CHANNEL(5, 0x03F),
270 MAX1363_MODE_SCAN_TO_CHANNEL(6, 0x07F),
271 MAX1236_MODE_SCAN_MID_TO_CHANNEL(6, 7, 0x0C0),
272 MAX1363_MODE_SCAN_TO_CHANNEL(7, 0x0FF),
273 MAX1236_MODE_SCAN_MID_TO_CHANNEL(6, 8, 0x1C0),
274 MAX1363_MODE_SCAN_TO_CHANNEL(8, 0x1FF),
275 MAX1236_MODE_SCAN_MID_TO_CHANNEL(6, 9, 0x3C0),
276 MAX1363_MODE_SCAN_TO_CHANNEL(9, 0x3FF),
277 MAX1236_MODE_SCAN_MID_TO_CHANNEL(6, 10, 0x7C0),
278 MAX1363_MODE_SCAN_TO_CHANNEL(10, 0x7FF),
279 MAX1236_MODE_SCAN_MID_TO_CHANNEL(6, 11, 0xFC0),
280 MAX1363_MODE_SCAN_TO_CHANNEL(11, 0xFFF),
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100281
Jonathan Cameron82020b02010-05-04 14:43:03 +0100282 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(2, 2, 0x003000),
283 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(4, 3, 0x007000),
284 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(6, 4, 0x00F000),
285 MAX1236_MODE_DIFF_SCAN_MID_TO_CHANNEL(8, 2, 0x018000),
286 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(8, 5, 0x01F000),
287 MAX1236_MODE_DIFF_SCAN_MID_TO_CHANNEL(10, 3, 0x038000),
288 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(10, 6, 0x3F000),
289 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(3, 2, 0x0C0000),
290 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(5, 3, 0x1C0000),
291 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(7, 4, 0x3C0000),
292 MAX1236_MODE_DIFF_SCAN_MID_TO_CHANNEL(9, 2, 0x600000),
293 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(9, 5, 0x7C0000),
294 MAX1236_MODE_DIFF_SCAN_MID_TO_CHANNEL(11, 3, 0xE00000),
295 MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(11, 6, 0xFC0000),
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100296};
297
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +0100298static const struct max1363_mode
Jonathan Cameronc52cfb62011-12-05 21:37:15 +0000299*max1363_match_mode(const unsigned long *mask,
Peter Meerwald71d2c122012-12-30 23:26:00 +0000300 const struct max1363_chip_info *ci)
Greg Kroah-Hartman1b183e42010-05-04 22:24:05 -0700301{
Jonathan Cameron82020b02010-05-04 14:43:03 +0100302 int i;
303 if (mask)
304 for (i = 0; i < ci->num_modes; i++)
Jonathan Cameron32b5eec2011-09-02 17:14:38 +0100305 if (bitmap_subset(mask,
306 max1363_mode_table[ci->mode_list[i]].
307 modemask,
308 MAX1363_MAX_CHANNELS))
Greg Kroah-Hartman1b183e42010-05-04 22:24:05 -0700309 return &max1363_mode_table[ci->mode_list[i]];
310 return NULL;
Mike Frysingerc608cb02010-05-23 03:10:30 -0400311}
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100312
Vivien Didelot61bdda62013-10-20 19:02:00 +0100313static int max1363_smbus_send(const struct i2c_client *client, const char *buf,
314 int count)
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100315{
Vivien Didelot61bdda62013-10-20 19:02:00 +0100316 int i, err;
Jonathan Cameron82020b02010-05-04 14:43:03 +0100317
Vivien Didelot61bdda62013-10-20 19:02:00 +0100318 for (i = err = 0; err == 0 && i < count; ++i)
319 err = i2c_smbus_write_byte(client, buf[i]);
320
321 return err ? err : count;
322}
323
324static int max1363_smbus_recv(const struct i2c_client *client, char *buf,
325 int count)
326{
327 int i, ret;
328
329 for (i = 0; i < count; ++i) {
330 ret = i2c_smbus_read_byte(client);
331 if (ret < 0)
332 return ret;
333 buf[i] = ret;
334 }
335
336 return count;
337}
338
339static int max1363_write_basic_config(struct max1363_state *st)
340{
341 u8 tx_buf[2] = { st->setupbyte, st->configbyte };
342
343 return st->send(st->client, tx_buf, 2);
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100344}
345
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +0100346static int max1363_set_scan_mode(struct max1363_state *st)
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100347{
348 st->configbyte &= ~(MAX1363_CHANNEL_SEL_MASK
349 | MAX1363_SCAN_MASK
350 | MAX1363_SE_DE_MASK);
351 st->configbyte |= st->current_mode->conf;
352
Vivien Didelot61bdda62013-10-20 19:02:00 +0100353 return max1363_write_basic_config(st);
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100354}
355
Jonathan Cameron298cd972011-05-18 14:40:53 +0100356static int max1363_read_single_chan(struct iio_dev *indio_dev,
357 struct iio_chan_spec const *chan,
358 int *val,
359 long m)
Jonathan Cameron82020b02010-05-04 14:43:03 +0100360{
Jonathan Cameron298cd972011-05-18 14:40:53 +0100361 int ret = 0;
362 s32 data;
Guenter Roeck482bb4e2013-01-31 21:43:00 +0000363 u8 rxbuf[2];
Jonathan Cameron298cd972011-05-18 14:40:53 +0100364 struct max1363_state *st = iio_priv(indio_dev);
365 struct i2c_client *client = st->client;
Jonathan Cameron82020b02010-05-04 14:43:03 +0100366
Jonathan Cameronb6b70682011-04-15 18:55:58 +0100367 mutex_lock(&indio_dev->mlock);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100368 /*
369 * If monitor mode is enabled, the method for reading a single
370 * channel will have to be rather different and has not yet
371 * been implemented.
Jonathan Cameron3ca34cc2011-12-05 22:18:25 +0000372 *
373 * Also, cannot read directly if buffered capture enabled.
Jonathan Cameron440a5202010-06-26 12:54:23 +0100374 */
Jonathan Cameron3ca34cc2011-12-05 22:18:25 +0000375 if (st->monitor_on || iio_buffer_enabled(indio_dev)) {
Jonathan Cameron440a5202010-06-26 12:54:23 +0100376 ret = -EBUSY;
377 goto error_ret;
378 }
379
Jonathan Cameron3ca34cc2011-12-05 22:18:25 +0000380 /* Check to see if current scan mode is correct */
381 if (st->current_mode != &max1363_mode_table[chan->address]) {
382 /* Update scan mode if needed */
383 st->current_mode = &max1363_mode_table[chan->address];
384 ret = max1363_set_scan_mode(st);
385 if (ret < 0)
386 goto error_ret;
387 }
388 if (st->chip_info->bits != 8) {
389 /* Get reading */
Vivien Didelot61bdda62013-10-20 19:02:00 +0100390 data = st->recv(client, rxbuf, 2);
Jonathan Cameron82020b02010-05-04 14:43:03 +0100391 if (data < 0) {
392 ret = data;
393 goto error_ret;
394 }
Guenter Roeck482bb4e2013-01-31 21:43:00 +0000395 data = (rxbuf[1] | rxbuf[0] << 8) &
396 ((1 << st->chip_info->bits) - 1);
Jonathan Cameron82020b02010-05-04 14:43:03 +0100397 } else {
Jonathan Cameron3ca34cc2011-12-05 22:18:25 +0000398 /* Get reading */
Vivien Didelot61bdda62013-10-20 19:02:00 +0100399 data = st->recv(client, rxbuf, 1);
Jonathan Cameron3ca34cc2011-12-05 22:18:25 +0000400 if (data < 0) {
401 ret = data;
402 goto error_ret;
Jonathan Cameron82020b02010-05-04 14:43:03 +0100403 }
Jonathan Cameron3ca34cc2011-12-05 22:18:25 +0000404 data = rxbuf[0];
Jonathan Cameron82020b02010-05-04 14:43:03 +0100405 }
Jonathan Cameron298cd972011-05-18 14:40:53 +0100406 *val = data;
Jonathan Cameron82020b02010-05-04 14:43:03 +0100407error_ret:
Jonathan Cameronb6b70682011-04-15 18:55:58 +0100408 mutex_unlock(&indio_dev->mlock);
Jonathan Cameron298cd972011-05-18 14:40:53 +0100409 return ret;
410
Jonathan Cameron82020b02010-05-04 14:43:03 +0100411}
412
Jonathan Cameron298cd972011-05-18 14:40:53 +0100413static int max1363_read_raw(struct iio_dev *indio_dev,
414 struct iio_chan_spec const *chan,
415 int *val,
416 int *val2,
417 long m)
Jonathan Cameron82020b02010-05-04 14:43:03 +0100418{
Jonathan Cameron298cd972011-05-18 14:40:53 +0100419 struct max1363_state *st = iio_priv(indio_dev);
420 int ret;
Guenter Roecka405b002013-02-03 00:59:00 +0000421
Jonathan Cameron298cd972011-05-18 14:40:53 +0100422 switch (m) {
Jonathan Cameronb11f98f2012-04-15 17:41:18 +0100423 case IIO_CHAN_INFO_RAW:
Jonathan Cameron298cd972011-05-18 14:40:53 +0100424 ret = max1363_read_single_chan(indio_dev, chan, val, m);
Jonathan Cameroncd038012011-08-12 16:55:29 +0100425 if (ret < 0)
Jonathan Cameron298cd972011-05-18 14:40:53 +0100426 return ret;
427 return IIO_VAL_INT;
Jonathan Cameronc8a9f802011-10-26 17:41:36 +0100428 case IIO_CHAN_INFO_SCALE:
Lars-Peter Clausenb2171672013-09-28 10:31:00 +0100429 *val = st->vref_uv / 1000;
430 *val2 = st->chip_info->bits;
431 return IIO_VAL_FRACTIONAL_LOG2;
Jonathan Cameron298cd972011-05-18 14:40:53 +0100432 default:
433 return -EINVAL;
434 }
435 return 0;
Jonathan Cameron82020b02010-05-04 14:43:03 +0100436}
437
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100438/* Applies to max1363 */
439static const enum max1363_modes max1363_mode_list[] = {
440 _s0, _s1, _s2, _s3,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100441 s0to1, s0to2, s0to3,
442 d0m1, d2m3, d1m0, d3m2,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100443 d0m1to2m3, d1m0to3m2,
444};
445
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100446static const struct iio_event_spec max1363_events[] = {
447 {
448 .type = IIO_EV_TYPE_THRESH,
449 .dir = IIO_EV_DIR_RISING,
450 .mask_separate = BIT(IIO_EV_INFO_VALUE) |
451 BIT(IIO_EV_INFO_ENABLE),
452 }, {
453 .type = IIO_EV_TYPE_THRESH,
454 .dir = IIO_EV_DIR_FALLING,
455 .mask_separate = BIT(IIO_EV_INFO_VALUE) |
456 BIT(IIO_EV_INFO_ENABLE),
457 },
458};
Jonathan Cameronf6e52e52013-02-19 21:11:35 +0000459
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100460#define MAX1363_CHAN_U(num, addr, si, bits, ev_spec, num_ev_spec) \
Jonathan Cameronade7ef72011-09-02 17:14:45 +0100461 { \
462 .type = IIO_VOLTAGE, \
463 .indexed = 1, \
464 .channel = num, \
465 .address = addr, \
Jonathan Cameronf6e52e52013-02-19 21:11:35 +0000466 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
467 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
Jonathan Cameronbc234e72011-12-05 21:56:01 +0000468 .datasheet_name = "AIN"#num, \
Jonathan Cameron18cffbed2011-12-05 21:37:16 +0000469 .scan_type = { \
470 .sign = 'u', \
471 .realbits = bits, \
472 .storagebits = (bits > 8) ? 16 : 8, \
473 .endianness = IIO_BE, \
474 }, \
Jonathan Cameronade7ef72011-09-02 17:14:45 +0100475 .scan_index = si, \
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100476 .event_spec = ev_spec, \
477 .num_event_specs = num_ev_spec, \
Jonathan Cameron298cd972011-05-18 14:40:53 +0100478 }
479
Jonathan Cameronade7ef72011-09-02 17:14:45 +0100480/* bipolar channel */
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100481#define MAX1363_CHAN_B(num, num2, addr, si, bits, ev_spec, num_ev_spec) \
Jonathan Cameronade7ef72011-09-02 17:14:45 +0100482 { \
483 .type = IIO_VOLTAGE, \
484 .differential = 1, \
485 .indexed = 1, \
486 .channel = num, \
487 .channel2 = num2, \
488 .address = addr, \
Jonathan Cameronf6e52e52013-02-19 21:11:35 +0000489 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
490 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
Jonathan Cameronbc234e72011-12-05 21:56:01 +0000491 .datasheet_name = "AIN"#num"-AIN"#num2, \
Jonathan Cameron18cffbed2011-12-05 21:37:16 +0000492 .scan_type = { \
493 .sign = 's', \
494 .realbits = bits, \
495 .storagebits = (bits > 8) ? 16 : 8, \
496 .endianness = IIO_BE, \
497 }, \
Jonathan Cameronade7ef72011-09-02 17:14:45 +0100498 .scan_index = si, \
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100499 .event_spec = ev_spec, \
500 .num_event_specs = num_ev_spec, \
Jonathan Cameronade7ef72011-09-02 17:14:45 +0100501 }
502
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100503#define MAX1363_4X_CHANS(bits, ev_spec, num_ev_spec) { \
504 MAX1363_CHAN_U(0, _s0, 0, bits, ev_spec, num_ev_spec), \
505 MAX1363_CHAN_U(1, _s1, 1, bits, ev_spec, num_ev_spec), \
506 MAX1363_CHAN_U(2, _s2, 2, bits, ev_spec, num_ev_spec), \
507 MAX1363_CHAN_U(3, _s3, 3, bits, ev_spec, num_ev_spec), \
508 MAX1363_CHAN_B(0, 1, d0m1, 4, bits, ev_spec, num_ev_spec), \
509 MAX1363_CHAN_B(2, 3, d2m3, 5, bits, ev_spec, num_ev_spec), \
510 MAX1363_CHAN_B(1, 0, d1m0, 6, bits, ev_spec, num_ev_spec), \
511 MAX1363_CHAN_B(3, 2, d3m2, 7, bits, ev_spec, num_ev_spec), \
512 IIO_CHAN_SOFT_TIMESTAMP(8) \
Jonathan Cameronade7ef72011-09-02 17:14:45 +0100513 }
514
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100515static const struct iio_chan_spec max1036_channels[] =
516 MAX1363_4X_CHANS(8, NULL, 0);
517static const struct iio_chan_spec max1136_channels[] =
518 MAX1363_4X_CHANS(10, NULL, 0);
519static const struct iio_chan_spec max1236_channels[] =
520 MAX1363_4X_CHANS(12, NULL, 0);
Lars-Peter Clausenf4e4b952012-08-09 08:51:00 +0100521static const struct iio_chan_spec max1361_channels[] =
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100522 MAX1363_4X_CHANS(10, max1363_events, ARRAY_SIZE(max1363_events));
Lars-Peter Clausenf4e4b952012-08-09 08:51:00 +0100523static const struct iio_chan_spec max1363_channels[] =
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100524 MAX1363_4X_CHANS(12, max1363_events, ARRAY_SIZE(max1363_events));
Jonathan Cameron298cd972011-05-18 14:40:53 +0100525
Justin P. Mattock4abf6f82012-02-29 22:00:38 -0800526/* Applies to max1236, max1237 */
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100527static const enum max1363_modes max1236_mode_list[] = {
528 _s0, _s1, _s2, _s3,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100529 s0to1, s0to2, s0to3,
530 d0m1, d2m3, d1m0, d3m2,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100531 d0m1to2m3, d1m0to3m2,
532 s2to3,
533};
534
535/* Applies to max1238, max1239 */
536static const enum max1363_modes max1238_mode_list[] = {
537 _s0, _s1, _s2, _s3, _s4, _s5, _s6, _s7, _s8, _s9, _s10, _s11,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100538 s0to1, s0to2, s0to3, s0to4, s0to5, s0to6,
539 s0to7, s0to8, s0to9, s0to10, s0to11,
540 d0m1, d2m3, d4m5, d6m7, d8m9, d10m11,
541 d1m0, d3m2, d5m4, d7m6, d9m8, d11m10,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100542 d0m1to2m3, d0m1to4m5, d0m1to6m7, d0m1to8m9, d0m1to10m11,
543 d1m0to3m2, d1m0to5m4, d1m0to7m6, d1m0to9m8, d1m0to11m10,
544 s6to7, s6to8, s6to9, s6to10, s6to11,
Jonathan Cameron82020b02010-05-04 14:43:03 +0100545 d6m7to8m9, d6m7to10m11, d7m6to9m8, d7m6to11m10,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100546};
547
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100548#define MAX1363_12X_CHANS(bits) { \
549 MAX1363_CHAN_U(0, _s0, 0, bits, NULL, 0), \
550 MAX1363_CHAN_U(1, _s1, 1, bits, NULL, 0), \
551 MAX1363_CHAN_U(2, _s2, 2, bits, NULL, 0), \
552 MAX1363_CHAN_U(3, _s3, 3, bits, NULL, 0), \
553 MAX1363_CHAN_U(4, _s4, 4, bits, NULL, 0), \
554 MAX1363_CHAN_U(5, _s5, 5, bits, NULL, 0), \
555 MAX1363_CHAN_U(6, _s6, 6, bits, NULL, 0), \
556 MAX1363_CHAN_U(7, _s7, 7, bits, NULL, 0), \
557 MAX1363_CHAN_U(8, _s8, 8, bits, NULL, 0), \
558 MAX1363_CHAN_U(9, _s9, 9, bits, NULL, 0), \
559 MAX1363_CHAN_U(10, _s10, 10, bits, NULL, 0), \
560 MAX1363_CHAN_U(11, _s11, 11, bits, NULL, 0), \
561 MAX1363_CHAN_B(0, 1, d0m1, 12, bits, NULL, 0), \
562 MAX1363_CHAN_B(2, 3, d2m3, 13, bits, NULL, 0), \
563 MAX1363_CHAN_B(4, 5, d4m5, 14, bits, NULL, 0), \
564 MAX1363_CHAN_B(6, 7, d6m7, 15, bits, NULL, 0), \
565 MAX1363_CHAN_B(8, 9, d8m9, 16, bits, NULL, 0), \
566 MAX1363_CHAN_B(10, 11, d10m11, 17, bits, NULL, 0), \
567 MAX1363_CHAN_B(1, 0, d1m0, 18, bits, NULL, 0), \
568 MAX1363_CHAN_B(3, 2, d3m2, 19, bits, NULL, 0), \
569 MAX1363_CHAN_B(5, 4, d5m4, 20, bits, NULL, 0), \
570 MAX1363_CHAN_B(7, 6, d7m6, 21, bits, NULL, 0), \
571 MAX1363_CHAN_B(9, 8, d9m8, 22, bits, NULL, 0), \
572 MAX1363_CHAN_B(11, 10, d11m10, 23, bits, NULL, 0), \
573 IIO_CHAN_SOFT_TIMESTAMP(24) \
Jonathan Cameron298cd972011-05-18 14:40:53 +0100574 }
Lars-Peter Clausenf4e4b952012-08-09 08:51:00 +0100575static const struct iio_chan_spec max1038_channels[] = MAX1363_12X_CHANS(8);
576static const struct iio_chan_spec max1138_channels[] = MAX1363_12X_CHANS(10);
577static const struct iio_chan_spec max1238_channels[] = MAX1363_12X_CHANS(12);
Jonathan Cameronc3fa0fdd2010-05-04 14:43:09 +0100578
579static const enum max1363_modes max11607_mode_list[] = {
580 _s0, _s1, _s2, _s3,
581 s0to1, s0to2, s0to3,
582 s2to3,
583 d0m1, d2m3, d1m0, d3m2,
584 d0m1to2m3, d1m0to3m2,
585};
586
587static const enum max1363_modes max11608_mode_list[] = {
588 _s0, _s1, _s2, _s3, _s4, _s5, _s6, _s7,
589 s0to1, s0to2, s0to3, s0to4, s0to5, s0to6, s0to7,
590 s6to7,
591 d0m1, d2m3, d4m5, d6m7,
592 d1m0, d3m2, d5m4, d7m6,
593 d0m1to2m3, d0m1to4m5, d0m1to6m7,
594 d1m0to3m2, d1m0to5m4, d1m0to7m6,
595};
596
Jonathan Cameronade7ef72011-09-02 17:14:45 +0100597#define MAX1363_8X_CHANS(bits) { \
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100598 MAX1363_CHAN_U(0, _s0, 0, bits, NULL, 0), \
599 MAX1363_CHAN_U(1, _s1, 1, bits, NULL, 0), \
600 MAX1363_CHAN_U(2, _s2, 2, bits, NULL, 0), \
601 MAX1363_CHAN_U(3, _s3, 3, bits, NULL, 0), \
602 MAX1363_CHAN_U(4, _s4, 4, bits, NULL, 0), \
603 MAX1363_CHAN_U(5, _s5, 5, bits, NULL, 0), \
604 MAX1363_CHAN_U(6, _s6, 6, bits, NULL, 0), \
605 MAX1363_CHAN_U(7, _s7, 7, bits, NULL, 0), \
606 MAX1363_CHAN_B(0, 1, d0m1, 8, bits, NULL, 0), \
607 MAX1363_CHAN_B(2, 3, d2m3, 9, bits, NULL, 0), \
608 MAX1363_CHAN_B(4, 5, d4m5, 10, bits, NULL, 0), \
609 MAX1363_CHAN_B(6, 7, d6m7, 11, bits, NULL, 0), \
610 MAX1363_CHAN_B(1, 0, d1m0, 12, bits, NULL, 0), \
611 MAX1363_CHAN_B(3, 2, d3m2, 13, bits, NULL, 0), \
612 MAX1363_CHAN_B(5, 4, d5m4, 14, bits, NULL, 0), \
613 MAX1363_CHAN_B(7, 6, d7m6, 15, bits, NULL, 0), \
Jonathan Cameronade7ef72011-09-02 17:14:45 +0100614 IIO_CHAN_SOFT_TIMESTAMP(16) \
615}
Lars-Peter Clausenf4e4b952012-08-09 08:51:00 +0100616static const struct iio_chan_spec max11602_channels[] = MAX1363_8X_CHANS(8);
617static const struct iio_chan_spec max11608_channels[] = MAX1363_8X_CHANS(10);
618static const struct iio_chan_spec max11614_channels[] = MAX1363_8X_CHANS(12);
Jonathan Cameronc3fa0fdd2010-05-04 14:43:09 +0100619
Jonathan Cameron586d1522011-05-18 14:42:10 +0100620static const enum max1363_modes max11644_mode_list[] = {
621 _s0, _s1, s0to1, d0m1, d1m0,
622};
623
624#define MAX1363_2X_CHANS(bits) { \
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100625 MAX1363_CHAN_U(0, _s0, 0, bits, NULL, 0), \
626 MAX1363_CHAN_U(1, _s1, 1, bits, NULL, 0), \
627 MAX1363_CHAN_B(0, 1, d0m1, 2, bits, NULL, 0), \
628 MAX1363_CHAN_B(1, 0, d1m0, 3, bits, NULL, 0), \
Jonathan Cameron586d1522011-05-18 14:42:10 +0100629 IIO_CHAN_SOFT_TIMESTAMP(4) \
630 }
631
Lars-Peter Clausenf4e4b952012-08-09 08:51:00 +0100632static const struct iio_chan_spec max11646_channels[] = MAX1363_2X_CHANS(10);
633static const struct iio_chan_spec max11644_channels[] = MAX1363_2X_CHANS(12);
Jonathan Cameron586d1522011-05-18 14:42:10 +0100634
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100635enum { max1361,
636 max1362,
637 max1363,
638 max1364,
Jonathan Cameron3bf877c2010-05-04 14:43:10 +0100639 max1036,
640 max1037,
641 max1038,
642 max1039,
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100643 max1136,
644 max1137,
645 max1138,
646 max1139,
647 max1236,
648 max1237,
649 max1238,
650 max1239,
Jonathan Cameron3bf877c2010-05-04 14:43:10 +0100651 max11600,
652 max11601,
653 max11602,
654 max11603,
655 max11604,
656 max11605,
Jonathan Cameronc3fa0fdd2010-05-04 14:43:09 +0100657 max11606,
658 max11607,
659 max11608,
660 max11609,
661 max11610,
662 max11611,
663 max11612,
664 max11613,
665 max11614,
666 max11615,
667 max11616,
668 max11617,
Jonathan Cameron586d1522011-05-18 14:42:10 +0100669 max11644,
670 max11645,
671 max11646,
672 max11647
Jonathan Camerond1325cf2009-08-18 18:06:20 +0100673};
674
Jonathan Cameron440a5202010-06-26 12:54:23 +0100675static const int max1363_monitor_speeds[] = { 133000, 665000, 33300, 16600,
676 8300, 4200, 2000, 1000 };
677
678static ssize_t max1363_monitor_show_freq(struct device *dev,
679 struct device_attribute *attr,
680 char *buf)
681{
Lars-Peter Clausen62c51832012-05-12 15:39:42 +0200682 struct max1363_state *st = iio_priv(dev_to_iio_dev(dev));
Jonathan Cameron440a5202010-06-26 12:54:23 +0100683 return sprintf(buf, "%d\n", max1363_monitor_speeds[st->monitor_speed]);
684}
685
686static ssize_t max1363_monitor_store_freq(struct device *dev,
687 struct device_attribute *attr,
688 const char *buf,
689 size_t len)
690{
Lars-Peter Clausen62c51832012-05-12 15:39:42 +0200691 struct iio_dev *indio_dev = dev_to_iio_dev(dev);
Jonathan Cameron3dba81b2011-04-15 18:55:59 +0100692 struct max1363_state *st = iio_priv(indio_dev);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100693 int i, ret;
694 unsigned long val;
695 bool found = false;
696
Jingoo Handdeb64f2013-06-01 08:10:00 +0100697 ret = kstrtoul(buf, 10, &val);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100698 if (ret)
699 return -EINVAL;
700 for (i = 0; i < ARRAY_SIZE(max1363_monitor_speeds); i++)
701 if (val == max1363_monitor_speeds[i]) {
702 found = true;
703 break;
704 }
705 if (!found)
706 return -EINVAL;
707
Jonathan Cameronb6b70682011-04-15 18:55:58 +0100708 mutex_lock(&indio_dev->mlock);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100709 st->monitor_speed = i;
Jonathan Cameronb6b70682011-04-15 18:55:58 +0100710 mutex_unlock(&indio_dev->mlock);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100711
712 return 0;
713}
714
715static IIO_DEV_ATTR_SAMP_FREQ(S_IRUGO | S_IWUSR,
716 max1363_monitor_show_freq,
717 max1363_monitor_store_freq);
718
719static IIO_CONST_ATTR(sampling_frequency_available,
720 "133000 665000 33300 16600 8300 4200 2000 1000");
721
Jonathan Cameron298cd972011-05-18 14:40:53 +0100722static int max1363_read_thresh(struct iio_dev *indio_dev,
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100723 const struct iio_chan_spec *chan, enum iio_event_type type,
724 enum iio_event_direction dir, enum iio_event_info info, int *val,
725 int *val2)
Jonathan Cameron440a5202010-06-26 12:54:23 +0100726{
Jonathan Cameron3dba81b2011-04-15 18:55:59 +0100727 struct max1363_state *st = iio_priv(indio_dev);
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100728 if (dir == IIO_EV_DIR_FALLING)
729 *val = st->thresh_low[chan->channel];
Jonathan Cameron440a5202010-06-26 12:54:23 +0100730 else
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100731 *val = st->thresh_high[chan->channel];
732 return IIO_VAL_INT;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100733}
734
Jonathan Cameron298cd972011-05-18 14:40:53 +0100735static int max1363_write_thresh(struct iio_dev *indio_dev,
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100736 const struct iio_chan_spec *chan, enum iio_event_type type,
737 enum iio_event_direction dir, enum iio_event_info info, int val,
738 int val2)
Jonathan Cameron440a5202010-06-26 12:54:23 +0100739{
Jonathan Cameron298cd972011-05-18 14:40:53 +0100740 struct max1363_state *st = iio_priv(indio_dev);
741 /* make it handle signed correctly as well */
Jonathan Cameron440a5202010-06-26 12:54:23 +0100742 switch (st->chip_info->bits) {
743 case 10:
744 if (val > 0x3FF)
745 return -EINVAL;
746 break;
747 case 12:
748 if (val > 0xFFF)
749 return -EINVAL;
750 break;
751 }
752
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100753 switch (dir) {
Jonathan Cameron298cd972011-05-18 14:40:53 +0100754 case IIO_EV_DIR_FALLING:
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100755 st->thresh_low[chan->channel] = val;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100756 break;
Jonathan Cameron298cd972011-05-18 14:40:53 +0100757 case IIO_EV_DIR_RISING:
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100758 st->thresh_high[chan->channel] = val;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100759 break;
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100760 default:
761 return -EINVAL;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100762 }
763
Jonathan Cameron440a5202010-06-26 12:54:23 +0100764 return 0;
765}
766
Jonathan Cameron330c6c52011-09-02 17:14:39 +0100767static const u64 max1363_event_codes[] = {
Jonathan Cameron6835cb62011-09-27 09:56:41 +0100768 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 0,
769 IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING),
770 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 1,
771 IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING),
772 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 2,
773 IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING),
774 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 3,
775 IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING),
776 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 0,
777 IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING),
778 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 1,
779 IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING),
780 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 2,
781 IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING),
782 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 3,
783 IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING),
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100784};
785
Jonathan Cameronaaf370d2011-05-18 14:41:16 +0100786static irqreturn_t max1363_event_handler(int irq, void *private)
Jonathan Cameron440a5202010-06-26 12:54:23 +0100787{
Jonathan Cameronaaf370d2011-05-18 14:41:16 +0100788 struct iio_dev *indio_dev = private;
789 struct max1363_state *st = iio_priv(indio_dev);
Gregor Boiriebc2b7da2016-03-09 19:05:49 +0100790 s64 timestamp = iio_get_time_ns(indio_dev);
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100791 unsigned long mask, loc;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100792 u8 rx;
793 u8 tx[2] = { st->setupbyte,
794 MAX1363_MON_INT_ENABLE | (st->monitor_speed << 1) | 0xF0 };
795
Vivien Didelot61bdda62013-10-20 19:02:00 +0100796 st->recv(st->client, &rx, 1);
Jonathan Cameron58f0a252011-05-18 14:42:38 +0100797 mask = rx;
798 for_each_set_bit(loc, &mask, 8)
Jonathan Cameron5aa96182011-08-30 12:41:06 +0100799 iio_push_event(indio_dev, max1363_event_codes[loc], timestamp);
Vivien Didelot61bdda62013-10-20 19:02:00 +0100800 st->send(st->client, tx, 2);
Jonathan Cameronaaf370d2011-05-18 14:41:16 +0100801
802 return IRQ_HANDLED;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100803}
804
Jonathan Cameron298cd972011-05-18 14:40:53 +0100805static int max1363_read_event_config(struct iio_dev *indio_dev,
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100806 const struct iio_chan_spec *chan, enum iio_event_type type,
807 enum iio_event_direction dir)
Jonathan Cameron440a5202010-06-26 12:54:23 +0100808{
Jonathan Cameron3dba81b2011-04-15 18:55:59 +0100809 struct max1363_state *st = iio_priv(indio_dev);
Jonathan Cameron298cd972011-05-18 14:40:53 +0100810 int val;
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100811 int number = chan->channel;
Jonathan Cameron0d9fa2c2012-10-06 14:38:11 +0100812
Jonathan Cameronb6b70682011-04-15 18:55:58 +0100813 mutex_lock(&indio_dev->mlock);
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100814 if (dir == IIO_EV_DIR_FALLING)
Jonathan Cameron298cd972011-05-18 14:40:53 +0100815 val = (1 << number) & st->mask_low;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100816 else
Jonathan Cameron298cd972011-05-18 14:40:53 +0100817 val = (1 << number) & st->mask_high;
Jonathan Cameronb6b70682011-04-15 18:55:58 +0100818 mutex_unlock(&indio_dev->mlock);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100819
Jonathan Cameron298cd972011-05-18 14:40:53 +0100820 return val;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100821}
822
823static int max1363_monitor_mode_update(struct max1363_state *st, int enabled)
824{
825 u8 *tx_buf;
826 int ret, i = 3, j;
827 unsigned long numelements;
828 int len;
Jonathan Cameron32b5eec2011-09-02 17:14:38 +0100829 const long *modemask;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100830
831 if (!enabled) {
Jonathan Cameronec443722012-10-06 14:19:01 +0100832 /* transition to buffered capture is not currently supported */
Jonathan Cameron440a5202010-06-26 12:54:23 +0100833 st->setupbyte &= ~MAX1363_SETUP_MONITOR_SETUP;
834 st->configbyte &= ~MAX1363_SCAN_MASK;
835 st->monitor_on = false;
Vivien Didelot61bdda62013-10-20 19:02:00 +0100836 return max1363_write_basic_config(st);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100837 }
838
839 /* Ensure we are in the relevant mode */
840 st->setupbyte |= MAX1363_SETUP_MONITOR_SETUP;
841 st->configbyte &= ~(MAX1363_CHANNEL_SEL_MASK
842 | MAX1363_SCAN_MASK
843 | MAX1363_SE_DE_MASK);
844 st->configbyte |= MAX1363_CONFIG_SCAN_MONITOR_MODE;
845 if ((st->mask_low | st->mask_high) & 0x0F) {
846 st->configbyte |= max1363_mode_table[s0to3].conf;
847 modemask = max1363_mode_table[s0to3].modemask;
848 } else if ((st->mask_low | st->mask_high) & 0x30) {
849 st->configbyte |= max1363_mode_table[d0m1to2m3].conf;
850 modemask = max1363_mode_table[d0m1to2m3].modemask;
851 } else {
852 st->configbyte |= max1363_mode_table[d1m0to3m2].conf;
853 modemask = max1363_mode_table[d1m0to3m2].modemask;
854 }
Jonathan Cameron32b5eec2011-09-02 17:14:38 +0100855 numelements = bitmap_weight(modemask, MAX1363_MAX_CHANNELS);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100856 len = 3 * numelements + 3;
857 tx_buf = kmalloc(len, GFP_KERNEL);
858 if (!tx_buf) {
859 ret = -ENOMEM;
860 goto error_ret;
861 }
862 tx_buf[0] = st->configbyte;
863 tx_buf[1] = st->setupbyte;
864 tx_buf[2] = (st->monitor_speed << 1);
865
866 /*
867 * So we need to do yet another bit of nefarious scan mode
868 * setup to match what we need.
869 */
870 for (j = 0; j < 8; j++)
Jonathan Cameron32b5eec2011-09-02 17:14:38 +0100871 if (test_bit(j, modemask)) {
Jonathan Cameron440a5202010-06-26 12:54:23 +0100872 /* Establish the mode is in the scan */
873 if (st->mask_low & (1 << j)) {
874 tx_buf[i] = (st->thresh_low[j] >> 4) & 0xFF;
875 tx_buf[i + 1] = (st->thresh_low[j] << 4) & 0xF0;
876 } else if (j < 4) {
877 tx_buf[i] = 0;
878 tx_buf[i + 1] = 0;
879 } else {
880 tx_buf[i] = 0x80;
881 tx_buf[i + 1] = 0;
882 }
883 if (st->mask_high & (1 << j)) {
884 tx_buf[i + 1] |=
885 (st->thresh_high[j] >> 8) & 0x0F;
886 tx_buf[i + 2] = st->thresh_high[j] & 0xFF;
887 } else if (j < 4) {
888 tx_buf[i + 1] |= 0x0F;
889 tx_buf[i + 2] = 0xFF;
890 } else {
891 tx_buf[i + 1] |= 0x07;
892 tx_buf[i + 2] = 0xFF;
893 }
894 i += 3;
895 }
896
897
Vivien Didelot61bdda62013-10-20 19:02:00 +0100898 ret = st->send(st->client, tx_buf, len);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100899 if (ret < 0)
900 goto error_ret;
901 if (ret != len) {
902 ret = -EIO;
903 goto error_ret;
904 }
905
906 /*
907 * Now that we hopefully have sensible thresholds in place it is
908 * time to turn the interrupts on.
909 * It is unclear from the data sheet if this should be necessary
910 * (i.e. whether monitor mode setup is atomic) but it appears to
911 * be in practice.
912 */
913 tx_buf[0] = st->setupbyte;
914 tx_buf[1] = MAX1363_MON_INT_ENABLE | (st->monitor_speed << 1) | 0xF0;
Vivien Didelot61bdda62013-10-20 19:02:00 +0100915 ret = st->send(st->client, tx_buf, 2);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100916 if (ret < 0)
917 goto error_ret;
918 if (ret != 2) {
919 ret = -EIO;
920 goto error_ret;
921 }
922 ret = 0;
923 st->monitor_on = true;
924error_ret:
925
926 kfree(tx_buf);
927
928 return ret;
929}
930
931/*
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300932 * To keep this manageable we always use one of 3 scan modes.
Jonathan Cameron440a5202010-06-26 12:54:23 +0100933 * Scan 0...3, 0-1,2-3 and 1-0,3-2
934 */
Jonathan Cameron298cd972011-05-18 14:40:53 +0100935
Jonathan Cameron440a5202010-06-26 12:54:23 +0100936static inline int __max1363_check_event_mask(int thismask, int checkmask)
937{
938 int ret = 0;
939 /* Is it unipolar */
940 if (thismask < 4) {
941 if (checkmask & ~0x0F) {
942 ret = -EBUSY;
943 goto error_ret;
944 }
945 } else if (thismask < 6) {
946 if (checkmask & ~0x30) {
947 ret = -EBUSY;
948 goto error_ret;
949 }
950 } else if (checkmask & ~0xC0)
951 ret = -EBUSY;
952error_ret:
953 return ret;
954}
955
Jonathan Cameron298cd972011-05-18 14:40:53 +0100956static int max1363_write_event_config(struct iio_dev *indio_dev,
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100957 const struct iio_chan_spec *chan, enum iio_event_type type,
958 enum iio_event_direction dir, int state)
Jonathan Cameron440a5202010-06-26 12:54:23 +0100959{
Jonathan Cameron298cd972011-05-18 14:40:53 +0100960 int ret = 0;
Jonathan Cameron3dba81b2011-04-15 18:55:59 +0100961 struct max1363_state *st = iio_priv(indio_dev);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100962 u16 unifiedmask;
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100963 int number = chan->channel;
Jonathan Cameron298cd972011-05-18 14:40:53 +0100964
Jonathan Cameron3dba81b2011-04-15 18:55:59 +0100965 mutex_lock(&indio_dev->mlock);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100966 unifiedmask = st->mask_low | st->mask_high;
Lars-Peter Clausene4ec84f2013-10-07 15:11:00 +0100967 if (dir == IIO_EV_DIR_FALLING) {
Jonathan Cameron298cd972011-05-18 14:40:53 +0100968
969 if (state == 0)
970 st->mask_low &= ~(1 << number);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100971 else {
Jonathan Cameron298cd972011-05-18 14:40:53 +0100972 ret = __max1363_check_event_mask((1 << number),
973 unifiedmask);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100974 if (ret)
975 goto error_ret;
Jonathan Cameron298cd972011-05-18 14:40:53 +0100976 st->mask_low |= (1 << number);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100977 }
978 } else {
Jonathan Cameron298cd972011-05-18 14:40:53 +0100979 if (state == 0)
980 st->mask_high &= ~(1 << number);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100981 else {
Jonathan Cameron298cd972011-05-18 14:40:53 +0100982 ret = __max1363_check_event_mask((1 << number),
983 unifiedmask);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100984 if (ret)
985 goto error_ret;
Jonathan Cameron298cd972011-05-18 14:40:53 +0100986 st->mask_high |= (1 << number);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100987 }
988 }
Jonathan Cameron440a5202010-06-26 12:54:23 +0100989
990 max1363_monitor_mode_update(st, !!(st->mask_high | st->mask_low));
991error_ret:
Jonathan Cameron3dba81b2011-04-15 18:55:59 +0100992 mutex_unlock(&indio_dev->mlock);
Jonathan Cameron440a5202010-06-26 12:54:23 +0100993
Jonathan Cameron298cd972011-05-18 14:40:53 +0100994 return ret;
Jonathan Cameron440a5202010-06-26 12:54:23 +0100995}
996
Jonathan Cameron440a5202010-06-26 12:54:23 +0100997/*
998 * As with scan_elements, only certain sets of these can
999 * be combined.
1000 */
1001static struct attribute *max1363_event_attributes[] = {
Jonathan Cameron440a5202010-06-26 12:54:23 +01001002 &iio_dev_attr_sampling_frequency.dev_attr.attr,
1003 &iio_const_attr_sampling_frequency_available.dev_attr.attr,
Jonathan Cameron440a5202010-06-26 12:54:23 +01001004 NULL,
1005};
1006
simran singhalc94645b2017-03-29 01:45:28 +05301007static const struct attribute_group max1363_event_attribute_group = {
Jonathan Cameron440a5202010-06-26 12:54:23 +01001008 .attrs = max1363_event_attributes,
1009};
1010
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +01001011static int max1363_update_scan_mode(struct iio_dev *indio_dev,
1012 const unsigned long *scan_mask)
1013{
1014 struct max1363_state *st = iio_priv(indio_dev);
1015
1016 /*
1017 * Need to figure out the current mode based upon the requested
1018 * scan mask in iio_dev
1019 */
1020 st->current_mode = max1363_match_mode(scan_mask, st->chip_info);
1021 if (!st->current_mode)
1022 return -EINVAL;
1023 max1363_set_scan_mode(st);
1024 return 0;
1025}
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001026
1027static const struct iio_info max1238_info = {
1028 .read_raw = &max1363_read_raw,
Jonathan Camerona9ea1b12012-04-10 21:11:05 +01001029 .update_scan_mode = &max1363_update_scan_mode,
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001030};
1031
1032static const struct iio_info max1363_info = {
Lars-Peter Clausencb955852013-12-07 10:45:00 +00001033 .read_event_value = &max1363_read_thresh,
1034 .write_event_value = &max1363_write_thresh,
1035 .read_event_config = &max1363_read_event_config,
1036 .write_event_config = &max1363_write_event_config,
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001037 .read_raw = &max1363_read_raw,
Jonathan Cameronc52cfb62011-12-05 21:37:15 +00001038 .update_scan_mode = &max1363_update_scan_mode,
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001039 .event_attrs = &max1363_event_attribute_group,
1040};
1041
1042/* max1363 and max1368 tested - rest from data sheet */
1043static const struct max1363_chip_info max1363_chip_info_tbl[] = {
1044 [max1361] = {
1045 .bits = 10,
1046 .int_vref_mv = 2048,
1047 .mode_list = max1363_mode_list,
1048 .num_modes = ARRAY_SIZE(max1363_mode_list),
1049 .default_mode = s0to3,
1050 .channels = max1361_channels,
1051 .num_channels = ARRAY_SIZE(max1361_channels),
1052 .info = &max1363_info,
1053 },
1054 [max1362] = {
1055 .bits = 10,
1056 .int_vref_mv = 4096,
1057 .mode_list = max1363_mode_list,
1058 .num_modes = ARRAY_SIZE(max1363_mode_list),
1059 .default_mode = s0to3,
1060 .channels = max1361_channels,
1061 .num_channels = ARRAY_SIZE(max1361_channels),
1062 .info = &max1363_info,
1063 },
1064 [max1363] = {
1065 .bits = 12,
1066 .int_vref_mv = 2048,
1067 .mode_list = max1363_mode_list,
1068 .num_modes = ARRAY_SIZE(max1363_mode_list),
1069 .default_mode = s0to3,
1070 .channels = max1363_channels,
1071 .num_channels = ARRAY_SIZE(max1363_channels),
1072 .info = &max1363_info,
1073 },
1074 [max1364] = {
1075 .bits = 12,
1076 .int_vref_mv = 4096,
1077 .mode_list = max1363_mode_list,
1078 .num_modes = ARRAY_SIZE(max1363_mode_list),
1079 .default_mode = s0to3,
1080 .channels = max1363_channels,
1081 .num_channels = ARRAY_SIZE(max1363_channels),
1082 .info = &max1363_info,
1083 },
1084 [max1036] = {
1085 .bits = 8,
1086 .int_vref_mv = 4096,
1087 .mode_list = max1236_mode_list,
1088 .num_modes = ARRAY_SIZE(max1236_mode_list),
1089 .default_mode = s0to3,
1090 .info = &max1238_info,
1091 .channels = max1036_channels,
1092 .num_channels = ARRAY_SIZE(max1036_channels),
1093 },
1094 [max1037] = {
1095 .bits = 8,
1096 .int_vref_mv = 2048,
1097 .mode_list = max1236_mode_list,
1098 .num_modes = ARRAY_SIZE(max1236_mode_list),
1099 .default_mode = s0to3,
1100 .info = &max1238_info,
1101 .channels = max1036_channels,
1102 .num_channels = ARRAY_SIZE(max1036_channels),
1103 },
1104 [max1038] = {
1105 .bits = 8,
1106 .int_vref_mv = 4096,
1107 .mode_list = max1238_mode_list,
1108 .num_modes = ARRAY_SIZE(max1238_mode_list),
1109 .default_mode = s0to11,
1110 .info = &max1238_info,
1111 .channels = max1038_channels,
1112 .num_channels = ARRAY_SIZE(max1038_channels),
1113 },
1114 [max1039] = {
1115 .bits = 8,
1116 .int_vref_mv = 2048,
1117 .mode_list = max1238_mode_list,
1118 .num_modes = ARRAY_SIZE(max1238_mode_list),
1119 .default_mode = s0to11,
1120 .info = &max1238_info,
1121 .channels = max1038_channels,
1122 .num_channels = ARRAY_SIZE(max1038_channels),
1123 },
1124 [max1136] = {
1125 .bits = 10,
1126 .int_vref_mv = 4096,
1127 .mode_list = max1236_mode_list,
1128 .num_modes = ARRAY_SIZE(max1236_mode_list),
1129 .default_mode = s0to3,
1130 .info = &max1238_info,
1131 .channels = max1136_channels,
1132 .num_channels = ARRAY_SIZE(max1136_channels),
1133 },
1134 [max1137] = {
1135 .bits = 10,
1136 .int_vref_mv = 2048,
1137 .mode_list = max1236_mode_list,
1138 .num_modes = ARRAY_SIZE(max1236_mode_list),
1139 .default_mode = s0to3,
1140 .info = &max1238_info,
1141 .channels = max1136_channels,
1142 .num_channels = ARRAY_SIZE(max1136_channels),
1143 },
1144 [max1138] = {
1145 .bits = 10,
1146 .int_vref_mv = 4096,
1147 .mode_list = max1238_mode_list,
1148 .num_modes = ARRAY_SIZE(max1238_mode_list),
1149 .default_mode = s0to11,
1150 .info = &max1238_info,
1151 .channels = max1138_channels,
1152 .num_channels = ARRAY_SIZE(max1138_channels),
1153 },
1154 [max1139] = {
1155 .bits = 10,
1156 .int_vref_mv = 2048,
1157 .mode_list = max1238_mode_list,
1158 .num_modes = ARRAY_SIZE(max1238_mode_list),
1159 .default_mode = s0to11,
1160 .info = &max1238_info,
1161 .channels = max1138_channels,
1162 .num_channels = ARRAY_SIZE(max1138_channels),
1163 },
1164 [max1236] = {
1165 .bits = 12,
1166 .int_vref_mv = 4096,
1167 .mode_list = max1236_mode_list,
1168 .num_modes = ARRAY_SIZE(max1236_mode_list),
1169 .default_mode = s0to3,
1170 .info = &max1238_info,
1171 .channels = max1236_channels,
1172 .num_channels = ARRAY_SIZE(max1236_channels),
1173 },
1174 [max1237] = {
1175 .bits = 12,
1176 .int_vref_mv = 2048,
1177 .mode_list = max1236_mode_list,
1178 .num_modes = ARRAY_SIZE(max1236_mode_list),
1179 .default_mode = s0to3,
1180 .info = &max1238_info,
1181 .channels = max1236_channels,
1182 .num_channels = ARRAY_SIZE(max1236_channels),
1183 },
1184 [max1238] = {
1185 .bits = 12,
1186 .int_vref_mv = 4096,
1187 .mode_list = max1238_mode_list,
1188 .num_modes = ARRAY_SIZE(max1238_mode_list),
1189 .default_mode = s0to11,
1190 .info = &max1238_info,
1191 .channels = max1238_channels,
1192 .num_channels = ARRAY_SIZE(max1238_channels),
1193 },
1194 [max1239] = {
1195 .bits = 12,
1196 .int_vref_mv = 2048,
1197 .mode_list = max1238_mode_list,
1198 .num_modes = ARRAY_SIZE(max1238_mode_list),
1199 .default_mode = s0to11,
1200 .info = &max1238_info,
1201 .channels = max1238_channels,
1202 .num_channels = ARRAY_SIZE(max1238_channels),
1203 },
1204 [max11600] = {
1205 .bits = 8,
1206 .int_vref_mv = 4096,
1207 .mode_list = max11607_mode_list,
1208 .num_modes = ARRAY_SIZE(max11607_mode_list),
1209 .default_mode = s0to3,
1210 .info = &max1238_info,
1211 .channels = max1036_channels,
1212 .num_channels = ARRAY_SIZE(max1036_channels),
1213 },
1214 [max11601] = {
1215 .bits = 8,
1216 .int_vref_mv = 2048,
1217 .mode_list = max11607_mode_list,
1218 .num_modes = ARRAY_SIZE(max11607_mode_list),
1219 .default_mode = s0to3,
1220 .info = &max1238_info,
1221 .channels = max1036_channels,
1222 .num_channels = ARRAY_SIZE(max1036_channels),
1223 },
1224 [max11602] = {
1225 .bits = 8,
1226 .int_vref_mv = 4096,
1227 .mode_list = max11608_mode_list,
1228 .num_modes = ARRAY_SIZE(max11608_mode_list),
1229 .default_mode = s0to7,
1230 .info = &max1238_info,
1231 .channels = max11602_channels,
1232 .num_channels = ARRAY_SIZE(max11602_channels),
1233 },
1234 [max11603] = {
1235 .bits = 8,
1236 .int_vref_mv = 2048,
1237 .mode_list = max11608_mode_list,
1238 .num_modes = ARRAY_SIZE(max11608_mode_list),
1239 .default_mode = s0to7,
1240 .info = &max1238_info,
1241 .channels = max11602_channels,
1242 .num_channels = ARRAY_SIZE(max11602_channels),
1243 },
1244 [max11604] = {
1245 .bits = 8,
Hartmut Knaackb8a70ae2014-02-16 11:47:00 +00001246 .int_vref_mv = 4096,
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001247 .mode_list = max1238_mode_list,
1248 .num_modes = ARRAY_SIZE(max1238_mode_list),
1249 .default_mode = s0to11,
1250 .info = &max1238_info,
Jonathan Camerona91a73c2014-05-24 12:52:10 +01001251 .channels = max1038_channels,
1252 .num_channels = ARRAY_SIZE(max1038_channels),
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001253 },
1254 [max11605] = {
1255 .bits = 8,
1256 .int_vref_mv = 2048,
1257 .mode_list = max1238_mode_list,
1258 .num_modes = ARRAY_SIZE(max1238_mode_list),
1259 .default_mode = s0to11,
1260 .info = &max1238_info,
Jonathan Camerona91a73c2014-05-24 12:52:10 +01001261 .channels = max1038_channels,
1262 .num_channels = ARRAY_SIZE(max1038_channels),
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001263 },
1264 [max11606] = {
1265 .bits = 10,
1266 .int_vref_mv = 4096,
1267 .mode_list = max11607_mode_list,
1268 .num_modes = ARRAY_SIZE(max11607_mode_list),
1269 .default_mode = s0to3,
1270 .info = &max1238_info,
1271 .channels = max1136_channels,
1272 .num_channels = ARRAY_SIZE(max1136_channels),
1273 },
1274 [max11607] = {
1275 .bits = 10,
1276 .int_vref_mv = 2048,
1277 .mode_list = max11607_mode_list,
1278 .num_modes = ARRAY_SIZE(max11607_mode_list),
1279 .default_mode = s0to3,
1280 .info = &max1238_info,
1281 .channels = max1136_channels,
1282 .num_channels = ARRAY_SIZE(max1136_channels),
1283 },
1284 [max11608] = {
1285 .bits = 10,
1286 .int_vref_mv = 4096,
1287 .mode_list = max11608_mode_list,
1288 .num_modes = ARRAY_SIZE(max11608_mode_list),
1289 .default_mode = s0to7,
1290 .info = &max1238_info,
1291 .channels = max11608_channels,
1292 .num_channels = ARRAY_SIZE(max11608_channels),
1293 },
1294 [max11609] = {
1295 .bits = 10,
1296 .int_vref_mv = 2048,
1297 .mode_list = max11608_mode_list,
1298 .num_modes = ARRAY_SIZE(max11608_mode_list),
1299 .default_mode = s0to7,
1300 .info = &max1238_info,
1301 .channels = max11608_channels,
1302 .num_channels = ARRAY_SIZE(max11608_channels),
1303 },
1304 [max11610] = {
1305 .bits = 10,
Hartmut Knaackb8a70ae2014-02-16 11:47:00 +00001306 .int_vref_mv = 4096,
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001307 .mode_list = max1238_mode_list,
1308 .num_modes = ARRAY_SIZE(max1238_mode_list),
1309 .default_mode = s0to11,
1310 .info = &max1238_info,
Jonathan Camerona91a73c2014-05-24 12:52:10 +01001311 .channels = max1138_channels,
1312 .num_channels = ARRAY_SIZE(max1138_channels),
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001313 },
1314 [max11611] = {
1315 .bits = 10,
1316 .int_vref_mv = 2048,
1317 .mode_list = max1238_mode_list,
1318 .num_modes = ARRAY_SIZE(max1238_mode_list),
1319 .default_mode = s0to11,
1320 .info = &max1238_info,
Jonathan Camerona91a73c2014-05-24 12:52:10 +01001321 .channels = max1138_channels,
1322 .num_channels = ARRAY_SIZE(max1138_channels),
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001323 },
1324 [max11612] = {
1325 .bits = 12,
1326 .int_vref_mv = 4096,
1327 .mode_list = max11607_mode_list,
1328 .num_modes = ARRAY_SIZE(max11607_mode_list),
1329 .default_mode = s0to3,
1330 .info = &max1238_info,
1331 .channels = max1363_channels,
1332 .num_channels = ARRAY_SIZE(max1363_channels),
1333 },
1334 [max11613] = {
1335 .bits = 12,
1336 .int_vref_mv = 2048,
1337 .mode_list = max11607_mode_list,
1338 .num_modes = ARRAY_SIZE(max11607_mode_list),
1339 .default_mode = s0to3,
1340 .info = &max1238_info,
1341 .channels = max1363_channels,
1342 .num_channels = ARRAY_SIZE(max1363_channels),
1343 },
1344 [max11614] = {
1345 .bits = 12,
1346 .int_vref_mv = 4096,
1347 .mode_list = max11608_mode_list,
1348 .num_modes = ARRAY_SIZE(max11608_mode_list),
1349 .default_mode = s0to7,
1350 .info = &max1238_info,
1351 .channels = max11614_channels,
1352 .num_channels = ARRAY_SIZE(max11614_channels),
1353 },
1354 [max11615] = {
1355 .bits = 12,
1356 .int_vref_mv = 2048,
1357 .mode_list = max11608_mode_list,
1358 .num_modes = ARRAY_SIZE(max11608_mode_list),
1359 .default_mode = s0to7,
1360 .info = &max1238_info,
1361 .channels = max11614_channels,
1362 .num_channels = ARRAY_SIZE(max11614_channels),
1363 },
1364 [max11616] = {
1365 .bits = 12,
Hartmut Knaackb8a70ae2014-02-16 11:47:00 +00001366 .int_vref_mv = 4096,
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001367 .mode_list = max1238_mode_list,
1368 .num_modes = ARRAY_SIZE(max1238_mode_list),
1369 .default_mode = s0to11,
1370 .info = &max1238_info,
1371 .channels = max1238_channels,
1372 .num_channels = ARRAY_SIZE(max1238_channels),
1373 },
1374 [max11617] = {
1375 .bits = 12,
1376 .int_vref_mv = 2048,
1377 .mode_list = max1238_mode_list,
1378 .num_modes = ARRAY_SIZE(max1238_mode_list),
1379 .default_mode = s0to11,
1380 .info = &max1238_info,
1381 .channels = max1238_channels,
1382 .num_channels = ARRAY_SIZE(max1238_channels),
1383 },
1384 [max11644] = {
1385 .bits = 12,
Stefan Eichenberger5c913eb2016-03-18 16:51:04 +01001386 .int_vref_mv = 4096,
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001387 .mode_list = max11644_mode_list,
1388 .num_modes = ARRAY_SIZE(max11644_mode_list),
1389 .default_mode = s0to1,
1390 .info = &max1238_info,
1391 .channels = max11644_channels,
1392 .num_channels = ARRAY_SIZE(max11644_channels),
1393 },
1394 [max11645] = {
1395 .bits = 12,
Stefan Eichenberger5c913eb2016-03-18 16:51:04 +01001396 .int_vref_mv = 2048,
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001397 .mode_list = max11644_mode_list,
1398 .num_modes = ARRAY_SIZE(max11644_mode_list),
1399 .default_mode = s0to1,
1400 .info = &max1238_info,
1401 .channels = max11644_channels,
1402 .num_channels = ARRAY_SIZE(max11644_channels),
1403 },
1404 [max11646] = {
1405 .bits = 10,
Stefan Eichenberger5c913eb2016-03-18 16:51:04 +01001406 .int_vref_mv = 4096,
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001407 .mode_list = max11644_mode_list,
1408 .num_modes = ARRAY_SIZE(max11644_mode_list),
1409 .default_mode = s0to1,
1410 .info = &max1238_info,
1411 .channels = max11646_channels,
1412 .num_channels = ARRAY_SIZE(max11646_channels),
1413 },
1414 [max11647] = {
1415 .bits = 10,
Stefan Eichenberger5c913eb2016-03-18 16:51:04 +01001416 .int_vref_mv = 2048,
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001417 .mode_list = max11644_mode_list,
1418 .num_modes = ARRAY_SIZE(max11644_mode_list),
1419 .default_mode = s0to1,
1420 .info = &max1238_info,
1421 .channels = max11646_channels,
1422 .num_channels = ARRAY_SIZE(max11646_channels),
1423 },
1424};
1425
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001426static int max1363_initial_setup(struct max1363_state *st)
1427{
Guenter Roecka405b002013-02-03 00:59:00 +00001428 st->setupbyte = MAX1363_SETUP_INT_CLOCK
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001429 | MAX1363_SETUP_UNIPOLAR
1430 | MAX1363_SETUP_NORESET;
1431
Guenter Roecka405b002013-02-03 00:59:00 +00001432 if (st->vref)
1433 st->setupbyte |= MAX1363_SETUP_AIN3_IS_REF_EXT_TO_REF;
1434 else
1435 st->setupbyte |= MAX1363_SETUP_POWER_UP_INT_REF
1436 | MAX1363_SETUP_AIN3_IS_AIN3_REF_IS_INT;
1437
Peter Meerwald71d2c122012-12-30 23:26:00 +00001438 /* Set scan mode writes the config anyway so wait until then */
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001439 st->setupbyte = MAX1363_SETUP_BYTE(st->setupbyte);
1440 st->current_mode = &max1363_mode_table[st->chip_info->default_mode];
1441 st->configbyte = MAX1363_CONFIG_BYTE(st->configbyte);
1442
1443 return max1363_set_scan_mode(st);
1444}
1445
Greg Kroah-Hartmanfc526922012-12-21 13:21:43 -08001446static int max1363_alloc_scan_masks(struct iio_dev *indio_dev)
Michael Hennerichcd4361c2012-02-22 13:16:49 +01001447{
1448 struct max1363_state *st = iio_priv(indio_dev);
1449 unsigned long *masks;
1450 int i;
1451
Guenter Roeck7c3e8672013-02-03 00:59:00 +00001452 masks = devm_kzalloc(&indio_dev->dev,
Kees Cooka86854d2018-06-12 14:07:58 -07001453 array3_size(BITS_TO_LONGS(MAX1363_MAX_CHANNELS),
1454 sizeof(long),
1455 st->chip_info->num_modes + 1),
1456 GFP_KERNEL);
Michael Hennerichcd4361c2012-02-22 13:16:49 +01001457 if (!masks)
1458 return -ENOMEM;
1459
1460 for (i = 0; i < st->chip_info->num_modes; i++)
1461 bitmap_copy(masks + BITS_TO_LONGS(MAX1363_MAX_CHANNELS)*i,
1462 max1363_mode_table[st->chip_info->mode_list[i]]
1463 .modemask, MAX1363_MAX_CHANNELS);
1464
1465 indio_dev->available_scan_masks = masks;
1466
1467 return 0;
1468}
1469
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +01001470static irqreturn_t max1363_trigger_handler(int irq, void *p)
1471{
1472 struct iio_poll_func *pf = p;
1473 struct iio_dev *indio_dev = pf->indio_dev;
1474 struct max1363_state *st = iio_priv(indio_dev);
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +01001475 __u8 *rxbuf;
1476 int b_sent;
1477 size_t d_size;
1478 unsigned long numvals = bitmap_weight(st->current_mode->modemask,
1479 MAX1363_MAX_CHANNELS);
1480
1481 /* Ensure the timestamp is 8 byte aligned */
1482 if (st->chip_info->bits != 8)
1483 d_size = numvals*2;
1484 else
1485 d_size = numvals;
1486 if (indio_dev->scan_timestamp) {
1487 d_size += sizeof(s64);
1488 if (d_size % sizeof(s64))
1489 d_size += sizeof(s64) - (d_size % sizeof(s64));
1490 }
1491 /* Monitor mode prevents reading. Whilst not currently implemented
1492 * might as well have this test in here in the meantime as it does
1493 * no harm.
1494 */
1495 if (numvals == 0)
1496 goto done;
1497
1498 rxbuf = kmalloc(d_size, GFP_KERNEL);
1499 if (rxbuf == NULL)
1500 goto done;
1501 if (st->chip_info->bits != 8)
Vivien Didelot61bdda62013-10-20 19:02:00 +01001502 b_sent = st->recv(st->client, rxbuf, numvals * 2);
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +01001503 else
Vivien Didelot61bdda62013-10-20 19:02:00 +01001504 b_sent = st->recv(st->client, rxbuf, numvals);
Jonathan Cameronb3bcbfc2012-10-06 14:10:05 +01001505 if (b_sent < 0)
1506 goto done_free;
1507
Gregor Boiriebc2b7da2016-03-09 19:05:49 +01001508 iio_push_to_buffers_with_timestamp(indio_dev, rxbuf,
1509 iio_get_time_ns(indio_dev));
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
Florian Vaussard152c9aa2016-06-30 09:43:06 +02001519#ifdef CONFIG_OF
1520
1521#define MAX1363_COMPATIBLE(of_compatible, cfg) { \
1522 .compatible = of_compatible, \
1523 .data = &max1363_chip_info_tbl[cfg], \
1524}
1525
1526static const struct of_device_id max1363_of_match[] = {
1527 MAX1363_COMPATIBLE("maxim,max1361", max1361),
1528 MAX1363_COMPATIBLE("maxim,max1362", max1362),
1529 MAX1363_COMPATIBLE("maxim,max1363", max1363),
1530 MAX1363_COMPATIBLE("maxim,max1364", max1364),
1531 MAX1363_COMPATIBLE("maxim,max1036", max1036),
1532 MAX1363_COMPATIBLE("maxim,max1037", max1037),
1533 MAX1363_COMPATIBLE("maxim,max1038", max1038),
1534 MAX1363_COMPATIBLE("maxim,max1039", max1039),
1535 MAX1363_COMPATIBLE("maxim,max1136", max1136),
1536 MAX1363_COMPATIBLE("maxim,max1137", max1137),
1537 MAX1363_COMPATIBLE("maxim,max1138", max1138),
1538 MAX1363_COMPATIBLE("maxim,max1139", max1139),
1539 MAX1363_COMPATIBLE("maxim,max1236", max1236),
1540 MAX1363_COMPATIBLE("maxim,max1237", max1237),
1541 MAX1363_COMPATIBLE("maxim,max1238", max1238),
1542 MAX1363_COMPATIBLE("maxim,max1239", max1239),
1543 MAX1363_COMPATIBLE("maxim,max11600", max11600),
1544 MAX1363_COMPATIBLE("maxim,max11601", max11601),
1545 MAX1363_COMPATIBLE("maxim,max11602", max11602),
1546 MAX1363_COMPATIBLE("maxim,max11603", max11603),
1547 MAX1363_COMPATIBLE("maxim,max11604", max11604),
1548 MAX1363_COMPATIBLE("maxim,max11605", max11605),
1549 MAX1363_COMPATIBLE("maxim,max11606", max11606),
1550 MAX1363_COMPATIBLE("maxim,max11607", max11607),
1551 MAX1363_COMPATIBLE("maxim,max11608", max11608),
1552 MAX1363_COMPATIBLE("maxim,max11609", max11609),
1553 MAX1363_COMPATIBLE("maxim,max11610", max11610),
1554 MAX1363_COMPATIBLE("maxim,max11611", max11611),
1555 MAX1363_COMPATIBLE("maxim,max11612", max11612),
1556 MAX1363_COMPATIBLE("maxim,max11613", max11613),
1557 MAX1363_COMPATIBLE("maxim,max11614", max11614),
1558 MAX1363_COMPATIBLE("maxim,max11615", max11615),
1559 MAX1363_COMPATIBLE("maxim,max11616", max11616),
1560 MAX1363_COMPATIBLE("maxim,max11617", max11617),
1561 MAX1363_COMPATIBLE("maxim,max11644", max11644),
1562 MAX1363_COMPATIBLE("maxim,max11645", max11645),
1563 MAX1363_COMPATIBLE("maxim,max11646", max11646),
1564 MAX1363_COMPATIBLE("maxim,max11647", max11647),
1565 { /* sentinel */ }
1566};
Javier Martinez Canillas99be2302017-01-16 12:50:45 -03001567MODULE_DEVICE_TABLE(of, max1363_of_match);
Florian Vaussard152c9aa2016-06-30 09:43:06 +02001568#endif
1569
Greg Kroah-Hartmanfc526922012-12-21 13:21:43 -08001570static int max1363_probe(struct i2c_client *client,
1571 const struct i2c_device_id *id)
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001572{
Michael Hennerichcd4361c2012-02-22 13:16:49 +01001573 int ret;
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001574 struct max1363_state *st;
1575 struct iio_dev *indio_dev;
Guenter Roecka405b002013-02-03 00:59:00 +00001576 struct regulator *vref;
Dan Carpenterf88af7e2011-06-08 09:42:21 +03001577
Sachin Kamat6917e1d2013-07-22 12:02:00 +01001578 indio_dev = devm_iio_device_alloc(&client->dev,
1579 sizeof(struct max1363_state));
1580 if (!indio_dev)
1581 return -ENOMEM;
Jonathan Cameronb77b8f82012-10-06 14:39:19 +01001582
Guenter Roeck315ce4b2013-01-31 21:43:00 +00001583 indio_dev->dev.of_node = client->dev.of_node;
Jonathan Cameron0b27d672012-04-10 21:11:07 +01001584 ret = iio_map_array_register(indio_dev, client->dev.platform_data);
1585 if (ret < 0)
Sachin Kamat6917e1d2013-07-22 12:02:00 +01001586 return ret;
Jonathan Cameronb77b8f82012-10-06 14:39:19 +01001587
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001588 st = iio_priv(indio_dev);
Jonathan Cameronb77b8f82012-10-06 14:39:19 +01001589
Guenter Roeck7c3e8672013-02-03 00:59:00 +00001590 st->reg = devm_regulator_get(&client->dev, "vcc");
Jonathan Cameronb77b8f82012-10-06 14:39:19 +01001591 if (IS_ERR(st->reg)) {
1592 ret = PTR_ERR(st->reg);
1593 goto error_unregister_map;
1594 }
1595
1596 ret = regulator_enable(st->reg);
1597 if (ret)
Guenter Roeck7c3e8672013-02-03 00:59:00 +00001598 goto error_unregister_map;
Jonathan Cameronb77b8f82012-10-06 14:39:19 +01001599
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001600 /* this is only used for device removal purposes */
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001601 i2c_set_clientdata(client, indio_dev);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001602
Julia Lawall794ac822018-05-21 11:49:09 +02001603 st->chip_info = of_device_get_match_data(&client->dev);
1604 if (!st->chip_info)
Florian Vaussard152c9aa2016-06-30 09:43:06 +02001605 st->chip_info = &max1363_chip_info_tbl[id->driver_data];
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001606 st->client = client;
1607
Guenter Roecka405b002013-02-03 00:59:00 +00001608 st->vref_uv = st->chip_info->int_vref_mv * 1000;
Guenter Roeck55b40d32014-01-27 18:10:00 +00001609 vref = devm_regulator_get_optional(&client->dev, "vref");
Guenter Roecka405b002013-02-03 00:59:00 +00001610 if (!IS_ERR(vref)) {
1611 int vref_uv;
1612
1613 ret = regulator_enable(vref);
1614 if (ret)
1615 goto error_disable_reg;
1616 st->vref = vref;
1617 vref_uv = regulator_get_voltage(vref);
1618 if (vref_uv <= 0) {
1619 ret = -EINVAL;
1620 goto error_disable_reg;
1621 }
1622 st->vref_uv = vref_uv;
1623 }
1624
Vivien Didelot61bdda62013-10-20 19:02:00 +01001625 if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
1626 st->send = i2c_master_send;
1627 st->recv = i2c_master_recv;
1628 } else if (i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE)
1629 && st->chip_info->bits == 8) {
1630 st->send = max1363_smbus_send;
1631 st->recv = max1363_smbus_recv;
1632 } else {
1633 ret = -EOPNOTSUPP;
1634 goto error_disable_reg;
1635 }
1636
Michael Hennerichcd4361c2012-02-22 13:16:49 +01001637 ret = max1363_alloc_scan_masks(indio_dev);
1638 if (ret)
Jonathan Cameronb77b8f82012-10-06 14:39:19 +01001639 goto error_disable_reg;
Jonathan Cameron82020b02010-05-04 14:43:03 +01001640
Peter Meerwald71d2c122012-12-30 23:26:00 +00001641 /* Establish that the iio_dev is a child of the i2c device */
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001642 indio_dev->dev.parent = &client->dev;
Matt Ranostayb541eaf2016-07-02 17:26:33 -07001643 indio_dev->dev.of_node = client->dev.of_node;
Jonathan Cameron845bd122011-05-18 14:41:44 +01001644 indio_dev->name = id->name;
Jonathan Cameron8e7d9672011-08-30 12:32:45 +01001645 indio_dev->channels = st->chip_info->channels;
1646 indio_dev->num_channels = st->chip_info->num_channels;
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001647 indio_dev->info = st->chip_info->info;
1648 indio_dev->modes = INDIO_DIRECT_MODE;
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001649 ret = max1363_initial_setup(st);
Jonathan Cameron58f0a252011-05-18 14:42:38 +01001650 if (ret < 0)
Guenter Roeck7c3e8672013-02-03 00:59:00 +00001651 goto error_disable_reg;
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001652
Peter Meerwald4389fbe2012-12-30 23:26:00 +00001653 ret = iio_triggered_buffer_setup(indio_dev, NULL,
Lars-Peter Clausen7a1aeba2013-09-16 09:34:00 +01001654 &max1363_trigger_handler, NULL);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001655 if (ret)
Guenter Roeck7c3e8672013-02-03 00:59:00 +00001656 goto error_disable_reg;
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001657
Jonathan Cameron6fe81352011-05-18 14:42:37 +01001658 if (client->irq) {
Guenter Roeck7c3e8672013-02-03 00:59:00 +00001659 ret = devm_request_threaded_irq(&client->dev, st->client->irq,
Jonathan Cameronaaf370d2011-05-18 14:41:16 +01001660 NULL,
1661 &max1363_event_handler,
1662 IRQF_TRIGGER_RISING | IRQF_ONESHOT,
1663 "max1363_event",
1664 indio_dev);
Jonathan Cameron298cd972011-05-18 14:40:53 +01001665
Jonathan Cameron440a5202010-06-26 12:54:23 +01001666 if (ret)
Jonathan Cameronec443722012-10-06 14:19:01 +01001667 goto error_uninit_buffer;
Jonathan Cameron440a5202010-06-26 12:54:23 +01001668 }
1669
Jonathan Cameron26d25ae2011-09-02 17:14:40 +01001670 ret = iio_device_register(indio_dev);
1671 if (ret < 0)
Guenter Roeck7c3e8672013-02-03 00:59:00 +00001672 goto error_uninit_buffer;
Dan Carpenterf88af7e2011-06-08 09:42:21 +03001673
Jonathan Cameron26d25ae2011-09-02 17:14:40 +01001674 return 0;
Guenter Roeck7c3e8672013-02-03 00:59:00 +00001675
Jonathan Cameronec443722012-10-06 14:19:01 +01001676error_uninit_buffer:
Peter Meerwald4389fbe2012-12-30 23:26:00 +00001677 iio_triggered_buffer_cleanup(indio_dev);
Jonathan Cameronb77b8f82012-10-06 14:39:19 +01001678error_disable_reg:
Guenter Roecka405b002013-02-03 00:59:00 +00001679 if (st->vref)
1680 regulator_disable(st->vref);
Jonathan Cameronb77b8f82012-10-06 14:39:19 +01001681 regulator_disable(st->reg);
Guenter Roeck678fb422012-12-24 06:24:00 +00001682error_unregister_map:
Guenter Roeck6cb2afd2013-01-31 21:43:00 +00001683 iio_map_array_unregister(indio_dev);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001684 return ret;
1685}
1686
Greg Kroah-Hartmanfc526922012-12-21 13:21:43 -08001687static int max1363_remove(struct i2c_client *client)
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001688{
Jonathan Cameron3dba81b2011-04-15 18:55:59 +01001689 struct iio_dev *indio_dev = i2c_get_clientdata(client);
1690 struct max1363_state *st = iio_priv(indio_dev);
Jonathan Cameron440a5202010-06-26 12:54:23 +01001691
Jonathan Camerond2fffd62011-10-14 14:46:58 +01001692 iio_device_unregister(indio_dev);
Peter Meerwald4389fbe2012-12-30 23:26:00 +00001693 iio_triggered_buffer_cleanup(indio_dev);
Guenter Roecka405b002013-02-03 00:59:00 +00001694 if (st->vref)
1695 regulator_disable(st->vref);
Guenter Roeck678fb422012-12-24 06:24:00 +00001696 regulator_disable(st->reg);
Guenter Roeck6cb2afd2013-01-31 21:43:00 +00001697 iio_map_array_unregister(indio_dev);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001698
1699 return 0;
1700}
1701
1702static const struct i2c_device_id max1363_id[] = {
1703 { "max1361", max1361 },
1704 { "max1362", max1362 },
1705 { "max1363", max1363 },
1706 { "max1364", max1364 },
Jonathan Cameron3bf877c2010-05-04 14:43:10 +01001707 { "max1036", max1036 },
1708 { "max1037", max1037 },
1709 { "max1038", max1038 },
1710 { "max1039", max1039 },
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001711 { "max1136", max1136 },
1712 { "max1137", max1137 },
1713 { "max1138", max1138 },
1714 { "max1139", max1139 },
1715 { "max1236", max1236 },
1716 { "max1237", max1237 },
1717 { "max1238", max1238 },
1718 { "max1239", max1239 },
Jonathan Cameron3bf877c2010-05-04 14:43:10 +01001719 { "max11600", max11600 },
1720 { "max11601", max11601 },
1721 { "max11602", max11602 },
1722 { "max11603", max11603 },
1723 { "max11604", max11604 },
1724 { "max11605", max11605 },
Jonathan Cameronc3fa0fdd2010-05-04 14:43:09 +01001725 { "max11606", max11606 },
1726 { "max11607", max11607 },
1727 { "max11608", max11608 },
1728 { "max11609", max11609 },
1729 { "max11610", max11610 },
1730 { "max11611", max11611 },
1731 { "max11612", max11612 },
1732 { "max11613", max11613 },
1733 { "max11614", max11614 },
1734 { "max11615", max11615 },
1735 { "max11616", max11616 },
1736 { "max11617", max11617 },
Stefan Eichenberger3fb77e22016-03-18 16:51:03 +01001737 { "max11644", max11644 },
1738 { "max11645", max11645 },
1739 { "max11646", max11646 },
1740 { "max11647", max11647 },
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001741 {}
1742};
1743
1744MODULE_DEVICE_TABLE(i2c, max1363_id);
1745
1746static struct i2c_driver max1363_driver = {
1747 .driver = {
1748 .name = "max1363",
Florian Vaussard152c9aa2016-06-30 09:43:06 +02001749 .of_match_table = of_match_ptr(max1363_of_match),
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001750 },
1751 .probe = max1363_probe,
Greg Kroah-Hartmanfc526922012-12-21 13:21:43 -08001752 .remove = max1363_remove,
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001753 .id_table = max1363_id,
1754};
Lars-Peter Clausen6e5af182011-11-16 10:13:38 +01001755module_i2c_driver(max1363_driver);
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001756
Jonathan Cameron0f8c9622012-09-02 21:34:59 +01001757MODULE_AUTHOR("Jonathan Cameron <jic23@kernel.org>");
Jonathan Camerond1325cf2009-08-18 18:06:20 +01001758MODULE_DESCRIPTION("Maxim 1363 ADC");
1759MODULE_LICENSE("GPL v2");