blob: ba733a8fda849c236437c10e0401fecb9cd9c1b0 [file] [log] [blame]
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301/* Copyright (c) 2018 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) "QG-K: %s: " fmt, __func__
14
15#include <linux/alarmtimer.h>
16#include <linux/cdev.h>
17#include <linux/device.h>
18#include <linux/interrupt.h>
19#include <linux/ktime.h>
20#include <linux/module.h>
21#include <linux/of.h>
22#include <linux/of_irq.h>
23#include <linux/of_batterydata.h>
24#include <linux/platform_device.h>
25#include <linux/power_supply.h>
26#include <linux/regmap.h>
27#include <linux/uaccess.h>
28#include <linux/pmic-voter.h>
29#include <linux/qpnp/qpnp-adc.h>
30#include <uapi/linux/qg.h>
31#include "qg-sdam.h"
32#include "qg-core.h"
33#include "qg-reg.h"
34#include "qg-util.h"
35#include "qg-soc.h"
36#include "qg-battery-profile.h"
37#include "qg-defs.h"
38
39static int qg_debug_mask;
40module_param_named(
41 debug_mask, qg_debug_mask, int, 0600
42);
43
44static int qg_get_battery_temp(struct qpnp_qg *chip, int *batt_temp);
45
46static bool is_battery_present(struct qpnp_qg *chip)
47{
48 u8 reg = 0;
49 int rc;
50
51 rc = qg_read(chip, chip->qg_base + QG_STATUS1_REG, &reg, 1);
52 if (rc < 0)
53 pr_err("Failed to read battery presence, rc=%d\n", rc);
54
55 return !!(reg & BATTERY_PRESENT_BIT);
56}
57
58#define DEBUG_BATT_ID_LOW 6000
59#define DEBUG_BATT_ID_HIGH 8500
60static bool is_debug_batt_id(struct qpnp_qg *chip)
61{
62 if (is_between(DEBUG_BATT_ID_LOW, DEBUG_BATT_ID_HIGH,
63 chip->batt_id_ohm))
64 return true;
65
66 return false;
67}
68
69static int qg_read_ocv(struct qpnp_qg *chip, u32 *ocv_uv, u8 type)
70{
71 int rc, addr;
72 u64 temp = 0;
73
74 switch (type) {
75 case GOOD_OCV:
76 addr = QG_S3_GOOD_OCV_V_DATA0_REG;
77 break;
78 case PON_OCV:
79 addr = QG_S7_PON_OCV_V_DATA0_REG;
80 break;
81 default:
82 pr_err("Invalid OCV type %d\n", type);
83 return -EINVAL;
84 }
85
86 rc = qg_read(chip, chip->qg_base + addr, (u8 *)&temp, 2);
87 if (rc < 0) {
88 pr_err("Failed to read ocv, rc=%d\n", rc);
89 return rc;
90 }
91
92 *ocv_uv = V_RAW_TO_UV(temp);
93
94 pr_debug("%s: OCV=%duV\n",
95 type == GOOD_OCV ? "GOOD_OCV" : "PON_OCV", *ocv_uv);
96
97 return rc;
98}
99
100static int qg_update_fifo_length(struct qpnp_qg *chip, u8 length)
101{
102 int rc;
103
104 if (!length || length > 8) {
105 pr_err("Invalid FIFO length %d\n", length);
106 return -EINVAL;
107 }
108
109 rc = qg_masked_write(chip, chip->qg_base + QG_S2_NORMAL_MEAS_CTL2_REG,
110 FIFO_LENGTH_MASK, (length - 1) << FIFO_LENGTH_SHIFT);
111 if (rc < 0)
112 pr_err("Failed to write S2 FIFO length, rc=%d\n", rc);
113
114 return rc;
115}
116
117static int qg_master_hold(struct qpnp_qg *chip, bool hold)
118{
119 int rc;
120
121 /* clear the master */
122 rc = qg_masked_write(chip, chip->qg_base + QG_DATA_CTL1_REG,
123 MASTER_HOLD_OR_CLR_BIT, 0);
124 if (rc < 0)
125 return rc;
126
127 if (hold) {
128 /* 0 -> 1, hold the master */
129 rc = qg_masked_write(chip, chip->qg_base + QG_DATA_CTL1_REG,
130 MASTER_HOLD_OR_CLR_BIT,
131 MASTER_HOLD_OR_CLR_BIT);
132 if (rc < 0)
133 return rc;
134 }
135
136 qg_dbg(chip, QG_DEBUG_STATUS, "Master hold = %d\n", hold);
137
138 return rc;
139}
140
141static void qg_notify_charger(struct qpnp_qg *chip)
142{
143 union power_supply_propval prop = {0, };
144 int rc;
145
146 if (!chip->batt_psy)
147 return;
148
149 if (is_debug_batt_id(chip)) {
150 prop.intval = 1;
151 power_supply_set_property(chip->batt_psy,
152 POWER_SUPPLY_PROP_DEBUG_BATTERY, &prop);
153 return;
154 }
155
156 if (!chip->profile_loaded)
157 return;
158
159 prop.intval = chip->bp.float_volt_uv;
160 rc = power_supply_set_property(chip->batt_psy,
161 POWER_SUPPLY_PROP_VOLTAGE_MAX, &prop);
162 if (rc < 0) {
163 pr_err("Failed to set voltage_max property on batt_psy, rc=%d\n",
164 rc);
165 return;
166 }
167
168 prop.intval = chip->bp.fastchg_curr_ma * 1000;
169 rc = power_supply_set_property(chip->batt_psy,
170 POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX, &prop);
171 if (rc < 0) {
172 pr_err("Failed to set constant_charge_current_max property on batt_psy, rc=%d\n",
173 rc);
174 return;
175 }
176
177 pr_debug("Notified charger on float voltage and FCC\n");
178}
179
180static bool is_batt_available(struct qpnp_qg *chip)
181{
182 if (chip->batt_psy)
183 return true;
184
185 chip->batt_psy = power_supply_get_by_name("battery");
186 if (!chip->batt_psy)
187 return false;
188
189 /* batt_psy is initialized, set the fcc and fv */
190 qg_notify_charger(chip);
191
192 return true;
193}
194
195static int qg_update_sdam_params(struct qpnp_qg *chip)
196{
197 int rc, batt_temp = 0, i;
198 unsigned long rtc_sec = 0;
199
200 rc = get_rtc_time(&rtc_sec);
201 if (rc < 0)
202 pr_err("Failed to get RTC time, rc=%d\n", rc);
203 else
204 chip->sdam_data[SDAM_TIME_SEC] = rtc_sec;
205
206 rc = qg_get_battery_temp(chip, &batt_temp);
207 if (rc < 0)
208 pr_err("Failed to get battery-temp, rc = %d\n", rc);
209 else
210 chip->sdam_data[SDAM_TEMP] = (u32)batt_temp;
211
212 rc = qg_sdam_write_all(chip->sdam_data);
213 if (rc < 0)
214 pr_err("Failed to write to SDAM rc=%d\n", rc);
215
216 for (i = 0; i < SDAM_MAX; i++)
217 qg_dbg(chip, QG_DEBUG_STATUS, "SDAM write param %d value=%d\n",
218 i, chip->sdam_data[i]);
219
220 return rc;
221}
222
223static int qg_process_fifo(struct qpnp_qg *chip, u32 fifo_length)
224{
225 int rc = 0, i, j = 0, temp;
226 u8 v_fifo[MAX_FIFO_LENGTH * 2], i_fifo[MAX_FIFO_LENGTH * 2];
227 u32 sample_interval = 0, sample_count = 0, fifo_v = 0, fifo_i = 0;
228
Anirudh Ghayal07fbf792018-02-26 11:38:33 +0530229 chip->kdata.fifo_time = (u32)ktime_get_seconds();
230
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +0530231 if (!fifo_length) {
232 pr_debug("No FIFO data\n");
233 return 0;
234 }
235
236 qg_dbg(chip, QG_DEBUG_FIFO, "FIFO length=%d\n", fifo_length);
237
238 rc = get_sample_interval(chip, &sample_interval);
239 if (rc < 0) {
240 pr_err("Failed to get FIFO sample interval, rc=%d\n", rc);
241 return rc;
242 }
243
244 rc = get_sample_count(chip, &sample_count);
245 if (rc < 0) {
246 pr_err("Failed to get FIFO sample count, rc=%d\n", rc);
247 return rc;
248 }
249
Anirudh Ghayalc6096392018-03-07 19:57:05 +0530250 /*
251 * If there is pending data from suspend, append the new FIFO
252 * data to it.
253 */
254 if (chip->suspend_data) {
255 j = chip->kdata.fifo_length; /* append the data */
256 chip->suspend_data = false;
257 qg_dbg(chip, QG_DEBUG_FIFO,
258 "Pending suspend-data FIFO length=%d\n", j);
259 } else {
260 /* clear any old pending data */
261 chip->kdata.fifo_length = 0;
262 }
263
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +0530264 for (i = 0; i < fifo_length * 2; i = i + 2, j++) {
265 rc = qg_read(chip, chip->qg_base + QG_V_FIFO0_DATA0_REG + i,
266 &v_fifo[i], 2);
267 if (rc < 0) {
268 pr_err("Failed to read QG_V_FIFO, rc=%d\n", rc);
269 return rc;
270 }
271 rc = qg_read(chip, chip->qg_base + QG_I_FIFO0_DATA0_REG + i,
272 &i_fifo[i], 2);
273 if (rc < 0) {
274 pr_err("Failed to read QG_I_FIFO, rc=%d\n", rc);
275 return rc;
276 }
277
278 fifo_v = v_fifo[i] | (v_fifo[i + 1] << 8);
279 fifo_i = i_fifo[i] | (i_fifo[i + 1] << 8);
280
281 temp = sign_extend32(fifo_i, 15);
282
283 chip->kdata.fifo[j].v = V_RAW_TO_UV(fifo_v);
284 chip->kdata.fifo[j].i = I_RAW_TO_UA(temp);
285 chip->kdata.fifo[j].interval = sample_interval;
286 chip->kdata.fifo[j].count = sample_count;
287
288 qg_dbg(chip, QG_DEBUG_FIFO, "FIFO %d raw_v=%d uV=%d raw_i=%d uA=%d interval=%d count=%d\n",
289 j, fifo_v,
290 chip->kdata.fifo[j].v,
291 fifo_i,
292 (int)chip->kdata.fifo[j].i,
293 chip->kdata.fifo[j].interval,
294 chip->kdata.fifo[j].count);
295 }
296
Anirudh Ghayalc6096392018-03-07 19:57:05 +0530297 chip->kdata.fifo_length += fifo_length;
Anirudh Ghayal07fbf792018-02-26 11:38:33 +0530298 chip->kdata.seq_no = chip->seq_no++ % U32_MAX;
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +0530299
300 return rc;
301}
302
303static int qg_process_accumulator(struct qpnp_qg *chip)
304{
305 int rc, sample_interval = 0;
306 u8 count, index = chip->kdata.fifo_length;
307 u64 acc_v = 0, acc_i = 0;
308 s64 temp = 0;
309
310 rc = qg_read(chip, chip->qg_base + QG_ACCUM_CNT_RT_REG,
311 &count, 1);
312 if (rc < 0) {
313 pr_err("Failed to read ACC count, rc=%d\n", rc);
314 return rc;
315 }
316
317 if (!count) {
318 pr_debug("No ACCUMULATOR data!\n");
319 return 0;
320 }
321
322 rc = get_sample_interval(chip, &sample_interval);
323 if (rc < 0) {
324 pr_err("Failed to get ACC sample interval, rc=%d\n", rc);
325 return 0;
326 }
327
328 rc = qg_read(chip, chip->qg_base + QG_V_ACCUM_DATA0_RT_REG,
329 (u8 *)&acc_v, 3);
330 if (rc < 0) {
331 pr_err("Failed to read ACC RT V data, rc=%d\n", rc);
332 return rc;
333 }
334
335 rc = qg_read(chip, chip->qg_base + QG_I_ACCUM_DATA0_RT_REG,
336 (u8 *)&acc_i, 3);
337 if (rc < 0) {
338 pr_err("Failed to read ACC RT I data, rc=%d\n", rc);
339 return rc;
340 }
341
342 temp = sign_extend64(acc_i, 23);
343
344 chip->kdata.fifo[index].v = V_RAW_TO_UV(div_u64(acc_v, count));
345 chip->kdata.fifo[index].i = I_RAW_TO_UA(div_s64(temp, count));
346 chip->kdata.fifo[index].interval = sample_interval;
347 chip->kdata.fifo[index].count = count;
348 chip->kdata.fifo_length++;
349
Anirudh Ghayal07fbf792018-02-26 11:38:33 +0530350 if (chip->kdata.fifo_length == 1) /* Only accumulator data */
351 chip->kdata.seq_no = chip->seq_no++ % U32_MAX;
352
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +0530353 qg_dbg(chip, QG_DEBUG_FIFO, "ACC v_avg=%duV i_avg=%duA interval=%d count=%d\n",
354 chip->kdata.fifo[index].v,
355 (int)chip->kdata.fifo[index].i,
356 chip->kdata.fifo[index].interval,
357 chip->kdata.fifo[index].count);
358
359 return rc;
360}
361
362static int qg_process_rt_fifo(struct qpnp_qg *chip)
363{
364 int rc;
365 u32 fifo_length = 0;
366
367 /* Get the real-time FIFO length */
368 rc = get_fifo_length(chip, &fifo_length, true);
369 if (rc < 0) {
370 pr_err("Failed to read RT FIFO length, rc=%d\n", rc);
371 return rc;
372 }
373
374 rc = qg_process_fifo(chip, fifo_length);
375 if (rc < 0) {
376 pr_err("Failed to process FIFO data, rc=%d\n", rc);
377 return rc;
378 }
379
380 rc = qg_process_accumulator(chip);
381 if (rc < 0) {
382 pr_err("Failed to process ACC data, rc=%d\n", rc);
383 return rc;
384 }
385
386 return rc;
387}
388
389#define VBAT_LOW_HYST_UV 50000 /* 50mV */
390static int qg_vbat_low_wa(struct qpnp_qg *chip)
391{
392 int rc, i;
393 u32 vbat_low_uv = chip->dt.vbatt_low_mv * 1000 + VBAT_LOW_HYST_UV;
394
395 if (!(chip->wa_flags & QG_VBAT_LOW_WA) || !chip->vbat_low)
396 return 0;
397
398 /*
399 * PMI632 1.0 does not generate a falling VBAT_LOW IRQ.
400 * To exit from VBAT_LOW config, check if any of the FIFO
401 * averages is > vbat_low threshold and reconfigure the
402 * FIFO length to normal.
403 */
404 for (i = 0; i < chip->kdata.fifo_length; i++) {
405 if (chip->kdata.fifo[i].v > vbat_low_uv) {
406 rc = qg_master_hold(chip, true);
407 if (rc < 0) {
408 pr_err("Failed to hold master, rc=%d\n", rc);
409 goto done;
410 }
411 rc = qg_update_fifo_length(chip,
412 chip->dt.s2_fifo_length);
413 if (rc < 0)
414 goto done;
415
416 rc = qg_master_hold(chip, false);
417 if (rc < 0) {
418 pr_err("Failed to release master, rc=%d\n", rc);
419 goto done;
420 }
421 /* FIFOs restarted */
422 chip->last_fifo_update_time = ktime_get();
423
424 chip->vbat_low = false;
425 pr_info("Exit VBAT_LOW vbat_avg=%duV vbat_low=%duV updated fifo_length=%d\n",
426 chip->kdata.fifo[i].v, vbat_low_uv,
427 chip->dt.s2_fifo_length);
428 break;
429 }
430 }
431
432 return 0;
433
434done:
435 qg_master_hold(chip, false);
436 return rc;
437}
438
439#define MIN_FIFO_FULL_TIME_MS 12000
440static int process_rt_fifo_data(struct qpnp_qg *chip,
441 bool vbat_low, bool update_smb)
442{
443 int rc = 0;
444 ktime_t now = ktime_get();
445 s64 time_delta;
446
447 /*
448 * Reject the FIFO read event if there are back-to-back requests
449 * This is done to gaurantee that there is always a minimum FIFO
450 * data to be processed, ignore this if vbat_low is set.
451 */
452 time_delta = ktime_ms_delta(now, chip->last_user_update_time);
453
454 qg_dbg(chip, QG_DEBUG_FIFO, "time_delta=%lld ms vbat_low=%d\n",
455 time_delta, vbat_low);
456
457 if (time_delta > MIN_FIFO_FULL_TIME_MS || vbat_low || update_smb) {
458 rc = qg_master_hold(chip, true);
459 if (rc < 0) {
460 pr_err("Failed to hold master, rc=%d\n", rc);
461 goto done;
462 }
463
464 rc = qg_process_rt_fifo(chip);
465 if (rc < 0) {
466 pr_err("Failed to process FIFO real-time, rc=%d\n", rc);
467 goto done;
468 }
469
470 if (vbat_low) {
471 /* change FIFO length */
472 rc = qg_update_fifo_length(chip,
473 chip->dt.s2_vbat_low_fifo_length);
474 if (rc < 0)
475 goto done;
476
477 qg_dbg(chip, QG_DEBUG_STATUS,
478 "FIFO length updated to %d vbat_low=%d\n",
479 chip->dt.s2_vbat_low_fifo_length,
480 vbat_low);
481 }
482
483 if (update_smb) {
484 rc = qg_masked_write(chip, chip->qg_base +
485 QG_MODE_CTL1_REG, PARALLEL_IBAT_SENSE_EN_BIT,
486 chip->parallel_enabled ?
487 PARALLEL_IBAT_SENSE_EN_BIT : 0);
488 if (rc < 0) {
489 pr_err("Failed to update SMB_EN, rc=%d\n", rc);
490 goto done;
491 }
492 qg_dbg(chip, QG_DEBUG_STATUS, "Parallel SENSE %d\n",
493 chip->parallel_enabled);
494 }
495
496 rc = qg_master_hold(chip, false);
497 if (rc < 0) {
498 pr_err("Failed to release master, rc=%d\n", rc);
499 goto done;
500 }
501 /* FIFOs restarted */
502 chip->last_fifo_update_time = ktime_get();
503
504 /* signal the read thread */
505 chip->data_ready = true;
506 wake_up_interruptible(&chip->qg_wait_q);
507 chip->last_user_update_time = now;
508
509 /* vote to stay awake until userspace reads data */
510 vote(chip->awake_votable, FIFO_RT_DONE_VOTER, true, 0);
511 } else {
512 qg_dbg(chip, QG_DEBUG_FIFO, "FIFO processing too early time_delta=%lld\n",
513 time_delta);
514 }
515done:
516 qg_master_hold(chip, false);
517 return rc;
518}
519
520static void process_udata_work(struct work_struct *work)
521{
522 struct qpnp_qg *chip = container_of(work,
523 struct qpnp_qg, udata_work);
524 int rc;
525
526 if (chip->udata.param[QG_SOC].valid) {
527 qg_dbg(chip, QG_DEBUG_SOC, "udata SOC=%d last SOC=%d\n",
528 chip->udata.param[QG_SOC].data, chip->catch_up_soc);
529
Anirudh Ghayal07fbf792018-02-26 11:38:33 +0530530 chip->catch_up_soc = chip->udata.param[QG_SOC].data;
531 qg_scale_soc(chip, false);
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +0530532
533 /* update parameters to SDAM */
Vamshi Krishna B V25855802018-02-21 15:26:30 +0530534 chip->sdam_data[SDAM_SOC] = chip->msoc;
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +0530535 chip->sdam_data[SDAM_OCV_UV] =
536 chip->udata.param[QG_OCV_UV].data;
537 chip->sdam_data[SDAM_RBAT_MOHM] =
538 chip->udata.param[QG_RBAT_MOHM].data;
539 chip->sdam_data[SDAM_VALID] = 1;
540
541 rc = qg_update_sdam_params(chip);
542 if (rc < 0)
543 pr_err("Failed to update SDAM params, rc=%d\n", rc);
544 }
545
Anirudh Ghayal07fbf792018-02-26 11:38:33 +0530546 if (chip->udata.param[QG_CHARGE_COUNTER].valid)
547 chip->charge_counter_uah =
548 chip->udata.param[QG_CHARGE_COUNTER].data;
549
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +0530550 vote(chip->awake_votable, UDATA_READY_VOTER, false, 0);
551}
552
553static irqreturn_t qg_default_irq_handler(int irq, void *data)
554{
555 struct qpnp_qg *chip = data;
556
557 qg_dbg(chip, QG_DEBUG_IRQ, "IRQ triggered\n");
558
559 return IRQ_HANDLED;
560}
561
562#define MAX_FIFO_DELTA_PERCENT 10
563static irqreturn_t qg_fifo_update_done_handler(int irq, void *data)
564{
565 ktime_t now = ktime_get();
566 int rc, hw_delta_ms = 0, margin_ms = 0;
567 u32 fifo_length = 0;
568 s64 time_delta_ms = 0;
569 struct qpnp_qg *chip = data;
570
571 time_delta_ms = ktime_ms_delta(now, chip->last_fifo_update_time);
572 chip->last_fifo_update_time = now;
573
574 qg_dbg(chip, QG_DEBUG_IRQ, "IRQ triggered\n");
575 mutex_lock(&chip->data_lock);
576
577 rc = get_fifo_length(chip, &fifo_length, false);
578 if (rc < 0) {
579 pr_err("Failed to get FIFO length, rc=%d\n", rc);
580 goto done;
581 }
582
583 rc = qg_process_fifo(chip, fifo_length);
584 if (rc < 0) {
585 pr_err("Failed to process QG FIFO, rc=%d\n", rc);
586 goto done;
587 }
588
589 rc = qg_vbat_low_wa(chip);
590 if (rc < 0) {
591 pr_err("Failed to apply VBAT LOW WA, rc=%d\n", rc);
592 goto done;
593 }
594
595 rc = get_fifo_done_time(chip, false, &hw_delta_ms);
596 if (rc < 0)
597 hw_delta_ms = 0;
598 else
599 margin_ms = (hw_delta_ms * MAX_FIFO_DELTA_PERCENT) / 100;
600
601 if (abs(hw_delta_ms - time_delta_ms) < margin_ms) {
602 chip->kdata.param[QG_FIFO_TIME_DELTA].data = time_delta_ms;
603 chip->kdata.param[QG_FIFO_TIME_DELTA].valid = true;
604 qg_dbg(chip, QG_DEBUG_FIFO, "FIFO_done time_delta_ms=%lld\n",
605 time_delta_ms);
606 }
607
608 /* signal the read thread */
609 chip->data_ready = true;
610 wake_up_interruptible(&chip->qg_wait_q);
611
612 /* vote to stay awake until userspace reads data */
613 vote(chip->awake_votable, FIFO_DONE_VOTER, true, 0);
614
615done:
616 mutex_unlock(&chip->data_lock);
617 return IRQ_HANDLED;
618}
619
620static irqreturn_t qg_vbat_low_handler(int irq, void *data)
621{
622 int rc;
623 struct qpnp_qg *chip = data;
624 u8 status = 0;
625
626 qg_dbg(chip, QG_DEBUG_IRQ, "IRQ triggered\n");
627 mutex_lock(&chip->data_lock);
628
629 rc = qg_read(chip, chip->qg_base + QG_INT_RT_STS_REG, &status, 1);
630 if (rc < 0) {
631 pr_err("Failed to read RT status, rc=%d\n", rc);
632 goto done;
633 }
634 chip->vbat_low = !!(status & VBAT_LOW_INT_RT_STS_BIT);
635
636 rc = process_rt_fifo_data(chip, chip->vbat_low, false);
637 if (rc < 0)
638 pr_err("Failed to process RT FIFO data, rc=%d\n", rc);
639
640 qg_dbg(chip, QG_DEBUG_IRQ, "VBAT_LOW = %d\n", chip->vbat_low);
641done:
642 mutex_unlock(&chip->data_lock);
643 return IRQ_HANDLED;
644}
645
646static irqreturn_t qg_vbat_empty_handler(int irq, void *data)
647{
648 struct qpnp_qg *chip = data;
649 u32 ocv_uv = 0;
650
651 qg_dbg(chip, QG_DEBUG_IRQ, "IRQ triggered\n");
652 pr_warn("VBATT EMPTY SOC = 0\n");
653
654 chip->catch_up_soc = 0;
655 qg_scale_soc(chip, true);
656
657 qg_sdam_read(SDAM_OCV_UV, &ocv_uv);
658 chip->sdam_data[SDAM_SOC] = 0;
659 chip->sdam_data[SDAM_OCV_UV] = ocv_uv;
660 chip->sdam_data[SDAM_VALID] = 1;
661
662 qg_update_sdam_params(chip);
663
664 if (chip->qg_psy)
665 power_supply_changed(chip->qg_psy);
666
667 return IRQ_HANDLED;
668}
669
670static irqreturn_t qg_good_ocv_handler(int irq, void *data)
671{
672 int rc;
Anirudh Ghayale4923382018-03-11 20:32:10 +0530673 u8 status = 0;
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +0530674 u32 ocv_uv;
675 struct qpnp_qg *chip = data;
676
677 qg_dbg(chip, QG_DEBUG_IRQ, "IRQ triggered\n");
678
679 mutex_lock(&chip->data_lock);
680
Anirudh Ghayale4923382018-03-11 20:32:10 +0530681 rc = qg_read(chip, chip->qg_base + QG_STATUS2_REG, &status, 1);
682 if (rc < 0) {
683 pr_err("Failed to read status2 register rc=%d\n", rc);
684 goto done;
685 }
686
687 if (!(status & GOOD_OCV_BIT))
688 goto done;
689
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +0530690 rc = qg_read_ocv(chip, &ocv_uv, GOOD_OCV);
691 if (rc < 0) {
692 pr_err("Failed to read good_ocv, rc=%d\n", rc);
693 goto done;
694 }
695
696 chip->kdata.param[QG_GOOD_OCV_UV].data = ocv_uv;
697 chip->kdata.param[QG_GOOD_OCV_UV].valid = true;
698
699 vote(chip->awake_votable, GOOD_OCV_VOTER, true, 0);
700
701 /* signal the readd thread */
702 chip->data_ready = true;
703 wake_up_interruptible(&chip->qg_wait_q);
704done:
705 mutex_unlock(&chip->data_lock);
706 return IRQ_HANDLED;
707}
708
709static struct qg_irq_info qg_irqs[] = {
710 [QG_BATT_MISSING_IRQ] = {
711 .name = "qg-batt-missing",
712 .handler = qg_default_irq_handler,
713 },
714 [QG_VBATT_LOW_IRQ] = {
715 .name = "qg-vbat-low",
716 .handler = qg_vbat_low_handler,
717 .wake = true,
718 },
719 [QG_VBATT_EMPTY_IRQ] = {
720 .name = "qg-vbat-empty",
721 .handler = qg_vbat_empty_handler,
722 .wake = true,
723 },
724 [QG_FIFO_UPDATE_DONE_IRQ] = {
725 .name = "qg-fifo-done",
726 .handler = qg_fifo_update_done_handler,
727 .wake = true,
728 },
729 [QG_GOOD_OCV_IRQ] = {
730 .name = "qg-good-ocv",
731 .handler = qg_good_ocv_handler,
732 .wake = true,
733 },
734 [QG_FSM_STAT_CHG_IRQ] = {
735 .name = "qg-fsm-state-chg",
736 .handler = qg_default_irq_handler,
737 },
738 [QG_EVENT_IRQ] = {
739 .name = "qg-event",
740 .handler = qg_default_irq_handler,
741 },
742};
743
744static int qg_awake_cb(struct votable *votable, void *data, int awake,
745 const char *client)
746{
747 struct qpnp_qg *chip = data;
748
Anirudh Ghayale4923382018-03-11 20:32:10 +0530749 /* ignore if the QG device is not open */
750 if (!chip->qg_device_open)
751 return 0;
752
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +0530753 if (awake)
754 pm_stay_awake(chip->dev);
755 else
756 pm_relax(chip->dev);
757
758 pr_debug("client: %s awake: %d\n", client, awake);
759 return 0;
760}
761
762static int qg_fifo_irq_disable_cb(struct votable *votable, void *data,
763 int disable, const char *client)
764{
765 if (disable) {
766 if (qg_irqs[QG_FIFO_UPDATE_DONE_IRQ].wake)
767 disable_irq_wake(
768 qg_irqs[QG_FIFO_UPDATE_DONE_IRQ].irq);
769 if (qg_irqs[QG_FIFO_UPDATE_DONE_IRQ].irq)
770 disable_irq_nosync(
771 qg_irqs[QG_FIFO_UPDATE_DONE_IRQ].irq);
772 } else {
773 if (qg_irqs[QG_FIFO_UPDATE_DONE_IRQ].irq)
774 enable_irq(qg_irqs[QG_FIFO_UPDATE_DONE_IRQ].irq);
775 if (qg_irqs[QG_FIFO_UPDATE_DONE_IRQ].wake)
776 enable_irq_wake(
777 qg_irqs[QG_FIFO_UPDATE_DONE_IRQ].irq);
778 }
779
780 return 0;
781}
782
783static int qg_vbatt_irq_disable_cb(struct votable *votable, void *data,
784 int disable, const char *client)
785{
786 if (disable) {
787 if (qg_irqs[QG_VBATT_LOW_IRQ].wake)
788 disable_irq_wake(qg_irqs[QG_VBATT_LOW_IRQ].irq);
789 if (qg_irqs[QG_VBATT_EMPTY_IRQ].wake)
790 disable_irq_wake(qg_irqs[QG_VBATT_EMPTY_IRQ].irq);
791 if (qg_irqs[QG_VBATT_LOW_IRQ].irq)
792 disable_irq_nosync(qg_irqs[QG_VBATT_LOW_IRQ].irq);
793 if (qg_irqs[QG_VBATT_EMPTY_IRQ].irq)
794 disable_irq_nosync(qg_irqs[QG_VBATT_EMPTY_IRQ].irq);
795 } else {
796 if (qg_irqs[QG_VBATT_LOW_IRQ].irq)
797 enable_irq(qg_irqs[QG_VBATT_LOW_IRQ].irq);
798 if (qg_irqs[QG_VBATT_EMPTY_IRQ].irq)
799 enable_irq(qg_irqs[QG_VBATT_EMPTY_IRQ].irq);
800 if (qg_irqs[QG_VBATT_LOW_IRQ].wake)
801 enable_irq_wake(qg_irqs[QG_VBATT_LOW_IRQ].irq);
802 if (qg_irqs[QG_VBATT_EMPTY_IRQ].wake)
803 enable_irq_wake(qg_irqs[QG_VBATT_EMPTY_IRQ].irq);
804 }
805
806 return 0;
807}
808
809static int qg_good_ocv_irq_disable_cb(struct votable *votable, void *data,
810 int disable, const char *client)
811{
812 if (disable) {
813 if (qg_irqs[QG_GOOD_OCV_IRQ].wake)
814 disable_irq_wake(qg_irqs[QG_GOOD_OCV_IRQ].irq);
815 if (qg_irqs[QG_GOOD_OCV_IRQ].irq)
816 disable_irq_nosync(qg_irqs[QG_GOOD_OCV_IRQ].irq);
817 } else {
818 if (qg_irqs[QG_GOOD_OCV_IRQ].irq)
819 enable_irq(qg_irqs[QG_GOOD_OCV_IRQ].irq);
820 if (qg_irqs[QG_GOOD_OCV_IRQ].wake)
821 enable_irq_wake(qg_irqs[QG_GOOD_OCV_IRQ].irq);
822 }
823
824 return 0;
825}
826
827#define DEFAULT_BATT_TYPE "Unknown Battery"
828#define MISSING_BATT_TYPE "Missing Battery"
829#define DEBUG_BATT_TYPE "Debug Board"
830static const char *qg_get_battery_type(struct qpnp_qg *chip)
831{
832 if (chip->battery_missing)
833 return MISSING_BATT_TYPE;
834
835 if (is_debug_batt_id(chip))
836 return DEBUG_BATT_TYPE;
837
838 if (chip->bp.batt_type_str) {
839 if (chip->profile_loaded)
840 return chip->bp.batt_type_str;
841 }
842
843 return DEFAULT_BATT_TYPE;
844}
845
846static int qg_get_battery_current(struct qpnp_qg *chip, int *ibat_ua)
847{
848 int rc = 0, last_ibat = 0;
849
850 if (chip->battery_missing) {
851 *ibat_ua = 0;
852 return 0;
853 }
854
855 rc = qg_read(chip, chip->qg_base + QG_LAST_ADC_I_DATA0_REG,
856 (u8 *)&last_ibat, 2);
857 if (rc < 0) {
858 pr_err("Failed to read LAST_ADV_I reg, rc=%d\n", rc);
859 return rc;
860 }
861
862 last_ibat = sign_extend32(last_ibat, 15);
863 *ibat_ua = I_RAW_TO_UA(last_ibat);
864
865 return rc;
866}
867
868static int qg_get_battery_voltage(struct qpnp_qg *chip, int *vbat_uv)
869{
870 int rc = 0;
871 u64 last_vbat = 0;
872
873 if (chip->battery_missing) {
874 *vbat_uv = 3700000;
875 return 0;
876 }
877
878 rc = qg_read(chip, chip->qg_base + QG_LAST_ADC_V_DATA0_REG,
879 (u8 *)&last_vbat, 2);
880 if (rc < 0) {
881 pr_err("Failed to read LAST_ADV_V reg, rc=%d\n", rc);
882 return rc;
883 }
884
885 *vbat_uv = V_RAW_TO_UV(last_vbat);
886
887 return rc;
888}
889
890#define DEBUG_BATT_SOC 67
891#define BATT_MISSING_SOC 50
892#define EMPTY_SOC 0
Vamshi Krishna B V25855802018-02-21 15:26:30 +0530893#define FULL_SOC 100
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +0530894static int qg_get_battery_capacity(struct qpnp_qg *chip, int *soc)
895{
896 if (is_debug_batt_id(chip)) {
897 *soc = DEBUG_BATT_SOC;
898 return 0;
899 }
900
901 if (chip->battery_missing || !chip->profile_loaded) {
902 *soc = BATT_MISSING_SOC;
903 return 0;
904 }
905
Vamshi Krishna B V25855802018-02-21 15:26:30 +0530906 if (chip->charge_full) {
907 *soc = FULL_SOC;
908 return 0;
909 }
910
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +0530911 *soc = chip->msoc;
912
913 return 0;
914}
915
916static int qg_get_battery_temp(struct qpnp_qg *chip, int *temp)
917{
918 int rc = 0;
919 struct qpnp_vadc_result result;
920
921 if (chip->battery_missing) {
922 *temp = 250;
923 return 0;
924 }
925
926 rc = qpnp_vadc_read(chip->vadc_dev, VADC_BAT_THERM_PU2, &result);
927 if (rc) {
928 pr_err("Failed reading adc channel=%d, rc=%d\n",
929 VADC_BAT_THERM_PU2, rc);
930 return rc;
931 }
932 pr_debug("batt_temp = %lld meas = 0x%llx\n",
933 result.physical, result.measurement);
934
935 *temp = (int)result.physical;
936
937 return rc;
938}
939
940static int qg_psy_set_property(struct power_supply *psy,
941 enum power_supply_property psp,
942 const union power_supply_propval *pval)
943{
944 return 0;
945}
946
947static int qg_psy_get_property(struct power_supply *psy,
948 enum power_supply_property psp,
949 union power_supply_propval *pval)
950{
951 struct qpnp_qg *chip = power_supply_get_drvdata(psy);
952 int rc = 0;
953
954 pval->intval = 0;
955
956 switch (psp) {
957 case POWER_SUPPLY_PROP_CAPACITY:
958 rc = qg_get_battery_capacity(chip, &pval->intval);
959 break;
960 case POWER_SUPPLY_PROP_VOLTAGE_NOW:
961 rc = qg_get_battery_voltage(chip, &pval->intval);
962 break;
963 case POWER_SUPPLY_PROP_CURRENT_NOW:
964 rc = qg_get_battery_current(chip, &pval->intval);
965 break;
966 case POWER_SUPPLY_PROP_VOLTAGE_OCV:
967 rc = qg_sdam_read(SDAM_OCV_UV, &pval->intval);
968 break;
969 case POWER_SUPPLY_PROP_TEMP:
970 rc = qg_get_battery_temp(chip, &pval->intval);
971 break;
972 case POWER_SUPPLY_PROP_RESISTANCE_ID:
973 pval->intval = chip->batt_id_ohm;
974 break;
975 case POWER_SUPPLY_PROP_DEBUG_BATTERY:
976 pval->intval = is_debug_batt_id(chip);
977 break;
978 case POWER_SUPPLY_PROP_RESISTANCE:
979 rc = qg_sdam_read(SDAM_RBAT_MOHM, &pval->intval);
980 if (!rc)
981 pval->intval *= 1000;
982 break;
983 case POWER_SUPPLY_PROP_RESISTANCE_CAPACITIVE:
984 pval->intval = chip->dt.rbat_conn_mohm;
985 break;
986 case POWER_SUPPLY_PROP_BATTERY_TYPE:
987 pval->strval = qg_get_battery_type(chip);
988 break;
989 case POWER_SUPPLY_PROP_VOLTAGE_MIN:
990 pval->intval = chip->dt.vbatt_cutoff_mv * 1000;
991 break;
992 case POWER_SUPPLY_PROP_VOLTAGE_MAX:
993 pval->intval = chip->bp.float_volt_uv;
994 break;
995 case POWER_SUPPLY_PROP_BATT_FULL_CURRENT:
996 pval->intval = chip->dt.iterm_ma * 1000;
997 break;
998 case POWER_SUPPLY_PROP_BATT_PROFILE_VERSION:
999 pval->intval = chip->bp.qg_profile_version;
1000 break;
Anirudh Ghayal07fbf792018-02-26 11:38:33 +05301001 case POWER_SUPPLY_PROP_CHARGE_COUNTER:
1002 pval->intval = chip->charge_counter_uah;
1003 break;
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301004 default:
1005 pr_debug("Unsupported property %d\n", psp);
1006 break;
1007 }
1008
1009 return rc;
1010}
1011
1012static int qg_property_is_writeable(struct power_supply *psy,
1013 enum power_supply_property psp)
1014{
1015 return 0;
1016}
1017
1018static enum power_supply_property qg_psy_props[] = {
1019 POWER_SUPPLY_PROP_CAPACITY,
1020 POWER_SUPPLY_PROP_TEMP,
1021 POWER_SUPPLY_PROP_VOLTAGE_NOW,
1022 POWER_SUPPLY_PROP_VOLTAGE_OCV,
1023 POWER_SUPPLY_PROP_CURRENT_NOW,
Anirudh Ghayal07fbf792018-02-26 11:38:33 +05301024 POWER_SUPPLY_PROP_CHARGE_COUNTER,
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301025 POWER_SUPPLY_PROP_RESISTANCE,
1026 POWER_SUPPLY_PROP_RESISTANCE_ID,
1027 POWER_SUPPLY_PROP_RESISTANCE_CAPACITIVE,
1028 POWER_SUPPLY_PROP_DEBUG_BATTERY,
1029 POWER_SUPPLY_PROP_BATTERY_TYPE,
1030 POWER_SUPPLY_PROP_VOLTAGE_MIN,
1031 POWER_SUPPLY_PROP_VOLTAGE_MAX,
1032 POWER_SUPPLY_PROP_BATT_FULL_CURRENT,
1033 POWER_SUPPLY_PROP_BATT_PROFILE_VERSION,
1034};
1035
1036static const struct power_supply_desc qg_psy_desc = {
1037 .name = "bms",
1038 .type = POWER_SUPPLY_TYPE_BMS,
1039 .properties = qg_psy_props,
1040 .num_properties = ARRAY_SIZE(qg_psy_props),
1041 .get_property = qg_psy_get_property,
1042 .set_property = qg_psy_set_property,
1043 .property_is_writeable = qg_property_is_writeable,
1044};
1045
Vamshi Krishna B V25855802018-02-21 15:26:30 +05301046#define DEFAULT_RECHARGE_SOC 95
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301047static int qg_charge_full_update(struct qpnp_qg *chip)
1048{
Vamshi Krishna B V25855802018-02-21 15:26:30 +05301049 union power_supply_propval prop = {0, };
1050 int rc, recharge_soc, health;
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301051
1052 vote(chip->good_ocv_irq_disable_votable,
1053 QG_INIT_STATE_IRQ_DISABLE, !chip->charge_done, 0);
1054
Vamshi Krishna B V25855802018-02-21 15:26:30 +05301055 if (!chip->dt.hold_soc_while_full)
1056 goto out;
1057
1058 rc = power_supply_get_property(chip->batt_psy,
1059 POWER_SUPPLY_PROP_HEALTH, &prop);
1060 if (rc < 0) {
1061 pr_err("Failed to get battery health, rc=%d\n", rc);
1062 goto out;
1063 }
1064 health = prop.intval;
1065
1066 rc = power_supply_get_property(chip->batt_psy,
1067 POWER_SUPPLY_PROP_RECHARGE_SOC, &prop);
1068 if (rc < 0 || prop.intval < 0) {
1069 pr_debug("Failed to get recharge-soc\n");
1070 recharge_soc = DEFAULT_RECHARGE_SOC;
1071 }
1072 recharge_soc = prop.intval;
1073
1074 qg_dbg(chip, QG_DEBUG_STATUS, "msoc=%d recharge_soc=%d health=%d charge_full=%d\n",
1075 chip->msoc, recharge_soc,
1076 health, chip->charge_full);
1077 if (chip->charge_done && !chip->charge_full) {
1078 if (chip->msoc >= 99 && health == POWER_SUPPLY_HEALTH_GOOD) {
1079 chip->charge_full = true;
1080 qg_dbg(chip, QG_DEBUG_STATUS, "Setting charge_full (0->1) @ msoc=%d\n",
1081 chip->msoc);
1082 } else {
1083 qg_dbg(chip, QG_DEBUG_STATUS, "Terminated charging @ msoc=%d\n",
1084 chip->msoc);
1085 }
1086 } else if ((!chip->charge_done || chip->msoc < recharge_soc)
1087 && chip->charge_full) {
1088 /*
1089 * If recharge has started or discharged below
1090 * recharge_soc, set charge_full as false.
1091 */
1092
1093 qg_dbg(chip, QG_DEBUG_STATUS, "msoc=%d recharge_soc=%d charge_full (1->0)\n",
1094 chip->msoc, recharge_soc);
1095 chip->charge_full = false;
1096 }
1097out:
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301098 return 0;
1099}
1100
1101static int qg_parallel_status_update(struct qpnp_qg *chip)
1102{
1103 int rc;
1104 bool parallel_enabled = is_parallel_enabled(chip);
1105
1106 if (parallel_enabled == chip->parallel_enabled)
1107 return 0;
1108
1109 chip->parallel_enabled = parallel_enabled;
1110 qg_dbg(chip, QG_DEBUG_STATUS,
1111 "Parallel status changed Enabled=%d\n", parallel_enabled);
1112
1113 mutex_lock(&chip->data_lock);
1114
1115 rc = process_rt_fifo_data(chip, false, true);
1116 if (rc < 0)
1117 pr_err("Failed to process RT FIFO data, rc=%d\n", rc);
1118
1119 mutex_unlock(&chip->data_lock);
1120
1121 return 0;
1122}
1123
1124static int qg_usb_status_update(struct qpnp_qg *chip)
1125{
1126 bool usb_present = is_usb_present(chip);
1127
1128 if (chip->usb_present != usb_present) {
1129 qg_dbg(chip, QG_DEBUG_STATUS,
1130 "USB status changed Present=%d\n",
1131 usb_present);
1132 qg_scale_soc(chip, false);
1133 }
1134
1135 chip->usb_present = usb_present;
1136
1137 return 0;
1138}
1139
1140static void qg_status_change_work(struct work_struct *work)
1141{
1142 struct qpnp_qg *chip = container_of(work,
1143 struct qpnp_qg, qg_status_change_work);
1144 union power_supply_propval prop = {0, };
1145 int rc = 0;
1146
1147 if (!is_batt_available(chip)) {
1148 pr_debug("batt-psy not available\n");
1149 goto out;
1150 }
1151
1152 rc = power_supply_get_property(chip->batt_psy,
1153 POWER_SUPPLY_PROP_STATUS, &prop);
1154 if (rc < 0)
1155 pr_err("Failed to get charger status, rc=%d\n", rc);
1156 else
1157 chip->charge_status = prop.intval;
1158
1159 rc = power_supply_get_property(chip->batt_psy,
1160 POWER_SUPPLY_PROP_CHARGE_DONE, &prop);
1161 if (rc < 0)
1162 pr_err("Failed to get charge done status, rc=%d\n", rc);
1163 else
1164 chip->charge_done = prop.intval;
1165
Vamshi Krishna B V25855802018-02-21 15:26:30 +05301166 qg_dbg(chip, QG_DEBUG_STATUS, "charge_status=%d charge_done=%d\n",
1167 chip->charge_status, chip->charge_done);
1168
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301169 rc = qg_parallel_status_update(chip);
1170 if (rc < 0)
1171 pr_err("Failed to update parallel-status, rc=%d\n", rc);
1172
1173 rc = qg_usb_status_update(chip);
1174 if (rc < 0)
1175 pr_err("Failed to update usb status, rc=%d\n", rc);
1176
1177 rc = qg_charge_full_update(chip);
1178 if (rc < 0)
1179 pr_err("Failed in charge_full_update, rc=%d\n", rc);
1180out:
1181 pm_relax(chip->dev);
1182}
1183
1184static int qg_notifier_cb(struct notifier_block *nb,
1185 unsigned long event, void *data)
1186{
1187 struct power_supply *psy = data;
1188 struct qpnp_qg *chip = container_of(nb, struct qpnp_qg, nb);
1189
1190 if (event != PSY_EVENT_PROP_CHANGED)
1191 return NOTIFY_OK;
1192
1193 if (work_pending(&chip->qg_status_change_work))
1194 return NOTIFY_OK;
1195
1196 if ((strcmp(psy->desc->name, "battery") == 0)
1197 || (strcmp(psy->desc->name, "parallel") == 0)
1198 || (strcmp(psy->desc->name, "usb") == 0)) {
1199 /*
1200 * We cannot vote for awake votable here as that takes
1201 * a mutex lock and this is executed in an atomic context.
1202 */
1203 pm_stay_awake(chip->dev);
1204 schedule_work(&chip->qg_status_change_work);
1205 }
1206
1207 return NOTIFY_OK;
1208}
1209
1210static int qg_init_psy(struct qpnp_qg *chip)
1211{
1212 struct power_supply_config qg_psy_cfg;
1213 int rc;
1214
1215 qg_psy_cfg.drv_data = chip;
1216 qg_psy_cfg.of_node = NULL;
1217 qg_psy_cfg.supplied_to = NULL;
1218 qg_psy_cfg.num_supplicants = 0;
1219 chip->qg_psy = devm_power_supply_register(chip->dev,
1220 &qg_psy_desc, &qg_psy_cfg);
1221 if (IS_ERR_OR_NULL(chip->qg_psy)) {
1222 pr_err("Failed to register qg_psy rc = %ld\n",
1223 PTR_ERR(chip->qg_psy));
1224 return -ENODEV;
1225 }
1226
1227 chip->nb.notifier_call = qg_notifier_cb;
1228 rc = power_supply_reg_notifier(&chip->nb);
1229 if (rc < 0)
1230 pr_err("Failed register psy notifier rc = %d\n", rc);
1231
1232 return rc;
1233}
1234
1235static ssize_t qg_device_read(struct file *file, char __user *buf, size_t count,
1236 loff_t *ppos)
1237{
1238 int rc;
1239 struct qpnp_qg *chip = file->private_data;
1240 unsigned long data_size = sizeof(chip->kdata);
1241
1242 /* non-blocking access, return */
1243 if (!chip->data_ready && (file->f_flags & O_NONBLOCK))
Vamshi Krishna B V25855802018-02-21 15:26:30 +05301244 return 0;
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301245
1246 /* blocking access wait on data_ready */
1247 if (!(file->f_flags & O_NONBLOCK)) {
1248 rc = wait_event_interruptible(chip->qg_wait_q,
1249 chip->data_ready);
1250 if (rc < 0) {
1251 pr_debug("Failed wait! rc=%d\n", rc);
1252 return rc;
1253 }
1254 }
1255
1256 mutex_lock(&chip->data_lock);
1257
1258 if (!chip->data_ready) {
1259 pr_debug("No Data, false wakeup\n");
1260 rc = -EFAULT;
1261 goto fail_read;
1262 }
1263
Anirudh Ghayal07fbf792018-02-26 11:38:33 +05301264
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301265 if (copy_to_user(buf, &chip->kdata, data_size)) {
1266 pr_err("Failed in copy_to_user\n");
1267 rc = -EFAULT;
1268 goto fail_read;
1269 }
1270 chip->data_ready = false;
1271
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301272 /* release all wake sources */
1273 vote(chip->awake_votable, GOOD_OCV_VOTER, false, 0);
1274 vote(chip->awake_votable, FIFO_DONE_VOTER, false, 0);
1275 vote(chip->awake_votable, FIFO_RT_DONE_VOTER, false, 0);
1276 vote(chip->awake_votable, SUSPEND_DATA_VOTER, false, 0);
1277
1278 qg_dbg(chip, QG_DEBUG_DEVICE,
Anirudh Ghayal07fbf792018-02-26 11:38:33 +05301279 "QG device read complete Seq_no=%u Size=%ld\n",
1280 chip->kdata.seq_no, data_size);
1281
1282 /* clear data */
1283 memset(&chip->kdata, 0, sizeof(chip->kdata));
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301284
1285 mutex_unlock(&chip->data_lock);
1286
1287 return data_size;
1288
1289fail_read:
1290 mutex_unlock(&chip->data_lock);
1291 return rc;
1292}
1293
1294static ssize_t qg_device_write(struct file *file, const char __user *buf,
1295 size_t count, loff_t *ppos)
1296{
1297 int rc = -EINVAL;
1298 struct qpnp_qg *chip = file->private_data;
1299 unsigned long data_size = sizeof(chip->udata);
1300
1301 mutex_lock(&chip->data_lock);
1302 if (count == 0) {
1303 pr_err("No data!\n");
1304 goto fail;
1305 }
1306
1307 if (count != 0 && count < data_size) {
Kiran Gunda0f5de042018-03-02 13:02:22 +05301308 pr_err("Invalid datasize %zu expected %lu\n", count, data_size);
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301309 goto fail;
1310 }
1311
1312 if (copy_from_user(&chip->udata, buf, data_size)) {
1313 pr_err("Failed in copy_from_user\n");
1314 rc = -EFAULT;
1315 goto fail;
1316 }
1317
1318 rc = data_size;
1319 vote(chip->awake_votable, UDATA_READY_VOTER, true, 0);
1320 schedule_work(&chip->udata_work);
1321 qg_dbg(chip, QG_DEBUG_DEVICE, "QG write complete size=%d\n", rc);
1322fail:
1323 mutex_unlock(&chip->data_lock);
1324 return rc;
1325}
1326
1327static unsigned int qg_device_poll(struct file *file, poll_table *wait)
1328{
1329 struct qpnp_qg *chip = file->private_data;
Vamshi Krishna B V25855802018-02-21 15:26:30 +05301330 unsigned int mask = 0;
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301331
1332 poll_wait(file, &chip->qg_wait_q, wait);
1333
1334 if (chip->data_ready)
1335 mask = POLLIN | POLLRDNORM;
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301336
1337 return mask;
1338}
1339
1340static int qg_device_open(struct inode *inode, struct file *file)
1341{
1342 struct qpnp_qg *chip = container_of(inode->i_cdev,
1343 struct qpnp_qg, qg_cdev);
1344
1345 file->private_data = chip;
Anirudh Ghayale4923382018-03-11 20:32:10 +05301346 chip->qg_device_open = true;
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301347 qg_dbg(chip, QG_DEBUG_DEVICE, "QG device opened!\n");
1348
1349 return 0;
1350}
1351
Anirudh Ghayale4923382018-03-11 20:32:10 +05301352static int qg_device_release(struct inode *inode, struct file *file)
1353{
1354 struct qpnp_qg *chip = container_of(inode->i_cdev,
1355 struct qpnp_qg, qg_cdev);
1356
1357 file->private_data = chip;
1358 chip->qg_device_open = false;
1359 qg_dbg(chip, QG_DEBUG_DEVICE, "QG device closed!\n");
1360
1361 return 0;
1362}
1363
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301364static const struct file_operations qg_fops = {
1365 .owner = THIS_MODULE,
1366 .open = qg_device_open,
Anirudh Ghayale4923382018-03-11 20:32:10 +05301367 .release = qg_device_release,
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301368 .read = qg_device_read,
1369 .write = qg_device_write,
1370 .poll = qg_device_poll,
1371};
1372
1373static int qg_register_device(struct qpnp_qg *chip)
1374{
1375 int rc;
1376
1377 rc = alloc_chrdev_region(&chip->dev_no, 0, 1, "qg");
1378 if (rc < 0) {
1379 pr_err("Failed to allocate chardev rc=%d\n", rc);
1380 return rc;
1381 }
1382
1383 cdev_init(&chip->qg_cdev, &qg_fops);
1384 rc = cdev_add(&chip->qg_cdev, chip->dev_no, 1);
1385 if (rc < 0) {
1386 pr_err("Failed to cdev_add rc=%d\n", rc);
1387 goto unregister_chrdev;
1388 }
1389
1390 chip->qg_class = class_create(THIS_MODULE, "qg");
1391 if (IS_ERR_OR_NULL(chip->qg_class)) {
1392 pr_err("Failed to create qg class\n");
1393 rc = -EINVAL;
1394 goto delete_cdev;
1395 }
1396 chip->qg_device = device_create(chip->qg_class, NULL, chip->dev_no,
1397 NULL, "qg");
1398 if (IS_ERR(chip->qg_device)) {
1399 pr_err("Failed to create qg_device\n");
1400 rc = -EINVAL;
1401 goto destroy_class;
1402 }
1403
1404 qg_dbg(chip, QG_DEBUG_DEVICE, "'/dev/qg' successfully created\n");
1405
1406 return 0;
1407
1408destroy_class:
1409 class_destroy(chip->qg_class);
1410delete_cdev:
1411 cdev_del(&chip->qg_cdev);
1412unregister_chrdev:
1413 unregister_chrdev_region(chip->dev_no, 1);
1414 return rc;
1415}
1416
1417#define BID_RPULL_OHM 100000
1418#define BID_VREF_MV 1875
1419static int get_batt_id_ohm(struct qpnp_qg *chip, u32 *batt_id_ohm)
1420{
1421 int rc, batt_id_mv;
1422 int64_t denom;
1423 struct qpnp_vadc_result result;
1424
1425 /* Read battery-id */
1426 rc = qpnp_vadc_read(chip->vadc_dev, VADC_BAT_ID_PU2, &result);
1427 if (rc) {
1428 pr_err("Failed to read BATT_ID over vadc, rc=%d\n", rc);
1429 return rc;
1430 }
1431
Kiran Gunda0f5de042018-03-02 13:02:22 +05301432 batt_id_mv = div_s64(result.physical, 1000);
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301433 if (batt_id_mv == 0) {
1434 pr_debug("batt_id_mv = 0 from ADC\n");
1435 return 0;
1436 }
1437
1438 denom = div64_s64(BID_VREF_MV * 1000, batt_id_mv) - 1000;
1439 if (denom <= 0) {
1440 /* batt id connector might be open, return 0 kohms */
1441 return 0;
1442 }
1443
1444 *batt_id_ohm = div64_u64(BID_RPULL_OHM * 1000 + denom / 2, denom);
1445
1446 qg_dbg(chip, QG_DEBUG_PROFILE, "batt_id_mv=%d, batt_id_ohm=%d\n",
1447 batt_id_mv, *batt_id_ohm);
1448
1449 return 0;
1450}
1451
1452static int qg_load_battery_profile(struct qpnp_qg *chip)
1453{
1454 struct device_node *node = chip->dev->of_node;
1455 struct device_node *batt_node, *profile_node;
1456 int rc;
1457
1458 batt_node = of_find_node_by_name(node, "qcom,battery-data");
1459 if (!batt_node) {
1460 pr_err("Batterydata not available\n");
1461 return -ENXIO;
1462 }
1463
1464 profile_node = of_batterydata_get_best_profile(batt_node,
1465 chip->batt_id_ohm / 1000, NULL);
1466 if (IS_ERR(profile_node)) {
1467 rc = PTR_ERR(profile_node);
1468 pr_err("Failed to detect valid QG battery profile %d\n", rc);
1469 return rc;
1470 }
1471
1472 rc = of_property_read_string(profile_node, "qcom,battery-type",
1473 &chip->bp.batt_type_str);
1474 if (rc < 0) {
1475 pr_err("Failed to detect battery type rc:%d\n", rc);
1476 return rc;
1477 }
1478
1479 rc = qg_batterydata_init(profile_node);
1480 if (rc < 0) {
1481 pr_err("Failed to initialize battery-profile rc=%d\n", rc);
1482 return rc;
1483 }
1484
1485 rc = of_property_read_u32(profile_node, "qcom,max-voltage-uv",
1486 &chip->bp.float_volt_uv);
1487 if (rc < 0) {
1488 pr_err("Failed to read battery float-voltage rc:%d\n", rc);
1489 chip->bp.float_volt_uv = -EINVAL;
1490 }
1491
1492 rc = of_property_read_u32(profile_node, "qcom,fastchg-current-ma",
1493 &chip->bp.fastchg_curr_ma);
1494 if (rc < 0) {
1495 pr_err("Failed to read battery fastcharge current rc:%d\n", rc);
1496 chip->bp.fastchg_curr_ma = -EINVAL;
1497 }
1498
1499 rc = of_property_read_u32(profile_node, "qcom,qg-batt-profile-ver",
1500 &chip->bp.qg_profile_version);
1501 if (rc < 0) {
1502 pr_err("Failed to read QG profile version rc:%d\n", rc);
1503 chip->bp.qg_profile_version = -EINVAL;
1504 }
1505
1506 qg_dbg(chip, QG_DEBUG_PROFILE, "profile=%s FV=%duV FCC=%dma\n",
1507 chip->bp.batt_type_str, chip->bp.float_volt_uv,
1508 chip->bp.fastchg_curr_ma);
1509
1510 return 0;
1511}
1512
1513static int qg_setup_battery(struct qpnp_qg *chip)
1514{
1515 int rc;
1516
1517 if (!is_battery_present(chip)) {
1518 qg_dbg(chip, QG_DEBUG_PROFILE, "Battery Missing!\n");
1519 chip->battery_missing = true;
1520 chip->profile_loaded = false;
1521 } else {
1522 /* battery present */
1523 rc = get_batt_id_ohm(chip, &chip->batt_id_ohm);
1524 if (rc < 0) {
1525 pr_err("Failed to detect batt_id rc=%d\n", rc);
1526 chip->profile_loaded = false;
1527 } else {
1528 rc = qg_load_battery_profile(chip);
1529 if (rc < 0)
1530 pr_err("Failed to load battery-profile rc=%d\n",
1531 rc);
1532 else
1533 chip->profile_loaded = true;
1534 }
1535 }
1536
1537 qg_dbg(chip, QG_DEBUG_PROFILE, "battery_missing=%d batt_id_ohm=%d Ohm profile_loaded=%d profile=%s\n",
1538 chip->battery_missing, chip->batt_id_ohm,
1539 chip->profile_loaded, chip->bp.batt_type_str);
1540
1541 return 0;
1542}
1543
1544static int qg_determine_pon_soc(struct qpnp_qg *chip)
1545{
Anirudh Ghayale4923382018-03-11 20:32:10 +05301546 u8 status = 0, ocv_type = 0;
1547 int rc = 0, batt_temp = 0;
1548 bool use_pon_ocv = true, use_shutdown_ocv = false;
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301549 unsigned long rtc_sec = 0;
1550 u32 ocv_uv = 0, soc = 0, shutdown[SDAM_MAX] = {0};
1551
1552 if (!chip->profile_loaded) {
1553 qg_dbg(chip, QG_DEBUG_PON, "No Profile, skipping PON soc\n");
1554 return 0;
1555 }
1556
Anirudh Ghayale4923382018-03-11 20:32:10 +05301557 rc = get_rtc_time(&rtc_sec);
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301558 if (rc < 0) {
Anirudh Ghayale4923382018-03-11 20:32:10 +05301559 pr_err("Failed to read RTC time rc=%d\n", rc);
1560 goto use_pon_ocv;
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301561 }
1562
Anirudh Ghayale4923382018-03-11 20:32:10 +05301563 rc = qg_sdam_read_all(shutdown);
1564 if (rc < 0) {
1565 pr_err("Failed to read shutdown params rc=%d\n", rc);
1566 goto use_pon_ocv;
1567 }
1568
1569 qg_dbg(chip, QG_DEBUG_PON, "Shutdown: Valid=%d SOC=%d OCV=%duV time=%dsecs, time_now=%ldsecs\n",
1570 shutdown[SDAM_VALID],
1571 shutdown[SDAM_SOC],
1572 shutdown[SDAM_OCV_UV],
1573 shutdown[SDAM_TIME_SEC],
1574 rtc_sec);
1575 /*
1576 * Use the shutdown SOC if
1577 * 1. The device was powered off for < ignore_shutdown_time
1578 * 2. SDAM read is a success & SDAM data is valid
1579 */
1580 if (shutdown[SDAM_VALID] && is_between(0,
1581 chip->dt.ignore_shutdown_soc_secs,
1582 (rtc_sec - shutdown[SDAM_TIME_SEC]))) {
1583 use_pon_ocv = false;
1584 use_shutdown_ocv = true;
1585 ocv_uv = shutdown[SDAM_OCV_UV];
1586 soc = shutdown[SDAM_SOC];
1587 qg_dbg(chip, QG_DEBUG_PON, "Using SHUTDOWN_SOC @ PON\n");
1588 }
1589
1590use_pon_ocv:
1591 if (use_pon_ocv == true) {
1592 rc = qg_get_battery_temp(chip, &batt_temp);
1593 if (rc) {
1594 pr_err("Failed to read BATT_TEMP at PON rc=%d\n", rc);
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301595 goto done;
1596 }
1597
Anirudh Ghayale4923382018-03-11 20:32:10 +05301598 rc = qg_read(chip, chip->qg_base + QG_STATUS2_REG, &status, 1);
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301599 if (rc < 0) {
Anirudh Ghayale4923382018-03-11 20:32:10 +05301600 pr_err("Failed to read status2 register rc=%d\n", rc);
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301601 goto done;
1602 }
Anirudh Ghayale4923382018-03-11 20:32:10 +05301603
1604 if (status & GOOD_OCV_BIT)
1605 ocv_type = GOOD_OCV;
1606 else
1607 ocv_type = PON_OCV;
1608
1609 qg_dbg(chip, QG_DEBUG_PON, "Using %s @ PON\n",
1610 ocv_type == GOOD_OCV ? "GOOD_OCV" : "PON_OCV");
1611
1612 rc = qg_read_ocv(chip, &ocv_uv, ocv_type);
1613 if (rc < 0) {
1614 pr_err("Failed to read ocv rc=%d\n", rc);
1615 goto done;
1616 }
1617
1618 rc = lookup_soc_ocv(&soc, ocv_uv, batt_temp, false);
1619 if (rc < 0) {
1620 pr_err("Failed to lookup SOC@PON rc=%d\n", rc);
1621 goto done;
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301622 }
1623 }
1624done:
Anirudh Ghayale4923382018-03-11 20:32:10 +05301625 if (rc < 0) {
1626 pr_err("Failed to get SOC @ PON, rc=%d\n", rc);
1627 return rc;
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301628 }
1629
1630 chip->pon_soc = chip->catch_up_soc = chip->msoc = soc;
1631 chip->kdata.param[QG_PON_OCV_UV].data = ocv_uv;
1632 chip->kdata.param[QG_PON_OCV_UV].valid = true;
1633
1634 /* write back to SDAM */
1635 chip->sdam_data[SDAM_SOC] = soc;
1636 chip->sdam_data[SDAM_OCV_UV] = ocv_uv;
1637 chip->sdam_data[SDAM_VALID] = 1;
1638
1639 rc = qg_write_monotonic_soc(chip, chip->msoc);
1640 if (rc < 0)
1641 pr_err("Failed to update MSOC register rc=%d\n", rc);
1642
1643 rc = qg_update_sdam_params(chip);
1644 if (rc < 0)
1645 pr_err("Failed to update sdam params rc=%d\n", rc);
1646
Anirudh Ghayale4923382018-03-11 20:32:10 +05301647 pr_info("use_pon_ocv=%d use_good_ocv=%d use_shutdown_ocv=%d ocv_uv=%duV soc=%d\n",
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301648 use_pon_ocv, !!(status & GOOD_OCV_BIT),
Anirudh Ghayale4923382018-03-11 20:32:10 +05301649 use_shutdown_ocv, ocv_uv, chip->msoc);
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301650 return 0;
1651}
1652
1653static int qg_set_wa_flags(struct qpnp_qg *chip)
1654{
1655 switch (chip->pmic_rev_id->pmic_subtype) {
1656 case PMI632_SUBTYPE:
1657 if (chip->pmic_rev_id->rev4 == PMI632_V1P0_REV4)
1658 chip->wa_flags |= QG_VBAT_LOW_WA;
1659 break;
1660 default:
1661 pr_err("Unsupported PMIC subtype %d\n",
1662 chip->pmic_rev_id->pmic_subtype);
1663 return -EINVAL;
1664 }
1665
1666 qg_dbg(chip, QG_DEBUG_PON, "wa_flags = %x\n", chip->wa_flags);
1667
1668 return 0;
1669}
1670
1671static int qg_hw_init(struct qpnp_qg *chip)
1672{
1673 int rc, temp;
1674 u8 reg;
1675
1676 rc = qg_set_wa_flags(chip);
1677 if (rc < 0) {
1678 pr_err("Failed to update PMIC type flags, rc=%d\n", rc);
1679 return rc;
1680 }
1681
1682 rc = qg_master_hold(chip, true);
1683 if (rc < 0) {
1684 pr_err("Failed to hold master, rc=%d\n", rc);
1685 goto done_fifo;
1686 }
1687
1688 rc = qg_process_rt_fifo(chip);
1689 if (rc < 0) {
1690 pr_err("Failed to process FIFO real-time, rc=%d\n", rc);
1691 goto done_fifo;
1692 }
1693
1694 /* update the changed S2 fifo DT parameters */
1695 if (chip->dt.s2_fifo_length > 0) {
1696 rc = qg_update_fifo_length(chip, chip->dt.s2_fifo_length);
1697 if (rc < 0)
1698 goto done_fifo;
1699 }
1700
1701 if (chip->dt.s2_acc_length > 0) {
1702 reg = ilog2(chip->dt.s2_acc_length) - 1;
1703 rc = qg_masked_write(chip, chip->qg_base +
1704 QG_S2_NORMAL_MEAS_CTL2_REG,
1705 NUM_OF_ACCUM_MASK, reg);
1706 if (rc < 0) {
1707 pr_err("Failed to write S2 ACC length, rc=%d\n", rc);
1708 goto done_fifo;
1709 }
1710 }
1711
1712 if (chip->dt.s2_acc_intvl_ms > 0) {
1713 reg = chip->dt.s2_acc_intvl_ms / 10;
1714 rc = qg_write(chip, chip->qg_base +
1715 QG_S2_NORMAL_MEAS_CTL3_REG,
1716 &reg, 1);
1717 if (rc < 0) {
1718 pr_err("Failed to write S2 ACC intrvl, rc=%d\n", rc);
1719 goto done_fifo;
1720 }
1721 }
1722
1723 /* signal the read thread */
1724 chip->data_ready = true;
1725 wake_up_interruptible(&chip->qg_wait_q);
1726
1727done_fifo:
1728 rc = qg_master_hold(chip, false);
1729 if (rc < 0) {
1730 pr_err("Failed to release master, rc=%d\n", rc);
1731 return rc;
1732 }
1733 chip->last_fifo_update_time = ktime_get();
1734
1735 if (chip->dt.ocv_timer_expiry_min != -EINVAL) {
1736 if (chip->dt.ocv_timer_expiry_min < 2)
1737 chip->dt.ocv_timer_expiry_min = 2;
1738 else if (chip->dt.ocv_timer_expiry_min > 30)
1739 chip->dt.ocv_timer_expiry_min = 30;
1740
1741 reg = (chip->dt.ocv_timer_expiry_min - 2) / 4;
1742 rc = qg_masked_write(chip,
1743 chip->qg_base + QG_S3_SLEEP_OCV_MEAS_CTL4_REG,
1744 SLEEP_IBAT_QUALIFIED_LENGTH_MASK, reg);
1745 if (rc < 0) {
1746 pr_err("Failed to write OCV timer, rc=%d\n", rc);
1747 return rc;
1748 }
1749 }
1750
1751 if (chip->dt.ocv_tol_threshold_uv != -EINVAL) {
1752 if (chip->dt.ocv_tol_threshold_uv < 0)
1753 chip->dt.ocv_tol_threshold_uv = 0;
1754 else if (chip->dt.ocv_tol_threshold_uv > 12262)
1755 chip->dt.ocv_tol_threshold_uv = 12262;
1756
1757 reg = chip->dt.ocv_tol_threshold_uv / 195;
1758 rc = qg_masked_write(chip,
1759 chip->qg_base + QG_S3_SLEEP_OCV_TREND_CTL2_REG,
1760 TREND_TOL_MASK, reg);
1761 if (rc < 0) {
1762 pr_err("Failed to write OCV tol-thresh, rc=%d\n", rc);
1763 return rc;
1764 }
1765 }
1766
1767 if (chip->dt.s3_entry_fifo_length != -EINVAL) {
1768 if (chip->dt.s3_entry_fifo_length < 1)
1769 chip->dt.s3_entry_fifo_length = 1;
1770 else if (chip->dt.s3_entry_fifo_length > 8)
1771 chip->dt.s3_entry_fifo_length = 8;
1772
1773 reg = chip->dt.s3_entry_fifo_length - 1;
1774 rc = qg_masked_write(chip,
1775 chip->qg_base + QG_S3_SLEEP_OCV_IBAT_CTL1_REG,
1776 SLEEP_IBAT_QUALIFIED_LENGTH_MASK, reg);
1777 if (rc < 0) {
1778 pr_err("Failed to write S3-entry fifo-length, rc=%d\n",
1779 rc);
1780 return rc;
1781 }
1782 }
1783
1784 if (chip->dt.s3_entry_ibat_ua != -EINVAL) {
1785 if (chip->dt.s3_entry_ibat_ua < 0)
1786 chip->dt.s3_entry_ibat_ua = 0;
1787 else if (chip->dt.s3_entry_ibat_ua > 155550)
1788 chip->dt.s3_entry_ibat_ua = 155550;
1789
1790 reg = chip->dt.s3_entry_ibat_ua / 610;
1791 rc = qg_write(chip, chip->qg_base +
1792 QG_S3_ENTRY_IBAT_THRESHOLD_REG,
1793 &reg, 1);
1794 if (rc < 0) {
1795 pr_err("Failed to write S3-entry ibat-uA, rc=%d\n", rc);
1796 return rc;
1797 }
1798 }
1799
1800 if (chip->dt.s3_exit_ibat_ua != -EINVAL) {
1801 if (chip->dt.s3_exit_ibat_ua < 0)
1802 chip->dt.s3_exit_ibat_ua = 0;
1803 else if (chip->dt.s3_exit_ibat_ua > 155550)
1804 chip->dt.s3_exit_ibat_ua = 155550;
1805
1806 rc = qg_read(chip, chip->qg_base +
1807 QG_S3_ENTRY_IBAT_THRESHOLD_REG,
1808 &reg, 1);
1809 if (rc < 0) {
1810 pr_err("Failed to read S3-entry ibat-uA, rc=%d", rc);
1811 return rc;
1812 }
1813 temp = reg * 610;
1814 if (chip->dt.s3_exit_ibat_ua < temp)
1815 chip->dt.s3_exit_ibat_ua = temp;
1816 else
1817 chip->dt.s3_exit_ibat_ua -= temp;
1818
1819 reg = chip->dt.s3_exit_ibat_ua / 610;
1820 rc = qg_write(chip,
1821 chip->qg_base + QG_S3_EXIT_IBAT_THRESHOLD_REG,
1822 &reg, 1);
1823 if (rc < 0) {
1824 pr_err("Failed to write S3-entry ibat-uA, rc=%d\n", rc);
1825 return rc;
1826 }
1827 }
1828
1829 /* vbat low */
1830 if (chip->dt.vbatt_low_mv < 0)
1831 chip->dt.vbatt_low_mv = 0;
1832 else if (chip->dt.vbatt_low_mv > 12750)
1833 chip->dt.vbatt_low_mv = 12750;
1834
1835 reg = chip->dt.vbatt_low_mv / 50;
1836 rc = qg_write(chip, chip->qg_base + QG_VBAT_LOW_THRESHOLD_REG,
1837 &reg, 1);
1838 if (rc < 0) {
1839 pr_err("Failed to write vbat-low, rc=%d\n", rc);
1840 return rc;
1841 }
1842
1843 /* vbat empty */
1844 if (chip->dt.vbatt_empty_mv < 0)
1845 chip->dt.vbatt_empty_mv = 0;
1846 else if (chip->dt.vbatt_empty_mv > 12750)
1847 chip->dt.vbatt_empty_mv = 12750;
1848
1849 reg = chip->dt.vbatt_empty_mv / 50;
1850 rc = qg_write(chip, chip->qg_base + QG_VBAT_EMPTY_THRESHOLD_REG,
1851 &reg, 1);
1852 if (rc < 0) {
1853 pr_err("Failed to write vbat-empty, rc=%d\n", rc);
1854 return rc;
1855 }
1856
1857 return 0;
1858}
1859
1860static int qg_post_init(struct qpnp_qg *chip)
1861{
1862 /* disable all IRQs if profile is not loaded */
1863 if (!chip->profile_loaded) {
1864 vote(chip->vbatt_irq_disable_votable,
1865 PROFILE_IRQ_DISABLE, true, 0);
1866 vote(chip->fifo_irq_disable_votable,
1867 PROFILE_IRQ_DISABLE, true, 0);
1868 vote(chip->good_ocv_irq_disable_votable,
1869 PROFILE_IRQ_DISABLE, true, 0);
1870 } else {
1871 /* disable GOOD_OCV IRQ at init */
1872 vote(chip->good_ocv_irq_disable_votable,
1873 QG_INIT_STATE_IRQ_DISABLE, true, 0);
1874 }
1875
1876 return 0;
1877}
1878
1879static int qg_get_irq_index_byname(const char *irq_name)
1880{
1881 int i;
1882
1883 for (i = 0; i < ARRAY_SIZE(qg_irqs); i++) {
1884 if (strcmp(qg_irqs[i].name, irq_name) == 0)
1885 return i;
1886 }
1887
1888 return -ENOENT;
1889}
1890
1891static int qg_request_interrupt(struct qpnp_qg *chip,
1892 struct device_node *node, const char *irq_name)
1893{
1894 int rc, irq, irq_index;
1895
1896 irq = of_irq_get_byname(node, irq_name);
1897 if (irq < 0) {
1898 pr_err("Failed to get irq %s byname\n", irq_name);
1899 return irq;
1900 }
1901
1902 irq_index = qg_get_irq_index_byname(irq_name);
1903 if (irq_index < 0) {
1904 pr_err("%s is not a defined irq\n", irq_name);
1905 return irq_index;
1906 }
1907
1908 if (!qg_irqs[irq_index].handler)
1909 return 0;
1910
1911 rc = devm_request_threaded_irq(chip->dev, irq, NULL,
1912 qg_irqs[irq_index].handler,
1913 IRQF_ONESHOT, irq_name, chip);
1914 if (rc < 0) {
1915 pr_err("Failed to request irq %d\n", irq);
1916 return rc;
1917 }
1918
1919 qg_irqs[irq_index].irq = irq;
1920 if (qg_irqs[irq_index].wake)
1921 enable_irq_wake(irq);
1922
1923 qg_dbg(chip, QG_DEBUG_PON, "IRQ %s registered wakeable=%d\n",
1924 qg_irqs[irq_index].name, qg_irqs[irq_index].wake);
1925
1926 return 0;
1927}
1928
1929static int qg_request_irqs(struct qpnp_qg *chip)
1930{
1931 struct device_node *node = chip->dev->of_node;
1932 struct device_node *child;
1933 const char *name;
1934 struct property *prop;
1935 int rc = 0;
1936
1937 for_each_available_child_of_node(node, child) {
1938 of_property_for_each_string(child, "interrupt-names",
1939 prop, name) {
1940 rc = qg_request_interrupt(chip, child, name);
1941 if (rc < 0)
1942 return rc;
1943 }
1944 }
1945
1946
1947 return 0;
1948}
1949
1950#define DEFAULT_VBATT_EMPTY_MV 3200
1951#define DEFAULT_VBATT_CUTOFF_MV 3400
1952#define DEFAULT_VBATT_LOW_MV 3500
1953#define DEFAULT_ITERM_MA 100
1954#define DEFAULT_S2_FIFO_LENGTH 5
1955#define DEFAULT_S2_VBAT_LOW_LENGTH 2
1956#define DEFAULT_S2_ACC_LENGTH 128
1957#define DEFAULT_S2_ACC_INTVL_MS 100
1958#define DEFAULT_DELTA_SOC 1
Anirudh Ghayale4923382018-03-11 20:32:10 +05301959#define DEFAULT_SHUTDOWN_SOC_SECS 360
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301960static int qg_parse_dt(struct qpnp_qg *chip)
1961{
1962 int rc = 0;
1963 struct device_node *revid_node, *child, *node = chip->dev->of_node;
1964 u32 base, temp;
1965 u8 type;
1966
1967 if (!node) {
1968 pr_err("Failed to find device-tree node\n");
1969 return -ENXIO;
1970 }
1971
1972 revid_node = of_parse_phandle(node, "qcom,pmic-revid", 0);
1973 if (!revid_node) {
1974 pr_err("Missing qcom,pmic-revid property - driver failed\n");
1975 return -EINVAL;
1976 }
1977
1978 chip->pmic_rev_id = get_revid_data(revid_node);
1979 of_node_put(revid_node);
1980 if (IS_ERR_OR_NULL(chip->pmic_rev_id)) {
1981 pr_err("Failed to get pmic_revid, rc=%ld\n",
1982 PTR_ERR(chip->pmic_rev_id));
1983 /*
1984 * the revid peripheral must be registered, any failure
1985 * here only indicates that the rev-id module has not
1986 * probed yet.
1987 */
1988 return -EPROBE_DEFER;
1989 }
1990
1991 qg_dbg(chip, QG_DEBUG_PON, "PMIC subtype %d Digital major %d\n",
1992 chip->pmic_rev_id->pmic_subtype, chip->pmic_rev_id->rev4);
1993
1994 for_each_available_child_of_node(node, child) {
1995 rc = of_property_read_u32(child, "reg", &base);
1996 if (rc < 0) {
1997 pr_err("Failed to read base address, rc=%d\n", rc);
1998 return rc;
1999 }
2000
2001 rc = qg_read(chip, base + PERPH_TYPE_REG, &type, 1);
2002 if (rc < 0) {
2003 pr_err("Failed to read type, rc=%d\n", rc);
2004 return rc;
2005 }
2006
2007 switch (type) {
2008 case QG_TYPE:
2009 chip->qg_base = base;
2010 break;
2011 default:
2012 break;
2013 }
2014 }
2015
2016 if (!chip->qg_base) {
2017 pr_err("QG device node missing\n");
2018 return -EINVAL;
2019 }
2020
2021 /* S2 state params */
2022 rc = of_property_read_u32(node, "qcom,s2-fifo-length", &temp);
2023 if (rc < 0)
2024 chip->dt.s2_fifo_length = DEFAULT_S2_FIFO_LENGTH;
2025 else
2026 chip->dt.s2_fifo_length = temp;
2027
2028 rc = of_property_read_u32(node, "qcom,s2-vbat-low-fifo-length", &temp);
2029 if (rc < 0)
2030 chip->dt.s2_vbat_low_fifo_length = DEFAULT_S2_VBAT_LOW_LENGTH;
2031 else
2032 chip->dt.s2_vbat_low_fifo_length = temp;
2033
2034 rc = of_property_read_u32(node, "qcom,s2-acc-length", &temp);
2035 if (rc < 0)
2036 chip->dt.s2_acc_length = DEFAULT_S2_ACC_LENGTH;
2037 else
2038 chip->dt.s2_acc_length = temp;
2039
2040 rc = of_property_read_u32(node, "qcom,s2-acc-interval-ms", &temp);
2041 if (rc < 0)
2042 chip->dt.s2_acc_intvl_ms = DEFAULT_S2_ACC_INTVL_MS;
2043 else
2044 chip->dt.s2_acc_intvl_ms = temp;
2045
2046 qg_dbg(chip, QG_DEBUG_PON, "DT: S2 FIFO length=%d low_vbat_length=%d acc_length=%d acc_interval=%d\n",
2047 chip->dt.s2_fifo_length, chip->dt.s2_vbat_low_fifo_length,
2048 chip->dt.s2_acc_length, chip->dt.s2_acc_intvl_ms);
2049
2050 /* OCV params */
2051 rc = of_property_read_u32(node, "qcom,ocv-timer-expiry-min", &temp);
2052 if (rc < 0)
2053 chip->dt.ocv_timer_expiry_min = -EINVAL;
2054 else
2055 chip->dt.ocv_timer_expiry_min = temp;
2056
2057 rc = of_property_read_u32(node, "qcom,ocv-tol-threshold-uv", &temp);
2058 if (rc < 0)
2059 chip->dt.ocv_tol_threshold_uv = -EINVAL;
2060 else
2061 chip->dt.ocv_tol_threshold_uv = temp;
2062
2063 qg_dbg(chip, QG_DEBUG_PON, "DT: OCV timer_expiry =%dmin ocv_tol_threshold=%duV\n",
2064 chip->dt.ocv_timer_expiry_min, chip->dt.ocv_tol_threshold_uv);
2065
2066 /* S3 sleep configuration */
2067 rc = of_property_read_u32(node, "qcom,s3-entry-fifo-length", &temp);
2068 if (rc < 0)
2069 chip->dt.s3_entry_fifo_length = -EINVAL;
2070 else
2071 chip->dt.s3_entry_fifo_length = temp;
2072
2073 rc = of_property_read_u32(node, "qcom,s3-entry-ibat-ua", &temp);
2074 if (rc < 0)
2075 chip->dt.s3_entry_ibat_ua = -EINVAL;
2076 else
2077 chip->dt.s3_entry_ibat_ua = temp;
2078
2079 rc = of_property_read_u32(node, "qcom,s3-entry-ibat-ua", &temp);
2080 if (rc < 0)
2081 chip->dt.s3_exit_ibat_ua = -EINVAL;
2082 else
2083 chip->dt.s3_exit_ibat_ua = temp;
2084
2085 /* VBAT thresholds */
2086 rc = of_property_read_u32(node, "qcom,vbatt-empty-mv", &temp);
2087 if (rc < 0)
2088 chip->dt.vbatt_empty_mv = DEFAULT_VBATT_EMPTY_MV;
2089 else
2090 chip->dt.vbatt_empty_mv = temp;
2091
2092 rc = of_property_read_u32(node, "qcom,vbatt-low-mv", &temp);
2093 if (rc < 0)
2094 chip->dt.vbatt_low_mv = DEFAULT_VBATT_LOW_MV;
2095 else
2096 chip->dt.vbatt_low_mv = temp;
2097
2098 rc = of_property_read_u32(node, "qcom,vbatt-cutoff-mv", &temp);
2099 if (rc < 0)
2100 chip->dt.vbatt_cutoff_mv = DEFAULT_VBATT_CUTOFF_MV;
2101 else
2102 chip->dt.vbatt_cutoff_mv = temp;
2103
2104 /* IBAT thresholds */
2105 rc = of_property_read_u32(node, "qcom,qg-iterm-ma", &temp);
2106 if (rc < 0)
2107 chip->dt.iterm_ma = DEFAULT_ITERM_MA;
2108 else
2109 chip->dt.iterm_ma = temp;
2110
2111 rc = of_property_read_u32(node, "qcom,delta-soc", &temp);
2112 if (rc < 0)
2113 chip->dt.delta_soc = DEFAULT_DELTA_SOC;
2114 else
2115 chip->dt.delta_soc = temp;
2116
Anirudh Ghayale4923382018-03-11 20:32:10 +05302117 rc = of_property_read_u32(node, "qcom,ignore-shutdown-soc-secs", &temp);
2118 if (rc < 0)
2119 chip->dt.ignore_shutdown_soc_secs = DEFAULT_SHUTDOWN_SOC_SECS;
2120 else
2121 chip->dt.ignore_shutdown_soc_secs = temp;
2122
Vamshi Krishna B V25855802018-02-21 15:26:30 +05302123 chip->dt.hold_soc_while_full = of_property_read_bool(node,
2124 "qcom,hold-soc-while-full");
2125
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05302126 rc = of_property_read_u32(node, "qcom,rbat-conn-mohm", &temp);
2127 if (rc < 0)
2128 chip->dt.rbat_conn_mohm = 0;
2129 else
2130 chip->dt.rbat_conn_mohm = temp;
2131
2132 qg_dbg(chip, QG_DEBUG_PON, "DT: vbatt_empty_mv=%dmV vbatt_low_mv=%dmV delta_soc=%d\n",
2133 chip->dt.vbatt_empty_mv, chip->dt.vbatt_low_mv,
2134 chip->dt.delta_soc);
2135
2136 return 0;
2137}
2138
2139static int process_suspend(struct qpnp_qg *chip)
2140{
Anirudh Ghayale4923382018-03-11 20:32:10 +05302141 u8 status = 0;
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05302142 int rc;
2143 u32 fifo_rt_length = 0, sleep_fifo_length = 0;
2144
Anirudh Ghayale4923382018-03-11 20:32:10 +05302145 /* skip if profile is not loaded */
2146 if (!chip->profile_loaded)
2147 return 0;
2148
Anirudh Ghayalc6096392018-03-07 19:57:05 +05302149 chip->suspend_data = false;
2150
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05302151 /* ignore any suspend processing if we are charging */
2152 if (chip->charge_status == POWER_SUPPLY_STATUS_CHARGING) {
2153 qg_dbg(chip, QG_DEBUG_PM, "Charging @ suspend - ignore processing\n");
2154 return 0;
2155 }
2156
2157 rc = get_fifo_length(chip, &fifo_rt_length, true);
2158 if (rc < 0) {
2159 pr_err("Failed to read FIFO RT count, rc=%d\n", rc);
2160 return rc;
2161 }
2162
2163 rc = qg_read(chip, chip->qg_base + QG_S3_SLEEP_OCV_IBAT_CTL1_REG,
2164 (u8 *)&sleep_fifo_length, 1);
2165 if (rc < 0) {
2166 pr_err("Failed to read sleep FIFO count, rc=%d\n", rc);
2167 return rc;
2168 }
2169 sleep_fifo_length &= SLEEP_IBAT_QUALIFIED_LENGTH_MASK;
2170 /*
2171 * If the real-time FIFO count is greater than
2172 * the the #fifo to enter sleep, save the FIFO data
2173 * and reset the fifo count.
2174 */
2175 if (fifo_rt_length >= (chip->dt.s2_fifo_length - sleep_fifo_length)) {
2176 rc = qg_master_hold(chip, true);
2177 if (rc < 0) {
2178 pr_err("Failed to hold master, rc=%d\n", rc);
2179 return rc;
2180 }
2181
2182 rc = qg_process_rt_fifo(chip);
2183 if (rc < 0) {
2184 pr_err("Failed to process FIFO real-time, rc=%d\n", rc);
2185 qg_master_hold(chip, false);
2186 return rc;
2187 }
2188
2189 rc = qg_master_hold(chip, false);
2190 if (rc < 0) {
2191 pr_err("Failed to release master, rc=%d\n", rc);
2192 return rc;
2193 }
2194 /* FIFOs restarted */
2195 chip->last_fifo_update_time = ktime_get();
2196
2197 chip->suspend_data = true;
2198 }
2199
Anirudh Ghayale4923382018-03-11 20:32:10 +05302200 /* read STATUS2 register to clear its last state */
2201 qg_read(chip, chip->qg_base + QG_STATUS2_REG, &status, 1);
2202
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05302203 qg_dbg(chip, QG_DEBUG_PM, "FIFO rt_length=%d sleep_fifo_length=%d default_s2_count=%d suspend_data=%d\n",
2204 fifo_rt_length, sleep_fifo_length,
2205 chip->dt.s2_fifo_length, chip->suspend_data);
2206
2207 return rc;
2208}
2209
2210static int process_resume(struct qpnp_qg *chip)
2211{
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05302212 u8 status2 = 0, rt_status = 0;
Anirudh Ghayalc6096392018-03-07 19:57:05 +05302213 u32 ocv_uv = 0;
2214 int rc, batt_temp = 0;
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05302215
Anirudh Ghayale4923382018-03-11 20:32:10 +05302216 /* skip if profile is not loaded */
2217 if (!chip->profile_loaded)
2218 return 0;
2219
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05302220 rc = qg_read(chip, chip->qg_base + QG_STATUS2_REG, &status2, 1);
2221 if (rc < 0) {
2222 pr_err("Failed to read status2 register, rc=%d\n", rc);
2223 return rc;
2224 }
2225
2226 if (status2 & GOOD_OCV_BIT) {
2227 rc = qg_read_ocv(chip, &ocv_uv, GOOD_OCV);
2228 if (rc < 0) {
2229 pr_err("Failed to read good_ocv, rc=%d\n", rc);
2230 return rc;
2231 }
2232 rc = qg_get_battery_temp(chip, &batt_temp);
2233 if (rc < 0) {
2234 pr_err("Failed to read BATT_TEMP, rc=%d\n", rc);
2235 return rc;
2236 }
2237
2238 chip->kdata.param[QG_GOOD_OCV_UV].data = ocv_uv;
2239 chip->kdata.param[QG_GOOD_OCV_UV].valid = true;
Anirudh Ghayalc6096392018-03-07 19:57:05 +05302240 /* Clear suspend data as there has been a GOOD OCV */
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05302241 chip->suspend_data = false;
Anirudh Ghayalc6096392018-03-07 19:57:05 +05302242 qg_dbg(chip, QG_DEBUG_PM, "GOOD OCV @ resume good_ocv=%d uV\n",
2243 ocv_uv);
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05302244 }
Anirudh Ghayalc6096392018-03-07 19:57:05 +05302245
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05302246 rc = qg_read(chip, chip->qg_base + QG_INT_LATCHED_STS_REG,
2247 &rt_status, 1);
2248 if (rc < 0) {
2249 pr_err("Failed to read latched status register, rc=%d\n", rc);
2250 return rc;
2251 }
2252 rt_status &= FIFO_UPDATE_DONE_INT_LAT_STS_BIT;
2253
Anirudh Ghayalc6096392018-03-07 19:57:05 +05302254 qg_dbg(chip, QG_DEBUG_PM, "FIFO_DONE_STS=%d suspend_data=%d good_ocv=%d\n",
2255 !!rt_status, chip->suspend_data,
2256 chip->kdata.param[QG_GOOD_OCV_UV].valid);
2257 /*
2258 * If this is not a wakeup from FIFO-done,
2259 * process the data immediately if - we have data from
2260 * suspend or there is a good OCV.
2261 */
2262 if (!rt_status && (chip->suspend_data ||
2263 chip->kdata.param[QG_GOOD_OCV_UV].valid)) {
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05302264 vote(chip->awake_votable, SUSPEND_DATA_VOTER, true, 0);
2265 /* signal the read thread */
2266 chip->data_ready = true;
2267 wake_up_interruptible(&chip->qg_wait_q);
Anirudh Ghayalc6096392018-03-07 19:57:05 +05302268 chip->suspend_data = false;
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05302269 }
2270
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05302271 return rc;
2272}
2273
2274static int qpnp_qg_suspend_noirq(struct device *dev)
2275{
2276 int rc;
2277 struct qpnp_qg *chip = dev_get_drvdata(dev);
2278
2279 mutex_lock(&chip->data_lock);
2280
2281 rc = process_suspend(chip);
2282 if (rc < 0)
2283 pr_err("Failed to process QG suspend, rc=%d\n", rc);
2284
2285 mutex_unlock(&chip->data_lock);
2286
2287 return 0;
2288}
2289
2290static int qpnp_qg_resume_noirq(struct device *dev)
2291{
2292 int rc;
2293 struct qpnp_qg *chip = dev_get_drvdata(dev);
2294
2295 mutex_lock(&chip->data_lock);
2296
2297 rc = process_resume(chip);
2298 if (rc < 0)
2299 pr_err("Failed to process QG resume, rc=%d\n", rc);
2300
2301 mutex_unlock(&chip->data_lock);
2302
2303 return 0;
2304}
2305
2306static const struct dev_pm_ops qpnp_qg_pm_ops = {
2307 .suspend_noirq = qpnp_qg_suspend_noirq,
2308 .resume_noirq = qpnp_qg_resume_noirq,
2309};
2310
2311static int qpnp_qg_probe(struct platform_device *pdev)
2312{
2313 int rc = 0, soc = 0;
2314 struct qpnp_qg *chip;
2315
2316 chip = devm_kzalloc(&pdev->dev, sizeof(*chip), GFP_KERNEL);
2317 if (!chip)
2318 return -ENOMEM;
2319
2320 chip->regmap = dev_get_regmap(pdev->dev.parent, NULL);
2321 if (!chip->regmap) {
2322 pr_err("Parent regmap is unavailable\n");
2323 return -ENXIO;
2324 }
2325
2326 /* VADC for BID */
2327 chip->vadc_dev = qpnp_get_vadc(&pdev->dev, "qg");
2328 if (IS_ERR(chip->vadc_dev)) {
2329 rc = PTR_ERR(chip->vadc_dev);
2330 if (rc != -EPROBE_DEFER)
2331 pr_err("Failed to find VADC node, rc=%d\n", rc);
2332
2333 return rc;
2334 }
2335
2336 chip->dev = &pdev->dev;
2337 chip->debug_mask = &qg_debug_mask;
2338 platform_set_drvdata(pdev, chip);
2339 INIT_WORK(&chip->udata_work, process_udata_work);
2340 INIT_WORK(&chip->qg_status_change_work, qg_status_change_work);
2341 mutex_init(&chip->bus_lock);
2342 mutex_init(&chip->soc_lock);
2343 mutex_init(&chip->data_lock);
2344 init_waitqueue_head(&chip->qg_wait_q);
2345
2346 rc = qg_parse_dt(chip);
2347 if (rc < 0) {
2348 pr_err("Failed to parse DT, rc=%d\n", rc);
2349 return rc;
2350 }
2351
2352 rc = qg_hw_init(chip);
2353 if (rc < 0) {
2354 pr_err("Failed to hw_init, rc=%d\n", rc);
2355 return rc;
2356 }
2357
2358 rc = qg_setup_battery(chip);
2359 if (rc < 0) {
2360 pr_err("Failed to setup battery, rc=%d\n", rc);
2361 return rc;
2362 }
2363
2364 rc = qg_register_device(chip);
2365 if (rc < 0) {
2366 pr_err("Failed to register QG char device, rc=%d\n", rc);
2367 return rc;
2368 }
2369
2370 rc = qg_sdam_init(chip->dev);
2371 if (rc < 0) {
2372 pr_err("Failed to initialize QG SDAM, rc=%d\n", rc);
2373 return rc;
2374 }
2375
2376 rc = qg_soc_init(chip);
2377 if (rc < 0) {
2378 pr_err("Failed to initialize SOC scaling init rc=%d\n", rc);
2379 return rc;
2380 }
2381
2382 rc = qg_determine_pon_soc(chip);
2383 if (rc < 0) {
2384 pr_err("Failed to determine initial state, rc=%d\n", rc);
2385 goto fail_device;
2386 }
2387
2388 chip->awake_votable = create_votable("QG_WS", VOTE_SET_ANY,
2389 qg_awake_cb, chip);
2390 if (IS_ERR(chip->awake_votable)) {
2391 rc = PTR_ERR(chip->awake_votable);
2392 chip->awake_votable = NULL;
2393 goto fail_device;
2394 }
2395
2396 chip->vbatt_irq_disable_votable = create_votable("QG_VBATT_IRQ_DISABLE",
2397 VOTE_SET_ANY, qg_vbatt_irq_disable_cb, chip);
2398 if (IS_ERR(chip->vbatt_irq_disable_votable)) {
2399 rc = PTR_ERR(chip->vbatt_irq_disable_votable);
2400 chip->vbatt_irq_disable_votable = NULL;
2401 goto fail_device;
2402 }
2403
2404 chip->fifo_irq_disable_votable = create_votable("QG_FIFO_IRQ_DISABLE",
2405 VOTE_SET_ANY, qg_fifo_irq_disable_cb, chip);
2406 if (IS_ERR(chip->fifo_irq_disable_votable)) {
2407 rc = PTR_ERR(chip->fifo_irq_disable_votable);
2408 chip->fifo_irq_disable_votable = NULL;
2409 goto fail_device;
2410 }
2411
2412 chip->good_ocv_irq_disable_votable =
2413 create_votable("QG_GOOD_IRQ_DISABLE",
2414 VOTE_SET_ANY, qg_good_ocv_irq_disable_cb, chip);
2415 if (IS_ERR(chip->good_ocv_irq_disable_votable)) {
2416 rc = PTR_ERR(chip->good_ocv_irq_disable_votable);
2417 chip->good_ocv_irq_disable_votable = NULL;
2418 goto fail_device;
2419 }
2420
2421 rc = qg_init_psy(chip);
2422 if (rc < 0) {
2423 pr_err("Failed to initialize QG psy, rc=%d\n", rc);
2424 goto fail_votable;
2425 }
2426
2427 rc = qg_request_irqs(chip);
2428 if (rc < 0) {
2429 pr_err("Failed to register QG interrupts, rc=%d\n", rc);
2430 goto fail_votable;
2431 }
2432
2433 rc = qg_post_init(chip);
2434 if (rc < 0) {
2435 pr_err("Failed in qg_post_init rc=%d\n", rc);
2436 goto fail_votable;
2437 }
2438
2439 qg_get_battery_capacity(chip, &soc);
2440 pr_info("QG initialized! battery_profile=%s SOC=%d\n",
2441 qg_get_battery_type(chip), soc);
2442
2443 return rc;
2444
2445fail_votable:
2446 destroy_votable(chip->awake_votable);
2447fail_device:
2448 device_destroy(chip->qg_class, chip->dev_no);
2449 cdev_del(&chip->qg_cdev);
2450 unregister_chrdev_region(chip->dev_no, 1);
2451 return rc;
2452}
2453
2454static int qpnp_qg_remove(struct platform_device *pdev)
2455{
2456 struct qpnp_qg *chip = platform_get_drvdata(pdev);
2457
2458 qg_batterydata_exit();
2459 qg_soc_exit(chip);
2460
2461 cancel_work_sync(&chip->udata_work);
2462 cancel_work_sync(&chip->qg_status_change_work);
2463 device_destroy(chip->qg_class, chip->dev_no);
2464 cdev_del(&chip->qg_cdev);
2465 unregister_chrdev_region(chip->dev_no, 1);
2466 mutex_destroy(&chip->bus_lock);
2467 mutex_destroy(&chip->data_lock);
2468 mutex_destroy(&chip->soc_lock);
2469 if (chip->awake_votable)
2470 destroy_votable(chip->awake_votable);
2471
2472 return 0;
2473}
2474
2475static const struct of_device_id match_table[] = {
2476 { .compatible = "qcom,qpnp-qg", },
2477 { },
2478};
2479
2480static struct platform_driver qpnp_qg_driver = {
2481 .driver = {
2482 .name = "qcom,qpnp-qg",
2483 .owner = THIS_MODULE,
2484 .of_match_table = match_table,
2485 .pm = &qpnp_qg_pm_ops,
2486 },
2487 .probe = qpnp_qg_probe,
2488 .remove = qpnp_qg_remove,
2489};
2490module_platform_driver(qpnp_qg_driver);
2491
2492MODULE_DESCRIPTION("QPNP QG Driver");
2493MODULE_LICENSE("GPL v2");