blob: 56233f5179ef35cc4a0a5cfa26ad7c613ec4d867 [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 */
534 chip->sdam_data[SDAM_SOC] =
535 chip->udata.param[QG_SOC].data;
536 chip->sdam_data[SDAM_OCV_UV] =
537 chip->udata.param[QG_OCV_UV].data;
538 chip->sdam_data[SDAM_RBAT_MOHM] =
539 chip->udata.param[QG_RBAT_MOHM].data;
540 chip->sdam_data[SDAM_VALID] = 1;
541
542 rc = qg_update_sdam_params(chip);
543 if (rc < 0)
544 pr_err("Failed to update SDAM params, rc=%d\n", rc);
545 }
546
Anirudh Ghayal07fbf792018-02-26 11:38:33 +0530547 if (chip->udata.param[QG_CHARGE_COUNTER].valid)
548 chip->charge_counter_uah =
549 chip->udata.param[QG_CHARGE_COUNTER].data;
550
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +0530551 vote(chip->awake_votable, UDATA_READY_VOTER, false, 0);
552}
553
554static irqreturn_t qg_default_irq_handler(int irq, void *data)
555{
556 struct qpnp_qg *chip = data;
557
558 qg_dbg(chip, QG_DEBUG_IRQ, "IRQ triggered\n");
559
560 return IRQ_HANDLED;
561}
562
563#define MAX_FIFO_DELTA_PERCENT 10
564static irqreturn_t qg_fifo_update_done_handler(int irq, void *data)
565{
566 ktime_t now = ktime_get();
567 int rc, hw_delta_ms = 0, margin_ms = 0;
568 u32 fifo_length = 0;
569 s64 time_delta_ms = 0;
570 struct qpnp_qg *chip = data;
571
572 time_delta_ms = ktime_ms_delta(now, chip->last_fifo_update_time);
573 chip->last_fifo_update_time = now;
574
575 qg_dbg(chip, QG_DEBUG_IRQ, "IRQ triggered\n");
576 mutex_lock(&chip->data_lock);
577
578 rc = get_fifo_length(chip, &fifo_length, false);
579 if (rc < 0) {
580 pr_err("Failed to get FIFO length, rc=%d\n", rc);
581 goto done;
582 }
583
584 rc = qg_process_fifo(chip, fifo_length);
585 if (rc < 0) {
586 pr_err("Failed to process QG FIFO, rc=%d\n", rc);
587 goto done;
588 }
589
590 rc = qg_vbat_low_wa(chip);
591 if (rc < 0) {
592 pr_err("Failed to apply VBAT LOW WA, rc=%d\n", rc);
593 goto done;
594 }
595
596 rc = get_fifo_done_time(chip, false, &hw_delta_ms);
597 if (rc < 0)
598 hw_delta_ms = 0;
599 else
600 margin_ms = (hw_delta_ms * MAX_FIFO_DELTA_PERCENT) / 100;
601
602 if (abs(hw_delta_ms - time_delta_ms) < margin_ms) {
603 chip->kdata.param[QG_FIFO_TIME_DELTA].data = time_delta_ms;
604 chip->kdata.param[QG_FIFO_TIME_DELTA].valid = true;
605 qg_dbg(chip, QG_DEBUG_FIFO, "FIFO_done time_delta_ms=%lld\n",
606 time_delta_ms);
607 }
608
609 /* signal the read thread */
610 chip->data_ready = true;
611 wake_up_interruptible(&chip->qg_wait_q);
612
613 /* vote to stay awake until userspace reads data */
614 vote(chip->awake_votable, FIFO_DONE_VOTER, true, 0);
615
616done:
617 mutex_unlock(&chip->data_lock);
618 return IRQ_HANDLED;
619}
620
621static irqreturn_t qg_vbat_low_handler(int irq, void *data)
622{
623 int rc;
624 struct qpnp_qg *chip = data;
625 u8 status = 0;
626
627 qg_dbg(chip, QG_DEBUG_IRQ, "IRQ triggered\n");
628 mutex_lock(&chip->data_lock);
629
630 rc = qg_read(chip, chip->qg_base + QG_INT_RT_STS_REG, &status, 1);
631 if (rc < 0) {
632 pr_err("Failed to read RT status, rc=%d\n", rc);
633 goto done;
634 }
635 chip->vbat_low = !!(status & VBAT_LOW_INT_RT_STS_BIT);
636
637 rc = process_rt_fifo_data(chip, chip->vbat_low, false);
638 if (rc < 0)
639 pr_err("Failed to process RT FIFO data, rc=%d\n", rc);
640
641 qg_dbg(chip, QG_DEBUG_IRQ, "VBAT_LOW = %d\n", chip->vbat_low);
642done:
643 mutex_unlock(&chip->data_lock);
644 return IRQ_HANDLED;
645}
646
647static irqreturn_t qg_vbat_empty_handler(int irq, void *data)
648{
649 struct qpnp_qg *chip = data;
650 u32 ocv_uv = 0;
651
652 qg_dbg(chip, QG_DEBUG_IRQ, "IRQ triggered\n");
653 pr_warn("VBATT EMPTY SOC = 0\n");
654
655 chip->catch_up_soc = 0;
656 qg_scale_soc(chip, true);
657
658 qg_sdam_read(SDAM_OCV_UV, &ocv_uv);
659 chip->sdam_data[SDAM_SOC] = 0;
660 chip->sdam_data[SDAM_OCV_UV] = ocv_uv;
661 chip->sdam_data[SDAM_VALID] = 1;
662
663 qg_update_sdam_params(chip);
664
665 if (chip->qg_psy)
666 power_supply_changed(chip->qg_psy);
667
668 return IRQ_HANDLED;
669}
670
671static irqreturn_t qg_good_ocv_handler(int irq, void *data)
672{
673 int rc;
Anirudh Ghayale4923382018-03-11 20:32:10 +0530674 u8 status = 0;
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +0530675 u32 ocv_uv;
676 struct qpnp_qg *chip = data;
677
678 qg_dbg(chip, QG_DEBUG_IRQ, "IRQ triggered\n");
679
680 mutex_lock(&chip->data_lock);
681
Anirudh Ghayale4923382018-03-11 20:32:10 +0530682 rc = qg_read(chip, chip->qg_base + QG_STATUS2_REG, &status, 1);
683 if (rc < 0) {
684 pr_err("Failed to read status2 register rc=%d\n", rc);
685 goto done;
686 }
687
688 if (!(status & GOOD_OCV_BIT))
689 goto done;
690
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +0530691 rc = qg_read_ocv(chip, &ocv_uv, GOOD_OCV);
692 if (rc < 0) {
693 pr_err("Failed to read good_ocv, rc=%d\n", rc);
694 goto done;
695 }
696
697 chip->kdata.param[QG_GOOD_OCV_UV].data = ocv_uv;
698 chip->kdata.param[QG_GOOD_OCV_UV].valid = true;
699
700 vote(chip->awake_votable, GOOD_OCV_VOTER, true, 0);
701
702 /* signal the readd thread */
703 chip->data_ready = true;
704 wake_up_interruptible(&chip->qg_wait_q);
705done:
706 mutex_unlock(&chip->data_lock);
707 return IRQ_HANDLED;
708}
709
710static struct qg_irq_info qg_irqs[] = {
711 [QG_BATT_MISSING_IRQ] = {
712 .name = "qg-batt-missing",
713 .handler = qg_default_irq_handler,
714 },
715 [QG_VBATT_LOW_IRQ] = {
716 .name = "qg-vbat-low",
717 .handler = qg_vbat_low_handler,
718 .wake = true,
719 },
720 [QG_VBATT_EMPTY_IRQ] = {
721 .name = "qg-vbat-empty",
722 .handler = qg_vbat_empty_handler,
723 .wake = true,
724 },
725 [QG_FIFO_UPDATE_DONE_IRQ] = {
726 .name = "qg-fifo-done",
727 .handler = qg_fifo_update_done_handler,
728 .wake = true,
729 },
730 [QG_GOOD_OCV_IRQ] = {
731 .name = "qg-good-ocv",
732 .handler = qg_good_ocv_handler,
733 .wake = true,
734 },
735 [QG_FSM_STAT_CHG_IRQ] = {
736 .name = "qg-fsm-state-chg",
737 .handler = qg_default_irq_handler,
738 },
739 [QG_EVENT_IRQ] = {
740 .name = "qg-event",
741 .handler = qg_default_irq_handler,
742 },
743};
744
745static int qg_awake_cb(struct votable *votable, void *data, int awake,
746 const char *client)
747{
748 struct qpnp_qg *chip = data;
749
Anirudh Ghayale4923382018-03-11 20:32:10 +0530750 /* ignore if the QG device is not open */
751 if (!chip->qg_device_open)
752 return 0;
753
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +0530754 if (awake)
755 pm_stay_awake(chip->dev);
756 else
757 pm_relax(chip->dev);
758
759 pr_debug("client: %s awake: %d\n", client, awake);
760 return 0;
761}
762
763static int qg_fifo_irq_disable_cb(struct votable *votable, void *data,
764 int disable, const char *client)
765{
766 if (disable) {
767 if (qg_irqs[QG_FIFO_UPDATE_DONE_IRQ].wake)
768 disable_irq_wake(
769 qg_irqs[QG_FIFO_UPDATE_DONE_IRQ].irq);
770 if (qg_irqs[QG_FIFO_UPDATE_DONE_IRQ].irq)
771 disable_irq_nosync(
772 qg_irqs[QG_FIFO_UPDATE_DONE_IRQ].irq);
773 } else {
774 if (qg_irqs[QG_FIFO_UPDATE_DONE_IRQ].irq)
775 enable_irq(qg_irqs[QG_FIFO_UPDATE_DONE_IRQ].irq);
776 if (qg_irqs[QG_FIFO_UPDATE_DONE_IRQ].wake)
777 enable_irq_wake(
778 qg_irqs[QG_FIFO_UPDATE_DONE_IRQ].irq);
779 }
780
781 return 0;
782}
783
784static int qg_vbatt_irq_disable_cb(struct votable *votable, void *data,
785 int disable, const char *client)
786{
787 if (disable) {
788 if (qg_irqs[QG_VBATT_LOW_IRQ].wake)
789 disable_irq_wake(qg_irqs[QG_VBATT_LOW_IRQ].irq);
790 if (qg_irqs[QG_VBATT_EMPTY_IRQ].wake)
791 disable_irq_wake(qg_irqs[QG_VBATT_EMPTY_IRQ].irq);
792 if (qg_irqs[QG_VBATT_LOW_IRQ].irq)
793 disable_irq_nosync(qg_irqs[QG_VBATT_LOW_IRQ].irq);
794 if (qg_irqs[QG_VBATT_EMPTY_IRQ].irq)
795 disable_irq_nosync(qg_irqs[QG_VBATT_EMPTY_IRQ].irq);
796 } else {
797 if (qg_irqs[QG_VBATT_LOW_IRQ].irq)
798 enable_irq(qg_irqs[QG_VBATT_LOW_IRQ].irq);
799 if (qg_irqs[QG_VBATT_EMPTY_IRQ].irq)
800 enable_irq(qg_irqs[QG_VBATT_EMPTY_IRQ].irq);
801 if (qg_irqs[QG_VBATT_LOW_IRQ].wake)
802 enable_irq_wake(qg_irqs[QG_VBATT_LOW_IRQ].irq);
803 if (qg_irqs[QG_VBATT_EMPTY_IRQ].wake)
804 enable_irq_wake(qg_irqs[QG_VBATT_EMPTY_IRQ].irq);
805 }
806
807 return 0;
808}
809
810static int qg_good_ocv_irq_disable_cb(struct votable *votable, void *data,
811 int disable, const char *client)
812{
813 if (disable) {
814 if (qg_irqs[QG_GOOD_OCV_IRQ].wake)
815 disable_irq_wake(qg_irqs[QG_GOOD_OCV_IRQ].irq);
816 if (qg_irqs[QG_GOOD_OCV_IRQ].irq)
817 disable_irq_nosync(qg_irqs[QG_GOOD_OCV_IRQ].irq);
818 } else {
819 if (qg_irqs[QG_GOOD_OCV_IRQ].irq)
820 enable_irq(qg_irqs[QG_GOOD_OCV_IRQ].irq);
821 if (qg_irqs[QG_GOOD_OCV_IRQ].wake)
822 enable_irq_wake(qg_irqs[QG_GOOD_OCV_IRQ].irq);
823 }
824
825 return 0;
826}
827
828#define DEFAULT_BATT_TYPE "Unknown Battery"
829#define MISSING_BATT_TYPE "Missing Battery"
830#define DEBUG_BATT_TYPE "Debug Board"
831static const char *qg_get_battery_type(struct qpnp_qg *chip)
832{
833 if (chip->battery_missing)
834 return MISSING_BATT_TYPE;
835
836 if (is_debug_batt_id(chip))
837 return DEBUG_BATT_TYPE;
838
839 if (chip->bp.batt_type_str) {
840 if (chip->profile_loaded)
841 return chip->bp.batt_type_str;
842 }
843
844 return DEFAULT_BATT_TYPE;
845}
846
847static int qg_get_battery_current(struct qpnp_qg *chip, int *ibat_ua)
848{
849 int rc = 0, last_ibat = 0;
850
851 if (chip->battery_missing) {
852 *ibat_ua = 0;
853 return 0;
854 }
855
856 rc = qg_read(chip, chip->qg_base + QG_LAST_ADC_I_DATA0_REG,
857 (u8 *)&last_ibat, 2);
858 if (rc < 0) {
859 pr_err("Failed to read LAST_ADV_I reg, rc=%d\n", rc);
860 return rc;
861 }
862
863 last_ibat = sign_extend32(last_ibat, 15);
864 *ibat_ua = I_RAW_TO_UA(last_ibat);
865
866 return rc;
867}
868
869static int qg_get_battery_voltage(struct qpnp_qg *chip, int *vbat_uv)
870{
871 int rc = 0;
872 u64 last_vbat = 0;
873
874 if (chip->battery_missing) {
875 *vbat_uv = 3700000;
876 return 0;
877 }
878
879 rc = qg_read(chip, chip->qg_base + QG_LAST_ADC_V_DATA0_REG,
880 (u8 *)&last_vbat, 2);
881 if (rc < 0) {
882 pr_err("Failed to read LAST_ADV_V reg, rc=%d\n", rc);
883 return rc;
884 }
885
886 *vbat_uv = V_RAW_TO_UV(last_vbat);
887
888 return rc;
889}
890
891#define DEBUG_BATT_SOC 67
892#define BATT_MISSING_SOC 50
893#define EMPTY_SOC 0
894static 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
906 *soc = chip->msoc;
907
908 return 0;
909}
910
911static int qg_get_battery_temp(struct qpnp_qg *chip, int *temp)
912{
913 int rc = 0;
914 struct qpnp_vadc_result result;
915
916 if (chip->battery_missing) {
917 *temp = 250;
918 return 0;
919 }
920
921 rc = qpnp_vadc_read(chip->vadc_dev, VADC_BAT_THERM_PU2, &result);
922 if (rc) {
923 pr_err("Failed reading adc channel=%d, rc=%d\n",
924 VADC_BAT_THERM_PU2, rc);
925 return rc;
926 }
927 pr_debug("batt_temp = %lld meas = 0x%llx\n",
928 result.physical, result.measurement);
929
930 *temp = (int)result.physical;
931
932 return rc;
933}
934
935static int qg_psy_set_property(struct power_supply *psy,
936 enum power_supply_property psp,
937 const union power_supply_propval *pval)
938{
939 return 0;
940}
941
942static int qg_psy_get_property(struct power_supply *psy,
943 enum power_supply_property psp,
944 union power_supply_propval *pval)
945{
946 struct qpnp_qg *chip = power_supply_get_drvdata(psy);
947 int rc = 0;
948
949 pval->intval = 0;
950
951 switch (psp) {
952 case POWER_SUPPLY_PROP_CAPACITY:
953 rc = qg_get_battery_capacity(chip, &pval->intval);
954 break;
955 case POWER_SUPPLY_PROP_VOLTAGE_NOW:
956 rc = qg_get_battery_voltage(chip, &pval->intval);
957 break;
958 case POWER_SUPPLY_PROP_CURRENT_NOW:
959 rc = qg_get_battery_current(chip, &pval->intval);
960 break;
961 case POWER_SUPPLY_PROP_VOLTAGE_OCV:
962 rc = qg_sdam_read(SDAM_OCV_UV, &pval->intval);
963 break;
964 case POWER_SUPPLY_PROP_TEMP:
965 rc = qg_get_battery_temp(chip, &pval->intval);
966 break;
967 case POWER_SUPPLY_PROP_RESISTANCE_ID:
968 pval->intval = chip->batt_id_ohm;
969 break;
970 case POWER_SUPPLY_PROP_DEBUG_BATTERY:
971 pval->intval = is_debug_batt_id(chip);
972 break;
973 case POWER_SUPPLY_PROP_RESISTANCE:
974 rc = qg_sdam_read(SDAM_RBAT_MOHM, &pval->intval);
975 if (!rc)
976 pval->intval *= 1000;
977 break;
978 case POWER_SUPPLY_PROP_RESISTANCE_CAPACITIVE:
979 pval->intval = chip->dt.rbat_conn_mohm;
980 break;
981 case POWER_SUPPLY_PROP_BATTERY_TYPE:
982 pval->strval = qg_get_battery_type(chip);
983 break;
984 case POWER_SUPPLY_PROP_VOLTAGE_MIN:
985 pval->intval = chip->dt.vbatt_cutoff_mv * 1000;
986 break;
987 case POWER_SUPPLY_PROP_VOLTAGE_MAX:
988 pval->intval = chip->bp.float_volt_uv;
989 break;
990 case POWER_SUPPLY_PROP_BATT_FULL_CURRENT:
991 pval->intval = chip->dt.iterm_ma * 1000;
992 break;
993 case POWER_SUPPLY_PROP_BATT_PROFILE_VERSION:
994 pval->intval = chip->bp.qg_profile_version;
995 break;
Anirudh Ghayal07fbf792018-02-26 11:38:33 +0530996 case POWER_SUPPLY_PROP_CHARGE_COUNTER:
997 pval->intval = chip->charge_counter_uah;
998 break;
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +0530999 default:
1000 pr_debug("Unsupported property %d\n", psp);
1001 break;
1002 }
1003
1004 return rc;
1005}
1006
1007static int qg_property_is_writeable(struct power_supply *psy,
1008 enum power_supply_property psp)
1009{
1010 return 0;
1011}
1012
1013static enum power_supply_property qg_psy_props[] = {
1014 POWER_SUPPLY_PROP_CAPACITY,
1015 POWER_SUPPLY_PROP_TEMP,
1016 POWER_SUPPLY_PROP_VOLTAGE_NOW,
1017 POWER_SUPPLY_PROP_VOLTAGE_OCV,
1018 POWER_SUPPLY_PROP_CURRENT_NOW,
Anirudh Ghayal07fbf792018-02-26 11:38:33 +05301019 POWER_SUPPLY_PROP_CHARGE_COUNTER,
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301020 POWER_SUPPLY_PROP_RESISTANCE,
1021 POWER_SUPPLY_PROP_RESISTANCE_ID,
1022 POWER_SUPPLY_PROP_RESISTANCE_CAPACITIVE,
1023 POWER_SUPPLY_PROP_DEBUG_BATTERY,
1024 POWER_SUPPLY_PROP_BATTERY_TYPE,
1025 POWER_SUPPLY_PROP_VOLTAGE_MIN,
1026 POWER_SUPPLY_PROP_VOLTAGE_MAX,
1027 POWER_SUPPLY_PROP_BATT_FULL_CURRENT,
1028 POWER_SUPPLY_PROP_BATT_PROFILE_VERSION,
1029};
1030
1031static const struct power_supply_desc qg_psy_desc = {
1032 .name = "bms",
1033 .type = POWER_SUPPLY_TYPE_BMS,
1034 .properties = qg_psy_props,
1035 .num_properties = ARRAY_SIZE(qg_psy_props),
1036 .get_property = qg_psy_get_property,
1037 .set_property = qg_psy_set_property,
1038 .property_is_writeable = qg_property_is_writeable,
1039};
1040
1041static int qg_charge_full_update(struct qpnp_qg *chip)
1042{
1043
1044 vote(chip->good_ocv_irq_disable_votable,
1045 QG_INIT_STATE_IRQ_DISABLE, !chip->charge_done, 0);
1046
1047 /* TODO: add hold-soc-at-full logic */
1048 return 0;
1049}
1050
1051static int qg_parallel_status_update(struct qpnp_qg *chip)
1052{
1053 int rc;
1054 bool parallel_enabled = is_parallel_enabled(chip);
1055
1056 if (parallel_enabled == chip->parallel_enabled)
1057 return 0;
1058
1059 chip->parallel_enabled = parallel_enabled;
1060 qg_dbg(chip, QG_DEBUG_STATUS,
1061 "Parallel status changed Enabled=%d\n", parallel_enabled);
1062
1063 mutex_lock(&chip->data_lock);
1064
1065 rc = process_rt_fifo_data(chip, false, true);
1066 if (rc < 0)
1067 pr_err("Failed to process RT FIFO data, rc=%d\n", rc);
1068
1069 mutex_unlock(&chip->data_lock);
1070
1071 return 0;
1072}
1073
1074static int qg_usb_status_update(struct qpnp_qg *chip)
1075{
1076 bool usb_present = is_usb_present(chip);
1077
1078 if (chip->usb_present != usb_present) {
1079 qg_dbg(chip, QG_DEBUG_STATUS,
1080 "USB status changed Present=%d\n",
1081 usb_present);
1082 qg_scale_soc(chip, false);
1083 }
1084
1085 chip->usb_present = usb_present;
1086
1087 return 0;
1088}
1089
1090static void qg_status_change_work(struct work_struct *work)
1091{
1092 struct qpnp_qg *chip = container_of(work,
1093 struct qpnp_qg, qg_status_change_work);
1094 union power_supply_propval prop = {0, };
1095 int rc = 0;
1096
1097 if (!is_batt_available(chip)) {
1098 pr_debug("batt-psy not available\n");
1099 goto out;
1100 }
1101
1102 rc = power_supply_get_property(chip->batt_psy,
1103 POWER_SUPPLY_PROP_STATUS, &prop);
1104 if (rc < 0)
1105 pr_err("Failed to get charger status, rc=%d\n", rc);
1106 else
1107 chip->charge_status = prop.intval;
1108
1109 rc = power_supply_get_property(chip->batt_psy,
1110 POWER_SUPPLY_PROP_CHARGE_DONE, &prop);
1111 if (rc < 0)
1112 pr_err("Failed to get charge done status, rc=%d\n", rc);
1113 else
1114 chip->charge_done = prop.intval;
1115
1116 rc = qg_parallel_status_update(chip);
1117 if (rc < 0)
1118 pr_err("Failed to update parallel-status, rc=%d\n", rc);
1119
1120 rc = qg_usb_status_update(chip);
1121 if (rc < 0)
1122 pr_err("Failed to update usb status, rc=%d\n", rc);
1123
1124 rc = qg_charge_full_update(chip);
1125 if (rc < 0)
1126 pr_err("Failed in charge_full_update, rc=%d\n", rc);
1127out:
1128 pm_relax(chip->dev);
1129}
1130
1131static int qg_notifier_cb(struct notifier_block *nb,
1132 unsigned long event, void *data)
1133{
1134 struct power_supply *psy = data;
1135 struct qpnp_qg *chip = container_of(nb, struct qpnp_qg, nb);
1136
1137 if (event != PSY_EVENT_PROP_CHANGED)
1138 return NOTIFY_OK;
1139
1140 if (work_pending(&chip->qg_status_change_work))
1141 return NOTIFY_OK;
1142
1143 if ((strcmp(psy->desc->name, "battery") == 0)
1144 || (strcmp(psy->desc->name, "parallel") == 0)
1145 || (strcmp(psy->desc->name, "usb") == 0)) {
1146 /*
1147 * We cannot vote for awake votable here as that takes
1148 * a mutex lock and this is executed in an atomic context.
1149 */
1150 pm_stay_awake(chip->dev);
1151 schedule_work(&chip->qg_status_change_work);
1152 }
1153
1154 return NOTIFY_OK;
1155}
1156
1157static int qg_init_psy(struct qpnp_qg *chip)
1158{
1159 struct power_supply_config qg_psy_cfg;
1160 int rc;
1161
1162 qg_psy_cfg.drv_data = chip;
1163 qg_psy_cfg.of_node = NULL;
1164 qg_psy_cfg.supplied_to = NULL;
1165 qg_psy_cfg.num_supplicants = 0;
1166 chip->qg_psy = devm_power_supply_register(chip->dev,
1167 &qg_psy_desc, &qg_psy_cfg);
1168 if (IS_ERR_OR_NULL(chip->qg_psy)) {
1169 pr_err("Failed to register qg_psy rc = %ld\n",
1170 PTR_ERR(chip->qg_psy));
1171 return -ENODEV;
1172 }
1173
1174 chip->nb.notifier_call = qg_notifier_cb;
1175 rc = power_supply_reg_notifier(&chip->nb);
1176 if (rc < 0)
1177 pr_err("Failed register psy notifier rc = %d\n", rc);
1178
1179 return rc;
1180}
1181
1182static ssize_t qg_device_read(struct file *file, char __user *buf, size_t count,
1183 loff_t *ppos)
1184{
1185 int rc;
1186 struct qpnp_qg *chip = file->private_data;
1187 unsigned long data_size = sizeof(chip->kdata);
1188
1189 /* non-blocking access, return */
1190 if (!chip->data_ready && (file->f_flags & O_NONBLOCK))
1191 return -EAGAIN;
1192
1193 /* blocking access wait on data_ready */
1194 if (!(file->f_flags & O_NONBLOCK)) {
1195 rc = wait_event_interruptible(chip->qg_wait_q,
1196 chip->data_ready);
1197 if (rc < 0) {
1198 pr_debug("Failed wait! rc=%d\n", rc);
1199 return rc;
1200 }
1201 }
1202
1203 mutex_lock(&chip->data_lock);
1204
1205 if (!chip->data_ready) {
1206 pr_debug("No Data, false wakeup\n");
1207 rc = -EFAULT;
1208 goto fail_read;
1209 }
1210
Anirudh Ghayal07fbf792018-02-26 11:38:33 +05301211
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301212 if (copy_to_user(buf, &chip->kdata, data_size)) {
1213 pr_err("Failed in copy_to_user\n");
1214 rc = -EFAULT;
1215 goto fail_read;
1216 }
1217 chip->data_ready = false;
1218
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301219 /* release all wake sources */
1220 vote(chip->awake_votable, GOOD_OCV_VOTER, false, 0);
1221 vote(chip->awake_votable, FIFO_DONE_VOTER, false, 0);
1222 vote(chip->awake_votable, FIFO_RT_DONE_VOTER, false, 0);
1223 vote(chip->awake_votable, SUSPEND_DATA_VOTER, false, 0);
1224
1225 qg_dbg(chip, QG_DEBUG_DEVICE,
Anirudh Ghayal07fbf792018-02-26 11:38:33 +05301226 "QG device read complete Seq_no=%u Size=%ld\n",
1227 chip->kdata.seq_no, data_size);
1228
1229 /* clear data */
1230 memset(&chip->kdata, 0, sizeof(chip->kdata));
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301231
1232 mutex_unlock(&chip->data_lock);
1233
1234 return data_size;
1235
1236fail_read:
1237 mutex_unlock(&chip->data_lock);
1238 return rc;
1239}
1240
1241static ssize_t qg_device_write(struct file *file, const char __user *buf,
1242 size_t count, loff_t *ppos)
1243{
1244 int rc = -EINVAL;
1245 struct qpnp_qg *chip = file->private_data;
1246 unsigned long data_size = sizeof(chip->udata);
1247
1248 mutex_lock(&chip->data_lock);
1249 if (count == 0) {
1250 pr_err("No data!\n");
1251 goto fail;
1252 }
1253
1254 if (count != 0 && count < data_size) {
Kiran Gunda0f5de042018-03-02 13:02:22 +05301255 pr_err("Invalid datasize %zu expected %lu\n", count, data_size);
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301256 goto fail;
1257 }
1258
1259 if (copy_from_user(&chip->udata, buf, data_size)) {
1260 pr_err("Failed in copy_from_user\n");
1261 rc = -EFAULT;
1262 goto fail;
1263 }
1264
1265 rc = data_size;
1266 vote(chip->awake_votable, UDATA_READY_VOTER, true, 0);
1267 schedule_work(&chip->udata_work);
1268 qg_dbg(chip, QG_DEBUG_DEVICE, "QG write complete size=%d\n", rc);
1269fail:
1270 mutex_unlock(&chip->data_lock);
1271 return rc;
1272}
1273
1274static unsigned int qg_device_poll(struct file *file, poll_table *wait)
1275{
1276 struct qpnp_qg *chip = file->private_data;
1277 unsigned int mask;
1278
1279 poll_wait(file, &chip->qg_wait_q, wait);
1280
1281 if (chip->data_ready)
1282 mask = POLLIN | POLLRDNORM;
1283 else
1284 mask = POLLERR;
1285
1286 return mask;
1287}
1288
1289static int qg_device_open(struct inode *inode, struct file *file)
1290{
1291 struct qpnp_qg *chip = container_of(inode->i_cdev,
1292 struct qpnp_qg, qg_cdev);
1293
1294 file->private_data = chip;
Anirudh Ghayale4923382018-03-11 20:32:10 +05301295 chip->qg_device_open = true;
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301296 qg_dbg(chip, QG_DEBUG_DEVICE, "QG device opened!\n");
1297
1298 return 0;
1299}
1300
Anirudh Ghayale4923382018-03-11 20:32:10 +05301301static int qg_device_release(struct inode *inode, struct file *file)
1302{
1303 struct qpnp_qg *chip = container_of(inode->i_cdev,
1304 struct qpnp_qg, qg_cdev);
1305
1306 file->private_data = chip;
1307 chip->qg_device_open = false;
1308 qg_dbg(chip, QG_DEBUG_DEVICE, "QG device closed!\n");
1309
1310 return 0;
1311}
1312
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301313static const struct file_operations qg_fops = {
1314 .owner = THIS_MODULE,
1315 .open = qg_device_open,
Anirudh Ghayale4923382018-03-11 20:32:10 +05301316 .release = qg_device_release,
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301317 .read = qg_device_read,
1318 .write = qg_device_write,
1319 .poll = qg_device_poll,
1320};
1321
1322static int qg_register_device(struct qpnp_qg *chip)
1323{
1324 int rc;
1325
1326 rc = alloc_chrdev_region(&chip->dev_no, 0, 1, "qg");
1327 if (rc < 0) {
1328 pr_err("Failed to allocate chardev rc=%d\n", rc);
1329 return rc;
1330 }
1331
1332 cdev_init(&chip->qg_cdev, &qg_fops);
1333 rc = cdev_add(&chip->qg_cdev, chip->dev_no, 1);
1334 if (rc < 0) {
1335 pr_err("Failed to cdev_add rc=%d\n", rc);
1336 goto unregister_chrdev;
1337 }
1338
1339 chip->qg_class = class_create(THIS_MODULE, "qg");
1340 if (IS_ERR_OR_NULL(chip->qg_class)) {
1341 pr_err("Failed to create qg class\n");
1342 rc = -EINVAL;
1343 goto delete_cdev;
1344 }
1345 chip->qg_device = device_create(chip->qg_class, NULL, chip->dev_no,
1346 NULL, "qg");
1347 if (IS_ERR(chip->qg_device)) {
1348 pr_err("Failed to create qg_device\n");
1349 rc = -EINVAL;
1350 goto destroy_class;
1351 }
1352
1353 qg_dbg(chip, QG_DEBUG_DEVICE, "'/dev/qg' successfully created\n");
1354
1355 return 0;
1356
1357destroy_class:
1358 class_destroy(chip->qg_class);
1359delete_cdev:
1360 cdev_del(&chip->qg_cdev);
1361unregister_chrdev:
1362 unregister_chrdev_region(chip->dev_no, 1);
1363 return rc;
1364}
1365
1366#define BID_RPULL_OHM 100000
1367#define BID_VREF_MV 1875
1368static int get_batt_id_ohm(struct qpnp_qg *chip, u32 *batt_id_ohm)
1369{
1370 int rc, batt_id_mv;
1371 int64_t denom;
1372 struct qpnp_vadc_result result;
1373
1374 /* Read battery-id */
1375 rc = qpnp_vadc_read(chip->vadc_dev, VADC_BAT_ID_PU2, &result);
1376 if (rc) {
1377 pr_err("Failed to read BATT_ID over vadc, rc=%d\n", rc);
1378 return rc;
1379 }
1380
Kiran Gunda0f5de042018-03-02 13:02:22 +05301381 batt_id_mv = div_s64(result.physical, 1000);
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301382 if (batt_id_mv == 0) {
1383 pr_debug("batt_id_mv = 0 from ADC\n");
1384 return 0;
1385 }
1386
1387 denom = div64_s64(BID_VREF_MV * 1000, batt_id_mv) - 1000;
1388 if (denom <= 0) {
1389 /* batt id connector might be open, return 0 kohms */
1390 return 0;
1391 }
1392
1393 *batt_id_ohm = div64_u64(BID_RPULL_OHM * 1000 + denom / 2, denom);
1394
1395 qg_dbg(chip, QG_DEBUG_PROFILE, "batt_id_mv=%d, batt_id_ohm=%d\n",
1396 batt_id_mv, *batt_id_ohm);
1397
1398 return 0;
1399}
1400
1401static int qg_load_battery_profile(struct qpnp_qg *chip)
1402{
1403 struct device_node *node = chip->dev->of_node;
1404 struct device_node *batt_node, *profile_node;
1405 int rc;
1406
1407 batt_node = of_find_node_by_name(node, "qcom,battery-data");
1408 if (!batt_node) {
1409 pr_err("Batterydata not available\n");
1410 return -ENXIO;
1411 }
1412
1413 profile_node = of_batterydata_get_best_profile(batt_node,
1414 chip->batt_id_ohm / 1000, NULL);
1415 if (IS_ERR(profile_node)) {
1416 rc = PTR_ERR(profile_node);
1417 pr_err("Failed to detect valid QG battery profile %d\n", rc);
1418 return rc;
1419 }
1420
1421 rc = of_property_read_string(profile_node, "qcom,battery-type",
1422 &chip->bp.batt_type_str);
1423 if (rc < 0) {
1424 pr_err("Failed to detect battery type rc:%d\n", rc);
1425 return rc;
1426 }
1427
1428 rc = qg_batterydata_init(profile_node);
1429 if (rc < 0) {
1430 pr_err("Failed to initialize battery-profile rc=%d\n", rc);
1431 return rc;
1432 }
1433
1434 rc = of_property_read_u32(profile_node, "qcom,max-voltage-uv",
1435 &chip->bp.float_volt_uv);
1436 if (rc < 0) {
1437 pr_err("Failed to read battery float-voltage rc:%d\n", rc);
1438 chip->bp.float_volt_uv = -EINVAL;
1439 }
1440
1441 rc = of_property_read_u32(profile_node, "qcom,fastchg-current-ma",
1442 &chip->bp.fastchg_curr_ma);
1443 if (rc < 0) {
1444 pr_err("Failed to read battery fastcharge current rc:%d\n", rc);
1445 chip->bp.fastchg_curr_ma = -EINVAL;
1446 }
1447
1448 rc = of_property_read_u32(profile_node, "qcom,qg-batt-profile-ver",
1449 &chip->bp.qg_profile_version);
1450 if (rc < 0) {
1451 pr_err("Failed to read QG profile version rc:%d\n", rc);
1452 chip->bp.qg_profile_version = -EINVAL;
1453 }
1454
1455 qg_dbg(chip, QG_DEBUG_PROFILE, "profile=%s FV=%duV FCC=%dma\n",
1456 chip->bp.batt_type_str, chip->bp.float_volt_uv,
1457 chip->bp.fastchg_curr_ma);
1458
1459 return 0;
1460}
1461
1462static int qg_setup_battery(struct qpnp_qg *chip)
1463{
1464 int rc;
1465
1466 if (!is_battery_present(chip)) {
1467 qg_dbg(chip, QG_DEBUG_PROFILE, "Battery Missing!\n");
1468 chip->battery_missing = true;
1469 chip->profile_loaded = false;
1470 } else {
1471 /* battery present */
1472 rc = get_batt_id_ohm(chip, &chip->batt_id_ohm);
1473 if (rc < 0) {
1474 pr_err("Failed to detect batt_id rc=%d\n", rc);
1475 chip->profile_loaded = false;
1476 } else {
1477 rc = qg_load_battery_profile(chip);
1478 if (rc < 0)
1479 pr_err("Failed to load battery-profile rc=%d\n",
1480 rc);
1481 else
1482 chip->profile_loaded = true;
1483 }
1484 }
1485
1486 qg_dbg(chip, QG_DEBUG_PROFILE, "battery_missing=%d batt_id_ohm=%d Ohm profile_loaded=%d profile=%s\n",
1487 chip->battery_missing, chip->batt_id_ohm,
1488 chip->profile_loaded, chip->bp.batt_type_str);
1489
1490 return 0;
1491}
1492
1493static int qg_determine_pon_soc(struct qpnp_qg *chip)
1494{
Anirudh Ghayale4923382018-03-11 20:32:10 +05301495 u8 status = 0, ocv_type = 0;
1496 int rc = 0, batt_temp = 0;
1497 bool use_pon_ocv = true, use_shutdown_ocv = false;
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301498 unsigned long rtc_sec = 0;
1499 u32 ocv_uv = 0, soc = 0, shutdown[SDAM_MAX] = {0};
1500
1501 if (!chip->profile_loaded) {
1502 qg_dbg(chip, QG_DEBUG_PON, "No Profile, skipping PON soc\n");
1503 return 0;
1504 }
1505
Anirudh Ghayale4923382018-03-11 20:32:10 +05301506 rc = get_rtc_time(&rtc_sec);
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301507 if (rc < 0) {
Anirudh Ghayale4923382018-03-11 20:32:10 +05301508 pr_err("Failed to read RTC time rc=%d\n", rc);
1509 goto use_pon_ocv;
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301510 }
1511
Anirudh Ghayale4923382018-03-11 20:32:10 +05301512 rc = qg_sdam_read_all(shutdown);
1513 if (rc < 0) {
1514 pr_err("Failed to read shutdown params rc=%d\n", rc);
1515 goto use_pon_ocv;
1516 }
1517
1518 qg_dbg(chip, QG_DEBUG_PON, "Shutdown: Valid=%d SOC=%d OCV=%duV time=%dsecs, time_now=%ldsecs\n",
1519 shutdown[SDAM_VALID],
1520 shutdown[SDAM_SOC],
1521 shutdown[SDAM_OCV_UV],
1522 shutdown[SDAM_TIME_SEC],
1523 rtc_sec);
1524 /*
1525 * Use the shutdown SOC if
1526 * 1. The device was powered off for < ignore_shutdown_time
1527 * 2. SDAM read is a success & SDAM data is valid
1528 */
1529 if (shutdown[SDAM_VALID] && is_between(0,
1530 chip->dt.ignore_shutdown_soc_secs,
1531 (rtc_sec - shutdown[SDAM_TIME_SEC]))) {
1532 use_pon_ocv = false;
1533 use_shutdown_ocv = true;
1534 ocv_uv = shutdown[SDAM_OCV_UV];
1535 soc = shutdown[SDAM_SOC];
1536 qg_dbg(chip, QG_DEBUG_PON, "Using SHUTDOWN_SOC @ PON\n");
1537 }
1538
1539use_pon_ocv:
1540 if (use_pon_ocv == true) {
1541 rc = qg_get_battery_temp(chip, &batt_temp);
1542 if (rc) {
1543 pr_err("Failed to read BATT_TEMP at PON rc=%d\n", rc);
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301544 goto done;
1545 }
1546
Anirudh Ghayale4923382018-03-11 20:32:10 +05301547 rc = qg_read(chip, chip->qg_base + QG_STATUS2_REG, &status, 1);
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301548 if (rc < 0) {
Anirudh Ghayale4923382018-03-11 20:32:10 +05301549 pr_err("Failed to read status2 register rc=%d\n", rc);
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301550 goto done;
1551 }
Anirudh Ghayale4923382018-03-11 20:32:10 +05301552
1553 if (status & GOOD_OCV_BIT)
1554 ocv_type = GOOD_OCV;
1555 else
1556 ocv_type = PON_OCV;
1557
1558 qg_dbg(chip, QG_DEBUG_PON, "Using %s @ PON\n",
1559 ocv_type == GOOD_OCV ? "GOOD_OCV" : "PON_OCV");
1560
1561 rc = qg_read_ocv(chip, &ocv_uv, ocv_type);
1562 if (rc < 0) {
1563 pr_err("Failed to read ocv rc=%d\n", rc);
1564 goto done;
1565 }
1566
1567 rc = lookup_soc_ocv(&soc, ocv_uv, batt_temp, false);
1568 if (rc < 0) {
1569 pr_err("Failed to lookup SOC@PON rc=%d\n", rc);
1570 goto done;
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301571 }
1572 }
1573done:
Anirudh Ghayale4923382018-03-11 20:32:10 +05301574 if (rc < 0) {
1575 pr_err("Failed to get SOC @ PON, rc=%d\n", rc);
1576 return rc;
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301577 }
1578
1579 chip->pon_soc = chip->catch_up_soc = chip->msoc = soc;
1580 chip->kdata.param[QG_PON_OCV_UV].data = ocv_uv;
1581 chip->kdata.param[QG_PON_OCV_UV].valid = true;
1582
1583 /* write back to SDAM */
1584 chip->sdam_data[SDAM_SOC] = soc;
1585 chip->sdam_data[SDAM_OCV_UV] = ocv_uv;
1586 chip->sdam_data[SDAM_VALID] = 1;
1587
1588 rc = qg_write_monotonic_soc(chip, chip->msoc);
1589 if (rc < 0)
1590 pr_err("Failed to update MSOC register rc=%d\n", rc);
1591
1592 rc = qg_update_sdam_params(chip);
1593 if (rc < 0)
1594 pr_err("Failed to update sdam params rc=%d\n", rc);
1595
Anirudh Ghayale4923382018-03-11 20:32:10 +05301596 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 +05301597 use_pon_ocv, !!(status & GOOD_OCV_BIT),
Anirudh Ghayale4923382018-03-11 20:32:10 +05301598 use_shutdown_ocv, ocv_uv, chip->msoc);
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301599 return 0;
1600}
1601
1602static int qg_set_wa_flags(struct qpnp_qg *chip)
1603{
1604 switch (chip->pmic_rev_id->pmic_subtype) {
1605 case PMI632_SUBTYPE:
1606 if (chip->pmic_rev_id->rev4 == PMI632_V1P0_REV4)
1607 chip->wa_flags |= QG_VBAT_LOW_WA;
1608 break;
1609 default:
1610 pr_err("Unsupported PMIC subtype %d\n",
1611 chip->pmic_rev_id->pmic_subtype);
1612 return -EINVAL;
1613 }
1614
1615 qg_dbg(chip, QG_DEBUG_PON, "wa_flags = %x\n", chip->wa_flags);
1616
1617 return 0;
1618}
1619
1620static int qg_hw_init(struct qpnp_qg *chip)
1621{
1622 int rc, temp;
1623 u8 reg;
1624
1625 rc = qg_set_wa_flags(chip);
1626 if (rc < 0) {
1627 pr_err("Failed to update PMIC type flags, rc=%d\n", rc);
1628 return rc;
1629 }
1630
1631 rc = qg_master_hold(chip, true);
1632 if (rc < 0) {
1633 pr_err("Failed to hold master, rc=%d\n", rc);
1634 goto done_fifo;
1635 }
1636
1637 rc = qg_process_rt_fifo(chip);
1638 if (rc < 0) {
1639 pr_err("Failed to process FIFO real-time, rc=%d\n", rc);
1640 goto done_fifo;
1641 }
1642
1643 /* update the changed S2 fifo DT parameters */
1644 if (chip->dt.s2_fifo_length > 0) {
1645 rc = qg_update_fifo_length(chip, chip->dt.s2_fifo_length);
1646 if (rc < 0)
1647 goto done_fifo;
1648 }
1649
1650 if (chip->dt.s2_acc_length > 0) {
1651 reg = ilog2(chip->dt.s2_acc_length) - 1;
1652 rc = qg_masked_write(chip, chip->qg_base +
1653 QG_S2_NORMAL_MEAS_CTL2_REG,
1654 NUM_OF_ACCUM_MASK, reg);
1655 if (rc < 0) {
1656 pr_err("Failed to write S2 ACC length, rc=%d\n", rc);
1657 goto done_fifo;
1658 }
1659 }
1660
1661 if (chip->dt.s2_acc_intvl_ms > 0) {
1662 reg = chip->dt.s2_acc_intvl_ms / 10;
1663 rc = qg_write(chip, chip->qg_base +
1664 QG_S2_NORMAL_MEAS_CTL3_REG,
1665 &reg, 1);
1666 if (rc < 0) {
1667 pr_err("Failed to write S2 ACC intrvl, rc=%d\n", rc);
1668 goto done_fifo;
1669 }
1670 }
1671
1672 /* signal the read thread */
1673 chip->data_ready = true;
1674 wake_up_interruptible(&chip->qg_wait_q);
1675
1676done_fifo:
1677 rc = qg_master_hold(chip, false);
1678 if (rc < 0) {
1679 pr_err("Failed to release master, rc=%d\n", rc);
1680 return rc;
1681 }
1682 chip->last_fifo_update_time = ktime_get();
1683
1684 if (chip->dt.ocv_timer_expiry_min != -EINVAL) {
1685 if (chip->dt.ocv_timer_expiry_min < 2)
1686 chip->dt.ocv_timer_expiry_min = 2;
1687 else if (chip->dt.ocv_timer_expiry_min > 30)
1688 chip->dt.ocv_timer_expiry_min = 30;
1689
1690 reg = (chip->dt.ocv_timer_expiry_min - 2) / 4;
1691 rc = qg_masked_write(chip,
1692 chip->qg_base + QG_S3_SLEEP_OCV_MEAS_CTL4_REG,
1693 SLEEP_IBAT_QUALIFIED_LENGTH_MASK, reg);
1694 if (rc < 0) {
1695 pr_err("Failed to write OCV timer, rc=%d\n", rc);
1696 return rc;
1697 }
1698 }
1699
1700 if (chip->dt.ocv_tol_threshold_uv != -EINVAL) {
1701 if (chip->dt.ocv_tol_threshold_uv < 0)
1702 chip->dt.ocv_tol_threshold_uv = 0;
1703 else if (chip->dt.ocv_tol_threshold_uv > 12262)
1704 chip->dt.ocv_tol_threshold_uv = 12262;
1705
1706 reg = chip->dt.ocv_tol_threshold_uv / 195;
1707 rc = qg_masked_write(chip,
1708 chip->qg_base + QG_S3_SLEEP_OCV_TREND_CTL2_REG,
1709 TREND_TOL_MASK, reg);
1710 if (rc < 0) {
1711 pr_err("Failed to write OCV tol-thresh, rc=%d\n", rc);
1712 return rc;
1713 }
1714 }
1715
1716 if (chip->dt.s3_entry_fifo_length != -EINVAL) {
1717 if (chip->dt.s3_entry_fifo_length < 1)
1718 chip->dt.s3_entry_fifo_length = 1;
1719 else if (chip->dt.s3_entry_fifo_length > 8)
1720 chip->dt.s3_entry_fifo_length = 8;
1721
1722 reg = chip->dt.s3_entry_fifo_length - 1;
1723 rc = qg_masked_write(chip,
1724 chip->qg_base + QG_S3_SLEEP_OCV_IBAT_CTL1_REG,
1725 SLEEP_IBAT_QUALIFIED_LENGTH_MASK, reg);
1726 if (rc < 0) {
1727 pr_err("Failed to write S3-entry fifo-length, rc=%d\n",
1728 rc);
1729 return rc;
1730 }
1731 }
1732
1733 if (chip->dt.s3_entry_ibat_ua != -EINVAL) {
1734 if (chip->dt.s3_entry_ibat_ua < 0)
1735 chip->dt.s3_entry_ibat_ua = 0;
1736 else if (chip->dt.s3_entry_ibat_ua > 155550)
1737 chip->dt.s3_entry_ibat_ua = 155550;
1738
1739 reg = chip->dt.s3_entry_ibat_ua / 610;
1740 rc = qg_write(chip, chip->qg_base +
1741 QG_S3_ENTRY_IBAT_THRESHOLD_REG,
1742 &reg, 1);
1743 if (rc < 0) {
1744 pr_err("Failed to write S3-entry ibat-uA, rc=%d\n", rc);
1745 return rc;
1746 }
1747 }
1748
1749 if (chip->dt.s3_exit_ibat_ua != -EINVAL) {
1750 if (chip->dt.s3_exit_ibat_ua < 0)
1751 chip->dt.s3_exit_ibat_ua = 0;
1752 else if (chip->dt.s3_exit_ibat_ua > 155550)
1753 chip->dt.s3_exit_ibat_ua = 155550;
1754
1755 rc = qg_read(chip, chip->qg_base +
1756 QG_S3_ENTRY_IBAT_THRESHOLD_REG,
1757 &reg, 1);
1758 if (rc < 0) {
1759 pr_err("Failed to read S3-entry ibat-uA, rc=%d", rc);
1760 return rc;
1761 }
1762 temp = reg * 610;
1763 if (chip->dt.s3_exit_ibat_ua < temp)
1764 chip->dt.s3_exit_ibat_ua = temp;
1765 else
1766 chip->dt.s3_exit_ibat_ua -= temp;
1767
1768 reg = chip->dt.s3_exit_ibat_ua / 610;
1769 rc = qg_write(chip,
1770 chip->qg_base + QG_S3_EXIT_IBAT_THRESHOLD_REG,
1771 &reg, 1);
1772 if (rc < 0) {
1773 pr_err("Failed to write S3-entry ibat-uA, rc=%d\n", rc);
1774 return rc;
1775 }
1776 }
1777
1778 /* vbat low */
1779 if (chip->dt.vbatt_low_mv < 0)
1780 chip->dt.vbatt_low_mv = 0;
1781 else if (chip->dt.vbatt_low_mv > 12750)
1782 chip->dt.vbatt_low_mv = 12750;
1783
1784 reg = chip->dt.vbatt_low_mv / 50;
1785 rc = qg_write(chip, chip->qg_base + QG_VBAT_LOW_THRESHOLD_REG,
1786 &reg, 1);
1787 if (rc < 0) {
1788 pr_err("Failed to write vbat-low, rc=%d\n", rc);
1789 return rc;
1790 }
1791
1792 /* vbat empty */
1793 if (chip->dt.vbatt_empty_mv < 0)
1794 chip->dt.vbatt_empty_mv = 0;
1795 else if (chip->dt.vbatt_empty_mv > 12750)
1796 chip->dt.vbatt_empty_mv = 12750;
1797
1798 reg = chip->dt.vbatt_empty_mv / 50;
1799 rc = qg_write(chip, chip->qg_base + QG_VBAT_EMPTY_THRESHOLD_REG,
1800 &reg, 1);
1801 if (rc < 0) {
1802 pr_err("Failed to write vbat-empty, rc=%d\n", rc);
1803 return rc;
1804 }
1805
1806 return 0;
1807}
1808
1809static int qg_post_init(struct qpnp_qg *chip)
1810{
1811 /* disable all IRQs if profile is not loaded */
1812 if (!chip->profile_loaded) {
1813 vote(chip->vbatt_irq_disable_votable,
1814 PROFILE_IRQ_DISABLE, true, 0);
1815 vote(chip->fifo_irq_disable_votable,
1816 PROFILE_IRQ_DISABLE, true, 0);
1817 vote(chip->good_ocv_irq_disable_votable,
1818 PROFILE_IRQ_DISABLE, true, 0);
1819 } else {
1820 /* disable GOOD_OCV IRQ at init */
1821 vote(chip->good_ocv_irq_disable_votable,
1822 QG_INIT_STATE_IRQ_DISABLE, true, 0);
1823 }
1824
1825 return 0;
1826}
1827
1828static int qg_get_irq_index_byname(const char *irq_name)
1829{
1830 int i;
1831
1832 for (i = 0; i < ARRAY_SIZE(qg_irqs); i++) {
1833 if (strcmp(qg_irqs[i].name, irq_name) == 0)
1834 return i;
1835 }
1836
1837 return -ENOENT;
1838}
1839
1840static int qg_request_interrupt(struct qpnp_qg *chip,
1841 struct device_node *node, const char *irq_name)
1842{
1843 int rc, irq, irq_index;
1844
1845 irq = of_irq_get_byname(node, irq_name);
1846 if (irq < 0) {
1847 pr_err("Failed to get irq %s byname\n", irq_name);
1848 return irq;
1849 }
1850
1851 irq_index = qg_get_irq_index_byname(irq_name);
1852 if (irq_index < 0) {
1853 pr_err("%s is not a defined irq\n", irq_name);
1854 return irq_index;
1855 }
1856
1857 if (!qg_irqs[irq_index].handler)
1858 return 0;
1859
1860 rc = devm_request_threaded_irq(chip->dev, irq, NULL,
1861 qg_irqs[irq_index].handler,
1862 IRQF_ONESHOT, irq_name, chip);
1863 if (rc < 0) {
1864 pr_err("Failed to request irq %d\n", irq);
1865 return rc;
1866 }
1867
1868 qg_irqs[irq_index].irq = irq;
1869 if (qg_irqs[irq_index].wake)
1870 enable_irq_wake(irq);
1871
1872 qg_dbg(chip, QG_DEBUG_PON, "IRQ %s registered wakeable=%d\n",
1873 qg_irqs[irq_index].name, qg_irqs[irq_index].wake);
1874
1875 return 0;
1876}
1877
1878static int qg_request_irqs(struct qpnp_qg *chip)
1879{
1880 struct device_node *node = chip->dev->of_node;
1881 struct device_node *child;
1882 const char *name;
1883 struct property *prop;
1884 int rc = 0;
1885
1886 for_each_available_child_of_node(node, child) {
1887 of_property_for_each_string(child, "interrupt-names",
1888 prop, name) {
1889 rc = qg_request_interrupt(chip, child, name);
1890 if (rc < 0)
1891 return rc;
1892 }
1893 }
1894
1895
1896 return 0;
1897}
1898
1899#define DEFAULT_VBATT_EMPTY_MV 3200
1900#define DEFAULT_VBATT_CUTOFF_MV 3400
1901#define DEFAULT_VBATT_LOW_MV 3500
1902#define DEFAULT_ITERM_MA 100
1903#define DEFAULT_S2_FIFO_LENGTH 5
1904#define DEFAULT_S2_VBAT_LOW_LENGTH 2
1905#define DEFAULT_S2_ACC_LENGTH 128
1906#define DEFAULT_S2_ACC_INTVL_MS 100
1907#define DEFAULT_DELTA_SOC 1
Anirudh Ghayale4923382018-03-11 20:32:10 +05301908#define DEFAULT_SHUTDOWN_SOC_SECS 360
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05301909static int qg_parse_dt(struct qpnp_qg *chip)
1910{
1911 int rc = 0;
1912 struct device_node *revid_node, *child, *node = chip->dev->of_node;
1913 u32 base, temp;
1914 u8 type;
1915
1916 if (!node) {
1917 pr_err("Failed to find device-tree node\n");
1918 return -ENXIO;
1919 }
1920
1921 revid_node = of_parse_phandle(node, "qcom,pmic-revid", 0);
1922 if (!revid_node) {
1923 pr_err("Missing qcom,pmic-revid property - driver failed\n");
1924 return -EINVAL;
1925 }
1926
1927 chip->pmic_rev_id = get_revid_data(revid_node);
1928 of_node_put(revid_node);
1929 if (IS_ERR_OR_NULL(chip->pmic_rev_id)) {
1930 pr_err("Failed to get pmic_revid, rc=%ld\n",
1931 PTR_ERR(chip->pmic_rev_id));
1932 /*
1933 * the revid peripheral must be registered, any failure
1934 * here only indicates that the rev-id module has not
1935 * probed yet.
1936 */
1937 return -EPROBE_DEFER;
1938 }
1939
1940 qg_dbg(chip, QG_DEBUG_PON, "PMIC subtype %d Digital major %d\n",
1941 chip->pmic_rev_id->pmic_subtype, chip->pmic_rev_id->rev4);
1942
1943 for_each_available_child_of_node(node, child) {
1944 rc = of_property_read_u32(child, "reg", &base);
1945 if (rc < 0) {
1946 pr_err("Failed to read base address, rc=%d\n", rc);
1947 return rc;
1948 }
1949
1950 rc = qg_read(chip, base + PERPH_TYPE_REG, &type, 1);
1951 if (rc < 0) {
1952 pr_err("Failed to read type, rc=%d\n", rc);
1953 return rc;
1954 }
1955
1956 switch (type) {
1957 case QG_TYPE:
1958 chip->qg_base = base;
1959 break;
1960 default:
1961 break;
1962 }
1963 }
1964
1965 if (!chip->qg_base) {
1966 pr_err("QG device node missing\n");
1967 return -EINVAL;
1968 }
1969
1970 /* S2 state params */
1971 rc = of_property_read_u32(node, "qcom,s2-fifo-length", &temp);
1972 if (rc < 0)
1973 chip->dt.s2_fifo_length = DEFAULT_S2_FIFO_LENGTH;
1974 else
1975 chip->dt.s2_fifo_length = temp;
1976
1977 rc = of_property_read_u32(node, "qcom,s2-vbat-low-fifo-length", &temp);
1978 if (rc < 0)
1979 chip->dt.s2_vbat_low_fifo_length = DEFAULT_S2_VBAT_LOW_LENGTH;
1980 else
1981 chip->dt.s2_vbat_low_fifo_length = temp;
1982
1983 rc = of_property_read_u32(node, "qcom,s2-acc-length", &temp);
1984 if (rc < 0)
1985 chip->dt.s2_acc_length = DEFAULT_S2_ACC_LENGTH;
1986 else
1987 chip->dt.s2_acc_length = temp;
1988
1989 rc = of_property_read_u32(node, "qcom,s2-acc-interval-ms", &temp);
1990 if (rc < 0)
1991 chip->dt.s2_acc_intvl_ms = DEFAULT_S2_ACC_INTVL_MS;
1992 else
1993 chip->dt.s2_acc_intvl_ms = temp;
1994
1995 qg_dbg(chip, QG_DEBUG_PON, "DT: S2 FIFO length=%d low_vbat_length=%d acc_length=%d acc_interval=%d\n",
1996 chip->dt.s2_fifo_length, chip->dt.s2_vbat_low_fifo_length,
1997 chip->dt.s2_acc_length, chip->dt.s2_acc_intvl_ms);
1998
1999 /* OCV params */
2000 rc = of_property_read_u32(node, "qcom,ocv-timer-expiry-min", &temp);
2001 if (rc < 0)
2002 chip->dt.ocv_timer_expiry_min = -EINVAL;
2003 else
2004 chip->dt.ocv_timer_expiry_min = temp;
2005
2006 rc = of_property_read_u32(node, "qcom,ocv-tol-threshold-uv", &temp);
2007 if (rc < 0)
2008 chip->dt.ocv_tol_threshold_uv = -EINVAL;
2009 else
2010 chip->dt.ocv_tol_threshold_uv = temp;
2011
2012 qg_dbg(chip, QG_DEBUG_PON, "DT: OCV timer_expiry =%dmin ocv_tol_threshold=%duV\n",
2013 chip->dt.ocv_timer_expiry_min, chip->dt.ocv_tol_threshold_uv);
2014
2015 /* S3 sleep configuration */
2016 rc = of_property_read_u32(node, "qcom,s3-entry-fifo-length", &temp);
2017 if (rc < 0)
2018 chip->dt.s3_entry_fifo_length = -EINVAL;
2019 else
2020 chip->dt.s3_entry_fifo_length = temp;
2021
2022 rc = of_property_read_u32(node, "qcom,s3-entry-ibat-ua", &temp);
2023 if (rc < 0)
2024 chip->dt.s3_entry_ibat_ua = -EINVAL;
2025 else
2026 chip->dt.s3_entry_ibat_ua = temp;
2027
2028 rc = of_property_read_u32(node, "qcom,s3-entry-ibat-ua", &temp);
2029 if (rc < 0)
2030 chip->dt.s3_exit_ibat_ua = -EINVAL;
2031 else
2032 chip->dt.s3_exit_ibat_ua = temp;
2033
2034 /* VBAT thresholds */
2035 rc = of_property_read_u32(node, "qcom,vbatt-empty-mv", &temp);
2036 if (rc < 0)
2037 chip->dt.vbatt_empty_mv = DEFAULT_VBATT_EMPTY_MV;
2038 else
2039 chip->dt.vbatt_empty_mv = temp;
2040
2041 rc = of_property_read_u32(node, "qcom,vbatt-low-mv", &temp);
2042 if (rc < 0)
2043 chip->dt.vbatt_low_mv = DEFAULT_VBATT_LOW_MV;
2044 else
2045 chip->dt.vbatt_low_mv = temp;
2046
2047 rc = of_property_read_u32(node, "qcom,vbatt-cutoff-mv", &temp);
2048 if (rc < 0)
2049 chip->dt.vbatt_cutoff_mv = DEFAULT_VBATT_CUTOFF_MV;
2050 else
2051 chip->dt.vbatt_cutoff_mv = temp;
2052
2053 /* IBAT thresholds */
2054 rc = of_property_read_u32(node, "qcom,qg-iterm-ma", &temp);
2055 if (rc < 0)
2056 chip->dt.iterm_ma = DEFAULT_ITERM_MA;
2057 else
2058 chip->dt.iterm_ma = temp;
2059
2060 rc = of_property_read_u32(node, "qcom,delta-soc", &temp);
2061 if (rc < 0)
2062 chip->dt.delta_soc = DEFAULT_DELTA_SOC;
2063 else
2064 chip->dt.delta_soc = temp;
2065
Anirudh Ghayale4923382018-03-11 20:32:10 +05302066 rc = of_property_read_u32(node, "qcom,ignore-shutdown-soc-secs", &temp);
2067 if (rc < 0)
2068 chip->dt.ignore_shutdown_soc_secs = DEFAULT_SHUTDOWN_SOC_SECS;
2069 else
2070 chip->dt.ignore_shutdown_soc_secs = temp;
2071
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05302072 rc = of_property_read_u32(node, "qcom,rbat-conn-mohm", &temp);
2073 if (rc < 0)
2074 chip->dt.rbat_conn_mohm = 0;
2075 else
2076 chip->dt.rbat_conn_mohm = temp;
2077
2078 qg_dbg(chip, QG_DEBUG_PON, "DT: vbatt_empty_mv=%dmV vbatt_low_mv=%dmV delta_soc=%d\n",
2079 chip->dt.vbatt_empty_mv, chip->dt.vbatt_low_mv,
2080 chip->dt.delta_soc);
2081
2082 return 0;
2083}
2084
2085static int process_suspend(struct qpnp_qg *chip)
2086{
Anirudh Ghayale4923382018-03-11 20:32:10 +05302087 u8 status = 0;
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05302088 int rc;
2089 u32 fifo_rt_length = 0, sleep_fifo_length = 0;
2090
Anirudh Ghayale4923382018-03-11 20:32:10 +05302091 /* skip if profile is not loaded */
2092 if (!chip->profile_loaded)
2093 return 0;
2094
Anirudh Ghayalc6096392018-03-07 19:57:05 +05302095 chip->suspend_data = false;
2096
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05302097 /* ignore any suspend processing if we are charging */
2098 if (chip->charge_status == POWER_SUPPLY_STATUS_CHARGING) {
2099 qg_dbg(chip, QG_DEBUG_PM, "Charging @ suspend - ignore processing\n");
2100 return 0;
2101 }
2102
2103 rc = get_fifo_length(chip, &fifo_rt_length, true);
2104 if (rc < 0) {
2105 pr_err("Failed to read FIFO RT count, rc=%d\n", rc);
2106 return rc;
2107 }
2108
2109 rc = qg_read(chip, chip->qg_base + QG_S3_SLEEP_OCV_IBAT_CTL1_REG,
2110 (u8 *)&sleep_fifo_length, 1);
2111 if (rc < 0) {
2112 pr_err("Failed to read sleep FIFO count, rc=%d\n", rc);
2113 return rc;
2114 }
2115 sleep_fifo_length &= SLEEP_IBAT_QUALIFIED_LENGTH_MASK;
2116 /*
2117 * If the real-time FIFO count is greater than
2118 * the the #fifo to enter sleep, save the FIFO data
2119 * and reset the fifo count.
2120 */
2121 if (fifo_rt_length >= (chip->dt.s2_fifo_length - sleep_fifo_length)) {
2122 rc = qg_master_hold(chip, true);
2123 if (rc < 0) {
2124 pr_err("Failed to hold master, rc=%d\n", rc);
2125 return rc;
2126 }
2127
2128 rc = qg_process_rt_fifo(chip);
2129 if (rc < 0) {
2130 pr_err("Failed to process FIFO real-time, rc=%d\n", rc);
2131 qg_master_hold(chip, false);
2132 return rc;
2133 }
2134
2135 rc = qg_master_hold(chip, false);
2136 if (rc < 0) {
2137 pr_err("Failed to release master, rc=%d\n", rc);
2138 return rc;
2139 }
2140 /* FIFOs restarted */
2141 chip->last_fifo_update_time = ktime_get();
2142
2143 chip->suspend_data = true;
2144 }
2145
Anirudh Ghayale4923382018-03-11 20:32:10 +05302146 /* read STATUS2 register to clear its last state */
2147 qg_read(chip, chip->qg_base + QG_STATUS2_REG, &status, 1);
2148
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05302149 qg_dbg(chip, QG_DEBUG_PM, "FIFO rt_length=%d sleep_fifo_length=%d default_s2_count=%d suspend_data=%d\n",
2150 fifo_rt_length, sleep_fifo_length,
2151 chip->dt.s2_fifo_length, chip->suspend_data);
2152
2153 return rc;
2154}
2155
2156static int process_resume(struct qpnp_qg *chip)
2157{
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05302158 u8 status2 = 0, rt_status = 0;
Anirudh Ghayalc6096392018-03-07 19:57:05 +05302159 u32 ocv_uv = 0;
2160 int rc, batt_temp = 0;
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05302161
Anirudh Ghayale4923382018-03-11 20:32:10 +05302162 /* skip if profile is not loaded */
2163 if (!chip->profile_loaded)
2164 return 0;
2165
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05302166 rc = qg_read(chip, chip->qg_base + QG_STATUS2_REG, &status2, 1);
2167 if (rc < 0) {
2168 pr_err("Failed to read status2 register, rc=%d\n", rc);
2169 return rc;
2170 }
2171
2172 if (status2 & GOOD_OCV_BIT) {
2173 rc = qg_read_ocv(chip, &ocv_uv, GOOD_OCV);
2174 if (rc < 0) {
2175 pr_err("Failed to read good_ocv, rc=%d\n", rc);
2176 return rc;
2177 }
2178 rc = qg_get_battery_temp(chip, &batt_temp);
2179 if (rc < 0) {
2180 pr_err("Failed to read BATT_TEMP, rc=%d\n", rc);
2181 return rc;
2182 }
2183
2184 chip->kdata.param[QG_GOOD_OCV_UV].data = ocv_uv;
2185 chip->kdata.param[QG_GOOD_OCV_UV].valid = true;
Anirudh Ghayalc6096392018-03-07 19:57:05 +05302186 /* Clear suspend data as there has been a GOOD OCV */
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05302187 chip->suspend_data = false;
Anirudh Ghayalc6096392018-03-07 19:57:05 +05302188 qg_dbg(chip, QG_DEBUG_PM, "GOOD OCV @ resume good_ocv=%d uV\n",
2189 ocv_uv);
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05302190 }
Anirudh Ghayalc6096392018-03-07 19:57:05 +05302191
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05302192 rc = qg_read(chip, chip->qg_base + QG_INT_LATCHED_STS_REG,
2193 &rt_status, 1);
2194 if (rc < 0) {
2195 pr_err("Failed to read latched status register, rc=%d\n", rc);
2196 return rc;
2197 }
2198 rt_status &= FIFO_UPDATE_DONE_INT_LAT_STS_BIT;
2199
Anirudh Ghayalc6096392018-03-07 19:57:05 +05302200 qg_dbg(chip, QG_DEBUG_PM, "FIFO_DONE_STS=%d suspend_data=%d good_ocv=%d\n",
2201 !!rt_status, chip->suspend_data,
2202 chip->kdata.param[QG_GOOD_OCV_UV].valid);
2203 /*
2204 * If this is not a wakeup from FIFO-done,
2205 * process the data immediately if - we have data from
2206 * suspend or there is a good OCV.
2207 */
2208 if (!rt_status && (chip->suspend_data ||
2209 chip->kdata.param[QG_GOOD_OCV_UV].valid)) {
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05302210 vote(chip->awake_votable, SUSPEND_DATA_VOTER, true, 0);
2211 /* signal the read thread */
2212 chip->data_ready = true;
2213 wake_up_interruptible(&chip->qg_wait_q);
Anirudh Ghayalc6096392018-03-07 19:57:05 +05302214 chip->suspend_data = false;
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05302215 }
2216
Anirudh Ghayale6b2f4a2018-01-02 19:35:40 +05302217 return rc;
2218}
2219
2220static int qpnp_qg_suspend_noirq(struct device *dev)
2221{
2222 int rc;
2223 struct qpnp_qg *chip = dev_get_drvdata(dev);
2224
2225 mutex_lock(&chip->data_lock);
2226
2227 rc = process_suspend(chip);
2228 if (rc < 0)
2229 pr_err("Failed to process QG suspend, rc=%d\n", rc);
2230
2231 mutex_unlock(&chip->data_lock);
2232
2233 return 0;
2234}
2235
2236static int qpnp_qg_resume_noirq(struct device *dev)
2237{
2238 int rc;
2239 struct qpnp_qg *chip = dev_get_drvdata(dev);
2240
2241 mutex_lock(&chip->data_lock);
2242
2243 rc = process_resume(chip);
2244 if (rc < 0)
2245 pr_err("Failed to process QG resume, rc=%d\n", rc);
2246
2247 mutex_unlock(&chip->data_lock);
2248
2249 return 0;
2250}
2251
2252static const struct dev_pm_ops qpnp_qg_pm_ops = {
2253 .suspend_noirq = qpnp_qg_suspend_noirq,
2254 .resume_noirq = qpnp_qg_resume_noirq,
2255};
2256
2257static int qpnp_qg_probe(struct platform_device *pdev)
2258{
2259 int rc = 0, soc = 0;
2260 struct qpnp_qg *chip;
2261
2262 chip = devm_kzalloc(&pdev->dev, sizeof(*chip), GFP_KERNEL);
2263 if (!chip)
2264 return -ENOMEM;
2265
2266 chip->regmap = dev_get_regmap(pdev->dev.parent, NULL);
2267 if (!chip->regmap) {
2268 pr_err("Parent regmap is unavailable\n");
2269 return -ENXIO;
2270 }
2271
2272 /* VADC for BID */
2273 chip->vadc_dev = qpnp_get_vadc(&pdev->dev, "qg");
2274 if (IS_ERR(chip->vadc_dev)) {
2275 rc = PTR_ERR(chip->vadc_dev);
2276 if (rc != -EPROBE_DEFER)
2277 pr_err("Failed to find VADC node, rc=%d\n", rc);
2278
2279 return rc;
2280 }
2281
2282 chip->dev = &pdev->dev;
2283 chip->debug_mask = &qg_debug_mask;
2284 platform_set_drvdata(pdev, chip);
2285 INIT_WORK(&chip->udata_work, process_udata_work);
2286 INIT_WORK(&chip->qg_status_change_work, qg_status_change_work);
2287 mutex_init(&chip->bus_lock);
2288 mutex_init(&chip->soc_lock);
2289 mutex_init(&chip->data_lock);
2290 init_waitqueue_head(&chip->qg_wait_q);
2291
2292 rc = qg_parse_dt(chip);
2293 if (rc < 0) {
2294 pr_err("Failed to parse DT, rc=%d\n", rc);
2295 return rc;
2296 }
2297
2298 rc = qg_hw_init(chip);
2299 if (rc < 0) {
2300 pr_err("Failed to hw_init, rc=%d\n", rc);
2301 return rc;
2302 }
2303
2304 rc = qg_setup_battery(chip);
2305 if (rc < 0) {
2306 pr_err("Failed to setup battery, rc=%d\n", rc);
2307 return rc;
2308 }
2309
2310 rc = qg_register_device(chip);
2311 if (rc < 0) {
2312 pr_err("Failed to register QG char device, rc=%d\n", rc);
2313 return rc;
2314 }
2315
2316 rc = qg_sdam_init(chip->dev);
2317 if (rc < 0) {
2318 pr_err("Failed to initialize QG SDAM, rc=%d\n", rc);
2319 return rc;
2320 }
2321
2322 rc = qg_soc_init(chip);
2323 if (rc < 0) {
2324 pr_err("Failed to initialize SOC scaling init rc=%d\n", rc);
2325 return rc;
2326 }
2327
2328 rc = qg_determine_pon_soc(chip);
2329 if (rc < 0) {
2330 pr_err("Failed to determine initial state, rc=%d\n", rc);
2331 goto fail_device;
2332 }
2333
2334 chip->awake_votable = create_votable("QG_WS", VOTE_SET_ANY,
2335 qg_awake_cb, chip);
2336 if (IS_ERR(chip->awake_votable)) {
2337 rc = PTR_ERR(chip->awake_votable);
2338 chip->awake_votable = NULL;
2339 goto fail_device;
2340 }
2341
2342 chip->vbatt_irq_disable_votable = create_votable("QG_VBATT_IRQ_DISABLE",
2343 VOTE_SET_ANY, qg_vbatt_irq_disable_cb, chip);
2344 if (IS_ERR(chip->vbatt_irq_disable_votable)) {
2345 rc = PTR_ERR(chip->vbatt_irq_disable_votable);
2346 chip->vbatt_irq_disable_votable = NULL;
2347 goto fail_device;
2348 }
2349
2350 chip->fifo_irq_disable_votable = create_votable("QG_FIFO_IRQ_DISABLE",
2351 VOTE_SET_ANY, qg_fifo_irq_disable_cb, chip);
2352 if (IS_ERR(chip->fifo_irq_disable_votable)) {
2353 rc = PTR_ERR(chip->fifo_irq_disable_votable);
2354 chip->fifo_irq_disable_votable = NULL;
2355 goto fail_device;
2356 }
2357
2358 chip->good_ocv_irq_disable_votable =
2359 create_votable("QG_GOOD_IRQ_DISABLE",
2360 VOTE_SET_ANY, qg_good_ocv_irq_disable_cb, chip);
2361 if (IS_ERR(chip->good_ocv_irq_disable_votable)) {
2362 rc = PTR_ERR(chip->good_ocv_irq_disable_votable);
2363 chip->good_ocv_irq_disable_votable = NULL;
2364 goto fail_device;
2365 }
2366
2367 rc = qg_init_psy(chip);
2368 if (rc < 0) {
2369 pr_err("Failed to initialize QG psy, rc=%d\n", rc);
2370 goto fail_votable;
2371 }
2372
2373 rc = qg_request_irqs(chip);
2374 if (rc < 0) {
2375 pr_err("Failed to register QG interrupts, rc=%d\n", rc);
2376 goto fail_votable;
2377 }
2378
2379 rc = qg_post_init(chip);
2380 if (rc < 0) {
2381 pr_err("Failed in qg_post_init rc=%d\n", rc);
2382 goto fail_votable;
2383 }
2384
2385 qg_get_battery_capacity(chip, &soc);
2386 pr_info("QG initialized! battery_profile=%s SOC=%d\n",
2387 qg_get_battery_type(chip), soc);
2388
2389 return rc;
2390
2391fail_votable:
2392 destroy_votable(chip->awake_votable);
2393fail_device:
2394 device_destroy(chip->qg_class, chip->dev_no);
2395 cdev_del(&chip->qg_cdev);
2396 unregister_chrdev_region(chip->dev_no, 1);
2397 return rc;
2398}
2399
2400static int qpnp_qg_remove(struct platform_device *pdev)
2401{
2402 struct qpnp_qg *chip = platform_get_drvdata(pdev);
2403
2404 qg_batterydata_exit();
2405 qg_soc_exit(chip);
2406
2407 cancel_work_sync(&chip->udata_work);
2408 cancel_work_sync(&chip->qg_status_change_work);
2409 device_destroy(chip->qg_class, chip->dev_no);
2410 cdev_del(&chip->qg_cdev);
2411 unregister_chrdev_region(chip->dev_no, 1);
2412 mutex_destroy(&chip->bus_lock);
2413 mutex_destroy(&chip->data_lock);
2414 mutex_destroy(&chip->soc_lock);
2415 if (chip->awake_votable)
2416 destroy_votable(chip->awake_votable);
2417
2418 return 0;
2419}
2420
2421static const struct of_device_id match_table[] = {
2422 { .compatible = "qcom,qpnp-qg", },
2423 { },
2424};
2425
2426static struct platform_driver qpnp_qg_driver = {
2427 .driver = {
2428 .name = "qcom,qpnp-qg",
2429 .owner = THIS_MODULE,
2430 .of_match_table = match_table,
2431 .pm = &qpnp_qg_pm_ops,
2432 },
2433 .probe = qpnp_qg_probe,
2434 .remove = qpnp_qg_remove,
2435};
2436module_platform_driver(qpnp_qg_driver);
2437
2438MODULE_DESCRIPTION("QPNP QG Driver");
2439MODULE_LICENSE("GPL v2");