GNU Linux-libre 6.8.9-gnu
[releases.git] / drivers / iio / adc / palmas_gpadc.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * palmas-adc.c -- TI PALMAS GPADC.
4  *
5  * Copyright (c) 2013, NVIDIA Corporation. All rights reserved.
6  *
7  * Author: Pradeep Goudagunta <pgoudagunta@nvidia.com>
8  */
9
10 #include <linux/module.h>
11 #include <linux/err.h>
12 #include <linux/irq.h>
13 #include <linux/interrupt.h>
14 #include <linux/platform_device.h>
15 #include <linux/slab.h>
16 #include <linux/delay.h>
17 #include <linux/pm.h>
18 #include <linux/mfd/palmas.h>
19 #include <linux/completion.h>
20 #include <linux/of.h>
21 #include <linux/iio/events.h>
22 #include <linux/iio/iio.h>
23 #include <linux/iio/machine.h>
24 #include <linux/iio/driver.h>
25
26 #define MOD_NAME "palmas-gpadc"
27 #define PALMAS_ADC_CONVERSION_TIMEOUT   (msecs_to_jiffies(5000))
28 #define PALMAS_TO_BE_CALCULATED 0
29 #define PALMAS_GPADC_TRIMINVALID        -1
30
31 struct palmas_gpadc_info {
32 /* calibration codes and regs */
33         int x1; /* lower ideal code */
34         int x2; /* higher ideal code */
35         int v1; /* expected lower volt reading */
36         int v2; /* expected higher volt reading */
37         u8 trim1_reg;   /* register number for lower trim */
38         u8 trim2_reg;   /* register number for upper trim */
39         int gain;       /* calculated from above (after reading trim regs) */
40         int offset;     /* calculated from above (after reading trim regs) */
41         int gain_error; /* calculated from above (after reading trim regs) */
42         bool is_uncalibrated;   /* if channel has calibration data */
43 };
44
45 #define PALMAS_ADC_INFO(_chan, _x1, _x2, _v1, _v2, _t1, _t2, _is_uncalibrated) \
46         [PALMAS_ADC_CH_##_chan] = { \
47                 .x1 = _x1, \
48                 .x2 = _x2, \
49                 .v1 = _v1, \
50                 .v2 = _v2, \
51                 .gain = PALMAS_TO_BE_CALCULATED, \
52                 .offset = PALMAS_TO_BE_CALCULATED, \
53                 .gain_error = PALMAS_TO_BE_CALCULATED, \
54                 .trim1_reg = PALMAS_GPADC_TRIM##_t1, \
55                 .trim2_reg = PALMAS_GPADC_TRIM##_t2,  \
56                 .is_uncalibrated = _is_uncalibrated \
57         }
58
59 static struct palmas_gpadc_info palmas_gpadc_info[] = {
60         PALMAS_ADC_INFO(IN0, 2064, 3112, 630, 950, 1, 2, false),
61         PALMAS_ADC_INFO(IN1, 2064, 3112, 630, 950, 1, 2, false),
62         PALMAS_ADC_INFO(IN2, 2064, 3112, 1260, 1900, 3, 4, false),
63         PALMAS_ADC_INFO(IN3, 2064, 3112, 630, 950, 1, 2, false),
64         PALMAS_ADC_INFO(IN4, 2064, 3112, 630, 950, 1, 2, false),
65         PALMAS_ADC_INFO(IN5, 2064, 3112, 630, 950, 1, 2, false),
66         PALMAS_ADC_INFO(IN6, 2064, 3112, 2520, 3800, 5, 6, false),
67         PALMAS_ADC_INFO(IN7, 2064, 3112, 2520, 3800, 7, 8, false),
68         PALMAS_ADC_INFO(IN8, 2064, 3112, 3150, 4750, 9, 10, false),
69         PALMAS_ADC_INFO(IN9, 2064, 3112, 5670, 8550, 11, 12, false),
70         PALMAS_ADC_INFO(IN10, 2064, 3112, 3465, 5225, 13, 14, false),
71         PALMAS_ADC_INFO(IN11, 0, 0, 0, 0, INVALID, INVALID, true),
72         PALMAS_ADC_INFO(IN12, 0, 0, 0, 0, INVALID, INVALID, true),
73         PALMAS_ADC_INFO(IN13, 0, 0, 0, 0, INVALID, INVALID, true),
74         PALMAS_ADC_INFO(IN14, 2064, 3112, 3645, 5225, 15, 16, false),
75         PALMAS_ADC_INFO(IN15, 0, 0, 0, 0, INVALID, INVALID, true),
76 };
77
78 struct palmas_adc_event {
79         bool enabled;
80         int channel;
81         enum iio_event_direction direction;
82 };
83
84 struct palmas_gpadc_thresholds {
85         int high;
86         int low;
87 };
88
89 /*
90  * struct palmas_gpadc - the palmas_gpadc structure
91  * @ch0_current:        channel 0 current source setting
92  *                      0: 0 uA
93  *                      1: 5 uA
94  *                      2: 15 uA
95  *                      3: 20 uA
96  * @ch3_current:        channel 0 current source setting
97  *                      0: 0 uA
98  *                      1: 10 uA
99  *                      2: 400 uA
100  *                      3: 800 uA
101  * @extended_delay:     enable the gpadc extended delay mode
102  * @auto_conversion_period:     define the auto_conversion_period
103  * @lock:       Lock to protect the device state during a potential concurrent
104  *              read access from userspace. Reading a raw value requires a sequence
105  *              of register writes, then a wait for a completion callback,
106  *              and finally a register read, during which userspace could issue
107  *              another read request. This lock protects a read access from
108  *              ocurring before another one has finished.
109  *
110  * This is the palmas_gpadc structure to store run-time information
111  * and pointers for this driver instance.
112  */
113 struct palmas_gpadc {
114         struct device                   *dev;
115         struct palmas                   *palmas;
116         u8                              ch0_current;
117         u8                              ch3_current;
118         bool                            extended_delay;
119         int                             irq;
120         int                             irq_auto_0;
121         int                             irq_auto_1;
122         struct palmas_gpadc_info        *adc_info;
123         struct completion               conv_completion;
124         struct palmas_adc_event         event0;
125         struct palmas_adc_event         event1;
126         struct palmas_gpadc_thresholds  thresholds[PALMAS_ADC_CH_MAX];
127         int                             auto_conversion_period;
128         struct mutex                    lock;
129 };
130
131 static struct palmas_adc_event *palmas_gpadc_get_event(struct palmas_gpadc *adc,
132                                                        int adc_chan,
133                                                        enum iio_event_direction dir)
134 {
135         if (adc_chan == adc->event0.channel && dir == adc->event0.direction)
136                 return &adc->event0;
137
138         if (adc_chan == adc->event1.channel && dir == adc->event1.direction)
139                 return &adc->event1;
140
141         return NULL;
142 }
143
144 static bool palmas_gpadc_channel_is_freerunning(struct palmas_gpadc *adc,
145                                                 int adc_chan)
146 {
147         return palmas_gpadc_get_event(adc, adc_chan, IIO_EV_DIR_RISING) ||
148                 palmas_gpadc_get_event(adc, adc_chan, IIO_EV_DIR_FALLING);
149 }
150
151 /*
152  * GPADC lock issue in AUTO mode.
153  * Impact: In AUTO mode, GPADC conversion can be locked after disabling AUTO
154  *         mode feature.
155  * Details:
156  *      When the AUTO mode is the only conversion mode enabled, if the AUTO
157  *      mode feature is disabled with bit GPADC_AUTO_CTRL.  AUTO_CONV1_EN = 0
158  *      or bit GPADC_AUTO_CTRL.  AUTO_CONV0_EN = 0 during a conversion, the
159  *      conversion mechanism can be seen as locked meaning that all following
160  *      conversion will give 0 as a result.  Bit GPADC_STATUS.GPADC_AVAILABLE
161  *      will stay at 0 meaning that GPADC is busy.  An RT conversion can unlock
162  *      the GPADC.
163  *
164  * Workaround(s):
165  *      To avoid the lock mechanism, the workaround to follow before any stop
166  *      conversion request is:
167  *      Force the GPADC state machine to be ON by using the GPADC_CTRL1.
168  *              GPADC_FORCE bit = 1
169  *      Shutdown the GPADC AUTO conversion using
170  *              GPADC_AUTO_CTRL.SHUTDOWN_CONV[01] = 0.
171  *      After 100us, force the GPADC state machine to be OFF by using the
172  *              GPADC_CTRL1.  GPADC_FORCE bit = 0
173  */
174
175 static int palmas_disable_auto_conversion(struct palmas_gpadc *adc)
176 {
177         int ret;
178
179         ret = palmas_update_bits(adc->palmas, PALMAS_GPADC_BASE,
180                         PALMAS_GPADC_CTRL1,
181                         PALMAS_GPADC_CTRL1_GPADC_FORCE,
182                         PALMAS_GPADC_CTRL1_GPADC_FORCE);
183         if (ret < 0) {
184                 dev_err(adc->dev, "GPADC_CTRL1 update failed: %d\n", ret);
185                 return ret;
186         }
187
188         ret = palmas_update_bits(adc->palmas, PALMAS_GPADC_BASE,
189                         PALMAS_GPADC_AUTO_CTRL,
190                         PALMAS_GPADC_AUTO_CTRL_SHUTDOWN_CONV1 |
191                         PALMAS_GPADC_AUTO_CTRL_SHUTDOWN_CONV0,
192                         0);
193         if (ret < 0) {
194                 dev_err(adc->dev, "AUTO_CTRL update failed: %d\n", ret);
195                 return ret;
196         }
197
198         udelay(100);
199
200         ret = palmas_update_bits(adc->palmas, PALMAS_GPADC_BASE,
201                         PALMAS_GPADC_CTRL1,
202                         PALMAS_GPADC_CTRL1_GPADC_FORCE, 0);
203         if (ret < 0)
204                 dev_err(adc->dev, "GPADC_CTRL1 update failed: %d\n", ret);
205
206         return ret;
207 }
208
209 static irqreturn_t palmas_gpadc_irq(int irq, void *data)
210 {
211         struct palmas_gpadc *adc = data;
212
213         complete(&adc->conv_completion);
214
215         return IRQ_HANDLED;
216 }
217
218 static irqreturn_t palmas_gpadc_irq_auto(int irq, void *data)
219 {
220         struct iio_dev *indio_dev = data;
221         struct palmas_gpadc *adc = iio_priv(indio_dev);
222         struct palmas_adc_event *ev;
223
224         dev_dbg(adc->dev, "Threshold interrupt %d occurs\n", irq);
225         palmas_disable_auto_conversion(adc);
226
227         ev = (irq == adc->irq_auto_0) ? &adc->event0 : &adc->event1;
228         if (ev->channel != -1) {
229                 enum iio_event_direction dir;
230                 u64 code;
231
232                 dir = ev->direction;
233                 code = IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, ev->channel,
234                                             IIO_EV_TYPE_THRESH, dir);
235                 iio_push_event(indio_dev, code, iio_get_time_ns(indio_dev));
236         }
237
238         return IRQ_HANDLED;
239 }
240
241 static int palmas_gpadc_start_mask_interrupt(struct palmas_gpadc *adc,
242                                                 bool mask)
243 {
244         int ret;
245
246         if (!mask)
247                 ret = palmas_update_bits(adc->palmas, PALMAS_INTERRUPT_BASE,
248                                         PALMAS_INT3_MASK,
249                                         PALMAS_INT3_MASK_GPADC_EOC_SW, 0);
250         else
251                 ret = palmas_update_bits(adc->palmas, PALMAS_INTERRUPT_BASE,
252                                         PALMAS_INT3_MASK,
253                                         PALMAS_INT3_MASK_GPADC_EOC_SW,
254                                         PALMAS_INT3_MASK_GPADC_EOC_SW);
255         if (ret < 0)
256                 dev_err(adc->dev, "GPADC INT MASK update failed: %d\n", ret);
257
258         return ret;
259 }
260
261 static int palmas_gpadc_enable(struct palmas_gpadc *adc, int adc_chan,
262                                int enable)
263 {
264         unsigned int mask, val;
265         int ret;
266
267         if (enable) {
268                 val = (adc->extended_delay
269                         << PALMAS_GPADC_RT_CTRL_EXTEND_DELAY_SHIFT);
270                 ret = palmas_update_bits(adc->palmas, PALMAS_GPADC_BASE,
271                                         PALMAS_GPADC_RT_CTRL,
272                                         PALMAS_GPADC_RT_CTRL_EXTEND_DELAY, val);
273                 if (ret < 0) {
274                         dev_err(adc->dev, "RT_CTRL update failed: %d\n", ret);
275                         return ret;
276                 }
277
278                 mask = (PALMAS_GPADC_CTRL1_CURRENT_SRC_CH0_MASK |
279                         PALMAS_GPADC_CTRL1_CURRENT_SRC_CH3_MASK |
280                         PALMAS_GPADC_CTRL1_GPADC_FORCE);
281                 val = (adc->ch0_current
282                         << PALMAS_GPADC_CTRL1_CURRENT_SRC_CH0_SHIFT);
283                 val |= (adc->ch3_current
284                         << PALMAS_GPADC_CTRL1_CURRENT_SRC_CH3_SHIFT);
285                 val |= PALMAS_GPADC_CTRL1_GPADC_FORCE;
286                 ret = palmas_update_bits(adc->palmas, PALMAS_GPADC_BASE,
287                                 PALMAS_GPADC_CTRL1, mask, val);
288                 if (ret < 0) {
289                         dev_err(adc->dev,
290                                 "Failed to update current setting: %d\n", ret);
291                         return ret;
292                 }
293
294                 mask = (PALMAS_GPADC_SW_SELECT_SW_CONV0_SEL_MASK |
295                         PALMAS_GPADC_SW_SELECT_SW_CONV_EN);
296                 val = (adc_chan | PALMAS_GPADC_SW_SELECT_SW_CONV_EN);
297                 ret = palmas_update_bits(adc->palmas, PALMAS_GPADC_BASE,
298                                 PALMAS_GPADC_SW_SELECT, mask, val);
299                 if (ret < 0) {
300                         dev_err(adc->dev, "SW_SELECT update failed: %d\n", ret);
301                         return ret;
302                 }
303         } else {
304                 ret = palmas_write(adc->palmas, PALMAS_GPADC_BASE,
305                                 PALMAS_GPADC_SW_SELECT, 0);
306                 if (ret < 0)
307                         dev_err(adc->dev, "SW_SELECT write failed: %d\n", ret);
308
309                 ret = palmas_update_bits(adc->palmas, PALMAS_GPADC_BASE,
310                                 PALMAS_GPADC_CTRL1,
311                                 PALMAS_GPADC_CTRL1_GPADC_FORCE, 0);
312                 if (ret < 0) {
313                         dev_err(adc->dev, "CTRL1 update failed: %d\n", ret);
314                         return ret;
315                 }
316         }
317
318         return ret;
319 }
320
321 static int palmas_gpadc_read_prepare(struct palmas_gpadc *adc, int adc_chan)
322 {
323         int ret;
324
325         if (palmas_gpadc_channel_is_freerunning(adc, adc_chan))
326                 return 0; /* ADC already running */
327
328         ret = palmas_gpadc_enable(adc, adc_chan, true);
329         if (ret < 0)
330                 return ret;
331
332         return palmas_gpadc_start_mask_interrupt(adc, 0);
333 }
334
335 static void palmas_gpadc_read_done(struct palmas_gpadc *adc, int adc_chan)
336 {
337         palmas_gpadc_start_mask_interrupt(adc, 1);
338         palmas_gpadc_enable(adc, adc_chan, false);
339 }
340
341 static int palmas_gpadc_calibrate(struct palmas_gpadc *adc, int adc_chan)
342 {
343         int k;
344         int d1;
345         int d2;
346         int ret;
347         int gain;
348         int x1 =  adc->adc_info[adc_chan].x1;
349         int x2 =  adc->adc_info[adc_chan].x2;
350         int v1 = adc->adc_info[adc_chan].v1;
351         int v2 = adc->adc_info[adc_chan].v2;
352
353         ret = palmas_read(adc->palmas, PALMAS_TRIM_GPADC_BASE,
354                                 adc->adc_info[adc_chan].trim1_reg, &d1);
355         if (ret < 0) {
356                 dev_err(adc->dev, "TRIM read failed: %d\n", ret);
357                 goto scrub;
358         }
359
360         ret = palmas_read(adc->palmas, PALMAS_TRIM_GPADC_BASE,
361                                 adc->adc_info[adc_chan].trim2_reg, &d2);
362         if (ret < 0) {
363                 dev_err(adc->dev, "TRIM read failed: %d\n", ret);
364                 goto scrub;
365         }
366
367         /* gain error calculation */
368         k = (1000 + (1000 * (d2 - d1)) / (x2 - x1));
369
370         /* gain calculation */
371         gain = ((v2 - v1) * 1000) / (x2 - x1);
372
373         adc->adc_info[adc_chan].gain_error = k;
374         adc->adc_info[adc_chan].gain = gain;
375         /* offset Calculation */
376         adc->adc_info[adc_chan].offset = (d1 * 1000) - ((k - 1000) * x1);
377
378 scrub:
379         return ret;
380 }
381
382 static int palmas_gpadc_start_conversion(struct palmas_gpadc *adc, int adc_chan)
383 {
384         unsigned int val;
385         int ret;
386
387         if (palmas_gpadc_channel_is_freerunning(adc, adc_chan)) {
388                 int event = (adc_chan == adc->event0.channel) ? 0 : 1;
389                 unsigned int reg = (event == 0) ?
390                         PALMAS_GPADC_AUTO_CONV0_LSB :
391                         PALMAS_GPADC_AUTO_CONV1_LSB;
392
393                 ret = palmas_bulk_read(adc->palmas, PALMAS_GPADC_BASE,
394                                         reg, &val, 2);
395                 if (ret < 0) {
396                         dev_err(adc->dev, "AUTO_CONV%x_LSB read failed: %d\n",
397                                 event, ret);
398                         return ret;
399                 }
400         } else {
401                 init_completion(&adc->conv_completion);
402                 ret = palmas_update_bits(adc->palmas, PALMAS_GPADC_BASE,
403                                         PALMAS_GPADC_SW_SELECT,
404                                         PALMAS_GPADC_SW_SELECT_SW_START_CONV0,
405                                         PALMAS_GPADC_SW_SELECT_SW_START_CONV0);
406                 if (ret < 0) {
407                         dev_err(adc->dev, "SELECT_SW_START write failed: %d\n", ret);
408                         return ret;
409                 }
410
411                 ret = wait_for_completion_timeout(&adc->conv_completion,
412                                         PALMAS_ADC_CONVERSION_TIMEOUT);
413                 if (ret == 0) {
414                         dev_err(adc->dev, "conversion not completed\n");
415                         return -ETIMEDOUT;
416                 }
417
418                 ret = palmas_bulk_read(adc->palmas, PALMAS_GPADC_BASE,
419                                         PALMAS_GPADC_SW_CONV0_LSB, &val, 2);
420                 if (ret < 0) {
421                         dev_err(adc->dev, "SW_CONV0_LSB read failed: %d\n", ret);
422                         return ret;
423                 }
424         }
425
426         ret = val & 0xFFF;
427
428         return ret;
429 }
430
431 static int palmas_gpadc_get_calibrated_code(struct palmas_gpadc *adc,
432                                                 int adc_chan, int val)
433 {
434         if (!adc->adc_info[adc_chan].is_uncalibrated)
435                 val  = (val*1000 - adc->adc_info[adc_chan].offset) /
436                                         adc->adc_info[adc_chan].gain_error;
437
438         if (val < 0) {
439                 if (val < -10)
440                         dev_err(adc->dev, "Mismatch with calibration var = %d\n", val);
441                 return 0;
442         }
443
444         val = (val * adc->adc_info[adc_chan].gain) / 1000;
445
446         return val;
447 }
448
449 /*
450  * The high and low threshold values are calculated based on the advice given
451  * in TI Application Report SLIA087A, "Guide to Using the GPADC in PS65903x,
452  * TPS65917-Q1, TPS65919-Q1, and TPS65916 Devices". This document recommend
453  * taking ADC tolerances into account and is based on the device integral non-
454  * linearity (INL), offset error and gain error:
455  *
456  *   raw high threshold = (ideal threshold + INL) * gain error + offset error
457  *
458  * The gain error include both gain error, as specified in the datasheet, and
459  * the gain error drift. These paramenters vary depending on device and whether
460  * the channel is calibrated (trimmed) or not.
461  */
462 static int palmas_gpadc_threshold_with_tolerance(int val, const int INL,
463                                                  const int gain_error,
464                                                  const int offset_error)
465 {
466         val = ((val + INL) * (1000 + gain_error)) / 1000 + offset_error;
467
468         return clamp(val, 0, 0xFFF);
469 }
470
471 /*
472  * The values below are taken from the datasheet of TWL6035, TWL6037.
473  * todo: get max INL, gain error, and offset error from OF.
474  */
475 static int palmas_gpadc_get_high_threshold_raw(struct palmas_gpadc *adc,
476                                                struct palmas_adc_event *ev)
477 {
478         const int adc_chan = ev->channel;
479         int val = adc->thresholds[adc_chan].high;
480         /* integral nonlinearity, measured in LSB */
481         const int max_INL = 2;
482         /* measured in LSB */
483         int max_offset_error;
484         /* 0.2% when calibrated */
485         int max_gain_error = 2;
486
487         val = (val * 1000) / adc->adc_info[adc_chan].gain;
488
489         if (adc->adc_info[adc_chan].is_uncalibrated) {
490                 /* 2% worse */
491                 max_gain_error += 20;
492                 max_offset_error = 36;
493         } else {
494                 val = (val * adc->adc_info[adc_chan].gain_error +
495                        adc->adc_info[adc_chan].offset) /
496                         1000;
497                 max_offset_error = 2;
498         }
499
500         return palmas_gpadc_threshold_with_tolerance(val,
501                                                      max_INL,
502                                                      max_gain_error,
503                                                      max_offset_error);
504 }
505
506 /*
507  * The values below are taken from the datasheet of TWL6035, TWL6037.
508  * todo: get min INL, gain error, and offset error from OF.
509  */
510 static int palmas_gpadc_get_low_threshold_raw(struct palmas_gpadc *adc,
511                                               struct palmas_adc_event *ev)
512 {
513         const int adc_chan = ev->channel;
514         int val = adc->thresholds[adc_chan].low;
515         /* integral nonlinearity, measured in LSB */
516         const int min_INL = -2;
517         /* measured in LSB */
518         int min_offset_error;
519         /* -0.6% when calibrated */
520         int min_gain_error = -6;
521
522         val = (val * 1000) / adc->adc_info[adc_chan].gain;
523
524         if (adc->adc_info[adc_chan].is_uncalibrated) {
525                 /* 2% worse */
526                 min_gain_error -= 20;
527                 min_offset_error = -36;
528         } else {
529                 val = (val * adc->adc_info[adc_chan].gain_error -
530                        adc->adc_info[adc_chan].offset) /
531                         1000;
532                 min_offset_error = -2;
533         }
534
535         return palmas_gpadc_threshold_with_tolerance(val,
536                                                      min_INL,
537                                                      min_gain_error,
538                                                      min_offset_error);
539 }
540
541 static int palmas_gpadc_read_raw(struct iio_dev *indio_dev,
542         struct iio_chan_spec const *chan, int *val, int *val2, long mask)
543 {
544         struct  palmas_gpadc *adc = iio_priv(indio_dev);
545         int adc_chan = chan->channel;
546         int ret = 0;
547
548         if (adc_chan >= PALMAS_ADC_CH_MAX)
549                 return -EINVAL;
550
551         mutex_lock(&adc->lock);
552
553         switch (mask) {
554         case IIO_CHAN_INFO_RAW:
555         case IIO_CHAN_INFO_PROCESSED:
556                 ret = palmas_gpadc_read_prepare(adc, adc_chan);
557                 if (ret < 0)
558                         goto out;
559
560                 ret = palmas_gpadc_start_conversion(adc, adc_chan);
561                 if (ret < 0) {
562                         dev_err(adc->dev,
563                         "ADC start conversion failed\n");
564                         goto out;
565                 }
566
567                 if (mask == IIO_CHAN_INFO_PROCESSED)
568                         ret = palmas_gpadc_get_calibrated_code(
569                                                         adc, adc_chan, ret);
570
571                 *val = ret;
572
573                 ret = IIO_VAL_INT;
574                 goto out;
575         }
576
577         mutex_unlock(&adc->lock);
578         return ret;
579
580 out:
581         palmas_gpadc_read_done(adc, adc_chan);
582         mutex_unlock(&adc->lock);
583
584         return ret;
585 }
586
587 static int palmas_gpadc_read_event_config(struct iio_dev *indio_dev,
588                                           const struct iio_chan_spec *chan,
589                                           enum iio_event_type type,
590                                           enum iio_event_direction dir)
591 {
592         struct palmas_gpadc *adc = iio_priv(indio_dev);
593         int adc_chan = chan->channel;
594         int ret = 0;
595
596         if (adc_chan >= PALMAS_ADC_CH_MAX || type != IIO_EV_TYPE_THRESH)
597                 return -EINVAL;
598
599         mutex_lock(&adc->lock);
600
601         if (palmas_gpadc_get_event(adc, adc_chan, dir))
602                 ret = 1;
603
604         mutex_unlock(&adc->lock);
605
606         return ret;
607 }
608
609 static int palmas_adc_configure_events(struct palmas_gpadc *adc);
610 static int palmas_adc_reset_events(struct palmas_gpadc *adc);
611
612 static int palmas_gpadc_reconfigure_event_channels(struct palmas_gpadc *adc)
613 {
614         return (adc->event0.enabled || adc->event1.enabled) ?
615                 palmas_adc_configure_events(adc) :
616                 palmas_adc_reset_events(adc);
617 }
618
619 static int palmas_gpadc_enable_event_config(struct palmas_gpadc *adc,
620                                             const struct iio_chan_spec *chan,
621                                             enum iio_event_direction dir)
622 {
623         struct palmas_adc_event *ev;
624         int adc_chan = chan->channel;
625
626         if (palmas_gpadc_get_event(adc, adc_chan, dir))
627                 /* already enabled */
628                 return 0;
629
630         if (adc->event0.channel == -1) {
631                 ev = &adc->event0;
632         } else if (adc->event1.channel == -1) {
633                 /* event0 has to be the lowest channel */
634                 if (adc_chan < adc->event0.channel) {
635                         adc->event1 = adc->event0;
636                         ev = &adc->event0;
637                 } else {
638                         ev = &adc->event1;
639                 }
640         } else { /* both AUTO channels already in use */
641                 dev_warn(adc->dev, "event0 - %d, event1 - %d\n",
642                          adc->event0.channel, adc->event1.channel);
643                 return -EBUSY;
644         }
645
646         ev->enabled = true;
647         ev->channel = adc_chan;
648         ev->direction = dir;
649
650         return palmas_gpadc_reconfigure_event_channels(adc);
651 }
652
653 static int palmas_gpadc_disable_event_config(struct palmas_gpadc *adc,
654                                              const struct iio_chan_spec *chan,
655                                              enum iio_event_direction dir)
656 {
657         int adc_chan = chan->channel;
658         struct palmas_adc_event *ev = palmas_gpadc_get_event(adc, adc_chan, dir);
659
660         if (!ev)
661                 return 0;
662
663         if (ev == &adc->event0) {
664                 adc->event0 = adc->event1;
665                 ev = &adc->event1;
666         }
667
668         ev->enabled = false;
669         ev->channel = -1;
670         ev->direction = IIO_EV_DIR_NONE;
671
672         return palmas_gpadc_reconfigure_event_channels(adc);
673 }
674
675 static int palmas_gpadc_write_event_config(struct iio_dev *indio_dev,
676                                            const struct iio_chan_spec *chan,
677                                            enum iio_event_type type,
678                                            enum iio_event_direction dir,
679                                            int state)
680 {
681         struct palmas_gpadc *adc = iio_priv(indio_dev);
682         int adc_chan = chan->channel;
683         int ret;
684
685         if (adc_chan >= PALMAS_ADC_CH_MAX || type != IIO_EV_TYPE_THRESH)
686                 return -EINVAL;
687
688         mutex_lock(&adc->lock);
689
690         if (state)
691                 ret = palmas_gpadc_enable_event_config(adc, chan, dir);
692         else
693                 ret = palmas_gpadc_disable_event_config(adc, chan, dir);
694
695         mutex_unlock(&adc->lock);
696
697         return ret;
698 }
699
700 static int palmas_gpadc_read_event_value(struct iio_dev *indio_dev,
701                                          const struct iio_chan_spec *chan,
702                                          enum iio_event_type type,
703                                          enum iio_event_direction dir,
704                                          enum iio_event_info info,
705                                          int *val, int *val2)
706 {
707         struct palmas_gpadc *adc = iio_priv(indio_dev);
708         int adc_chan = chan->channel;
709         int ret;
710
711         if (adc_chan >= PALMAS_ADC_CH_MAX || type != IIO_EV_TYPE_THRESH)
712                 return -EINVAL;
713
714         mutex_lock(&adc->lock);
715
716         switch (info) {
717         case IIO_EV_INFO_VALUE:
718                 *val = (dir == IIO_EV_DIR_RISING) ?
719                         adc->thresholds[adc_chan].high :
720                         adc->thresholds[adc_chan].low;
721                 ret = IIO_VAL_INT;
722                 break;
723         default:
724                 ret = -EINVAL;
725                 break;
726         }
727
728         mutex_unlock(&adc->lock);
729
730         return ret;
731 }
732
733 static int palmas_gpadc_write_event_value(struct iio_dev *indio_dev,
734                                           const struct iio_chan_spec *chan,
735                                           enum iio_event_type type,
736                                           enum iio_event_direction dir,
737                                           enum iio_event_info info,
738                                           int val, int val2)
739 {
740         struct palmas_gpadc *adc = iio_priv(indio_dev);
741         int adc_chan = chan->channel;
742         int old;
743         int ret;
744
745         if (adc_chan >= PALMAS_ADC_CH_MAX || type != IIO_EV_TYPE_THRESH)
746                 return -EINVAL;
747
748         mutex_lock(&adc->lock);
749         switch (info) {
750         case IIO_EV_INFO_VALUE:
751                 if (val < 0 || val > 0xFFF) {
752                         ret = -EINVAL;
753                         goto out_unlock;
754                 }
755                 if (dir == IIO_EV_DIR_RISING) {
756                         old = adc->thresholds[adc_chan].high;
757                         adc->thresholds[adc_chan].high = val;
758                 } else {
759                         old = adc->thresholds[adc_chan].low;
760                         adc->thresholds[adc_chan].low = val;
761                 }
762                 ret = 0;
763                 break;
764         default:
765                 ret = -EINVAL;
766                 goto out_unlock;
767         }
768
769         if (val != old && palmas_gpadc_get_event(adc, adc_chan, dir))
770                 ret = palmas_gpadc_reconfigure_event_channels(adc);
771
772 out_unlock:
773         mutex_unlock(&adc->lock);
774
775         return ret;
776 }
777
778 static const struct iio_info palmas_gpadc_iio_info = {
779         .read_raw = palmas_gpadc_read_raw,
780         .read_event_config = palmas_gpadc_read_event_config,
781         .write_event_config = palmas_gpadc_write_event_config,
782         .read_event_value = palmas_gpadc_read_event_value,
783         .write_event_value = palmas_gpadc_write_event_value,
784 };
785
786 static const struct iio_event_spec palmas_gpadc_events[] = {
787         {
788                 .type = IIO_EV_TYPE_THRESH,
789                 .dir = IIO_EV_DIR_RISING,
790                 .mask_separate = BIT(IIO_EV_INFO_VALUE) |
791                                 BIT(IIO_EV_INFO_ENABLE),
792         }, {
793                 .type = IIO_EV_TYPE_THRESH,
794                 .dir = IIO_EV_DIR_FALLING,
795                 .mask_separate = BIT(IIO_EV_INFO_VALUE) |
796                                 BIT(IIO_EV_INFO_ENABLE),
797         },
798 };
799
800 #define PALMAS_ADC_CHAN_IIO(chan, _type, chan_info)     \
801 {                                                       \
802         .datasheet_name = PALMAS_DATASHEET_NAME(chan),  \
803         .type = _type,                                  \
804         .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |  \
805                         BIT(chan_info),                 \
806         .indexed = 1,                                   \
807         .channel = PALMAS_ADC_CH_##chan,                \
808         .event_spec = palmas_gpadc_events,              \
809         .num_event_specs = ARRAY_SIZE(palmas_gpadc_events)      \
810 }
811
812 static const struct iio_chan_spec palmas_gpadc_iio_channel[] = {
813         PALMAS_ADC_CHAN_IIO(IN0, IIO_VOLTAGE, IIO_CHAN_INFO_PROCESSED),
814         PALMAS_ADC_CHAN_IIO(IN1, IIO_TEMP, IIO_CHAN_INFO_RAW),
815         PALMAS_ADC_CHAN_IIO(IN2, IIO_VOLTAGE, IIO_CHAN_INFO_PROCESSED),
816         PALMAS_ADC_CHAN_IIO(IN3, IIO_TEMP, IIO_CHAN_INFO_RAW),
817         PALMAS_ADC_CHAN_IIO(IN4, IIO_VOLTAGE, IIO_CHAN_INFO_PROCESSED),
818         PALMAS_ADC_CHAN_IIO(IN5, IIO_VOLTAGE, IIO_CHAN_INFO_PROCESSED),
819         PALMAS_ADC_CHAN_IIO(IN6, IIO_VOLTAGE, IIO_CHAN_INFO_PROCESSED),
820         PALMAS_ADC_CHAN_IIO(IN7, IIO_VOLTAGE, IIO_CHAN_INFO_PROCESSED),
821         PALMAS_ADC_CHAN_IIO(IN8, IIO_VOLTAGE, IIO_CHAN_INFO_PROCESSED),
822         PALMAS_ADC_CHAN_IIO(IN9, IIO_VOLTAGE, IIO_CHAN_INFO_PROCESSED),
823         PALMAS_ADC_CHAN_IIO(IN10, IIO_VOLTAGE, IIO_CHAN_INFO_PROCESSED),
824         PALMAS_ADC_CHAN_IIO(IN11, IIO_VOLTAGE, IIO_CHAN_INFO_PROCESSED),
825         PALMAS_ADC_CHAN_IIO(IN12, IIO_TEMP, IIO_CHAN_INFO_RAW),
826         PALMAS_ADC_CHAN_IIO(IN13, IIO_TEMP, IIO_CHAN_INFO_RAW),
827         PALMAS_ADC_CHAN_IIO(IN14, IIO_VOLTAGE, IIO_CHAN_INFO_PROCESSED),
828         PALMAS_ADC_CHAN_IIO(IN15, IIO_VOLTAGE, IIO_CHAN_INFO_PROCESSED),
829 };
830
831 static int palmas_gpadc_get_adc_dt_data(struct platform_device *pdev,
832         struct palmas_gpadc_platform_data **gpadc_pdata)
833 {
834         struct device_node *np = pdev->dev.of_node;
835         struct palmas_gpadc_platform_data *gp_data;
836         int ret;
837         u32 pval;
838
839         gp_data = devm_kzalloc(&pdev->dev, sizeof(*gp_data), GFP_KERNEL);
840         if (!gp_data)
841                 return -ENOMEM;
842
843         ret = of_property_read_u32(np, "ti,channel0-current-microamp", &pval);
844         if (!ret)
845                 gp_data->ch0_current = pval;
846
847         ret = of_property_read_u32(np, "ti,channel3-current-microamp", &pval);
848         if (!ret)
849                 gp_data->ch3_current = pval;
850
851         gp_data->extended_delay = of_property_read_bool(np,
852                                         "ti,enable-extended-delay");
853
854         *gpadc_pdata = gp_data;
855
856         return 0;
857 }
858
859 static void palmas_gpadc_reset(void *data)
860 {
861         struct palmas_gpadc *adc = data;
862         if (adc->event0.enabled || adc->event1.enabled)
863                 palmas_adc_reset_events(adc);
864 }
865
866 static int palmas_gpadc_probe(struct platform_device *pdev)
867 {
868         struct palmas_gpadc *adc;
869         struct palmas_platform_data *pdata;
870         struct palmas_gpadc_platform_data *gpadc_pdata = NULL;
871         struct iio_dev *indio_dev;
872         int ret, i;
873
874         pdata = dev_get_platdata(pdev->dev.parent);
875
876         if (pdata && pdata->gpadc_pdata)
877                 gpadc_pdata = pdata->gpadc_pdata;
878
879         if (!gpadc_pdata && pdev->dev.of_node) {
880                 ret = palmas_gpadc_get_adc_dt_data(pdev, &gpadc_pdata);
881                 if (ret < 0)
882                         return ret;
883         }
884         if (!gpadc_pdata)
885                 return -EINVAL;
886
887         indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*adc));
888         if (!indio_dev) {
889                 dev_err(&pdev->dev, "iio_device_alloc failed\n");
890                 return -ENOMEM;
891         }
892
893         adc = iio_priv(indio_dev);
894         adc->dev = &pdev->dev;
895         adc->palmas = dev_get_drvdata(pdev->dev.parent);
896         adc->adc_info = palmas_gpadc_info;
897
898         mutex_init(&adc->lock);
899
900         init_completion(&adc->conv_completion);
901         platform_set_drvdata(pdev, indio_dev);
902
903         adc->auto_conversion_period = gpadc_pdata->auto_conversion_period_ms;
904         adc->irq = palmas_irq_get_virq(adc->palmas, PALMAS_GPADC_EOC_SW_IRQ);
905         if (adc->irq < 0)
906                 return dev_err_probe(adc->dev, adc->irq, "get virq failed\n");
907
908         ret = devm_request_threaded_irq(&pdev->dev, adc->irq, NULL,
909                                         palmas_gpadc_irq,
910                                         IRQF_ONESHOT, dev_name(adc->dev),
911                                         adc);
912         if (ret < 0)
913                 return dev_err_probe(adc->dev, ret,
914                                      "request irq %d failed\n", adc->irq);
915
916         adc->irq_auto_0 = platform_get_irq(pdev, 1);
917         if (adc->irq_auto_0 < 0)
918                 return adc->irq_auto_0;
919
920         ret = devm_request_threaded_irq(&pdev->dev, adc->irq_auto_0, NULL,
921                                         palmas_gpadc_irq_auto, IRQF_ONESHOT,
922                                         "palmas-adc-auto-0", indio_dev);
923         if (ret < 0)
924                 return dev_err_probe(adc->dev, ret,
925                                      "request auto0 irq %d failed\n",
926                                      adc->irq_auto_0);
927
928         adc->irq_auto_1 = platform_get_irq(pdev, 2);
929         if (adc->irq_auto_1 < 0)
930                 return adc->irq_auto_1;
931
932         ret = devm_request_threaded_irq(&pdev->dev, adc->irq_auto_1, NULL,
933                                         palmas_gpadc_irq_auto, IRQF_ONESHOT,
934                                         "palmas-adc-auto-1", indio_dev);
935         if (ret < 0)
936                 return dev_err_probe(adc->dev, ret,
937                                      "request auto1 irq %d failed\n",
938                                      adc->irq_auto_1);
939
940         adc->event0.enabled = false;
941         adc->event0.channel = -1;
942         adc->event0.direction = IIO_EV_DIR_NONE;
943         adc->event1.enabled = false;
944         adc->event1.channel = -1;
945         adc->event1.direction = IIO_EV_DIR_NONE;
946
947         /* set the current source 0 (value 0/5/15/20 uA => 0..3) */
948         if (gpadc_pdata->ch0_current <= 1)
949                 adc->ch0_current = PALMAS_ADC_CH0_CURRENT_SRC_0;
950         else if (gpadc_pdata->ch0_current <= 5)
951                 adc->ch0_current = PALMAS_ADC_CH0_CURRENT_SRC_5;
952         else if (gpadc_pdata->ch0_current <= 15)
953                 adc->ch0_current = PALMAS_ADC_CH0_CURRENT_SRC_15;
954         else
955                 adc->ch0_current = PALMAS_ADC_CH0_CURRENT_SRC_20;
956
957         /* set the current source 3 (value 0/10/400/800 uA => 0..3) */
958         if (gpadc_pdata->ch3_current <= 1)
959                 adc->ch3_current = PALMAS_ADC_CH3_CURRENT_SRC_0;
960         else if (gpadc_pdata->ch3_current <= 10)
961                 adc->ch3_current = PALMAS_ADC_CH3_CURRENT_SRC_10;
962         else if (gpadc_pdata->ch3_current <= 400)
963                 adc->ch3_current = PALMAS_ADC_CH3_CURRENT_SRC_400;
964         else
965                 adc->ch3_current = PALMAS_ADC_CH3_CURRENT_SRC_800;
966
967         adc->extended_delay = gpadc_pdata->extended_delay;
968
969         indio_dev->name = MOD_NAME;
970         indio_dev->info = &palmas_gpadc_iio_info;
971         indio_dev->modes = INDIO_DIRECT_MODE;
972         indio_dev->channels = palmas_gpadc_iio_channel;
973         indio_dev->num_channels = ARRAY_SIZE(palmas_gpadc_iio_channel);
974
975         ret = devm_iio_device_register(&pdev->dev, indio_dev);
976         if (ret < 0)
977                 return dev_err_probe(adc->dev, ret,
978                                      "iio_device_register() failed\n");
979
980         device_set_wakeup_capable(&pdev->dev, 1);
981         for (i = 0; i < PALMAS_ADC_CH_MAX; i++) {
982                 if (!(adc->adc_info[i].is_uncalibrated))
983                         palmas_gpadc_calibrate(adc, i);
984         }
985
986         ret = devm_add_action(&pdev->dev, palmas_gpadc_reset, adc);
987         if (ret)
988                 return ret;
989
990         return 0;
991 }
992
993 static int palmas_adc_configure_events(struct palmas_gpadc *adc)
994 {
995         int adc_period, conv;
996         int i;
997         int ch0 = 0, ch1 = 0;
998         int thres;
999         int ret;
1000
1001         adc_period = adc->auto_conversion_period;
1002         for (i = 0; i < 16; ++i) {
1003                 if (((1000 * (1 << i)) / 32) >= adc_period)
1004                         break;
1005         }
1006         if (i > 0)
1007                 i--;
1008         adc_period = i;
1009         ret = palmas_update_bits(adc->palmas, PALMAS_GPADC_BASE,
1010                         PALMAS_GPADC_AUTO_CTRL,
1011                         PALMAS_GPADC_AUTO_CTRL_COUNTER_CONV_MASK,
1012                         adc_period);
1013         if (ret < 0) {
1014                 dev_err(adc->dev, "AUTO_CTRL write failed: %d\n", ret);
1015                 return ret;
1016         }
1017
1018         conv = 0;
1019         if (adc->event0.enabled) {
1020                 struct palmas_adc_event *ev = &adc->event0;
1021                 int polarity;
1022
1023                 ch0 = ev->channel;
1024                 conv |= PALMAS_GPADC_AUTO_CTRL_AUTO_CONV0_EN;
1025                 switch (ev->direction) {
1026                 case IIO_EV_DIR_RISING:
1027                         thres = palmas_gpadc_get_high_threshold_raw(adc, ev);
1028                         polarity = 0;
1029                         break;
1030                 case IIO_EV_DIR_FALLING:
1031                         thres = palmas_gpadc_get_low_threshold_raw(adc, ev);
1032                         polarity = PALMAS_GPADC_THRES_CONV0_MSB_THRES_CONV0_POL;
1033                         break;
1034                 default:
1035                         return -EINVAL;
1036                 }
1037
1038                 ret = palmas_write(adc->palmas, PALMAS_GPADC_BASE,
1039                                 PALMAS_GPADC_THRES_CONV0_LSB, thres & 0xFF);
1040                 if (ret < 0) {
1041                         dev_err(adc->dev,
1042                                 "THRES_CONV0_LSB write failed: %d\n", ret);
1043                         return ret;
1044                 }
1045
1046                 ret = palmas_write(adc->palmas, PALMAS_GPADC_BASE,
1047                                 PALMAS_GPADC_THRES_CONV0_MSB,
1048                                 ((thres >> 8) & 0xF) | polarity);
1049                 if (ret < 0) {
1050                         dev_err(adc->dev,
1051                                 "THRES_CONV0_MSB write failed: %d\n", ret);
1052                         return ret;
1053                 }
1054         }
1055
1056         if (adc->event1.enabled) {
1057                 struct palmas_adc_event *ev = &adc->event1;
1058                 int polarity;
1059
1060                 ch1 = ev->channel;
1061                 conv |= PALMAS_GPADC_AUTO_CTRL_AUTO_CONV1_EN;
1062                 switch (ev->direction) {
1063                 case IIO_EV_DIR_RISING:
1064                         thres = palmas_gpadc_get_high_threshold_raw(adc, ev);
1065                         polarity = 0;
1066                         break;
1067                 case IIO_EV_DIR_FALLING:
1068                         thres = palmas_gpadc_get_low_threshold_raw(adc, ev);
1069                         polarity = PALMAS_GPADC_THRES_CONV1_MSB_THRES_CONV1_POL;
1070                         break;
1071                 default:
1072                         return -EINVAL;
1073                 }
1074
1075                 ret = palmas_write(adc->palmas, PALMAS_GPADC_BASE,
1076                                 PALMAS_GPADC_THRES_CONV1_LSB, thres & 0xFF);
1077                 if (ret < 0) {
1078                         dev_err(adc->dev,
1079                                 "THRES_CONV1_LSB write failed: %d\n", ret);
1080                         return ret;
1081                 }
1082
1083                 ret = palmas_write(adc->palmas, PALMAS_GPADC_BASE,
1084                                 PALMAS_GPADC_THRES_CONV1_MSB,
1085                                 ((thres >> 8) & 0xF) | polarity);
1086                 if (ret < 0) {
1087                         dev_err(adc->dev,
1088                                 "THRES_CONV1_MSB write failed: %d\n", ret);
1089                         return ret;
1090                 }
1091         }
1092
1093         ret = palmas_write(adc->palmas, PALMAS_GPADC_BASE,
1094                         PALMAS_GPADC_AUTO_SELECT, (ch1 << 4) | ch0);
1095         if (ret < 0) {
1096                 dev_err(adc->dev, "AUTO_SELECT write failed: %d\n", ret);
1097                 return ret;
1098         }
1099
1100         ret = palmas_update_bits(adc->palmas, PALMAS_GPADC_BASE,
1101                         PALMAS_GPADC_AUTO_CTRL,
1102                         PALMAS_GPADC_AUTO_CTRL_AUTO_CONV1_EN |
1103                         PALMAS_GPADC_AUTO_CTRL_AUTO_CONV0_EN, conv);
1104         if (ret < 0)
1105                 dev_err(adc->dev, "AUTO_CTRL write failed: %d\n", ret);
1106
1107         return ret;
1108 }
1109
1110 static int palmas_adc_reset_events(struct palmas_gpadc *adc)
1111 {
1112         int ret;
1113
1114         ret = palmas_write(adc->palmas, PALMAS_GPADC_BASE,
1115                         PALMAS_GPADC_AUTO_SELECT, 0);
1116         if (ret < 0) {
1117                 dev_err(adc->dev, "AUTO_SELECT write failed: %d\n", ret);
1118                 return ret;
1119         }
1120
1121         ret = palmas_disable_auto_conversion(adc);
1122         if (ret < 0)
1123                 dev_err(adc->dev, "Disable auto conversion failed: %d\n", ret);
1124
1125         return ret;
1126 }
1127
1128 static int palmas_gpadc_suspend(struct device *dev)
1129 {
1130         struct iio_dev *indio_dev = dev_get_drvdata(dev);
1131         struct palmas_gpadc *adc = iio_priv(indio_dev);
1132
1133         if (!device_may_wakeup(dev))
1134                 return 0;
1135
1136         if (adc->event0.enabled)
1137                 enable_irq_wake(adc->irq_auto_0);
1138
1139         if (adc->event1.enabled)
1140                 enable_irq_wake(adc->irq_auto_1);
1141
1142         return 0;
1143 }
1144
1145 static int palmas_gpadc_resume(struct device *dev)
1146 {
1147         struct iio_dev *indio_dev = dev_get_drvdata(dev);
1148         struct palmas_gpadc *adc = iio_priv(indio_dev);
1149
1150         if (!device_may_wakeup(dev))
1151                 return 0;
1152
1153         if (adc->event0.enabled)
1154                 disable_irq_wake(adc->irq_auto_0);
1155
1156         if (adc->event1.enabled)
1157                 disable_irq_wake(adc->irq_auto_1);
1158
1159         return 0;
1160 };
1161
1162 static DEFINE_SIMPLE_DEV_PM_OPS(palmas_pm_ops, palmas_gpadc_suspend,
1163                                 palmas_gpadc_resume);
1164
1165 static const struct of_device_id of_palmas_gpadc_match_tbl[] = {
1166         { .compatible = "ti,palmas-gpadc", },
1167         { /* end */ }
1168 };
1169 MODULE_DEVICE_TABLE(of, of_palmas_gpadc_match_tbl);
1170
1171 static struct platform_driver palmas_gpadc_driver = {
1172         .probe = palmas_gpadc_probe,
1173         .driver = {
1174                 .name = MOD_NAME,
1175                 .pm = pm_sleep_ptr(&palmas_pm_ops),
1176                 .of_match_table = of_palmas_gpadc_match_tbl,
1177         },
1178 };
1179 module_platform_driver(palmas_gpadc_driver);
1180
1181 MODULE_DESCRIPTION("palmas GPADC driver");
1182 MODULE_AUTHOR("Pradeep Goudagunta<pgoudagunta@nvidia.com>");
1183 MODULE_ALIAS("platform:palmas-gpadc");
1184 MODULE_LICENSE("GPL v2");