blob: a597ef9e0c280df55b98a802dc909bef1d8c8a26 [file] [log] [blame]
Siddartha Mohanadoss37d9c8a2017-01-23 19:21:58 -08001/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13#define pr_fmt(fmt) "%s: " fmt, __func__
14
15#include <linux/kernel.h>
16#include <linux/regmap.h>
17#include <linux/of.h>
18#include <linux/err.h>
19#include <linux/init.h>
20#include <linux/slab.h>
21#include <linux/delay.h>
22#include <linux/mutex.h>
23#include <linux/types.h>
24#include <linux/hwmon.h>
25#include <linux/module.h>
26#include <linux/debugfs.h>
27#include <linux/spmi.h>
28#include <linux/platform_device.h>
29#include <linux/of_irq.h>
30#ifdef CONFIG_WAKELOCK
31#include <linux/wakelock.h>
32#endif
33#include <linux/interrupt.h>
34#include <linux/completion.h>
35#include <linux/hwmon-sysfs.h>
36#include <linux/qpnp/qpnp-adc.h>
37#include <linux/platform_device.h>
38#ifdef CONFIG_WAKELOCK
39#include <linux/wakelock.h>
40#endif
41
42/* QPNP IADC register definition */
43#define QPNP_IADC_REVISION1 0x0
44#define QPNP_IADC_REVISION2 0x1
45#define QPNP_IADC_REVISION3 0x2
46#define QPNP_IADC_REVISION4 0x3
47#define QPNP_IADC_PERPH_TYPE 0x4
48#define QPNP_IADC_PERH_SUBTYPE 0x5
49
50#define QPNP_IADC_SUPPORTED_REVISION2 1
51
52#define QPNP_STATUS1 0x8
53#define QPNP_STATUS1_OP_MODE 4
54#define QPNP_STATUS1_MULTI_MEAS_EN BIT(3)
55#define QPNP_STATUS1_MEAS_INTERVAL_EN_STS BIT(2)
56#define QPNP_STATUS1_REQ_STS BIT(1)
57#define QPNP_STATUS1_EOC BIT(0)
58#define QPNP_STATUS1_REQ_STS_EOC_MASK 0x3
59#define QPNP_STATUS2 0x9
60#define QPNP_STATUS2_CONV_SEQ_STATE_SHIFT 4
61#define QPNP_STATUS2_FIFO_NOT_EMPTY_FLAG BIT(1)
62#define QPNP_STATUS2_CONV_SEQ_TIMEOUT_STS BIT(0)
63#define QPNP_CONV_TIMEOUT_ERR 2
64
65#define QPNP_IADC_MODE_CTL 0x40
66#define QPNP_OP_MODE_SHIFT 4
67#define QPNP_USE_BMS_DATA BIT(4)
68#define QPNP_VADC_SYNCH_EN BIT(2)
69#define QPNP_OFFSET_RMV_EN BIT(1)
70#define QPNP_ADC_TRIM_EN BIT(0)
71#define QPNP_IADC_EN_CTL1 0x46
72#define QPNP_IADC_ADC_EN BIT(7)
73#define QPNP_ADC_CH_SEL_CTL 0x48
74#define QPNP_ADC_DIG_PARAM 0x50
75#define QPNP_ADC_CLK_SEL_MASK 0x3
76#define QPNP_ADC_DEC_RATIO_SEL_MASK 0xc
77#define QPNP_ADC_DIG_DEC_RATIO_SEL_SHIFT 2
78
79#define QPNP_CONV_REQ 0x52
80#define QPNP_CONV_REQ_SET BIT(7)
81#define QPNP_CONV_SEQ_CTL 0x54
82#define QPNP_CONV_SEQ_HOLDOFF_SHIFT 4
83#define QPNP_CONV_SEQ_TRIG_CTL 0x55
84#define QPNP_FAST_AVG_CTL 0x5a
85
86#define QPNP_M0_LOW_THR_LSB 0x5c
87#define QPNP_M0_LOW_THR_MSB 0x5d
88#define QPNP_M0_HIGH_THR_LSB 0x5e
89#define QPNP_M0_HIGH_THR_MSB 0x5f
90#define QPNP_M1_LOW_THR_LSB 0x69
91#define QPNP_M1_LOW_THR_MSB 0x6a
92#define QPNP_M1_HIGH_THR_LSB 0x6b
93#define QPNP_M1_HIGH_THR_MSB 0x6c
94
95#define QPNP_DATA0 0x60
96#define QPNP_DATA1 0x61
97#define QPNP_CONV_TIMEOUT_ERR 2
98
99#define QPNP_IADC_SEC_ACCESS 0xD0
100#define QPNP_IADC_SEC_ACCESS_DATA 0xA5
101#define QPNP_IADC_MSB_OFFSET 0xF2
102#define QPNP_IADC_LSB_OFFSET 0xF3
103#define QPNP_IADC_NOMINAL_RSENSE 0xF4
104#define QPNP_IADC_ATE_GAIN_CALIB_OFFSET 0xF5
105#define QPNP_INT_TEST_VAL 0xE1
106
107#define QPNP_IADC_ADC_CH_SEL_CTL 0x48
108#define QPNP_IADC_ADC_CHX_SEL_SHIFT 3
109
110#define QPNP_IADC_ADC_DIG_PARAM 0x50
111#define QPNP_IADC_CLK_SEL_SHIFT 1
112#define QPNP_IADC_DEC_RATIO_SEL 3
113
114#define QPNP_IADC_CONV_REQUEST 0x52
115#define QPNP_IADC_CONV_REQ BIT(7)
116
117#define QPNP_IADC_DATA0 0x60
118#define QPNP_IADC_DATA1 0x61
119
120#define QPNP_ADC_CONV_TIME_MIN 2000
121#define QPNP_ADC_CONV_TIME_MAX 2100
122#define QPNP_ADC_ERR_COUNT 20
123
124#define QPNP_ADC_GAIN_NV 17857
125#define QPNP_OFFSET_CALIBRATION_SHORT_CADC_LEADS_IDEAL 0
126#define QPNP_IADC_INTERNAL_RSENSE_N_OHMS_FACTOR 10000000
127#define QPNP_IADC_NANO_VOLTS_FACTOR 1000000
128#define QPNP_IADC_CALIB_SECONDS 300000
129#define QPNP_IADC_RSENSE_LSB_N_OHMS_PER_BIT 15625
130#define QPNP_IADC_DIE_TEMP_CALIB_OFFSET 5000
131
132#define QPNP_RAW_CODE_16_BIT_MSB_MASK 0xff00
133#define QPNP_RAW_CODE_16_BIT_LSB_MASK 0xff
134#define QPNP_BIT_SHIFT_8 8
135#define QPNP_RSENSE_MSB_SIGN_CHECK 0x80
136#define QPNP_ADC_COMPLETION_TIMEOUT HZ
137#define SMBB_BAT_IF_TRIM_CNST_RDS_MASK 0x7
138#define SMBB_BAT_IF_TRIM_CNST_RDS_MASK_CONST_0 0
139#define SMBB_BAT_IF_TRIM_CNST_RDS_MASK_CONST_2 2
140#define QPNP_IADC1_USR_TRIM2_ADC_FULLSCALE1_CONST 127
141#define QPNP_IADC_RSENSE_DEFAULT_VALUE 7800000
142#define QPNP_IADC_RSENSE_DEFAULT_TYPEB_GF 9000000
143#define QPNP_IADC_RSENSE_DEFAULT_TYPEB_SMIC 9700000
144
145struct qpnp_iadc_comp {
146 bool ext_rsense;
147 u8 id;
148 u8 sys_gain;
149 u8 revision_dig_major;
150 u8 revision_ana_minor;
151};
152
153struct qpnp_iadc_chip {
154 struct device *dev;
155 struct qpnp_adc_drv *adc;
156 int32_t rsense;
157 bool external_rsense;
158 bool default_internal_rsense;
159 struct device *iadc_hwmon;
160 struct list_head list;
161 int64_t die_temp;
162 struct delayed_work iadc_work;
163 bool iadc_mode_sel;
164 struct qpnp_iadc_comp iadc_comp;
165 struct qpnp_vadc_chip *vadc_dev;
166 struct work_struct trigger_completion_work;
167 bool skip_auto_calibrations;
168 bool iadc_poll_eoc;
169 u16 batt_id_trim_cnst_rds;
170 int rds_trim_default_type;
171 int max_channels_available;
172 bool rds_trim_default_check;
173 int32_t rsense_workaround_value;
174 struct sensor_device_attribute sens_attr[0];
175};
176
177LIST_HEAD(qpnp_iadc_device_list);
178
179enum qpnp_iadc_rsense_rds_workaround {
180 QPNP_IADC_RDS_DEFAULT_TYPEA,
181 QPNP_IADC_RDS_DEFAULT_TYPEB,
182 QPNP_IADC_RDS_DEFAULT_TYPEC,
183};
184
185static int32_t qpnp_iadc_read_reg(struct qpnp_iadc_chip *iadc,
186 uint32_t reg, u8 *data)
187{
188 int rc;
189 uint val;
190
191 rc = regmap_read(iadc->adc->regmap, (iadc->adc->offset + reg), &val);
192 if (rc < 0) {
193 pr_err("qpnp iadc read reg %d failed with %d\n", reg, rc);
194 return rc;
195 }
196 *data = (u8)val;
197
198 return 0;
199}
200
201static int32_t qpnp_iadc_write_reg(struct qpnp_iadc_chip *iadc,
202 uint32_t reg, u8 data)
203{
204 int rc;
205 u8 *buf;
206
207 buf = &data;
208 rc = regmap_write(iadc->adc->regmap, (iadc->adc->offset + reg), *buf);
209 if (rc < 0) {
210 pr_err("qpnp iadc write reg %d failed with %d\n", reg, rc);
211 return rc;
212 }
213
214 return 0;
215}
216
217static int qpnp_iadc_is_valid(struct qpnp_iadc_chip *iadc)
218{
219 struct qpnp_iadc_chip *iadc_chip = NULL;
220
221 list_for_each_entry(iadc_chip, &qpnp_iadc_device_list, list)
222 if (iadc == iadc_chip)
223 return 0;
224
225 return -EINVAL;
226}
227
228static void qpnp_iadc_trigger_completion(struct work_struct *work)
229{
230 struct qpnp_iadc_chip *iadc = container_of(work,
231 struct qpnp_iadc_chip, trigger_completion_work);
232
233 if (qpnp_iadc_is_valid(iadc) < 0)
234 return;
235
236 complete(&iadc->adc->adc_rslt_completion);
237}
238
239static irqreturn_t qpnp_iadc_isr(int irq, void *dev_id)
240{
241 struct qpnp_iadc_chip *iadc = dev_id;
242
243 schedule_work(&iadc->trigger_completion_work);
244
245 return IRQ_HANDLED;
246}
247
248static int32_t qpnp_iadc_enable(struct qpnp_iadc_chip *dev, bool state)
249{
250 int rc = 0;
251 u8 data = 0;
252
253 data = QPNP_IADC_ADC_EN;
254 if (state) {
255 rc = qpnp_iadc_write_reg(dev, QPNP_IADC_EN_CTL1,
256 data);
257 if (rc < 0) {
258 pr_err("IADC enable failed\n");
259 return rc;
260 }
261 } else {
262 rc = qpnp_iadc_write_reg(dev, QPNP_IADC_EN_CTL1,
263 (~data & QPNP_IADC_ADC_EN));
264 if (rc < 0) {
265 pr_err("IADC disable failed\n");
266 return rc;
267 }
268 }
269
270 return 0;
271}
272
273static int32_t qpnp_iadc_status_debug(struct qpnp_iadc_chip *dev)
274{
275 int rc = 0;
276 u8 mode = 0, status1 = 0, chan = 0, dig = 0, en = 0;
277
278 rc = qpnp_iadc_read_reg(dev, QPNP_IADC_MODE_CTL, &mode);
279 if (rc < 0) {
280 pr_err("mode ctl register read failed with %d\n", rc);
281 return rc;
282 }
283
284 rc = qpnp_iadc_read_reg(dev, QPNP_ADC_DIG_PARAM, &dig);
285 if (rc < 0) {
286 pr_err("digital param read failed with %d\n", rc);
287 return rc;
288 }
289
290 rc = qpnp_iadc_read_reg(dev, QPNP_IADC_ADC_CH_SEL_CTL, &chan);
291 if (rc < 0) {
292 pr_err("channel read failed with %d\n", rc);
293 return rc;
294 }
295
296 rc = qpnp_iadc_read_reg(dev, QPNP_STATUS1, &status1);
297 if (rc < 0) {
298 pr_err("status1 read failed with %d\n", rc);
299 return rc;
300 }
301
302 rc = qpnp_iadc_read_reg(dev, QPNP_IADC_EN_CTL1, &en);
303 if (rc < 0) {
304 pr_err("en read failed with %d\n", rc);
305 return rc;
306 }
307
308 pr_debug("EOC not set with status:%x, dig:%x, ch:%x, mode:%x, en:%x\n",
309 status1, dig, chan, mode, en);
310
311 rc = qpnp_iadc_enable(dev, false);
312 if (rc < 0) {
313 pr_err("IADC disable failed with %d\n", rc);
314 return rc;
315 }
316
317 return 0;
318}
319
320static int32_t qpnp_iadc_read_conversion_result(struct qpnp_iadc_chip *iadc,
321 int16_t *data)
322{
323 uint8_t rslt_lsb, rslt_msb;
324 uint16_t rslt;
325 int32_t rc;
326
327 rc = qpnp_iadc_read_reg(iadc, QPNP_IADC_DATA0, &rslt_lsb);
328 if (rc < 0) {
329 pr_err("qpnp adc result read failed with %d\n", rc);
330 return rc;
331 }
332
333 rc = qpnp_iadc_read_reg(iadc, QPNP_IADC_DATA1, &rslt_msb);
334 if (rc < 0) {
335 pr_err("qpnp adc result read failed with %d\n", rc);
336 return rc;
337 }
338
339 rslt = (rslt_msb << 8) | rslt_lsb;
340 *data = rslt;
341
342 rc = qpnp_iadc_enable(iadc, false);
343 if (rc)
344 return rc;
345
346 return 0;
347}
348
349#define QPNP_IADC_PM8026_2_REV2 4
350#define QPNP_IADC_PM8026_2_REV3 2
351
352#define QPNP_COEFF_1 969000
353#define QPNP_COEFF_2 32
354#define QPNP_COEFF_3_TYPEA 1700000
355#define QPNP_COEFF_3_TYPEB 1000000
356#define QPNP_COEFF_4 100
357#define QPNP_COEFF_5 15
358#define QPNP_COEFF_6 100000
359#define QPNP_COEFF_7 21
360#define QPNP_COEFF_8 100000000
361#define QPNP_COEFF_9 38
362#define QPNP_COEFF_10 40
363#define QPNP_COEFF_11 7
364#define QPNP_COEFF_12 11
365#define QPNP_COEFF_13 37
366#define QPNP_COEFF_14 39
367#define QPNP_COEFF_15 9
368#define QPNP_COEFF_16 11
369#define QPNP_COEFF_17 851200
370#define QPNP_COEFF_18 296500
371#define QPNP_COEFF_19 222400
372#define QPNP_COEFF_20 813800
373#define QPNP_COEFF_21 1059100
374#define QPNP_COEFF_22 5000000
375#define QPNP_COEFF_23 3722500
376#define QPNP_COEFF_24 84
377#define QPNP_COEFF_25 33
378#define QPNP_COEFF_26 22
379#define QPNP_COEFF_27 53
380#define QPNP_COEFF_28 48
381
382static int32_t qpnp_iadc_comp(int64_t *result, struct qpnp_iadc_chip *iadc,
383 int64_t die_temp)
384{
385 int64_t temp_var = 0, sys_gain_coeff = 0, old;
386 int32_t coeff_a = 0, coeff_b = 0;
387 int version = 0;
388
389 version = qpnp_adc_get_revid_version(iadc->dev);
390 if (version == -EINVAL)
391 return 0;
392
393 old = *result;
394 *result = *result * 1000000;
395
396 if (iadc->iadc_comp.sys_gain > 127)
397 sys_gain_coeff = -QPNP_COEFF_6 *
398 (iadc->iadc_comp.sys_gain - 128);
399 else
400 sys_gain_coeff = QPNP_COEFF_6 *
401 iadc->iadc_comp.sys_gain;
402
403 switch (version) {
404 case QPNP_REV_ID_8941_3_1:
405 switch (iadc->iadc_comp.id) {
406 case COMP_ID_GF:
407 if (!iadc->iadc_comp.ext_rsense) {
408 /* internal rsense */
409 coeff_a = QPNP_COEFF_2;
410 coeff_b = -QPNP_COEFF_3_TYPEA;
411 } else {
412 if (*result < 0) {
413 /* charge */
414 coeff_a = QPNP_COEFF_5;
415 coeff_b = QPNP_COEFF_6;
416 } else {
417 /* discharge */
418 coeff_a = -QPNP_COEFF_7;
419 coeff_b = QPNP_COEFF_6;
420 }
421 }
422 break;
423 case COMP_ID_TSMC:
424 default:
425 if (!iadc->iadc_comp.ext_rsense) {
426 /* internal rsense */
427 coeff_a = QPNP_COEFF_2;
428 coeff_b = -QPNP_COEFF_3_TYPEB;
429 } else {
430 if (*result < 0) {
431 /* charge */
432 coeff_a = QPNP_COEFF_5;
433 coeff_b = QPNP_COEFF_6;
434 } else {
435 /* discharge */
436 coeff_a = -QPNP_COEFF_7;
437 coeff_b = QPNP_COEFF_6;
438 }
439 }
440 break;
441 }
442 break;
443 case QPNP_REV_ID_8026_2_1:
444 case QPNP_REV_ID_8026_2_2:
445 /* pm8026 rev 2.1 and 2.2 */
446 switch (iadc->iadc_comp.id) {
447 case COMP_ID_GF:
448 if (!iadc->iadc_comp.ext_rsense) {
449 /* internal rsense */
450 if (*result < 0) {
451 /* charge */
452 coeff_a = 0;
453 coeff_b = 0;
454 } else {
455 coeff_a = QPNP_COEFF_25;
456 coeff_b = 0;
457 }
458 } else {
459 if (*result < 0) {
460 /* charge */
461 coeff_a = 0;
462 coeff_b = 0;
463 } else {
464 /* discharge */
465 coeff_a = 0;
466 coeff_b = 0;
467 }
468 }
469 break;
470 case COMP_ID_TSMC:
471 default:
472 if (!iadc->iadc_comp.ext_rsense) {
473 /* internal rsense */
474 if (*result < 0) {
475 /* charge */
476 coeff_a = 0;
477 coeff_b = 0;
478 } else {
479 coeff_a = QPNP_COEFF_26;
480 coeff_b = 0;
481 }
482 } else {
483 if (*result < 0) {
484 /* charge */
485 coeff_a = 0;
486 coeff_b = 0;
487 } else {
488 /* discharge */
489 coeff_a = 0;
490 coeff_b = 0;
491 }
492 }
493 break;
494 }
495 break;
496 case QPNP_REV_ID_8026_1_0:
497 /* pm8026 rev 1.0 */
498 switch (iadc->iadc_comp.id) {
499 case COMP_ID_GF:
500 if (!iadc->iadc_comp.ext_rsense) {
501 /* internal rsense */
502 if (*result < 0) {
503 /* charge */
504 coeff_a = QPNP_COEFF_9;
505 coeff_b = -QPNP_COEFF_17;
506 } else {
507 coeff_a = QPNP_COEFF_10;
508 coeff_b = QPNP_COEFF_18;
509 }
510 } else {
511 if (*result < 0) {
512 /* charge */
513 coeff_a = -QPNP_COEFF_11;
514 coeff_b = 0;
515 } else {
516 /* discharge */
517 coeff_a = -QPNP_COEFF_17;
518 coeff_b = -QPNP_COEFF_19;
519 }
520 }
521 break;
522 case COMP_ID_TSMC:
523 default:
524 if (!iadc->iadc_comp.ext_rsense) {
525 /* internal rsense */
526 if (*result < 0) {
527 /* charge */
528 coeff_a = QPNP_COEFF_13;
529 coeff_b = -QPNP_COEFF_20;
530 } else {
531 coeff_a = QPNP_COEFF_14;
532 coeff_b = QPNP_COEFF_21;
533 }
534 } else {
535 if (*result < 0) {
536 /* charge */
537 coeff_a = -QPNP_COEFF_15;
538 coeff_b = 0;
539 } else {
540 /* discharge */
541 coeff_a = -QPNP_COEFF_12;
542 coeff_b = -QPNP_COEFF_19;
543 }
544 }
545 break;
546 }
547 break;
548 case QPNP_REV_ID_8110_1_0:
549 /* pm8110 rev 1.0 */
550 switch (iadc->iadc_comp.id) {
551 case COMP_ID_GF:
552 if (!iadc->iadc_comp.ext_rsense) {
553 /* internal rsense */
554 if (*result < 0) {
555 /* charge */
556 coeff_a = QPNP_COEFF_24;
557 coeff_b = -QPNP_COEFF_22;
558 } else {
559 coeff_a = QPNP_COEFF_24;
560 coeff_b = -QPNP_COEFF_23;
561 }
562 }
563 break;
564 case COMP_ID_SMIC:
565 default:
566 if (!iadc->iadc_comp.ext_rsense) {
567 /* internal rsense */
568 if (*result < 0) {
569 /* charge */
570 coeff_a = QPNP_COEFF_24;
571 coeff_b = -QPNP_COEFF_22;
572 } else {
573 coeff_a = QPNP_COEFF_24;
574 coeff_b = -QPNP_COEFF_23;
575 }
576 }
577 break;
578 }
579 break;
580 case QPNP_REV_ID_8110_2_0:
581 die_temp -= 25000;
582 /* pm8110 rev 2.0 */
583 switch (iadc->iadc_comp.id) {
584 case COMP_ID_GF:
585 if (!iadc->iadc_comp.ext_rsense) {
586 /* internal rsense */
587 if (*result < 0) {
588 /* charge */
589 coeff_a = 0;
590 coeff_b = 0;
591 } else {
592 coeff_a = QPNP_COEFF_27;
593 coeff_b = 0;
594 }
595 }
596 break;
597 case COMP_ID_SMIC:
598 default:
599 if (!iadc->iadc_comp.ext_rsense) {
600 /* internal rsense */
601 if (*result < 0) {
602 /* charge */
603 coeff_a = 0;
604 coeff_b = 0;
605 } else {
606 coeff_a = QPNP_COEFF_28;
607 coeff_b = 0;
608 }
609 }
610 break;
611 }
612 break;
613 default:
614 case QPNP_REV_ID_8026_2_0:
615 /* pm8026 rev 1.0 */
616 coeff_a = 0;
617 coeff_b = 0;
618 break;
619 }
620
621 temp_var = (coeff_a * die_temp) + coeff_b;
622 temp_var = div64_s64(temp_var, QPNP_COEFF_4);
623 temp_var = 1000 * (1000000 - temp_var);
624
625 if (!iadc->iadc_comp.ext_rsense) {
626 /* internal rsense */
627 *result = div64_s64(*result * 1000, temp_var);
628 }
629
630 if (iadc->iadc_comp.ext_rsense) {
631 /* external rsense */
632 sys_gain_coeff = (1000000 +
633 div64_s64(sys_gain_coeff, QPNP_COEFF_4));
634 temp_var = div64_s64(temp_var * sys_gain_coeff, 1000000);
635 *result = div64_s64(*result * 1000, temp_var);
636 }
637 pr_debug("%lld compensated into %lld, a: %d, b: %d, sys_gain: %lld\n",
638 old, *result, coeff_a, coeff_b, sys_gain_coeff);
639
640 return 0;
641}
642
643int32_t qpnp_iadc_comp_result(struct qpnp_iadc_chip *iadc, int64_t *result)
644{
645 return qpnp_iadc_comp(result, iadc, iadc->die_temp);
646}
647EXPORT_SYMBOL(qpnp_iadc_comp_result);
648
649static int qpnp_iadc_rds_trim_update_check(struct qpnp_iadc_chip *iadc)
650{
651 int rc = 0;
652 u8 trim2_val = 0;
653 uint smbb_batt_trm_data = 0;
654 u8 smbb_batt_trm_cnst_rds = 0;
655
656 if (!iadc->rds_trim_default_check) {
657 pr_debug("No internal rds trim check needed\n");
658 return 0;
659 }
660
661 rc = qpnp_iadc_read_reg(iadc, QPNP_IADC_NOMINAL_RSENSE, &trim2_val);
662 if (rc < 0) {
663 pr_err("qpnp adc trim2_fullscale1 reg read failed %d\n", rc);
664 return rc;
665 }
666
667 rc = regmap_read(iadc->adc->regmap, iadc->batt_id_trim_cnst_rds,
668 &smbb_batt_trm_data);
669 if (rc < 0) {
670 pr_err("batt_id trim_cnst rds reg read failed %d\n", rc);
671 return rc;
672 }
673
674 smbb_batt_trm_cnst_rds = (u8)smbb_batt_trm_data &
675 SMBB_BAT_IF_TRIM_CNST_RDS_MASK;
676
677 pr_debug("n_trim:0x%x smb_trm:0x%02x\n", trim2_val, smbb_batt_trm_data);
678
679 if (iadc->rds_trim_default_type == QPNP_IADC_RDS_DEFAULT_TYPEA) {
680
681 if ((smbb_batt_trm_cnst_rds ==
682 SMBB_BAT_IF_TRIM_CNST_RDS_MASK_CONST_2) &&
683 (trim2_val == QPNP_IADC1_USR_TRIM2_ADC_FULLSCALE1_CONST)) {
684 iadc->rsense_workaround_value =
685 QPNP_IADC_RSENSE_DEFAULT_VALUE;
686 iadc->default_internal_rsense = true;
687 }
688 } else if (iadc->rds_trim_default_type ==
689 QPNP_IADC_RDS_DEFAULT_TYPEB) {
690 if ((smbb_batt_trm_cnst_rds >=
691 SMBB_BAT_IF_TRIM_CNST_RDS_MASK_CONST_2) &&
692 (trim2_val == QPNP_IADC1_USR_TRIM2_ADC_FULLSCALE1_CONST)) {
693 iadc->rsense_workaround_value =
694 QPNP_IADC_RSENSE_DEFAULT_VALUE;
695 iadc->default_internal_rsense = true;
696 } else if ((smbb_batt_trm_cnst_rds <
697 SMBB_BAT_IF_TRIM_CNST_RDS_MASK_CONST_2) &&
698 (trim2_val ==
699 QPNP_IADC1_USR_TRIM2_ADC_FULLSCALE1_CONST)) {
700 if (iadc->iadc_comp.id == COMP_ID_GF) {
701 iadc->rsense_workaround_value =
702 QPNP_IADC_RSENSE_DEFAULT_TYPEB_GF;
703 iadc->default_internal_rsense = true;
704 } else if (iadc->iadc_comp.id == COMP_ID_SMIC) {
705 iadc->rsense_workaround_value =
706 QPNP_IADC_RSENSE_DEFAULT_TYPEB_SMIC;
707 iadc->default_internal_rsense = true;
708 }
709 }
710 } else if (iadc->rds_trim_default_type == QPNP_IADC_RDS_DEFAULT_TYPEC) {
711
712 if ((smbb_batt_trm_cnst_rds >
713 SMBB_BAT_IF_TRIM_CNST_RDS_MASK_CONST_0) &&
714 (smbb_batt_trm_cnst_rds <=
715 SMBB_BAT_IF_TRIM_CNST_RDS_MASK_CONST_2) &&
716 (trim2_val == QPNP_IADC1_USR_TRIM2_ADC_FULLSCALE1_CONST)) {
717 iadc->rsense_workaround_value =
718 QPNP_IADC_RSENSE_DEFAULT_VALUE;
719 iadc->default_internal_rsense = true;
720 }
721 }
722
723 return 0;
724}
725
726static int32_t qpnp_iadc_comp_info(struct qpnp_iadc_chip *iadc)
727{
728 int rc = 0;
729
730 rc = qpnp_iadc_read_reg(iadc, QPNP_INT_TEST_VAL, &iadc->iadc_comp.id);
731 if (rc < 0) {
732 pr_err("qpnp adc comp id failed with %d\n", rc);
733 return rc;
734 }
735
736 rc = qpnp_iadc_read_reg(iadc, QPNP_IADC_REVISION2,
737 &iadc->iadc_comp.revision_dig_major);
738 if (rc < 0) {
739 pr_err("qpnp adc revision2 read failed with %d\n", rc);
740 return rc;
741 }
742
743 rc = qpnp_iadc_read_reg(iadc, QPNP_IADC_REVISION3,
744 &iadc->iadc_comp.revision_ana_minor);
745 if (rc < 0) {
746 pr_err("qpnp adc revision3 read failed with %d\n", rc);
747 return rc;
748 }
749
750 rc = qpnp_iadc_read_reg(iadc, QPNP_IADC_ATE_GAIN_CALIB_OFFSET,
751 &iadc->iadc_comp.sys_gain);
752 if (rc < 0) {
753 pr_err("full scale read failed with %d\n", rc);
754 return rc;
755 }
756
757 if (iadc->external_rsense)
758 iadc->iadc_comp.ext_rsense = true;
759
760 pr_debug("fab id = %u, revision_dig_major = %u, revision_ana_minor = %u sys gain = %u, external_rsense = %d\n",
761 iadc->iadc_comp.id,
762 iadc->iadc_comp.revision_dig_major,
763 iadc->iadc_comp.revision_ana_minor,
764 iadc->iadc_comp.sys_gain,
765 iadc->iadc_comp.ext_rsense);
766 return rc;
767}
768
769static int32_t qpnp_iadc_configure(struct qpnp_iadc_chip *iadc,
770 enum qpnp_iadc_channels channel,
771 uint16_t *raw_code, uint32_t mode_sel)
772{
773 u8 qpnp_iadc_mode_reg = 0, qpnp_iadc_ch_sel_reg = 0;
774 u8 qpnp_iadc_conv_req = 0, qpnp_iadc_dig_param_reg = 0;
775 u8 status1 = 0;
776 uint32_t count = 0;
777 int32_t rc = 0;
778
779 qpnp_iadc_ch_sel_reg = channel;
780
781 qpnp_iadc_dig_param_reg |= iadc->adc->amux_prop->decimation <<
782 QPNP_IADC_DEC_RATIO_SEL;
783 if (iadc->iadc_mode_sel)
784 qpnp_iadc_mode_reg |= (QPNP_ADC_TRIM_EN | QPNP_VADC_SYNCH_EN);
785 else
786 qpnp_iadc_mode_reg |= QPNP_ADC_TRIM_EN;
787
788 qpnp_iadc_conv_req = QPNP_IADC_CONV_REQ;
789
790 rc = qpnp_iadc_write_reg(iadc, QPNP_IADC_MODE_CTL, qpnp_iadc_mode_reg);
791 if (rc) {
792 pr_err("qpnp adc read adc failed with %d\n", rc);
793 return rc;
794 }
795
796 rc = qpnp_iadc_write_reg(iadc, QPNP_IADC_ADC_CH_SEL_CTL,
797 qpnp_iadc_ch_sel_reg);
798 if (rc) {
799 pr_err("qpnp adc read adc failed with %d\n", rc);
800 return rc;
801 }
802
803 rc = qpnp_iadc_write_reg(iadc, QPNP_ADC_DIG_PARAM,
804 qpnp_iadc_dig_param_reg);
805 if (rc) {
806 pr_err("qpnp adc read adc failed with %d\n", rc);
807 return rc;
808 }
809
810 rc = qpnp_iadc_write_reg(iadc, QPNP_FAST_AVG_CTL,
811 iadc->adc->amux_prop->fast_avg_setup);
812 if (rc < 0) {
813 pr_err("qpnp adc fast averaging configure error\n");
814 return rc;
815 }
816
817 if (!iadc->iadc_poll_eoc)
818 reinit_completion(&iadc->adc->adc_rslt_completion);
819
820 rc = qpnp_iadc_enable(iadc, true);
821 if (rc)
822 return rc;
823
824 rc = qpnp_iadc_write_reg(iadc, QPNP_CONV_REQ, qpnp_iadc_conv_req);
825 if (rc) {
826 pr_err("qpnp adc read adc failed with %d\n", rc);
827 return rc;
828 }
829
830 if (iadc->iadc_poll_eoc) {
831 while (status1 != QPNP_STATUS1_EOC) {
832 rc = qpnp_iadc_read_reg(iadc, QPNP_STATUS1, &status1);
833 if (rc < 0)
834 return rc;
835 status1 &= QPNP_STATUS1_REQ_STS_EOC_MASK;
836 usleep_range(QPNP_ADC_CONV_TIME_MIN,
837 QPNP_ADC_CONV_TIME_MAX);
838 count++;
839 if (count > QPNP_ADC_ERR_COUNT) {
840 pr_err("retry error exceeded\n");
841 rc = qpnp_iadc_status_debug(iadc);
842 if (rc < 0)
843 pr_err("IADC status debug failed\n");
844 rc = -EINVAL;
845 return rc;
846 }
847 }
848 } else {
849 rc = wait_for_completion_timeout(
850 &iadc->adc->adc_rslt_completion,
851 QPNP_ADC_COMPLETION_TIMEOUT);
852 if (!rc) {
853 rc = qpnp_iadc_read_reg(iadc, QPNP_STATUS1, &status1);
854 if (rc < 0)
855 return rc;
856 status1 &= QPNP_STATUS1_REQ_STS_EOC_MASK;
857 if (status1 == QPNP_STATUS1_EOC)
858 pr_debug("End of conversion status set\n");
859 else {
860 rc = qpnp_iadc_status_debug(iadc);
861 if (rc < 0) {
862 pr_err("status debug failed %d\n", rc);
863 return rc;
864 }
865 return -EINVAL;
866 }
867 }
868 }
869
870 rc = qpnp_iadc_read_conversion_result(iadc, raw_code);
871 if (rc) {
872 pr_err("qpnp adc read adc failed with %d\n", rc);
873 return rc;
874 }
875
876 return 0;
877}
878
879#define IADC_CENTER 0xC000
880#define IADC_READING_RESOLUTION_N 542535
881#define IADC_READING_RESOLUTION_D 100000
882static int32_t qpnp_convert_raw_offset_voltage(struct qpnp_iadc_chip *iadc)
883{
884 s64 numerator;
885
886 if ((iadc->adc->calib.gain_raw - iadc->adc->calib.offset_raw) == 0) {
887 pr_err("raw offset errors! raw_gain:0x%x and raw_offset:0x%x\n",
888 iadc->adc->calib.gain_raw, iadc->adc->calib.offset_raw);
889 return -EINVAL;
890 }
891
892 numerator = iadc->adc->calib.offset_raw - IADC_CENTER;
893 numerator *= IADC_READING_RESOLUTION_N;
894 iadc->adc->calib.offset_uv = div_s64(numerator,
895 IADC_READING_RESOLUTION_D);
896
897 numerator = iadc->adc->calib.gain_raw - iadc->adc->calib.offset_raw;
898 numerator *= IADC_READING_RESOLUTION_N;
899
900 iadc->adc->calib.gain_uv = div_s64(numerator,
901 IADC_READING_RESOLUTION_D);
902
903 pr_debug("gain_uv:%d offset_uv:%d\n",
904 iadc->adc->calib.gain_uv, iadc->adc->calib.offset_uv);
905 return 0;
906}
907
908#define IADC_IDEAL_RAW_GAIN 3291
909int32_t qpnp_iadc_calibrate_for_trim(struct qpnp_iadc_chip *iadc,
910 bool batfet_closed)
911{
912 uint8_t rslt_lsb, rslt_msb;
913 int32_t rc = 0, version = 0;
914 uint16_t raw_data;
915 uint32_t mode_sel = 0;
916 bool iadc_offset_ch_batfet_check;
917
918 if (qpnp_iadc_is_valid(iadc) < 0)
919 return -EPROBE_DEFER;
920
921 mutex_lock(&iadc->adc->adc_lock);
922
923 if (iadc->iadc_poll_eoc) {
924 pr_debug("acquiring iadc eoc wakelock\n");
925 pm_stay_awake(iadc->dev);
926 }
927
928 iadc->adc->amux_prop->decimation = DECIMATION_TYPE1;
929 iadc->adc->amux_prop->fast_avg_setup = ADC_FAST_AVG_SAMPLE_1;
930
931 rc = qpnp_iadc_configure(iadc, GAIN_CALIBRATION_17P857MV,
932 &raw_data, mode_sel);
933 if (rc < 0) {
934 pr_err("qpnp adc result read failed with %d\n", rc);
935 goto fail;
936 }
937
938 iadc->adc->calib.gain_raw = raw_data;
939
940 /*
941 * there is a features on PM8941 in the BMS where if the batfet is
942 * opened the BMS reads from INTERNAL_RSENSE (channel 0) actually go to
943 * OFFSET_CALIBRATION_CSP_CSN (channel 5). Hence if batfet is opened
944 * we have to calibrate based on OFFSET_CALIBRATION_CSP_CSN even for
945 * internal rsense.
946 */
947 version = qpnp_adc_get_revid_version(iadc->dev);
948 if ((version == QPNP_REV_ID_8941_3_1) ||
949 (version == QPNP_REV_ID_8941_3_0) ||
950 (version == QPNP_REV_ID_8941_2_0))
951 iadc_offset_ch_batfet_check = true;
952 else
953 iadc_offset_ch_batfet_check = false;
954
955 if ((iadc_offset_ch_batfet_check && !batfet_closed) ||
956 (iadc->external_rsense)) {
957 /* external offset calculation */
958 rc = qpnp_iadc_configure(iadc, OFFSET_CALIBRATION_CSP_CSN,
959 &raw_data, mode_sel);
960 if (rc < 0) {
961 pr_err("qpnp adc result read failed with %d\n", rc);
962 goto fail;
963 }
964 } else {
965 /* internal offset calculation */
966 rc = qpnp_iadc_configure(iadc, OFFSET_CALIBRATION_CSP2_CSN2,
967 &raw_data, mode_sel);
968 if (rc < 0) {
969 pr_err("qpnp adc result read failed with %d\n", rc);
970 goto fail;
971 }
972 }
973
974 iadc->adc->calib.offset_raw = raw_data;
975 if (rc < 0) {
976 pr_err("qpnp adc offset/gain calculation failed\n");
977 goto fail;
978 }
979
980 if (iadc->iadc_comp.revision_dig_major == QPNP_IADC_PM8026_2_REV2
981 && iadc->iadc_comp.revision_ana_minor ==
982 QPNP_IADC_PM8026_2_REV3)
983 iadc->adc->calib.gain_raw =
984 iadc->adc->calib.offset_raw + IADC_IDEAL_RAW_GAIN;
985
986 pr_debug("raw gain:0x%x, raw offset:0x%x\n",
987 iadc->adc->calib.gain_raw, iadc->adc->calib.offset_raw);
988
989 rc = qpnp_convert_raw_offset_voltage(iadc);
990 if (rc < 0) {
991 pr_err("qpnp raw_voltage conversion failed\n");
992 goto fail;
993 }
994
995 rslt_msb = (raw_data & QPNP_RAW_CODE_16_BIT_MSB_MASK) >>
996 QPNP_BIT_SHIFT_8;
997 rslt_lsb = raw_data & QPNP_RAW_CODE_16_BIT_LSB_MASK;
998
999 pr_debug("trim values:lsb:0x%x and msb:0x%x\n", rslt_lsb, rslt_msb);
1000
1001 rc = qpnp_iadc_write_reg(iadc, QPNP_IADC_SEC_ACCESS,
1002 QPNP_IADC_SEC_ACCESS_DATA);
1003 if (rc < 0) {
1004 pr_err("qpnp iadc configure error for sec access\n");
1005 goto fail;
1006 }
1007
1008 rc = qpnp_iadc_write_reg(iadc, QPNP_IADC_MSB_OFFSET,
1009 rslt_msb);
1010 if (rc < 0) {
1011 pr_err("qpnp iadc configure error for MSB write\n");
1012 goto fail;
1013 }
1014
1015 rc = qpnp_iadc_write_reg(iadc, QPNP_IADC_SEC_ACCESS,
1016 QPNP_IADC_SEC_ACCESS_DATA);
1017 if (rc < 0) {
1018 pr_err("qpnp iadc configure error for sec access\n");
1019 goto fail;
1020 }
1021
1022 rc = qpnp_iadc_write_reg(iadc, QPNP_IADC_LSB_OFFSET,
1023 rslt_lsb);
1024 if (rc < 0) {
1025 pr_err("qpnp iadc configure error for LSB write\n");
1026 goto fail;
1027 }
1028fail:
1029 if (iadc->iadc_poll_eoc) {
1030 pr_debug("releasing iadc eoc wakelock\n");
1031 pm_relax(iadc->dev);
1032 }
1033 mutex_unlock(&iadc->adc->adc_lock);
1034 return rc;
1035}
1036EXPORT_SYMBOL(qpnp_iadc_calibrate_for_trim);
1037
1038static void qpnp_iadc_work(struct work_struct *work)
1039{
1040 struct qpnp_iadc_chip *iadc = container_of(work,
1041 struct qpnp_iadc_chip, iadc_work.work);
1042 int rc = 0;
1043
1044 if (!iadc->skip_auto_calibrations) {
1045 rc = qpnp_iadc_calibrate_for_trim(iadc, true);
1046 if (rc)
1047 pr_debug("periodic IADC calibration failed\n");
1048 }
1049
1050 schedule_delayed_work(&iadc->iadc_work,
1051 round_jiffies_relative(msecs_to_jiffies
1052 (QPNP_IADC_CALIB_SECONDS)));
1053}
1054
1055static int32_t qpnp_iadc_version_check(struct qpnp_iadc_chip *iadc)
1056{
1057 uint8_t revision;
1058 int rc;
1059
1060 rc = qpnp_iadc_read_reg(iadc, QPNP_IADC_REVISION2, &revision);
1061 if (rc < 0) {
1062 pr_err("qpnp adc result read failed with %d\n", rc);
1063 return rc;
1064 }
1065
1066 if (revision < QPNP_IADC_SUPPORTED_REVISION2) {
1067 pr_err("IADC Version not supported\n");
1068 return -EINVAL;
1069 }
1070
1071 return 0;
1072}
1073
1074struct qpnp_iadc_chip *qpnp_get_iadc(struct device *dev, const char *name)
1075{
1076 struct qpnp_iadc_chip *iadc;
1077 struct device_node *node = NULL;
1078 char prop_name[QPNP_MAX_PROP_NAME_LEN];
1079
1080 snprintf(prop_name, QPNP_MAX_PROP_NAME_LEN, "qcom,%s-iadc", name);
1081
1082 node = of_parse_phandle(dev->of_node, prop_name, 0);
1083 if (node == NULL)
1084 return ERR_PTR(-ENODEV);
1085
1086 list_for_each_entry(iadc, &qpnp_iadc_device_list, list)
1087 if (iadc->adc->pdev->dev.of_node == node)
1088 return iadc;
1089 return ERR_PTR(-EPROBE_DEFER);
1090}
1091EXPORT_SYMBOL(qpnp_get_iadc);
1092
1093int32_t qpnp_iadc_get_rsense(struct qpnp_iadc_chip *iadc, int32_t *rsense)
1094{
1095 uint8_t rslt_rsense = 0;
1096 int32_t rc = 0, sign_bit = 0;
1097
1098 if (qpnp_iadc_is_valid(iadc) < 0)
1099 return -EPROBE_DEFER;
1100
1101 if (iadc->external_rsense) {
1102 *rsense = iadc->rsense;
1103 } else if (iadc->default_internal_rsense) {
1104 *rsense = iadc->rsense_workaround_value;
1105 } else {
1106
1107 rc = qpnp_iadc_read_reg(iadc, QPNP_IADC_NOMINAL_RSENSE,
1108 &rslt_rsense);
1109 if (rc < 0) {
1110 pr_err("qpnp adc rsense read failed with %d\n", rc);
1111 return rc;
1112 }
1113
1114 pr_debug("rsense:0%x\n", rslt_rsense);
1115
1116 if (rslt_rsense & QPNP_RSENSE_MSB_SIGN_CHECK)
1117 sign_bit = 1;
1118
1119 rslt_rsense &= ~QPNP_RSENSE_MSB_SIGN_CHECK;
1120
1121 if (sign_bit)
1122 *rsense = QPNP_IADC_INTERNAL_RSENSE_N_OHMS_FACTOR -
1123 (rslt_rsense * QPNP_IADC_RSENSE_LSB_N_OHMS_PER_BIT);
1124 else
1125 *rsense = QPNP_IADC_INTERNAL_RSENSE_N_OHMS_FACTOR +
1126 (rslt_rsense * QPNP_IADC_RSENSE_LSB_N_OHMS_PER_BIT);
1127 }
1128 pr_debug("rsense value is %d\n", *rsense);
1129
1130 if (*rsense == 0)
1131 pr_err("incorrect rsens value:%d rslt_rsense:%d\n",
1132 *rsense, rslt_rsense);
1133
1134 return rc;
1135}
1136EXPORT_SYMBOL(qpnp_iadc_get_rsense);
1137
1138static int32_t qpnp_check_pmic_temp(struct qpnp_iadc_chip *iadc)
1139{
1140 struct qpnp_vadc_result result_pmic_therm;
1141 int64_t die_temp_offset;
1142 int rc = 0;
1143
1144 rc = qpnp_vadc_read(iadc->vadc_dev, DIE_TEMP, &result_pmic_therm);
1145 if (rc < 0)
1146 return rc;
1147
1148 die_temp_offset = result_pmic_therm.physical -
1149 iadc->die_temp;
1150 if (die_temp_offset < 0)
1151 die_temp_offset = -die_temp_offset;
1152
1153 if (die_temp_offset > QPNP_IADC_DIE_TEMP_CALIB_OFFSET) {
1154 iadc->die_temp = result_pmic_therm.physical;
1155 if (!iadc->skip_auto_calibrations) {
1156 rc = qpnp_iadc_calibrate_for_trim(iadc, true);
1157 if (rc)
1158 pr_err("IADC calibration failed rc = %d\n", rc);
1159 }
1160 }
1161
1162 return rc;
1163}
1164
1165int32_t qpnp_iadc_read(struct qpnp_iadc_chip *iadc,
1166 enum qpnp_iadc_channels channel,
1167 struct qpnp_iadc_result *result)
1168{
1169 int32_t rc, rsense_n_ohms, sign = 0, num, mode_sel = 0;
1170 int32_t rsense_u_ohms = 0;
1171 int64_t result_current;
1172 uint16_t raw_data;
1173 int dt_index = 0;
1174
1175 if (qpnp_iadc_is_valid(iadc) < 0)
1176 return -EPROBE_DEFER;
1177
1178 if ((iadc->adc->calib.gain_raw - iadc->adc->calib.offset_raw) == 0) {
1179 pr_err("raw offset errors! run iadc calibration again\n");
1180 return -EINVAL;
1181 }
1182
1183 rc = qpnp_check_pmic_temp(iadc);
1184 if (rc) {
1185 pr_err("Error checking pmic therm temp\n");
1186 return rc;
1187 }
1188
1189 mutex_lock(&iadc->adc->adc_lock);
1190
1191 while (((enum qpnp_iadc_channels)
1192 iadc->adc->adc_channels[dt_index].channel_num
1193 != channel) && (dt_index < iadc->max_channels_available))
1194 dt_index++;
1195
1196 if (dt_index >= iadc->max_channels_available) {
1197 pr_err("not a valid IADC channel\n");
1198 rc = -EINVAL;
1199 goto fail;
1200 }
1201
1202 iadc->adc->amux_prop->decimation =
1203 iadc->adc->adc_channels[dt_index].adc_decimation;
1204 iadc->adc->amux_prop->fast_avg_setup =
1205 iadc->adc->adc_channels[dt_index].fast_avg_setup;
1206
1207 if (iadc->iadc_poll_eoc) {
1208 pr_debug("acquiring iadc eoc wakelock\n");
1209 pm_stay_awake(iadc->dev);
1210 }
1211
1212 rc = qpnp_iadc_configure(iadc, channel, &raw_data, mode_sel);
1213 if (rc < 0) {
1214 pr_err("qpnp adc result read failed with %d\n", rc);
1215 goto fail;
1216 }
1217
1218 rc = qpnp_iadc_get_rsense(iadc, &rsense_n_ohms);
1219 pr_debug("current raw:0%x and rsense:%d\n",
1220 raw_data, rsense_n_ohms);
1221 rsense_u_ohms = rsense_n_ohms/1000;
1222 num = raw_data - iadc->adc->calib.offset_raw;
1223 if (num < 0) {
1224 sign = 1;
1225 num = -num;
1226 }
1227
1228 result->result_uv = (num * QPNP_ADC_GAIN_NV)/
1229 (iadc->adc->calib.gain_raw - iadc->adc->calib.offset_raw);
1230 result_current = result->result_uv;
1231 result_current *= QPNP_IADC_NANO_VOLTS_FACTOR;
1232 /* Intentional fall through. Process the result w/o comp */
1233 do_div(result_current, rsense_u_ohms);
1234
1235 if (sign) {
1236 result->result_uv = -result->result_uv;
1237 result_current = -result_current;
1238 }
1239 result_current *= -1;
1240 rc = qpnp_iadc_comp_result(iadc, &result_current);
1241 if (rc < 0)
1242 pr_err("Error during compensating the IADC\n");
1243 rc = 0;
1244 result_current *= -1;
1245
1246 result->result_ua = (int32_t) result_current;
1247fail:
1248 if (iadc->iadc_poll_eoc) {
1249 pr_debug("releasing iadc eoc wakelock\n");
1250 pm_relax(iadc->dev);
1251 }
1252 mutex_unlock(&iadc->adc->adc_lock);
1253
1254 return rc;
1255}
1256EXPORT_SYMBOL(qpnp_iadc_read);
1257
1258int32_t qpnp_iadc_get_gain_and_offset(struct qpnp_iadc_chip *iadc,
1259 struct qpnp_iadc_calib *result)
1260{
1261 int rc;
1262
1263 if (qpnp_iadc_is_valid(iadc) < 0)
1264 return -EPROBE_DEFER;
1265
1266 rc = qpnp_check_pmic_temp(iadc);
1267 if (rc) {
1268 pr_err("Error checking pmic therm temp\n");
1269 return rc;
1270 }
1271
1272 mutex_lock(&iadc->adc->adc_lock);
1273 result->gain_raw = iadc->adc->calib.gain_raw;
1274 result->ideal_gain_nv = QPNP_ADC_GAIN_NV;
1275 result->gain_uv = iadc->adc->calib.gain_uv;
1276 result->offset_raw = iadc->adc->calib.offset_raw;
1277 result->ideal_offset_uv =
1278 QPNP_OFFSET_CALIBRATION_SHORT_CADC_LEADS_IDEAL;
1279 result->offset_uv = iadc->adc->calib.offset_uv;
1280 pr_debug("raw gain:0%x, raw offset:0%x\n",
1281 result->gain_raw, result->offset_raw);
1282 pr_debug("gain_uv:%d offset_uv:%d\n",
1283 result->gain_uv, result->offset_uv);
1284 mutex_unlock(&iadc->adc->adc_lock);
1285
1286 return 0;
1287}
1288EXPORT_SYMBOL(qpnp_iadc_get_gain_and_offset);
1289
1290int qpnp_iadc_skip_calibration(struct qpnp_iadc_chip *iadc)
1291{
1292 iadc->skip_auto_calibrations = true;
1293 return 0;
1294}
1295EXPORT_SYMBOL(qpnp_iadc_skip_calibration);
1296
1297int qpnp_iadc_resume_calibration(struct qpnp_iadc_chip *iadc)
1298{
1299 iadc->skip_auto_calibrations = false;
1300 return 0;
1301}
1302EXPORT_SYMBOL(qpnp_iadc_resume_calibration);
1303
1304int32_t qpnp_iadc_vadc_sync_read(struct qpnp_iadc_chip *iadc,
1305 enum qpnp_iadc_channels i_channel, struct qpnp_iadc_result *i_result,
1306 enum qpnp_vadc_channels v_channel, struct qpnp_vadc_result *v_result)
1307{
1308 int rc = 0, mode_sel = 0, num = 0, rsense_n_ohms = 0, sign = 0;
1309 int dt_index = 0;
1310 uint16_t raw_data;
1311 int32_t rsense_u_ohms = 0;
1312 int64_t result_current;
1313
1314 if (qpnp_iadc_is_valid(iadc) < 0)
1315 return -EPROBE_DEFER;
1316
1317 if ((iadc->adc->calib.gain_raw - iadc->adc->calib.offset_raw) == 0) {
1318 pr_err("raw offset errors! run iadc calibration again\n");
1319 return -EINVAL;
1320 }
1321
1322 mutex_lock(&iadc->adc->adc_lock);
1323
1324 if (iadc->iadc_poll_eoc) {
1325 pr_debug("acquiring iadc eoc wakelock\n");
1326 pm_stay_awake(iadc->dev);
1327 }
1328
1329 iadc->iadc_mode_sel = true;
1330
1331 rc = qpnp_vadc_iadc_sync_request(iadc->vadc_dev, v_channel);
1332 if (rc) {
1333 pr_err("Configuring VADC failed\n");
1334 goto fail;
1335 }
1336
1337 while (((enum qpnp_iadc_channels)
1338 iadc->adc->adc_channels[dt_index].channel_num
1339 != i_channel) && (dt_index < iadc->max_channels_available))
1340 dt_index++;
1341
1342 if (dt_index >= iadc->max_channels_available) {
1343 pr_err("not a valid IADC channel\n");
1344 rc = -EINVAL;
1345 goto fail;
1346 }
1347
1348 iadc->adc->amux_prop->decimation =
1349 iadc->adc->adc_channels[dt_index].adc_decimation;
1350 iadc->adc->amux_prop->fast_avg_setup =
1351 iadc->adc->adc_channels[dt_index].fast_avg_setup;
1352
1353 rc = qpnp_iadc_configure(iadc, i_channel, &raw_data, mode_sel);
1354 if (rc < 0) {
1355 pr_err("qpnp adc result read failed with %d\n", rc);
1356 goto fail_release_vadc;
1357 }
1358
1359 rc = qpnp_iadc_get_rsense(iadc, &rsense_n_ohms);
1360 pr_debug("current raw:0%x and rsense:%d\n",
1361 raw_data, rsense_n_ohms);
1362 rsense_u_ohms = rsense_n_ohms/1000;
1363 num = raw_data - iadc->adc->calib.offset_raw;
1364 if (num < 0) {
1365 sign = 1;
1366 num = -num;
1367 }
1368
1369 i_result->result_uv = (num * QPNP_ADC_GAIN_NV)/
1370 (iadc->adc->calib.gain_raw - iadc->adc->calib.offset_raw);
1371 result_current = i_result->result_uv;
1372 result_current *= QPNP_IADC_NANO_VOLTS_FACTOR;
1373 /* Intentional fall through. Process the result w/o comp */
1374 if (!rsense_u_ohms) {
1375 pr_err("rsense error=%d\n", rsense_u_ohms);
1376 goto fail_release_vadc;
1377 }
1378
1379 do_div(result_current, rsense_u_ohms);
1380
1381 if (sign) {
1382 i_result->result_uv = -i_result->result_uv;
1383 result_current = -result_current;
1384 }
1385 result_current *= -1;
1386 rc = qpnp_iadc_comp_result(iadc, &result_current);
1387 if (rc < 0)
1388 pr_err("Error during compensating the IADC\n");
1389 rc = 0;
1390 result_current *= -1;
1391
1392 i_result->result_ua = (int32_t) result_current;
1393
1394fail_release_vadc:
1395 rc = qpnp_vadc_iadc_sync_complete_request(iadc->vadc_dev, v_channel,
1396 v_result);
1397 if (rc)
1398 pr_err("Releasing VADC failed\n");
1399fail:
1400 iadc->iadc_mode_sel = false;
1401
1402 if (iadc->iadc_poll_eoc) {
1403 pr_debug("releasing iadc eoc wakelock\n");
1404 pm_relax(iadc->dev);
1405 }
1406 mutex_unlock(&iadc->adc->adc_lock);
1407
1408 return rc;
1409}
1410EXPORT_SYMBOL(qpnp_iadc_vadc_sync_read);
1411
1412static ssize_t qpnp_iadc_show(struct device *dev,
1413 struct device_attribute *devattr, char *buf)
1414{
1415 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
1416 struct qpnp_iadc_chip *iadc = dev_get_drvdata(dev);
1417 struct qpnp_iadc_result result;
1418 int rc = -1;
1419
1420 rc = qpnp_iadc_read(iadc, attr->index, &result);
1421
1422 if (rc)
1423 return 0;
1424
1425 return snprintf(buf, QPNP_ADC_HWMON_NAME_LENGTH,
1426 "Result:%d\n", result.result_ua);
1427}
1428
1429static struct sensor_device_attribute qpnp_adc_attr =
1430 SENSOR_ATTR(NULL, 0444, qpnp_iadc_show, NULL, 0);
1431
1432static int32_t qpnp_iadc_init_hwmon(struct qpnp_iadc_chip *iadc,
1433 struct platform_device *pdev)
1434{
1435 struct device_node *child;
1436 struct device_node *node = pdev->dev.of_node;
1437 int rc = 0, i = 0, channel;
1438
1439 for_each_child_of_node(node, child) {
1440 channel = iadc->adc->adc_channels[i].channel_num;
1441 qpnp_adc_attr.index = iadc->adc->adc_channels[i].channel_num;
1442 qpnp_adc_attr.dev_attr.attr.name =
1443 iadc->adc->adc_channels[i].name;
1444 memcpy(&iadc->sens_attr[i], &qpnp_adc_attr,
1445 sizeof(qpnp_adc_attr));
1446 sysfs_attr_init(&iadc->sens_attr[i].dev_attr.attr);
1447 rc = device_create_file(&pdev->dev,
1448 &iadc->sens_attr[i].dev_attr);
1449 if (rc) {
1450 dev_err(&pdev->dev,
1451 "device_create_file failed for dev %s\n",
1452 iadc->adc->adc_channels[i].name);
1453 goto hwmon_err_sens;
1454 }
1455 i++;
1456 }
1457
1458 return 0;
1459hwmon_err_sens:
1460 pr_err("Init HWMON failed for qpnp_iadc with %d\n", rc);
1461 return rc;
1462}
1463
1464static int qpnp_iadc_probe(struct platform_device *pdev)
1465{
1466 struct qpnp_iadc_chip *iadc;
1467 struct qpnp_adc_drv *adc_qpnp;
1468 struct device_node *node = pdev->dev.of_node;
1469 struct device_node *child;
1470 unsigned int base;
1471 int rc, count_adc_channel_list = 0, i = 0;
1472
1473 for_each_child_of_node(node, child)
1474 count_adc_channel_list++;
1475
1476 if (!count_adc_channel_list) {
1477 pr_err("No channel listing\n");
1478 return -EINVAL;
1479 }
1480
1481 iadc = devm_kzalloc(&pdev->dev, sizeof(struct qpnp_iadc_chip) +
1482 (sizeof(struct sensor_device_attribute) *
1483 count_adc_channel_list), GFP_KERNEL);
1484 if (!iadc) {
1485 dev_err(&pdev->dev, "Unable to allocate memory\n");
1486 return -ENOMEM;
1487 }
1488
1489 adc_qpnp = devm_kzalloc(&pdev->dev, sizeof(struct qpnp_adc_drv),
1490 GFP_KERNEL);
1491 if (!adc_qpnp)
1492 return -ENOMEM;
1493
1494 adc_qpnp->regmap = dev_get_regmap(pdev->dev.parent, NULL);
1495 if (!adc_qpnp->regmap) {
1496 dev_err(&pdev->dev, "Couldn't get parent's regmap\n");
1497 return -EINVAL;
1498 }
1499
1500 iadc->dev = &(pdev->dev);
1501 iadc->adc = adc_qpnp;
1502
1503 rc = qpnp_adc_get_devicetree_data(pdev, iadc->adc);
1504 if (rc) {
1505 dev_err(&pdev->dev, "failed to read device tree\n");
1506 return rc;
1507 }
1508
1509 rc = of_property_read_u32(pdev->dev.of_node, "batt-id-trim-cnst-rds",
1510 &base);
1511 if (rc < 0) {
1512 dev_err(&pdev->dev,
1513 "Couldn't find batt-id-trim-cnst-rds in node = %s rc = %d\n",
1514 pdev->dev.of_node->full_name, rc);
1515 return rc;
1516 }
1517 iadc->batt_id_trim_cnst_rds = base;
1518 rc = of_property_read_u32(node, "qcom,use-default-rds-trim",
1519 &iadc->rds_trim_default_type);
1520 if (rc)
1521 pr_debug("No trim workaround needed\n");
1522 else {
1523 pr_debug("Use internal RDS trim workaround\n");
1524 iadc->rds_trim_default_check = true;
1525 }
1526
1527 iadc->vadc_dev = qpnp_get_vadc(&pdev->dev, "iadc");
1528 if (IS_ERR(iadc->vadc_dev)) {
1529 rc = PTR_ERR(iadc->vadc_dev);
1530 if (rc != -EPROBE_DEFER)
1531 pr_err("vadc property missing, rc=%d\n", rc);
1532 return rc;
1533 }
1534
1535 mutex_init(&iadc->adc->adc_lock);
1536
1537 rc = of_property_read_u32(node, "qcom,rsense",
1538 &iadc->rsense);
1539 if (rc)
1540 pr_debug("Defaulting to internal rsense\n");
1541 else {
1542 pr_debug("Use external rsense\n");
1543 iadc->external_rsense = true;
1544 }
1545
1546 iadc->iadc_poll_eoc = of_property_read_bool(node,
1547 "qcom,iadc-poll-eoc");
1548 if (!iadc->iadc_poll_eoc) {
1549 rc = devm_request_irq(&pdev->dev, iadc->adc->adc_irq_eoc,
1550 qpnp_iadc_isr, IRQF_TRIGGER_RISING,
1551 "qpnp_iadc_interrupt", iadc);
1552 if (rc) {
1553 dev_err(&pdev->dev, "failed to request adc irq\n");
1554 return rc;
1555 }
1556 enable_irq_wake(iadc->adc->adc_irq_eoc);
1557 }
1558
1559 rc = qpnp_iadc_init_hwmon(iadc, pdev);
1560 if (rc) {
1561 dev_err(&pdev->dev, "failed to initialize qpnp hwmon adc\n");
1562 return rc;
1563 }
1564 iadc->iadc_hwmon = hwmon_device_register(&iadc->adc->pdev->dev);
1565
1566 rc = qpnp_iadc_version_check(iadc);
1567 if (rc) {
1568 dev_err(&pdev->dev, "IADC version not supported\n");
1569 goto fail;
1570 }
1571
1572 iadc->max_channels_available = count_adc_channel_list;
1573 INIT_WORK(&iadc->trigger_completion_work, qpnp_iadc_trigger_completion);
1574 INIT_DELAYED_WORK(&iadc->iadc_work, qpnp_iadc_work);
1575 rc = qpnp_iadc_comp_info(iadc);
1576 if (rc) {
1577 dev_err(&pdev->dev, "abstracting IADC comp info failed!\n");
1578 goto fail;
1579 }
1580
1581 rc = qpnp_iadc_rds_trim_update_check(iadc);
1582 if (rc) {
1583 dev_err(&pdev->dev, "Rds trim update failed!\n");
1584 goto fail;
1585 }
1586
1587 dev_set_drvdata(&pdev->dev, iadc);
1588 list_add(&iadc->list, &qpnp_iadc_device_list);
1589 rc = qpnp_iadc_calibrate_for_trim(iadc, true);
1590 if (rc)
1591 dev_err(&pdev->dev, "failed to calibrate for USR trim\n");
1592
1593 if (iadc->iadc_poll_eoc)
1594 device_init_wakeup(iadc->dev, 1);
1595
1596 schedule_delayed_work(&iadc->iadc_work,
1597 round_jiffies_relative(msecs_to_jiffies
1598 (QPNP_IADC_CALIB_SECONDS)));
1599 return 0;
1600fail:
1601 for_each_child_of_node(node, child) {
1602 device_remove_file(&pdev->dev, &iadc->sens_attr[i].dev_attr);
1603 i++;
1604 }
1605 hwmon_device_unregister(iadc->iadc_hwmon);
1606
1607 return rc;
1608}
1609
1610static int qpnp_iadc_remove(struct platform_device *pdev)
1611{
1612 struct qpnp_iadc_chip *iadc = dev_get_drvdata(&pdev->dev);
1613 struct device_node *node = pdev->dev.of_node;
1614 struct device_node *child;
1615 int i = 0;
1616
1617 cancel_delayed_work(&iadc->iadc_work);
1618 for_each_child_of_node(node, child) {
1619 device_remove_file(&pdev->dev, &iadc->sens_attr[i].dev_attr);
1620 i++;
1621 }
1622 hwmon_device_unregister(iadc->iadc_hwmon);
1623 if (iadc->iadc_poll_eoc)
1624 pm_relax(iadc->dev);
1625 dev_set_drvdata(&pdev->dev, NULL);
1626
1627 return 0;
1628}
1629
1630static const struct of_device_id qpnp_iadc_match_table[] = {
1631 { .compatible = "qcom,qpnp-iadc",
1632 },
1633 {}
1634};
1635
1636static struct platform_driver qpnp_iadc_driver = {
1637 .driver = {
1638 .name = "qcom,qpnp-iadc",
1639 .of_match_table = qpnp_iadc_match_table,
1640 },
1641 .probe = qpnp_iadc_probe,
1642 .remove = qpnp_iadc_remove,
1643};
1644
1645static int __init qpnp_iadc_init(void)
1646{
1647 return platform_driver_register(&qpnp_iadc_driver);
1648}
1649module_init(qpnp_iadc_init);
1650
1651static void __exit qpnp_iadc_exit(void)
1652{
1653 platform_driver_unregister(&qpnp_iadc_driver);
1654}
1655module_exit(qpnp_iadc_exit);
1656
1657MODULE_DESCRIPTION("QPNP PMIC current ADC driver");
1658MODULE_LICENSE("GPL v2");