GNU Linux-libre 4.19.286-gnu1
[releases.git] / drivers / iio / adc / imx7d_adc.c
1 /*
2  * Freescale i.MX7D ADC driver
3  *
4  * Copyright (C) 2015 Freescale Semiconductor, Inc.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  */
11
12 #include <linux/clk.h>
13 #include <linux/completion.h>
14 #include <linux/err.h>
15 #include <linux/interrupt.h>
16 #include <linux/io.h>
17 #include <linux/kernel.h>
18 #include <linux/module.h>
19 #include <linux/platform_device.h>
20 #include <linux/regulator/consumer.h>
21
22 #include <linux/iio/iio.h>
23 #include <linux/iio/driver.h>
24 #include <linux/iio/sysfs.h>
25
26 /* ADC register */
27 #define IMX7D_REG_ADC_CH_A_CFG1                 0x00
28 #define IMX7D_REG_ADC_CH_A_CFG2                 0x10
29 #define IMX7D_REG_ADC_CH_B_CFG1                 0x20
30 #define IMX7D_REG_ADC_CH_B_CFG2                 0x30
31 #define IMX7D_REG_ADC_CH_C_CFG1                 0x40
32 #define IMX7D_REG_ADC_CH_C_CFG2                 0x50
33 #define IMX7D_REG_ADC_CH_D_CFG1                 0x60
34 #define IMX7D_REG_ADC_CH_D_CFG2                 0x70
35 #define IMX7D_REG_ADC_CH_SW_CFG                 0x80
36 #define IMX7D_REG_ADC_TIMER_UNIT                0x90
37 #define IMX7D_REG_ADC_DMA_FIFO                  0xa0
38 #define IMX7D_REG_ADC_FIFO_STATUS               0xb0
39 #define IMX7D_REG_ADC_INT_SIG_EN                0xc0
40 #define IMX7D_REG_ADC_INT_EN                    0xd0
41 #define IMX7D_REG_ADC_INT_STATUS                0xe0
42 #define IMX7D_REG_ADC_CHA_B_CNV_RSLT            0xf0
43 #define IMX7D_REG_ADC_CHC_D_CNV_RSLT            0x100
44 #define IMX7D_REG_ADC_CH_SW_CNV_RSLT            0x110
45 #define IMX7D_REG_ADC_DMA_FIFO_DAT              0x120
46 #define IMX7D_REG_ADC_ADC_CFG                   0x130
47
48 #define IMX7D_REG_ADC_CHANNEL_CFG2_BASE         0x10
49 #define IMX7D_EACH_CHANNEL_REG_OFFSET           0x20
50
51 #define IMX7D_REG_ADC_CH_CFG1_CHANNEL_EN                        (0x1 << 31)
52 #define IMX7D_REG_ADC_CH_CFG1_CHANNEL_SINGLE                    BIT(30)
53 #define IMX7D_REG_ADC_CH_CFG1_CHANNEL_AVG_EN                    BIT(29)
54 #define IMX7D_REG_ADC_CH_CFG1_CHANNEL_SEL(x)                    ((x) << 24)
55
56 #define IMX7D_REG_ADC_CH_CFG2_AVG_NUM_4                         (0x0 << 12)
57 #define IMX7D_REG_ADC_CH_CFG2_AVG_NUM_8                         (0x1 << 12)
58 #define IMX7D_REG_ADC_CH_CFG2_AVG_NUM_16                        (0x2 << 12)
59 #define IMX7D_REG_ADC_CH_CFG2_AVG_NUM_32                        (0x3 << 12)
60
61 #define IMX7D_REG_ADC_TIMER_UNIT_PRE_DIV_4                      (0x0 << 29)
62 #define IMX7D_REG_ADC_TIMER_UNIT_PRE_DIV_8                      (0x1 << 29)
63 #define IMX7D_REG_ADC_TIMER_UNIT_PRE_DIV_16                     (0x2 << 29)
64 #define IMX7D_REG_ADC_TIMER_UNIT_PRE_DIV_32                     (0x3 << 29)
65 #define IMX7D_REG_ADC_TIMER_UNIT_PRE_DIV_64                     (0x4 << 29)
66 #define IMX7D_REG_ADC_TIMER_UNIT_PRE_DIV_128                    (0x5 << 29)
67
68 #define IMX7D_REG_ADC_ADC_CFG_ADC_CLK_DOWN                      BIT(31)
69 #define IMX7D_REG_ADC_ADC_CFG_ADC_POWER_DOWN                    BIT(1)
70 #define IMX7D_REG_ADC_ADC_CFG_ADC_EN                            BIT(0)
71
72 #define IMX7D_REG_ADC_INT_CHA_COV_INT_EN                        BIT(8)
73 #define IMX7D_REG_ADC_INT_CHB_COV_INT_EN                        BIT(9)
74 #define IMX7D_REG_ADC_INT_CHC_COV_INT_EN                        BIT(10)
75 #define IMX7D_REG_ADC_INT_CHD_COV_INT_EN                        BIT(11)
76 #define IMX7D_REG_ADC_INT_CHANNEL_INT_EN \
77         (IMX7D_REG_ADC_INT_CHA_COV_INT_EN | \
78          IMX7D_REG_ADC_INT_CHB_COV_INT_EN | \
79          IMX7D_REG_ADC_INT_CHC_COV_INT_EN | \
80          IMX7D_REG_ADC_INT_CHD_COV_INT_EN)
81 #define IMX7D_REG_ADC_INT_STATUS_CHANNEL_INT_STATUS             0xf00
82 #define IMX7D_REG_ADC_INT_STATUS_CHANNEL_CONV_TIME_OUT          0xf0000
83
84 #define IMX7D_ADC_TIMEOUT               msecs_to_jiffies(100)
85
86 enum imx7d_adc_clk_pre_div {
87         IMX7D_ADC_ANALOG_CLK_PRE_DIV_4,
88         IMX7D_ADC_ANALOG_CLK_PRE_DIV_8,
89         IMX7D_ADC_ANALOG_CLK_PRE_DIV_16,
90         IMX7D_ADC_ANALOG_CLK_PRE_DIV_32,
91         IMX7D_ADC_ANALOG_CLK_PRE_DIV_64,
92         IMX7D_ADC_ANALOG_CLK_PRE_DIV_128,
93 };
94
95 enum imx7d_adc_average_num {
96         IMX7D_ADC_AVERAGE_NUM_4,
97         IMX7D_ADC_AVERAGE_NUM_8,
98         IMX7D_ADC_AVERAGE_NUM_16,
99         IMX7D_ADC_AVERAGE_NUM_32,
100 };
101
102 struct imx7d_adc_feature {
103         enum imx7d_adc_clk_pre_div clk_pre_div;
104         enum imx7d_adc_average_num avg_num;
105
106         u32 core_time_unit;     /* impact the sample rate */
107
108         bool average_en;
109 };
110
111 struct imx7d_adc {
112         struct device *dev;
113         void __iomem *regs;
114         struct clk *clk;
115
116         u32 vref_uv;
117         u32 value;
118         u32 channel;
119         u32 pre_div_num;
120
121         struct regulator *vref;
122         struct imx7d_adc_feature adc_feature;
123
124         struct completion completion;
125 };
126
127 struct imx7d_adc_analogue_core_clk {
128         u32 pre_div;
129         u32 reg_config;
130 };
131
132 #define IMX7D_ADC_ANALOGUE_CLK_CONFIG(_pre_div, _reg_conf) {    \
133         .pre_div = (_pre_div),                                  \
134         .reg_config = (_reg_conf),                              \
135 }
136
137 static const struct imx7d_adc_analogue_core_clk imx7d_adc_analogue_clk[] = {
138         IMX7D_ADC_ANALOGUE_CLK_CONFIG(4, IMX7D_REG_ADC_TIMER_UNIT_PRE_DIV_4),
139         IMX7D_ADC_ANALOGUE_CLK_CONFIG(8, IMX7D_REG_ADC_TIMER_UNIT_PRE_DIV_8),
140         IMX7D_ADC_ANALOGUE_CLK_CONFIG(16, IMX7D_REG_ADC_TIMER_UNIT_PRE_DIV_16),
141         IMX7D_ADC_ANALOGUE_CLK_CONFIG(32, IMX7D_REG_ADC_TIMER_UNIT_PRE_DIV_32),
142         IMX7D_ADC_ANALOGUE_CLK_CONFIG(64, IMX7D_REG_ADC_TIMER_UNIT_PRE_DIV_64),
143         IMX7D_ADC_ANALOGUE_CLK_CONFIG(128, IMX7D_REG_ADC_TIMER_UNIT_PRE_DIV_128),
144 };
145
146 #define IMX7D_ADC_CHAN(_idx) {                                  \
147         .type = IIO_VOLTAGE,                                    \
148         .indexed = 1,                                           \
149         .channel = (_idx),                                      \
150         .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),           \
151         .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) |  \
152                                 BIT(IIO_CHAN_INFO_SAMP_FREQ),   \
153 }
154
155 static const struct iio_chan_spec imx7d_adc_iio_channels[] = {
156         IMX7D_ADC_CHAN(0),
157         IMX7D_ADC_CHAN(1),
158         IMX7D_ADC_CHAN(2),
159         IMX7D_ADC_CHAN(3),
160         IMX7D_ADC_CHAN(4),
161         IMX7D_ADC_CHAN(5),
162         IMX7D_ADC_CHAN(6),
163         IMX7D_ADC_CHAN(7),
164         IMX7D_ADC_CHAN(8),
165         IMX7D_ADC_CHAN(9),
166         IMX7D_ADC_CHAN(10),
167         IMX7D_ADC_CHAN(11),
168         IMX7D_ADC_CHAN(12),
169         IMX7D_ADC_CHAN(13),
170         IMX7D_ADC_CHAN(14),
171         IMX7D_ADC_CHAN(15),
172 };
173
174 static const u32 imx7d_adc_average_num[] = {
175         IMX7D_REG_ADC_CH_CFG2_AVG_NUM_4,
176         IMX7D_REG_ADC_CH_CFG2_AVG_NUM_8,
177         IMX7D_REG_ADC_CH_CFG2_AVG_NUM_16,
178         IMX7D_REG_ADC_CH_CFG2_AVG_NUM_32,
179 };
180
181 static void imx7d_adc_feature_config(struct imx7d_adc *info)
182 {
183         info->adc_feature.clk_pre_div = IMX7D_ADC_ANALOG_CLK_PRE_DIV_4;
184         info->adc_feature.avg_num = IMX7D_ADC_AVERAGE_NUM_32;
185         info->adc_feature.core_time_unit = 1;
186         info->adc_feature.average_en = true;
187 }
188
189 static void imx7d_adc_sample_rate_set(struct imx7d_adc *info)
190 {
191         struct imx7d_adc_feature *adc_feature = &info->adc_feature;
192         struct imx7d_adc_analogue_core_clk adc_analogure_clk;
193         u32 i;
194         u32 tmp_cfg1;
195         u32 sample_rate = 0;
196
197         /*
198          * Before sample set, disable channel A,B,C,D. Here we
199          * clear the bit 31 of register REG_ADC_CH_A\B\C\D_CFG1.
200          */
201         for (i = 0; i < 4; i++) {
202                 tmp_cfg1 =
203                         readl(info->regs + i * IMX7D_EACH_CHANNEL_REG_OFFSET);
204                 tmp_cfg1 &= ~IMX7D_REG_ADC_CH_CFG1_CHANNEL_EN;
205                 writel(tmp_cfg1,
206                        info->regs + i * IMX7D_EACH_CHANNEL_REG_OFFSET);
207         }
208
209         adc_analogure_clk = imx7d_adc_analogue_clk[adc_feature->clk_pre_div];
210         sample_rate |= adc_analogure_clk.reg_config;
211         info->pre_div_num = adc_analogure_clk.pre_div;
212
213         sample_rate |= adc_feature->core_time_unit;
214         writel(sample_rate, info->regs + IMX7D_REG_ADC_TIMER_UNIT);
215 }
216
217 static void imx7d_adc_hw_init(struct imx7d_adc *info)
218 {
219         u32 cfg;
220
221         /* power up and enable adc analogue core */
222         cfg = readl(info->regs + IMX7D_REG_ADC_ADC_CFG);
223         cfg &= ~(IMX7D_REG_ADC_ADC_CFG_ADC_CLK_DOWN |
224                  IMX7D_REG_ADC_ADC_CFG_ADC_POWER_DOWN);
225         cfg |= IMX7D_REG_ADC_ADC_CFG_ADC_EN;
226         writel(cfg, info->regs + IMX7D_REG_ADC_ADC_CFG);
227
228         /* enable channel A,B,C,D interrupt */
229         writel(IMX7D_REG_ADC_INT_CHANNEL_INT_EN,
230                info->regs + IMX7D_REG_ADC_INT_SIG_EN);
231         writel(IMX7D_REG_ADC_INT_CHANNEL_INT_EN,
232                info->regs + IMX7D_REG_ADC_INT_EN);
233
234         imx7d_adc_sample_rate_set(info);
235 }
236
237 static void imx7d_adc_channel_set(struct imx7d_adc *info)
238 {
239         u32 cfg1 = 0;
240         u32 cfg2;
241         u32 channel;
242
243         channel = info->channel;
244
245         /* the channel choose single conversion, and enable average mode */
246         cfg1 |= (IMX7D_REG_ADC_CH_CFG1_CHANNEL_EN |
247                  IMX7D_REG_ADC_CH_CFG1_CHANNEL_SINGLE);
248         if (info->adc_feature.average_en)
249                 cfg1 |= IMX7D_REG_ADC_CH_CFG1_CHANNEL_AVG_EN;
250
251         /*
252          * physical channel 0 chose logical channel A
253          * physical channel 1 chose logical channel B
254          * physical channel 2 chose logical channel C
255          * physical channel 3 chose logical channel D
256          */
257         cfg1 |= IMX7D_REG_ADC_CH_CFG1_CHANNEL_SEL(channel);
258
259         /*
260          * read register REG_ADC_CH_A\B\C\D_CFG2, according to the
261          * channel chosen
262          */
263         cfg2 = readl(info->regs + IMX7D_EACH_CHANNEL_REG_OFFSET * channel +
264                      IMX7D_REG_ADC_CHANNEL_CFG2_BASE);
265
266         cfg2 |= imx7d_adc_average_num[info->adc_feature.avg_num];
267
268         /*
269          * write the register REG_ADC_CH_A\B\C\D_CFG2, according to
270          * the channel chosen
271          */
272         writel(cfg2, info->regs + IMX7D_EACH_CHANNEL_REG_OFFSET * channel +
273                IMX7D_REG_ADC_CHANNEL_CFG2_BASE);
274         writel(cfg1, info->regs + IMX7D_EACH_CHANNEL_REG_OFFSET * channel);
275 }
276
277 static u32 imx7d_adc_get_sample_rate(struct imx7d_adc *info)
278 {
279         /* input clock is always 24MHz */
280         u32 input_clk = 24000000;
281         u32 analogue_core_clk;
282         u32 core_time_unit = info->adc_feature.core_time_unit;
283         u32 tmp;
284
285         analogue_core_clk = input_clk / info->pre_div_num;
286         tmp = (core_time_unit + 1) * 6;
287
288         return analogue_core_clk / tmp;
289 }
290
291 static int imx7d_adc_read_raw(struct iio_dev *indio_dev,
292                         struct iio_chan_spec const *chan,
293                         int *val,
294                         int *val2,
295                         long mask)
296 {
297         struct imx7d_adc *info = iio_priv(indio_dev);
298
299         u32 channel;
300         long ret;
301
302         switch (mask) {
303         case IIO_CHAN_INFO_RAW:
304                 mutex_lock(&indio_dev->mlock);
305                 reinit_completion(&info->completion);
306
307                 channel = chan->channel & 0x03;
308                 info->channel = channel;
309                 imx7d_adc_channel_set(info);
310
311                 ret = wait_for_completion_interruptible_timeout
312                                 (&info->completion, IMX7D_ADC_TIMEOUT);
313                 if (ret == 0) {
314                         mutex_unlock(&indio_dev->mlock);
315                         return -ETIMEDOUT;
316                 }
317                 if (ret < 0) {
318                         mutex_unlock(&indio_dev->mlock);
319                         return ret;
320                 }
321
322                 *val = info->value;
323                 mutex_unlock(&indio_dev->mlock);
324                 return IIO_VAL_INT;
325
326         case IIO_CHAN_INFO_SCALE:
327                 info->vref_uv = regulator_get_voltage(info->vref);
328                 *val = info->vref_uv / 1000;
329                 *val2 = 12;
330                 return IIO_VAL_FRACTIONAL_LOG2;
331
332         case IIO_CHAN_INFO_SAMP_FREQ:
333                 *val = imx7d_adc_get_sample_rate(info);
334                 return IIO_VAL_INT;
335
336         default:
337                 return -EINVAL;
338         }
339 }
340
341 static int imx7d_adc_read_data(struct imx7d_adc *info)
342 {
343         u32 channel;
344         u32 value;
345
346         channel = info->channel & 0x03;
347
348         /*
349          * channel A and B conversion result share one register,
350          * bit[27~16] is the channel B conversion result,
351          * bit[11~0] is the channel A conversion result.
352          * channel C and D is the same.
353          */
354         if (channel < 2)
355                 value = readl(info->regs + IMX7D_REG_ADC_CHA_B_CNV_RSLT);
356         else
357                 value = readl(info->regs + IMX7D_REG_ADC_CHC_D_CNV_RSLT);
358         if (channel & 0x1)      /* channel B or D */
359                 value = (value >> 16) & 0xFFF;
360         else                    /* channel A or C */
361                 value &= 0xFFF;
362
363         return value;
364 }
365
366 static irqreturn_t imx7d_adc_isr(int irq, void *dev_id)
367 {
368         struct imx7d_adc *info = dev_id;
369         int status;
370
371         status = readl(info->regs + IMX7D_REG_ADC_INT_STATUS);
372         if (status & IMX7D_REG_ADC_INT_STATUS_CHANNEL_INT_STATUS) {
373                 info->value = imx7d_adc_read_data(info);
374                 complete(&info->completion);
375
376                 /*
377                  * The register IMX7D_REG_ADC_INT_STATUS can't clear
378                  * itself after read operation, need software to write
379                  * 0 to the related bit. Here we clear the channel A/B/C/D
380                  * conversion finished flag.
381                  */
382                 status &= ~IMX7D_REG_ADC_INT_STATUS_CHANNEL_INT_STATUS;
383                 writel(status, info->regs + IMX7D_REG_ADC_INT_STATUS);
384         }
385
386         /*
387          * If the channel A/B/C/D conversion timeout, report it and clear these
388          * timeout flags.
389          */
390         if (status & IMX7D_REG_ADC_INT_STATUS_CHANNEL_CONV_TIME_OUT) {
391                 pr_err("%s: ADC got conversion time out interrupt: 0x%08x\n",
392                         dev_name(info->dev), status);
393                 status &= ~IMX7D_REG_ADC_INT_STATUS_CHANNEL_CONV_TIME_OUT;
394                 writel(status, info->regs + IMX7D_REG_ADC_INT_STATUS);
395         }
396
397         return IRQ_HANDLED;
398 }
399
400 static int imx7d_adc_reg_access(struct iio_dev *indio_dev,
401                         unsigned reg, unsigned writeval,
402                         unsigned *readval)
403 {
404         struct imx7d_adc *info = iio_priv(indio_dev);
405
406         if (!readval || reg % 4 || reg > IMX7D_REG_ADC_ADC_CFG)
407                 return -EINVAL;
408
409         *readval = readl(info->regs + reg);
410
411         return 0;
412 }
413
414 static const struct iio_info imx7d_adc_iio_info = {
415         .read_raw = &imx7d_adc_read_raw,
416         .debugfs_reg_access = &imx7d_adc_reg_access,
417 };
418
419 static const struct of_device_id imx7d_adc_match[] = {
420         { .compatible = "fsl,imx7d-adc", },
421         { /* sentinel */ }
422 };
423 MODULE_DEVICE_TABLE(of, imx7d_adc_match);
424
425 static void imx7d_adc_power_down(struct imx7d_adc *info)
426 {
427         u32 adc_cfg;
428
429         adc_cfg = readl(info->regs + IMX7D_REG_ADC_ADC_CFG);
430         adc_cfg |= IMX7D_REG_ADC_ADC_CFG_ADC_CLK_DOWN |
431                    IMX7D_REG_ADC_ADC_CFG_ADC_POWER_DOWN;
432         adc_cfg &= ~IMX7D_REG_ADC_ADC_CFG_ADC_EN;
433         writel(adc_cfg, info->regs + IMX7D_REG_ADC_ADC_CFG);
434 }
435
436 static int imx7d_adc_probe(struct platform_device *pdev)
437 {
438         struct imx7d_adc *info;
439         struct iio_dev *indio_dev;
440         struct resource *mem;
441         int irq;
442         int ret;
443
444         indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*info));
445         if (!indio_dev) {
446                 dev_err(&pdev->dev, "Failed allocating iio device\n");
447                 return -ENOMEM;
448         }
449
450         info = iio_priv(indio_dev);
451         info->dev = &pdev->dev;
452
453         mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
454         info->regs = devm_ioremap_resource(&pdev->dev, mem);
455         if (IS_ERR(info->regs)) {
456                 ret = PTR_ERR(info->regs);
457                 dev_err(&pdev->dev,
458                         "Failed to remap adc memory, err = %d\n", ret);
459                 return ret;
460         }
461
462         irq = platform_get_irq(pdev, 0);
463         if (irq < 0) {
464                 dev_err(&pdev->dev, "No irq resource?\n");
465                 return irq;
466         }
467
468         info->clk = devm_clk_get(&pdev->dev, "adc");
469         if (IS_ERR(info->clk)) {
470                 ret = PTR_ERR(info->clk);
471                 dev_err(&pdev->dev, "Failed getting clock, err = %d\n", ret);
472                 return ret;
473         }
474
475         info->vref = devm_regulator_get(&pdev->dev, "vref");
476         if (IS_ERR(info->vref)) {
477                 ret = PTR_ERR(info->vref);
478                 dev_err(&pdev->dev,
479                         "Failed getting reference voltage, err = %d\n", ret);
480                 return ret;
481         }
482
483         ret = regulator_enable(info->vref);
484         if (ret) {
485                 dev_err(&pdev->dev,
486                         "Can't enable adc reference top voltage, err = %d\n",
487                         ret);
488                 return ret;
489         }
490
491         platform_set_drvdata(pdev, indio_dev);
492
493         init_completion(&info->completion);
494
495         indio_dev->name = dev_name(&pdev->dev);
496         indio_dev->dev.parent = &pdev->dev;
497         indio_dev->info = &imx7d_adc_iio_info;
498         indio_dev->modes = INDIO_DIRECT_MODE;
499         indio_dev->channels = imx7d_adc_iio_channels;
500         indio_dev->num_channels = ARRAY_SIZE(imx7d_adc_iio_channels);
501
502         ret = clk_prepare_enable(info->clk);
503         if (ret) {
504                 dev_err(&pdev->dev,
505                         "Could not prepare or enable the clock.\n");
506                 goto error_adc_clk_enable;
507         }
508
509         ret = devm_request_irq(info->dev, irq,
510                                 imx7d_adc_isr, 0,
511                                 dev_name(&pdev->dev), info);
512         if (ret < 0) {
513                 dev_err(&pdev->dev, "Failed requesting irq, irq = %d\n", irq);
514                 goto error_iio_device_register;
515         }
516
517         imx7d_adc_feature_config(info);
518         imx7d_adc_hw_init(info);
519
520         ret = iio_device_register(indio_dev);
521         if (ret) {
522                 imx7d_adc_power_down(info);
523                 dev_err(&pdev->dev, "Couldn't register the device.\n");
524                 goto error_iio_device_register;
525         }
526
527         return 0;
528
529 error_iio_device_register:
530         clk_disable_unprepare(info->clk);
531 error_adc_clk_enable:
532         regulator_disable(info->vref);
533
534         return ret;
535 }
536
537 static int imx7d_adc_remove(struct platform_device *pdev)
538 {
539         struct iio_dev *indio_dev = platform_get_drvdata(pdev);
540         struct imx7d_adc *info = iio_priv(indio_dev);
541
542         iio_device_unregister(indio_dev);
543
544         imx7d_adc_power_down(info);
545
546         clk_disable_unprepare(info->clk);
547         regulator_disable(info->vref);
548
549         return 0;
550 }
551
552 static int __maybe_unused imx7d_adc_suspend(struct device *dev)
553 {
554         struct iio_dev *indio_dev = dev_get_drvdata(dev);
555         struct imx7d_adc *info = iio_priv(indio_dev);
556
557         imx7d_adc_power_down(info);
558
559         clk_disable_unprepare(info->clk);
560         regulator_disable(info->vref);
561
562         return 0;
563 }
564
565 static int __maybe_unused imx7d_adc_resume(struct device *dev)
566 {
567         struct iio_dev *indio_dev = dev_get_drvdata(dev);
568         struct imx7d_adc *info = iio_priv(indio_dev);
569         int ret;
570
571         ret = regulator_enable(info->vref);
572         if (ret) {
573                 dev_err(info->dev,
574                         "Can't enable adc reference top voltage, err = %d\n",
575                         ret);
576                 return ret;
577         }
578
579         ret = clk_prepare_enable(info->clk);
580         if (ret) {
581                 dev_err(info->dev,
582                         "Could not prepare or enable clock.\n");
583                 regulator_disable(info->vref);
584                 return ret;
585         }
586
587         imx7d_adc_hw_init(info);
588
589         return 0;
590 }
591
592 static SIMPLE_DEV_PM_OPS(imx7d_adc_pm_ops, imx7d_adc_suspend, imx7d_adc_resume);
593
594 static struct platform_driver imx7d_adc_driver = {
595         .probe          = imx7d_adc_probe,
596         .remove         = imx7d_adc_remove,
597         .driver         = {
598                 .name   = "imx7d_adc",
599                 .of_match_table = imx7d_adc_match,
600                 .pm     = &imx7d_adc_pm_ops,
601         },
602 };
603
604 module_platform_driver(imx7d_adc_driver);
605
606 MODULE_AUTHOR("Haibo Chen <haibo.chen@freescale.com>");
607 MODULE_DESCRIPTION("Freescale IMX7D ADC driver");
608 MODULE_LICENSE("GPL v2");