1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2012-2014, The Linux Foundation. All rights reserved.
6 #include <linux/bitops.h>
7 #include <linux/completion.h>
8 #include <linux/delay.h>
10 #include <linux/iio/iio.h>
11 #include <linux/interrupt.h>
12 #include <linux/kernel.h>
13 #include <linux/mutex.h>
14 #include <linux/module.h>
16 #include <linux/of_device.h>
17 #include <linux/platform_device.h>
18 #include <linux/regmap.h>
19 #include <linux/slab.h>
21 /* IADC register and bit definition */
22 #define IADC_REVISION2 0x1
23 #define IADC_REVISION2_SUPPORTED_IADC 1
25 #define IADC_PERPH_TYPE 0x4
26 #define IADC_PERPH_TYPE_ADC 8
28 #define IADC_PERPH_SUBTYPE 0x5
29 #define IADC_PERPH_SUBTYPE_IADC 3
31 #define IADC_STATUS1 0x8
32 #define IADC_STATUS1_OP_MODE 4
33 #define IADC_STATUS1_REQ_STS BIT(1)
34 #define IADC_STATUS1_EOC BIT(0)
35 #define IADC_STATUS1_REQ_STS_EOC_MASK 0x3
37 #define IADC_MODE_CTL 0x40
38 #define IADC_OP_MODE_SHIFT 3
39 #define IADC_OP_MODE_NORMAL 0
40 #define IADC_TRIM_EN BIT(0)
42 #define IADC_EN_CTL1 0x46
43 #define IADC_EN_CTL1_SET BIT(7)
45 #define IADC_CH_SEL_CTL 0x48
47 #define IADC_DIG_PARAM 0x50
48 #define IADC_DIG_DEC_RATIO_SEL_SHIFT 2
50 #define IADC_HW_SETTLE_DELAY 0x51
52 #define IADC_CONV_REQ 0x52
53 #define IADC_CONV_REQ_SET BIT(7)
55 #define IADC_FAST_AVG_CTL 0x5a
56 #define IADC_FAST_AVG_EN 0x5b
57 #define IADC_FAST_AVG_EN_SET BIT(7)
59 #define IADC_PERH_RESET_CTL3 0xda
60 #define IADC_FOLLOW_WARM_RB BIT(2)
62 #define IADC_DATA 0x60 /* 16 bits */
64 #define IADC_SEC_ACCESS 0xd0
65 #define IADC_SEC_ACCESS_DATA 0xa5
67 #define IADC_NOMINAL_RSENSE 0xf4
68 #define IADC_NOMINAL_RSENSE_SIGN_MASK BIT(7)
70 #define IADC_REF_GAIN_MICRO_VOLTS 17857
72 #define IADC_INT_RSENSE_DEVIATION 15625 /* nano Ohms per bit */
74 #define IADC_INT_RSENSE_IDEAL_VALUE 10000 /* micro Ohms */
75 #define IADC_INT_RSENSE_DEFAULT_VALUE 7800 /* micro Ohms */
76 #define IADC_INT_RSENSE_DEFAULT_GF 9000 /* micro Ohms */
77 #define IADC_INT_RSENSE_DEFAULT_SMIC 9700 /* micro Ohms */
79 #define IADC_CONV_TIME_MIN_US 2000
80 #define IADC_CONV_TIME_MAX_US 2100
82 #define IADC_DEF_PRESCALING 0 /* 1:1 */
83 #define IADC_DEF_DECIMATION 0 /* 512 */
84 #define IADC_DEF_HW_SETTLE_TIME 0 /* 0 us */
85 #define IADC_DEF_AVG_SAMPLES 0 /* 1 sample */
87 /* IADC channel list */
88 #define IADC_INT_RSENSE 0
89 #define IADC_EXT_RSENSE 1
90 #define IADC_GAIN_17P857MV 3
91 #define IADC_EXT_OFFSET_CSP_CSN 5
92 #define IADC_INT_OFFSET_CSP2_CSN2 6
95 * struct iadc_chip - IADC Current ADC device structure.
96 * @regmap: regmap for register read/write.
97 * @dev: This device pointer.
98 * @base: base offset for the ADC peripheral.
99 * @rsense: Values of the internal and external sense resister in micro Ohms.
100 * @poll_eoc: Poll for end of conversion instead of waiting for IRQ.
101 * @offset: Raw offset values for the internal and external channels.
102 * @gain: Raw gain of the channels.
103 * @lock: ADC lock for access to the peripheral.
104 * @complete: ADC notification after end of conversion interrupt is received.
107 struct regmap
*regmap
;
115 struct completion complete
;
118 static int iadc_read(struct iadc_chip
*iadc
, u16 offset
, u8
*data
)
123 ret
= regmap_read(iadc
->regmap
, iadc
->base
+ offset
, &val
);
131 static int iadc_write(struct iadc_chip
*iadc
, u16 offset
, u8 data
)
133 return regmap_write(iadc
->regmap
, iadc
->base
+ offset
, data
);
136 static int iadc_reset(struct iadc_chip
*iadc
)
141 ret
= iadc_write(iadc
, IADC_SEC_ACCESS
, IADC_SEC_ACCESS_DATA
);
145 ret
= iadc_read(iadc
, IADC_PERH_RESET_CTL3
, &data
);
149 ret
= iadc_write(iadc
, IADC_SEC_ACCESS
, IADC_SEC_ACCESS_DATA
);
153 data
|= IADC_FOLLOW_WARM_RB
;
155 return iadc_write(iadc
, IADC_PERH_RESET_CTL3
, data
);
158 static int iadc_set_state(struct iadc_chip
*iadc
, bool state
)
160 return iadc_write(iadc
, IADC_EN_CTL1
, state
? IADC_EN_CTL1_SET
: 0);
163 static void iadc_status_show(struct iadc_chip
*iadc
)
165 u8 mode
, sta1
, chan
, dig
, en
, req
;
168 ret
= iadc_read(iadc
, IADC_MODE_CTL
, &mode
);
172 ret
= iadc_read(iadc
, IADC_DIG_PARAM
, &dig
);
176 ret
= iadc_read(iadc
, IADC_CH_SEL_CTL
, &chan
);
180 ret
= iadc_read(iadc
, IADC_CONV_REQ
, &req
);
184 ret
= iadc_read(iadc
, IADC_STATUS1
, &sta1
);
188 ret
= iadc_read(iadc
, IADC_EN_CTL1
, &en
);
193 "mode:%02x en:%02x chan:%02x dig:%02x req:%02x sta1:%02x\n",
194 mode
, en
, chan
, dig
, req
, sta1
);
197 static int iadc_configure(struct iadc_chip
*iadc
, int channel
)
203 mode
= (IADC_OP_MODE_NORMAL
<< IADC_OP_MODE_SHIFT
) | IADC_TRIM_EN
;
204 ret
= iadc_write(iadc
, IADC_MODE_CTL
, mode
);
208 /* Channel selection */
209 ret
= iadc_write(iadc
, IADC_CH_SEL_CTL
, channel
);
213 /* Digital parameter setup */
214 decim
= IADC_DEF_DECIMATION
<< IADC_DIG_DEC_RATIO_SEL_SHIFT
;
215 ret
= iadc_write(iadc
, IADC_DIG_PARAM
, decim
);
219 /* HW settle time delay */
220 ret
= iadc_write(iadc
, IADC_HW_SETTLE_DELAY
, IADC_DEF_HW_SETTLE_TIME
);
224 ret
= iadc_write(iadc
, IADC_FAST_AVG_CTL
, IADC_DEF_AVG_SAMPLES
);
228 if (IADC_DEF_AVG_SAMPLES
)
229 ret
= iadc_write(iadc
, IADC_FAST_AVG_EN
, IADC_FAST_AVG_EN_SET
);
231 ret
= iadc_write(iadc
, IADC_FAST_AVG_EN
, 0);
237 reinit_completion(&iadc
->complete
);
239 ret
= iadc_set_state(iadc
, true);
243 /* Request conversion */
244 return iadc_write(iadc
, IADC_CONV_REQ
, IADC_CONV_REQ_SET
);
247 static int iadc_poll_wait_eoc(struct iadc_chip
*iadc
, unsigned int interval_us
)
249 unsigned int count
, retry
;
253 retry
= interval_us
/ IADC_CONV_TIME_MIN_US
;
255 for (count
= 0; count
< retry
; count
++) {
256 ret
= iadc_read(iadc
, IADC_STATUS1
, &sta1
);
260 sta1
&= IADC_STATUS1_REQ_STS_EOC_MASK
;
261 if (sta1
== IADC_STATUS1_EOC
)
264 usleep_range(IADC_CONV_TIME_MIN_US
, IADC_CONV_TIME_MAX_US
);
267 iadc_status_show(iadc
);
272 static int iadc_read_result(struct iadc_chip
*iadc
, u16
*data
)
274 return regmap_bulk_read(iadc
->regmap
, iadc
->base
+ IADC_DATA
, data
, 2);
277 static int iadc_do_conversion(struct iadc_chip
*iadc
, int chan
, u16
*data
)
282 ret
= iadc_configure(iadc
, chan
);
286 wait
= BIT(IADC_DEF_AVG_SAMPLES
) * IADC_CONV_TIME_MIN_US
* 2;
288 if (iadc
->poll_eoc
) {
289 ret
= iadc_poll_wait_eoc(iadc
, wait
);
291 ret
= wait_for_completion_timeout(&iadc
->complete
,
292 usecs_to_jiffies(wait
));
296 /* double check conversion status */
297 ret
= iadc_poll_wait_eoc(iadc
, IADC_CONV_TIME_MIN_US
);
301 ret
= iadc_read_result(iadc
, data
);
303 iadc_set_state(iadc
, false);
305 dev_err(iadc
->dev
, "conversion failed\n");
310 static int iadc_read_raw(struct iio_dev
*indio_dev
,
311 struct iio_chan_spec
const *chan
,
312 int *val
, int *val2
, long mask
)
314 struct iadc_chip
*iadc
= iio_priv(indio_dev
);
315 s32 isense_ua
, vsense_uv
;
316 u16 adc_raw
, vsense_raw
;
320 case IIO_CHAN_INFO_RAW
:
321 mutex_lock(&iadc
->lock
);
322 ret
= iadc_do_conversion(iadc
, chan
->channel
, &adc_raw
);
323 mutex_unlock(&iadc
->lock
);
327 vsense_raw
= adc_raw
- iadc
->offset
[chan
->channel
];
329 vsense_uv
= vsense_raw
* IADC_REF_GAIN_MICRO_VOLTS
;
330 vsense_uv
/= (s32
)iadc
->gain
- iadc
->offset
[chan
->channel
];
332 isense_ua
= vsense_uv
/ iadc
->rsense
[chan
->channel
];
334 dev_dbg(iadc
->dev
, "off %d gain %d adc %d %duV I %duA\n",
335 iadc
->offset
[chan
->channel
], iadc
->gain
,
336 adc_raw
, vsense_uv
, isense_ua
);
340 case IIO_CHAN_INFO_SCALE
:
343 return IIO_VAL_INT_PLUS_MICRO
;
349 static const struct iio_info iadc_info
= {
350 .read_raw
= iadc_read_raw
,
353 static irqreturn_t
iadc_isr(int irq
, void *dev_id
)
355 struct iadc_chip
*iadc
= dev_id
;
357 complete(&iadc
->complete
);
362 static int iadc_update_offset(struct iadc_chip
*iadc
)
366 ret
= iadc_do_conversion(iadc
, IADC_GAIN_17P857MV
, &iadc
->gain
);
370 ret
= iadc_do_conversion(iadc
, IADC_INT_OFFSET_CSP2_CSN2
,
371 &iadc
->offset
[IADC_INT_RSENSE
]);
375 if (iadc
->gain
== iadc
->offset
[IADC_INT_RSENSE
]) {
376 dev_err(iadc
->dev
, "error: internal offset == gain %d\n",
381 ret
= iadc_do_conversion(iadc
, IADC_EXT_OFFSET_CSP_CSN
,
382 &iadc
->offset
[IADC_EXT_RSENSE
]);
386 if (iadc
->gain
== iadc
->offset
[IADC_EXT_RSENSE
]) {
387 dev_err(iadc
->dev
, "error: external offset == gain %d\n",
395 static int iadc_version_check(struct iadc_chip
*iadc
)
400 ret
= iadc_read(iadc
, IADC_PERPH_TYPE
, &val
);
404 if (val
< IADC_PERPH_TYPE_ADC
) {
405 dev_err(iadc
->dev
, "%d is not ADC\n", val
);
409 ret
= iadc_read(iadc
, IADC_PERPH_SUBTYPE
, &val
);
413 if (val
< IADC_PERPH_SUBTYPE_IADC
) {
414 dev_err(iadc
->dev
, "%d is not IADC\n", val
);
418 ret
= iadc_read(iadc
, IADC_REVISION2
, &val
);
422 if (val
< IADC_REVISION2_SUPPORTED_IADC
) {
423 dev_err(iadc
->dev
, "revision %d not supported\n", val
);
430 static int iadc_rsense_read(struct iadc_chip
*iadc
, struct device_node
*node
)
432 int ret
, sign
, int_sense
;
435 ret
= of_property_read_u32(node
, "qcom,external-resistor-micro-ohms",
436 &iadc
->rsense
[IADC_EXT_RSENSE
]);
438 iadc
->rsense
[IADC_EXT_RSENSE
] = IADC_INT_RSENSE_IDEAL_VALUE
;
440 if (!iadc
->rsense
[IADC_EXT_RSENSE
]) {
441 dev_err(iadc
->dev
, "external resistor can't be zero Ohms");
445 ret
= iadc_read(iadc
, IADC_NOMINAL_RSENSE
, &deviation
);
450 * Deviation value stored is an offset from 10 mili Ohms, bit 7 is
451 * the sign, the remaining bits have an LSB of 15625 nano Ohms.
453 sign
= (deviation
& IADC_NOMINAL_RSENSE_SIGN_MASK
) ? -1 : 1;
455 deviation
&= ~IADC_NOMINAL_RSENSE_SIGN_MASK
;
457 /* Scale it to nono Ohms */
458 int_sense
= IADC_INT_RSENSE_IDEAL_VALUE
* 1000;
459 int_sense
+= sign
* deviation
* IADC_INT_RSENSE_DEVIATION
;
460 int_sense
/= 1000; /* micro Ohms */
462 iadc
->rsense
[IADC_INT_RSENSE
] = int_sense
;
466 static const struct iio_chan_spec iadc_channels
[] = {
469 .datasheet_name
= "INTERNAL_RSENSE",
471 .info_mask_separate
= BIT(IIO_CHAN_INFO_RAW
) |
472 BIT(IIO_CHAN_INFO_SCALE
),
477 .datasheet_name
= "EXTERNAL_RSENSE",
479 .info_mask_separate
= BIT(IIO_CHAN_INFO_RAW
) |
480 BIT(IIO_CHAN_INFO_SCALE
),
485 static int iadc_probe(struct platform_device
*pdev
)
487 struct device_node
*node
= pdev
->dev
.of_node
;
488 struct device
*dev
= &pdev
->dev
;
489 struct iio_dev
*indio_dev
;
490 struct iadc_chip
*iadc
;
494 indio_dev
= devm_iio_device_alloc(dev
, sizeof(*iadc
));
498 iadc
= iio_priv(indio_dev
);
501 iadc
->regmap
= dev_get_regmap(dev
->parent
, NULL
);
505 init_completion(&iadc
->complete
);
506 mutex_init(&iadc
->lock
);
508 ret
= of_property_read_u32(node
, "reg", &res
);
514 ret
= iadc_version_check(iadc
);
518 ret
= iadc_rsense_read(iadc
, node
);
522 dev_dbg(iadc
->dev
, "sense resistors %d and %d micro Ohm\n",
523 iadc
->rsense
[IADC_INT_RSENSE
],
524 iadc
->rsense
[IADC_EXT_RSENSE
]);
526 irq_eoc
= platform_get_irq(pdev
, 0);
527 if (irq_eoc
== -EPROBE_DEFER
)
531 iadc
->poll_eoc
= true;
533 ret
= iadc_reset(iadc
);
535 dev_err(dev
, "reset failed\n");
539 if (!iadc
->poll_eoc
) {
540 ret
= devm_request_irq(dev
, irq_eoc
, iadc_isr
, 0,
543 enable_irq_wake(irq_eoc
);
547 device_init_wakeup(iadc
->dev
, 1);
550 ret
= iadc_update_offset(iadc
);
552 dev_err(dev
, "failed offset calibration\n");
556 indio_dev
->name
= pdev
->name
;
557 indio_dev
->modes
= INDIO_DIRECT_MODE
;
558 indio_dev
->info
= &iadc_info
;
559 indio_dev
->channels
= iadc_channels
;
560 indio_dev
->num_channels
= ARRAY_SIZE(iadc_channels
);
562 return devm_iio_device_register(dev
, indio_dev
);
565 static const struct of_device_id iadc_match_table
[] = {
566 { .compatible
= "qcom,spmi-iadc" },
570 MODULE_DEVICE_TABLE(of
, iadc_match_table
);
572 static struct platform_driver iadc_driver
= {
574 .name
= "qcom-spmi-iadc",
575 .of_match_table
= iadc_match_table
,
580 module_platform_driver(iadc_driver
);
582 MODULE_ALIAS("platform:qcom-spmi-iadc");
583 MODULE_DESCRIPTION("Qualcomm SPMI PMIC current ADC driver");
584 MODULE_LICENSE("GPL v2");
585 MODULE_AUTHOR("Ivan T. Ivanov <iivanov@mm-sol.com>");