blob: d1031ba7fbd0f7c92dd3076da0c893203f4a8bcc [file] [log] [blame]
Harry Yang4b7db0f2017-11-27 10:50:44 -08001/* 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#include <linux/debugfs.h>
14#include <linux/delay.h>
15#include <linux/device.h>
16#include <linux/module.h>
17#include <linux/platform_device.h>
18#include <linux/regmap.h>
19#include <linux/power_supply.h>
20#include <linux/of.h>
21#include <linux/of_irq.h>
22#include <linux/log2.h>
23#include <linux/qpnp/qpnp-revid.h>
24#include <linux/regulator/driver.h>
25#include <linux/regulator/of_regulator.h>
26#include <linux/regulator/machine.h>
27#include <linux/pmic-voter.h>
28#include "smb5-reg.h"
29#include "smb5-lib.h"
30
31static struct smb_params smb5_params = {
32 .fcc = {
33 .name = "fast charge current",
34 .reg = CHGR_FAST_CHARGE_CURRENT_CFG_REG,
35 .min_u = 0,
36 .max_u = 8000000,
37 .step_u = 25000,
38 },
39 .fv = {
40 .name = "float voltage",
41 .reg = CHGR_FLOAT_VOLTAGE_CFG_REG,
42 .min_u = 3600000,
43 .max_u = 4790000,
44 .step_u = 10000,
45 },
46 .usb_icl = {
47 .name = "usb input current limit",
48 .reg = USBIN_CURRENT_LIMIT_CFG_REG,
49 .min_u = 0,
50 .max_u = 5000000,
51 .step_u = 50000,
52 },
53 .icl_stat = {
54 .name = "input current limit status",
55 .reg = AICL_ICL_STATUS_REG,
56 .min_u = 0,
57 .max_u = 5000000,
58 .step_u = 50000,
59 },
60 .otg_cl = {
61 .name = "usb otg current limit",
62 .reg = DCDC_OTG_CURRENT_LIMIT_CFG_REG,
63 .min_u = 500000,
64 .max_u = 3000000,
65 .step_u = 500000,
66 },
67 .jeita_cc_comp_hot = {
68 .name = "jeita fcc reduction",
69 .reg = JEITA_CCCOMP_CFG_HOT_REG,
70 .min_u = 0,
71 .max_u = 8000000,
72 .step_u = 25000,
73 .set_proc = NULL,
74 },
75 .jeita_cc_comp_cold = {
76 .name = "jeita fcc reduction",
77 .reg = JEITA_CCCOMP_CFG_COLD_REG,
78 .min_u = 0,
79 .max_u = 8000000,
80 .step_u = 25000,
81 .set_proc = NULL,
82 },
83 .freq_switcher = {
84 .name = "switching frequency",
85 .reg = DCDC_FSW_SEL_REG,
86 .min_u = 1200,
87 .max_u = 2400,
88 .step_u = 400,
89 .set_proc = NULL,
90 },
91};
92
93struct smb_dt_props {
94 int usb_icl_ua;
95 struct device_node *revid_dev_node;
96 enum float_options float_option;
97 int chg_inhibit_thr_mv;
98 bool no_battery;
99 bool hvdcp_disable;
100 bool auto_recharge_soc;
101 int wd_bark_time;
102 int batt_profile_fcc_ua;
103 int batt_profile_fv_uv;
104};
105
106struct smb5 {
107 struct smb_charger chg;
108 struct dentry *dfs_root;
109 struct smb_dt_props dt;
110};
111
112static int __debug_mask;
113module_param_named(
114 debug_mask, __debug_mask, int, 0600
115);
116
117static int __weak_chg_icl_ua = 500000;
118module_param_named(
119 weak_chg_icl_ua, __weak_chg_icl_ua, int, 0600
120);
121
122#define MICRO_1P5A 1500000
123#define MICRO_P1A 100000
124#define OTG_DEFAULT_DEGLITCH_TIME_MS 50
125#define MIN_WD_BARK_TIME 16
126#define DEFAULT_WD_BARK_TIME 64
127#define BITE_WDOG_TIMEOUT_8S 0x3
128#define BARK_WDOG_TIMEOUT_MASK GENMASK(3, 2)
129#define BARK_WDOG_TIMEOUT_SHIFT 2
130static int smb5_parse_dt(struct smb5 *chip)
131{
132 struct smb_charger *chg = &chip->chg;
133 struct device_node *node = chg->dev->of_node;
134 int rc, byte_len;
135
136 if (!node) {
137 pr_err("device tree node missing\n");
138 return -EINVAL;
139 }
140
141 chg->step_chg_enabled = of_property_read_bool(node,
142 "qcom,step-charging-enable");
143
144 chg->sw_jeita_enabled = of_property_read_bool(node,
145 "qcom,sw-jeita-enable");
146
147 rc = of_property_read_u32(node, "qcom,wd-bark-time-secs",
148 &chip->dt.wd_bark_time);
149 if (rc < 0 || chip->dt.wd_bark_time < MIN_WD_BARK_TIME)
150 chip->dt.wd_bark_time = DEFAULT_WD_BARK_TIME;
151
152 chip->dt.no_battery = of_property_read_bool(node,
153 "qcom,batteryless-platform");
154
155 rc = of_property_read_u32(node,
156 "qcom,fcc-max-ua", &chip->dt.batt_profile_fcc_ua);
157 if (rc < 0)
158 chip->dt.batt_profile_fcc_ua = -EINVAL;
159
160 rc = of_property_read_u32(node,
161 "qcom,fv-max-uv", &chip->dt.batt_profile_fv_uv);
162 if (rc < 0)
163 chip->dt.batt_profile_fv_uv = -EINVAL;
164
165 rc = of_property_read_u32(node,
166 "qcom,usb-icl-ua", &chip->dt.usb_icl_ua);
167 if (rc < 0)
168 chip->dt.usb_icl_ua = -EINVAL;
169
170 rc = of_property_read_u32(node,
171 "qcom,otg-cl-ua", &chg->otg_cl_ua);
172 if (rc < 0)
173 chg->otg_cl_ua = MICRO_1P5A;
174
175 if (of_find_property(node, "qcom,thermal-mitigation", &byte_len)) {
176 chg->thermal_mitigation = devm_kzalloc(chg->dev, byte_len,
177 GFP_KERNEL);
178
179 if (chg->thermal_mitigation == NULL)
180 return -ENOMEM;
181
182 chg->thermal_levels = byte_len / sizeof(u32);
183 rc = of_property_read_u32_array(node,
184 "qcom,thermal-mitigation",
185 chg->thermal_mitigation,
186 chg->thermal_levels);
187 if (rc < 0) {
188 dev_err(chg->dev,
189 "Couldn't read threm limits rc = %d\n", rc);
190 return rc;
191 }
192 }
193
194 rc = of_property_read_u32(node, "qcom,float-option",
195 &chip->dt.float_option);
196 if (!rc && (chip->dt.float_option < 0 || chip->dt.float_option > 4)) {
197 pr_err("qcom,float-option is out of range [0, 4]\n");
198 return -EINVAL;
199 }
200
201 chip->dt.hvdcp_disable = of_property_read_bool(node,
202 "qcom,hvdcp-disable");
203
204
205 rc = of_property_read_u32(node, "qcom,chg-inhibit-threshold-mv",
206 &chip->dt.chg_inhibit_thr_mv);
207 if (!rc && (chip->dt.chg_inhibit_thr_mv < 0 ||
208 chip->dt.chg_inhibit_thr_mv > 300)) {
209 pr_err("qcom,chg-inhibit-threshold-mv is incorrect\n");
210 return -EINVAL;
211 }
212
213 chip->dt.auto_recharge_soc = of_property_read_bool(node,
214 "qcom,auto-recharge-soc");
215
216 chg->micro_usb_mode = of_property_read_bool(node, "qcom,micro-usb");
217
218 chg->dcp_icl_ua = chip->dt.usb_icl_ua;
219
220 chg->suspend_input_on_debug_batt = of_property_read_bool(node,
221 "qcom,suspend-input-on-debug-batt");
222
223 rc = of_property_read_u32(node, "qcom,otg-deglitch-time-ms",
224 &chg->otg_delay_ms);
225 if (rc < 0)
226 chg->otg_delay_ms = OTG_DEFAULT_DEGLITCH_TIME_MS;
227
228 return 0;
229}
230
231/************************
232 * USB PSY REGISTRATION *
233 ************************/
234static enum power_supply_property smb5_usb_props[] = {
235 POWER_SUPPLY_PROP_PRESENT,
236 POWER_SUPPLY_PROP_ONLINE,
237 POWER_SUPPLY_PROP_PD_CURRENT_MAX,
238 POWER_SUPPLY_PROP_CURRENT_MAX,
239 POWER_SUPPLY_PROP_TYPE,
240 POWER_SUPPLY_PROP_TYPEC_MODE,
241 POWER_SUPPLY_PROP_TYPEC_POWER_ROLE,
242 POWER_SUPPLY_PROP_TYPEC_CC_ORIENTATION,
243 POWER_SUPPLY_PROP_PD_ALLOWED,
244 POWER_SUPPLY_PROP_PD_ACTIVE,
245 POWER_SUPPLY_PROP_INPUT_CURRENT_SETTLED,
246 POWER_SUPPLY_PROP_INPUT_CURRENT_NOW,
247 POWER_SUPPLY_PROP_BOOST_CURRENT,
248 POWER_SUPPLY_PROP_PE_START,
249 POWER_SUPPLY_PROP_CTM_CURRENT_MAX,
250 POWER_SUPPLY_PROP_HW_CURRENT_MAX,
251 POWER_SUPPLY_PROP_REAL_TYPE,
252 POWER_SUPPLY_PROP_PR_SWAP,
253 POWER_SUPPLY_PROP_PD_VOLTAGE_MAX,
254 POWER_SUPPLY_PROP_PD_VOLTAGE_MIN,
255 POWER_SUPPLY_PROP_SDP_CURRENT_MAX,
256};
257
258static int smb5_usb_get_prop(struct power_supply *psy,
259 enum power_supply_property psp,
260 union power_supply_propval *val)
261{
262 struct smb5 *chip = power_supply_get_drvdata(psy);
263 struct smb_charger *chg = &chip->chg;
264 int rc = 0;
265
266 switch (psp) {
267 case POWER_SUPPLY_PROP_PRESENT:
268 rc = smblib_get_prop_usb_present(chg, val);
269 break;
270 case POWER_SUPPLY_PROP_ONLINE:
271 rc = smblib_get_prop_usb_online(chg, val);
272 if (!val->intval)
273 break;
274
275 if ((chg->typec_mode == POWER_SUPPLY_TYPEC_SOURCE_DEFAULT ||
276 chg->micro_usb_mode) &&
277 chg->real_charger_type == POWER_SUPPLY_TYPE_USB)
278 val->intval = 0;
279 else
280 val->intval = 1;
281 if (chg->real_charger_type == POWER_SUPPLY_TYPE_UNKNOWN)
282 val->intval = 0;
283 break;
284 case POWER_SUPPLY_PROP_VOLTAGE_MAX:
285 rc = smblib_get_prop_usb_voltage_max(chg, val);
286 break;
287 case POWER_SUPPLY_PROP_PD_CURRENT_MAX:
288 val->intval = get_client_vote(chg->usb_icl_votable, PD_VOTER);
289 break;
290 case POWER_SUPPLY_PROP_CURRENT_MAX:
291 rc = smblib_get_prop_input_current_settled(chg, val);
292 break;
293 case POWER_SUPPLY_PROP_TYPE:
294 val->intval = POWER_SUPPLY_TYPE_USB_PD;
295 break;
296 case POWER_SUPPLY_PROP_REAL_TYPE:
297 val->intval = chg->real_charger_type;
298 break;
299 case POWER_SUPPLY_PROP_TYPEC_MODE:
300 if (chg->micro_usb_mode)
301 val->intval = POWER_SUPPLY_TYPEC_NONE;
302 else
303 val->intval = chg->typec_mode;
304 break;
305 case POWER_SUPPLY_PROP_TYPEC_POWER_ROLE:
306 if (chg->micro_usb_mode)
307 val->intval = POWER_SUPPLY_TYPEC_PR_NONE;
308 else
309 rc = smblib_get_prop_typec_power_role(chg, val);
310 break;
311 case POWER_SUPPLY_PROP_TYPEC_CC_ORIENTATION:
312 if (chg->micro_usb_mode)
313 val->intval = 0;
314 else
315 rc = smblib_get_prop_typec_cc_orientation(chg, val);
316 break;
317 case POWER_SUPPLY_PROP_PD_ALLOWED:
318 rc = smblib_get_prop_pd_allowed(chg, val);
319 break;
320 case POWER_SUPPLY_PROP_PD_ACTIVE:
321 val->intval = chg->pd_active;
322 break;
323 case POWER_SUPPLY_PROP_INPUT_CURRENT_SETTLED:
324 rc = smblib_get_prop_input_current_settled(chg, val);
325 break;
326 case POWER_SUPPLY_PROP_BOOST_CURRENT:
327 val->intval = chg->boost_current_ua;
328 break;
329 case POWER_SUPPLY_PROP_PD_IN_HARD_RESET:
330 rc = smblib_get_prop_pd_in_hard_reset(chg, val);
331 break;
332 case POWER_SUPPLY_PROP_PD_USB_SUSPEND_SUPPORTED:
333 val->intval = chg->system_suspend_supported;
334 break;
335 case POWER_SUPPLY_PROP_PE_START:
336 rc = smblib_get_pe_start(chg, val);
337 break;
338 case POWER_SUPPLY_PROP_CTM_CURRENT_MAX:
339 val->intval = get_client_vote(chg->usb_icl_votable, CTM_VOTER);
340 break;
341 case POWER_SUPPLY_PROP_HW_CURRENT_MAX:
342 rc = smblib_get_charge_current(chg, &val->intval);
343 break;
344 case POWER_SUPPLY_PROP_PR_SWAP:
345 rc = smblib_get_prop_pr_swap_in_progress(chg, val);
346 break;
347 case POWER_SUPPLY_PROP_PD_VOLTAGE_MAX:
348 val->intval = chg->voltage_max_uv;
349 break;
350 case POWER_SUPPLY_PROP_PD_VOLTAGE_MIN:
351 val->intval = chg->voltage_min_uv;
352 break;
353 case POWER_SUPPLY_PROP_SDP_CURRENT_MAX:
354 val->intval = get_client_vote(chg->usb_icl_votable,
355 USB_PSY_VOTER);
356 break;
357 default:
358 pr_err("get prop %d is not supported in usb\n", psp);
359 rc = -EINVAL;
360 break;
361 }
362
363 if (rc < 0) {
364 pr_debug("Couldn't get prop %d rc = %d\n", psp, rc);
365 return -ENODATA;
366 }
367
368 return 0;
369}
370
371static int smb5_usb_set_prop(struct power_supply *psy,
372 enum power_supply_property psp,
373 const union power_supply_propval *val)
374{
375 struct smb5 *chip = power_supply_get_drvdata(psy);
376 struct smb_charger *chg = &chip->chg;
377 int rc = 0;
378
379 mutex_lock(&chg->lock);
380 if (!chg->typec_present) {
381 rc = -EINVAL;
382 goto unlock;
383 }
384
385 switch (psp) {
386 case POWER_SUPPLY_PROP_PD_CURRENT_MAX:
387 rc = smblib_set_prop_pd_current_max(chg, val);
388 break;
389 case POWER_SUPPLY_PROP_TYPEC_POWER_ROLE:
390 rc = smblib_set_prop_typec_power_role(chg, val);
391 break;
392 case POWER_SUPPLY_PROP_PD_ACTIVE:
393 rc = smblib_set_prop_pd_active(chg, val);
394 break;
395 case POWER_SUPPLY_PROP_PD_IN_HARD_RESET:
396 rc = smblib_set_prop_pd_in_hard_reset(chg, val);
397 break;
398 case POWER_SUPPLY_PROP_PD_USB_SUSPEND_SUPPORTED:
399 chg->system_suspend_supported = val->intval;
400 break;
401 case POWER_SUPPLY_PROP_BOOST_CURRENT:
402 rc = smblib_set_prop_boost_current(chg, val);
403 break;
404 case POWER_SUPPLY_PROP_CTM_CURRENT_MAX:
405 rc = vote(chg->usb_icl_votable, CTM_VOTER,
406 val->intval >= 0, val->intval);
407 break;
408 case POWER_SUPPLY_PROP_PR_SWAP:
409 rc = smblib_set_prop_pr_swap_in_progress(chg, val);
410 break;
411 case POWER_SUPPLY_PROP_PD_VOLTAGE_MAX:
412 rc = smblib_set_prop_pd_voltage_max(chg, val);
413 break;
414 case POWER_SUPPLY_PROP_PD_VOLTAGE_MIN:
415 rc = smblib_set_prop_pd_voltage_min(chg, val);
416 break;
417 case POWER_SUPPLY_PROP_SDP_CURRENT_MAX:
418 rc = smblib_set_prop_sdp_current_max(chg, val);
419 break;
420 default:
421 pr_err("set prop %d is not supported\n", psp);
422 rc = -EINVAL;
423 break;
424 }
425
426unlock:
427 mutex_unlock(&chg->lock);
428 return rc;
429}
430
431static int smb5_usb_prop_is_writeable(struct power_supply *psy,
432 enum power_supply_property psp)
433{
434 switch (psp) {
435 case POWER_SUPPLY_PROP_CTM_CURRENT_MAX:
436 return 1;
437 default:
438 break;
439 }
440
441 return 0;
442}
443
444static const struct power_supply_desc usb_psy_desc = {
445 .name = "usb",
446 .type = POWER_SUPPLY_TYPE_USB_PD,
447 .properties = smb5_usb_props,
448 .num_properties = ARRAY_SIZE(smb5_usb_props),
449 .get_property = smb5_usb_get_prop,
450 .set_property = smb5_usb_set_prop,
451 .property_is_writeable = smb5_usb_prop_is_writeable,
452};
453
454static int smb5_init_usb_psy(struct smb5 *chip)
455{
456 struct power_supply_config usb_cfg = {};
457 struct smb_charger *chg = &chip->chg;
458
459 usb_cfg.drv_data = chip;
460 usb_cfg.of_node = chg->dev->of_node;
461 chg->usb_psy = devm_power_supply_register(chg->dev,
462 &usb_psy_desc,
463 &usb_cfg);
464 if (IS_ERR(chg->usb_psy)) {
465 pr_err("Couldn't register USB power supply\n");
466 return PTR_ERR(chg->usb_psy);
467 }
468
469 return 0;
470}
471
472/********************************
473 * USB PC_PORT PSY REGISTRATION *
474 ********************************/
475static enum power_supply_property smb5_usb_port_props[] = {
476 POWER_SUPPLY_PROP_TYPE,
477 POWER_SUPPLY_PROP_ONLINE,
478 POWER_SUPPLY_PROP_VOLTAGE_MAX,
479 POWER_SUPPLY_PROP_CURRENT_MAX,
480};
481
482static int smb5_usb_port_get_prop(struct power_supply *psy,
483 enum power_supply_property psp,
484 union power_supply_propval *val)
485{
486 struct smb5 *chip = power_supply_get_drvdata(psy);
487 struct smb_charger *chg = &chip->chg;
488 int rc = 0;
489
490 switch (psp) {
491 case POWER_SUPPLY_PROP_TYPE:
492 val->intval = POWER_SUPPLY_TYPE_USB;
493 break;
494 case POWER_SUPPLY_PROP_ONLINE:
495 rc = smblib_get_prop_usb_online(chg, val);
496 if (!val->intval)
497 break;
498
499 if ((chg->typec_mode == POWER_SUPPLY_TYPEC_SOURCE_DEFAULT ||
500 chg->micro_usb_mode) &&
501 chg->real_charger_type == POWER_SUPPLY_TYPE_USB)
502 val->intval = 1;
503 else
504 val->intval = 0;
505 break;
506 case POWER_SUPPLY_PROP_VOLTAGE_MAX:
507 val->intval = 5000000;
508 break;
509 case POWER_SUPPLY_PROP_CURRENT_MAX:
510 rc = smblib_get_prop_input_current_settled(chg, val);
511 break;
512 default:
513 pr_err_ratelimited("Get prop %d is not supported in pc_port\n",
514 psp);
515 return -EINVAL;
516 }
517
518 if (rc < 0) {
519 pr_debug("Couldn't get prop %d rc = %d\n", psp, rc);
520 return -ENODATA;
521 }
522
523 return 0;
524}
525
526static int smb5_usb_port_set_prop(struct power_supply *psy,
527 enum power_supply_property psp,
528 const union power_supply_propval *val)
529{
530 int rc = 0;
531
532 switch (psp) {
533 default:
534 pr_err_ratelimited("Set prop %d is not supported in pc_port\n",
535 psp);
536 rc = -EINVAL;
537 break;
538 }
539
540 return rc;
541}
542
543static const struct power_supply_desc usb_port_psy_desc = {
544 .name = "pc_port",
545 .type = POWER_SUPPLY_TYPE_USB,
546 .properties = smb5_usb_port_props,
547 .num_properties = ARRAY_SIZE(smb5_usb_port_props),
548 .get_property = smb5_usb_port_get_prop,
549 .set_property = smb5_usb_port_set_prop,
550};
551
552static int smb5_init_usb_port_psy(struct smb5 *chip)
553{
554 struct power_supply_config usb_port_cfg = {};
555 struct smb_charger *chg = &chip->chg;
556
557 usb_port_cfg.drv_data = chip;
558 usb_port_cfg.of_node = chg->dev->of_node;
559 chg->usb_port_psy = devm_power_supply_register(chg->dev,
560 &usb_port_psy_desc,
561 &usb_port_cfg);
562 if (IS_ERR(chg->usb_port_psy)) {
563 pr_err("Couldn't register USB pc_port power supply\n");
564 return PTR_ERR(chg->usb_port_psy);
565 }
566
567 return 0;
568}
569
570/*****************************
571 * USB MAIN PSY REGISTRATION *
572 *****************************/
573
574static enum power_supply_property smb5_usb_main_props[] = {
575 POWER_SUPPLY_PROP_VOLTAGE_MAX,
576 POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX,
577 POWER_SUPPLY_PROP_TYPE,
578 POWER_SUPPLY_PROP_INPUT_CURRENT_SETTLED,
579 POWER_SUPPLY_PROP_INPUT_VOLTAGE_SETTLED,
580 POWER_SUPPLY_PROP_FCC_DELTA,
581 POWER_SUPPLY_PROP_CURRENT_MAX,
582};
583
584static int smb5_usb_main_get_prop(struct power_supply *psy,
585 enum power_supply_property psp,
586 union power_supply_propval *val)
587{
588 struct smb5 *chip = power_supply_get_drvdata(psy);
589 struct smb_charger *chg = &chip->chg;
590 int rc = 0;
591
592 switch (psp) {
593 case POWER_SUPPLY_PROP_VOLTAGE_MAX:
594 rc = smblib_get_charge_param(chg, &chg->param.fv, &val->intval);
595 break;
596 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX:
597 rc = smblib_get_charge_param(chg, &chg->param.fcc,
598 &val->intval);
599 break;
600 case POWER_SUPPLY_PROP_TYPE:
601 val->intval = POWER_SUPPLY_TYPE_MAIN;
602 break;
603 case POWER_SUPPLY_PROP_INPUT_CURRENT_SETTLED:
604 rc = smblib_get_prop_input_current_settled(chg, val);
605 break;
606 case POWER_SUPPLY_PROP_INPUT_VOLTAGE_SETTLED:
607 rc = smblib_get_prop_input_voltage_settled(chg, val);
608 break;
609 case POWER_SUPPLY_PROP_FCC_DELTA:
610 rc = smblib_get_prop_fcc_delta(chg, val);
611 break;
612 case POWER_SUPPLY_PROP_CURRENT_MAX:
613 rc = smblib_get_icl_current(chg, &val->intval);
614 break;
615 default:
616 pr_debug("get prop %d is not supported in usb-main\n", psp);
617 rc = -EINVAL;
618 break;
619 }
620 if (rc < 0) {
621 pr_debug("Couldn't get prop %d rc = %d\n", psp, rc);
622 return -ENODATA;
623 }
624
625 return 0;
626}
627
628static int smb5_usb_main_set_prop(struct power_supply *psy,
629 enum power_supply_property psp,
630 const union power_supply_propval *val)
631{
632 struct smb5 *chip = power_supply_get_drvdata(psy);
633 struct smb_charger *chg = &chip->chg;
634 int rc = 0;
635
636 switch (psp) {
637 case POWER_SUPPLY_PROP_VOLTAGE_MAX:
638 rc = smblib_set_charge_param(chg, &chg->param.fv, val->intval);
639 break;
640 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX:
641 rc = smblib_set_charge_param(chg, &chg->param.fcc, val->intval);
642 break;
643 case POWER_SUPPLY_PROP_CURRENT_MAX:
644 rc = smblib_set_icl_current(chg, val->intval);
645 break;
646 default:
647 pr_err("set prop %d is not supported\n", psp);
648 rc = -EINVAL;
649 break;
650 }
651
652 return rc;
653}
654
655static const struct power_supply_desc usb_main_psy_desc = {
656 .name = "main",
657 .type = POWER_SUPPLY_TYPE_MAIN,
658 .properties = smb5_usb_main_props,
659 .num_properties = ARRAY_SIZE(smb5_usb_main_props),
660 .get_property = smb5_usb_main_get_prop,
661 .set_property = smb5_usb_main_set_prop,
662};
663
664static int smb5_init_usb_main_psy(struct smb5 *chip)
665{
666 struct power_supply_config usb_main_cfg = {};
667 struct smb_charger *chg = &chip->chg;
668
669 usb_main_cfg.drv_data = chip;
670 usb_main_cfg.of_node = chg->dev->of_node;
671 chg->usb_main_psy = devm_power_supply_register(chg->dev,
672 &usb_main_psy_desc,
673 &usb_main_cfg);
674 if (IS_ERR(chg->usb_main_psy)) {
675 pr_err("Couldn't register USB main power supply\n");
676 return PTR_ERR(chg->usb_main_psy);
677 }
678
679 return 0;
680}
681
682/*************************
683 * DC PSY REGISTRATION *
684 *************************/
685
686static enum power_supply_property smb5_dc_props[] = {
687 POWER_SUPPLY_PROP_INPUT_SUSPEND,
688 POWER_SUPPLY_PROP_PRESENT,
689 POWER_SUPPLY_PROP_ONLINE,
690 POWER_SUPPLY_PROP_REAL_TYPE,
691};
692
693static int smb5_dc_get_prop(struct power_supply *psy,
694 enum power_supply_property psp,
695 union power_supply_propval *val)
696{
697 struct smb5 *chip = power_supply_get_drvdata(psy);
698 struct smb_charger *chg = &chip->chg;
699 int rc = 0;
700
701 switch (psp) {
702 case POWER_SUPPLY_PROP_INPUT_SUSPEND:
703 val->intval = get_effective_result(chg->dc_suspend_votable);
704 break;
705 case POWER_SUPPLY_PROP_PRESENT:
706 rc = smblib_get_prop_dc_present(chg, val);
707 break;
708 case POWER_SUPPLY_PROP_ONLINE:
709 rc = smblib_get_prop_dc_online(chg, val);
710 break;
711 case POWER_SUPPLY_PROP_REAL_TYPE:
712 val->intval = POWER_SUPPLY_TYPE_WIPOWER;
713 break;
714 default:
715 return -EINVAL;
716 }
717 if (rc < 0) {
718 pr_debug("Couldn't get prop %d rc = %d\n", psp, rc);
719 return -ENODATA;
720 }
721 return 0;
722}
723
724static int smb5_dc_set_prop(struct power_supply *psy,
725 enum power_supply_property psp,
726 const union power_supply_propval *val)
727{
728 struct smb5 *chip = power_supply_get_drvdata(psy);
729 struct smb_charger *chg = &chip->chg;
730 int rc = 0;
731
732 switch (psp) {
733 case POWER_SUPPLY_PROP_INPUT_SUSPEND:
734 rc = vote(chg->dc_suspend_votable, WBC_VOTER,
735 (bool)val->intval, 0);
736 break;
737 default:
738 return -EINVAL;
739 }
740
741 return rc;
742}
743
744static int smb5_dc_prop_is_writeable(struct power_supply *psy,
745 enum power_supply_property psp)
746{
747 int rc;
748
749 switch (psp) {
750 default:
751 rc = 0;
752 break;
753 }
754
755 return rc;
756}
757
758static const struct power_supply_desc dc_psy_desc = {
759 .name = "dc",
760 .type = POWER_SUPPLY_TYPE_WIRELESS,
761 .properties = smb5_dc_props,
762 .num_properties = ARRAY_SIZE(smb5_dc_props),
763 .get_property = smb5_dc_get_prop,
764 .set_property = smb5_dc_set_prop,
765 .property_is_writeable = smb5_dc_prop_is_writeable,
766};
767
768static int smb5_init_dc_psy(struct smb5 *chip)
769{
770 struct power_supply_config dc_cfg = {};
771 struct smb_charger *chg = &chip->chg;
772
773 dc_cfg.drv_data = chip;
774 dc_cfg.of_node = chg->dev->of_node;
775 chg->dc_psy = devm_power_supply_register(chg->dev,
776 &dc_psy_desc,
777 &dc_cfg);
778 if (IS_ERR(chg->dc_psy)) {
779 pr_err("Couldn't register USB power supply\n");
780 return PTR_ERR(chg->dc_psy);
781 }
782
783 return 0;
784}
785
786/*************************
787 * BATT PSY REGISTRATION *
788 *************************/
789static enum power_supply_property smb5_batt_props[] = {
790 POWER_SUPPLY_PROP_INPUT_SUSPEND,
791 POWER_SUPPLY_PROP_STATUS,
792 POWER_SUPPLY_PROP_HEALTH,
793 POWER_SUPPLY_PROP_PRESENT,
794 POWER_SUPPLY_PROP_CHARGE_TYPE,
795 POWER_SUPPLY_PROP_CAPACITY,
796 POWER_SUPPLY_PROP_INPUT_CURRENT_LIMITED,
797 POWER_SUPPLY_PROP_VOLTAGE_NOW,
798 POWER_SUPPLY_PROP_VOLTAGE_MAX,
799 POWER_SUPPLY_PROP_CURRENT_NOW,
800 POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX,
801 POWER_SUPPLY_PROP_TEMP,
802 POWER_SUPPLY_PROP_TECHNOLOGY,
803 POWER_SUPPLY_PROP_STEP_CHARGING_ENABLED,
804 POWER_SUPPLY_PROP_SW_JEITA_ENABLED,
805 POWER_SUPPLY_PROP_CHARGE_DONE,
806 POWER_SUPPLY_PROP_PARALLEL_DISABLE,
807 POWER_SUPPLY_PROP_SET_SHIP_MODE,
808 POWER_SUPPLY_PROP_DIE_HEALTH,
809 POWER_SUPPLY_PROP_RERUN_AICL,
810 POWER_SUPPLY_PROP_DP_DM,
811 POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT_MAX,
812 POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT,
813 POWER_SUPPLY_PROP_CHARGE_COUNTER,
814};
815
816static int smb5_batt_get_prop(struct power_supply *psy,
817 enum power_supply_property psp,
818 union power_supply_propval *val)
819{
820 struct smb_charger *chg = power_supply_get_drvdata(psy);
821 int rc = 0;
822
823 switch (psp) {
824 case POWER_SUPPLY_PROP_STATUS:
825 rc = smblib_get_prop_batt_status(chg, val);
826 break;
827 case POWER_SUPPLY_PROP_HEALTH:
828 rc = smblib_get_prop_batt_health(chg, val);
829 break;
830 case POWER_SUPPLY_PROP_PRESENT:
831 rc = smblib_get_prop_batt_present(chg, val);
832 break;
833 case POWER_SUPPLY_PROP_INPUT_SUSPEND:
834 rc = smblib_get_prop_input_suspend(chg, val);
835 break;
836 case POWER_SUPPLY_PROP_CHARGE_TYPE:
837 rc = smblib_get_prop_batt_charge_type(chg, val);
838 break;
839 case POWER_SUPPLY_PROP_CAPACITY:
840 rc = smblib_get_prop_batt_capacity(chg, val);
841 break;
842 case POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT:
843 rc = smblib_get_prop_system_temp_level(chg, val);
844 break;
845 case POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT_MAX:
846 rc = smblib_get_prop_system_temp_level_max(chg, val);
847 break;
848 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMITED:
849 rc = smblib_get_prop_input_current_limited(chg, val);
850 break;
851 case POWER_SUPPLY_PROP_STEP_CHARGING_ENABLED:
852 val->intval = chg->step_chg_enabled;
853 break;
854 case POWER_SUPPLY_PROP_SW_JEITA_ENABLED:
855 val->intval = chg->sw_jeita_enabled;
856 break;
857 case POWER_SUPPLY_PROP_VOLTAGE_NOW:
858 rc = smblib_get_prop_batt_voltage_now(chg, val);
859 break;
860 case POWER_SUPPLY_PROP_VOLTAGE_MAX:
861 val->intval = get_client_vote(chg->fv_votable,
862 BATT_PROFILE_VOTER);
863 break;
864 case POWER_SUPPLY_PROP_CURRENT_NOW:
865 rc = smblib_get_prop_batt_current_now(chg, val);
866 break;
867 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX:
868 val->intval = get_client_vote(chg->fcc_votable,
869 BATT_PROFILE_VOTER);
870 break;
871 case POWER_SUPPLY_PROP_TEMP:
872 rc = smblib_get_prop_batt_temp(chg, val);
873 break;
874 case POWER_SUPPLY_PROP_TECHNOLOGY:
875 val->intval = POWER_SUPPLY_TECHNOLOGY_LION;
876 break;
877 case POWER_SUPPLY_PROP_CHARGE_DONE:
878 rc = smblib_get_prop_batt_charge_done(chg, val);
879 break;
880 case POWER_SUPPLY_PROP_PARALLEL_DISABLE:
881 val->intval = get_client_vote(chg->pl_disable_votable,
882 USER_VOTER);
883 break;
884 case POWER_SUPPLY_PROP_SET_SHIP_MODE:
885 /* Not in ship mode as long as device is active */
886 val->intval = 0;
887 break;
888 case POWER_SUPPLY_PROP_DIE_HEALTH:
889 if (chg->die_health == -EINVAL)
890 rc = smblib_get_prop_die_health(chg, val);
891 else
892 val->intval = chg->die_health;
893 break;
894 case POWER_SUPPLY_PROP_DP_DM:
895 val->intval = chg->pulse_cnt;
896 break;
897 case POWER_SUPPLY_PROP_RERUN_AICL:
898 val->intval = 0;
899 break;
900 case POWER_SUPPLY_PROP_CHARGE_COUNTER:
901 rc = smblib_get_prop_batt_charge_counter(chg, val);
902 break;
903 default:
904 pr_err("batt power supply prop %d not supported\n", psp);
905 return -EINVAL;
906 }
907
908 if (rc < 0) {
909 pr_debug("Couldn't get prop %d rc = %d\n", psp, rc);
910 return -ENODATA;
911 }
912
913 return 0;
914}
915
916static int smb5_batt_set_prop(struct power_supply *psy,
917 enum power_supply_property prop,
918 const union power_supply_propval *val)
919{
920 int rc = 0;
921 struct smb_charger *chg = power_supply_get_drvdata(psy);
922
923 switch (prop) {
924 case POWER_SUPPLY_PROP_STATUS:
925 rc = smblib_set_prop_batt_status(chg, val);
926 break;
927 case POWER_SUPPLY_PROP_INPUT_SUSPEND:
928 rc = smblib_set_prop_input_suspend(chg, val);
929 break;
930 case POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT:
931 rc = smblib_set_prop_system_temp_level(chg, val);
932 break;
933 case POWER_SUPPLY_PROP_CAPACITY:
934 rc = smblib_set_prop_batt_capacity(chg, val);
935 break;
936 case POWER_SUPPLY_PROP_PARALLEL_DISABLE:
937 vote(chg->pl_disable_votable, USER_VOTER, (bool)val->intval, 0);
938 break;
939 case POWER_SUPPLY_PROP_VOLTAGE_MAX:
940 chg->batt_profile_fv_uv = val->intval;
941 vote(chg->fv_votable, BATT_PROFILE_VOTER, true, val->intval);
942 break;
943 case POWER_SUPPLY_PROP_STEP_CHARGING_ENABLED:
944 chg->step_chg_enabled = !!val->intval;
945 break;
946 case POWER_SUPPLY_PROP_SW_JEITA_ENABLED:
947 if (chg->sw_jeita_enabled != (!!val->intval)) {
948 rc = smblib_disable_hw_jeita(chg, !!val->intval);
949 if (rc == 0)
950 chg->sw_jeita_enabled = !!val->intval;
951 }
952 break;
953 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX:
954 chg->batt_profile_fcc_ua = val->intval;
955 vote(chg->fcc_votable, BATT_PROFILE_VOTER, true, val->intval);
956 break;
957 case POWER_SUPPLY_PROP_SET_SHIP_MODE:
958 /* Not in ship mode as long as the device is active */
959 if (!val->intval)
960 break;
961 if (chg->pl.psy)
962 power_supply_set_property(chg->pl.psy,
963 POWER_SUPPLY_PROP_SET_SHIP_MODE, val);
964 rc = smblib_set_prop_ship_mode(chg, val);
965 break;
966 case POWER_SUPPLY_PROP_RERUN_AICL:
967 rc = smblib_rerun_aicl(chg);
968 break;
969 case POWER_SUPPLY_PROP_DP_DM:
970 rc = smblib_dp_dm(chg, val->intval);
971 break;
972 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMITED:
973 rc = smblib_set_prop_input_current_limited(chg, val);
974 break;
975 case POWER_SUPPLY_PROP_DIE_HEALTH:
976 chg->die_health = val->intval;
977 power_supply_changed(chg->batt_psy);
978 break;
979 default:
980 rc = -EINVAL;
981 }
982
983 return rc;
984}
985
986static int smb5_batt_prop_is_writeable(struct power_supply *psy,
987 enum power_supply_property psp)
988{
989 switch (psp) {
990 case POWER_SUPPLY_PROP_STATUS:
991 case POWER_SUPPLY_PROP_INPUT_SUSPEND:
992 case POWER_SUPPLY_PROP_SYSTEM_TEMP_LEVEL:
993 case POWER_SUPPLY_PROP_CAPACITY:
994 case POWER_SUPPLY_PROP_PARALLEL_DISABLE:
995 case POWER_SUPPLY_PROP_DP_DM:
996 case POWER_SUPPLY_PROP_RERUN_AICL:
997 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMITED:
998 case POWER_SUPPLY_PROP_STEP_CHARGING_ENABLED:
999 case POWER_SUPPLY_PROP_SW_JEITA_ENABLED:
1000 case POWER_SUPPLY_PROP_DIE_HEALTH:
1001 return 1;
1002 default:
1003 break;
1004 }
1005
1006 return 0;
1007}
1008
1009static const struct power_supply_desc batt_psy_desc = {
1010 .name = "battery",
1011 .type = POWER_SUPPLY_TYPE_BATTERY,
1012 .properties = smb5_batt_props,
1013 .num_properties = ARRAY_SIZE(smb5_batt_props),
1014 .get_property = smb5_batt_get_prop,
1015 .set_property = smb5_batt_set_prop,
1016 .property_is_writeable = smb5_batt_prop_is_writeable,
1017};
1018
1019static int smb5_init_batt_psy(struct smb5 *chip)
1020{
1021 struct power_supply_config batt_cfg = {};
1022 struct smb_charger *chg = &chip->chg;
1023 int rc = 0;
1024
1025 batt_cfg.drv_data = chg;
1026 batt_cfg.of_node = chg->dev->of_node;
1027 chg->batt_psy = devm_power_supply_register(chg->dev,
1028 &batt_psy_desc,
1029 &batt_cfg);
1030 if (IS_ERR(chg->batt_psy)) {
1031 pr_err("Couldn't register battery power supply\n");
1032 return PTR_ERR(chg->batt_psy);
1033 }
1034
1035 return rc;
1036}
1037
1038/******************************
1039 * VBUS REGULATOR REGISTRATION *
1040 ******************************/
1041
1042static struct regulator_ops smb5_vbus_reg_ops = {
1043 .enable = smblib_vbus_regulator_enable,
1044 .disable = smblib_vbus_regulator_disable,
1045 .is_enabled = smblib_vbus_regulator_is_enabled,
1046};
1047
1048static int smb5_init_vbus_regulator(struct smb5 *chip)
1049{
1050 struct smb_charger *chg = &chip->chg;
1051 struct regulator_config cfg = {};
1052 int rc = 0;
1053
1054 chg->vbus_vreg = devm_kzalloc(chg->dev, sizeof(*chg->vbus_vreg),
1055 GFP_KERNEL);
1056 if (!chg->vbus_vreg)
1057 return -ENOMEM;
1058
1059 cfg.dev = chg->dev;
1060 cfg.driver_data = chip;
1061
1062 chg->vbus_vreg->rdesc.owner = THIS_MODULE;
1063 chg->vbus_vreg->rdesc.type = REGULATOR_VOLTAGE;
1064 chg->vbus_vreg->rdesc.ops = &smb5_vbus_reg_ops;
1065 chg->vbus_vreg->rdesc.of_match = "qcom,smb5-vbus";
1066 chg->vbus_vreg->rdesc.name = "qcom,smb5-vbus";
1067
1068 chg->vbus_vreg->rdev = devm_regulator_register(chg->dev,
1069 &chg->vbus_vreg->rdesc, &cfg);
1070 if (IS_ERR(chg->vbus_vreg->rdev)) {
1071 rc = PTR_ERR(chg->vbus_vreg->rdev);
1072 chg->vbus_vreg->rdev = NULL;
1073 if (rc != -EPROBE_DEFER)
1074 pr_err("Couldn't register VBUS regulator rc=%d\n", rc);
1075 }
1076
1077 return rc;
1078}
1079
1080/******************************
1081 * VCONN REGULATOR REGISTRATION *
1082 ******************************/
1083
1084static struct regulator_ops smb5_vconn_reg_ops = {
1085 .enable = smblib_vconn_regulator_enable,
1086 .disable = smblib_vconn_regulator_disable,
1087 .is_enabled = smblib_vconn_regulator_is_enabled,
1088};
1089
1090static int smb5_init_vconn_regulator(struct smb5 *chip)
1091{
1092 struct smb_charger *chg = &chip->chg;
1093 struct regulator_config cfg = {};
1094 int rc = 0;
1095
1096 if (chg->micro_usb_mode)
1097 return 0;
1098
1099 chg->vconn_vreg = devm_kzalloc(chg->dev, sizeof(*chg->vconn_vreg),
1100 GFP_KERNEL);
1101 if (!chg->vconn_vreg)
1102 return -ENOMEM;
1103
1104 cfg.dev = chg->dev;
1105 cfg.driver_data = chip;
1106
1107 chg->vconn_vreg->rdesc.owner = THIS_MODULE;
1108 chg->vconn_vreg->rdesc.type = REGULATOR_VOLTAGE;
1109 chg->vconn_vreg->rdesc.ops = &smb5_vconn_reg_ops;
1110 chg->vconn_vreg->rdesc.of_match = "qcom,smb5-vconn";
1111 chg->vconn_vreg->rdesc.name = "qcom,smb5-vconn";
1112
1113 chg->vconn_vreg->rdev = devm_regulator_register(chg->dev,
1114 &chg->vconn_vreg->rdesc, &cfg);
1115 if (IS_ERR(chg->vconn_vreg->rdev)) {
1116 rc = PTR_ERR(chg->vconn_vreg->rdev);
1117 chg->vconn_vreg->rdev = NULL;
1118 if (rc != -EPROBE_DEFER)
1119 pr_err("Couldn't register VCONN regulator rc=%d\n", rc);
1120 }
1121
1122 return rc;
1123}
1124
1125/***************************
1126 * HARDWARE INITIALIZATION *
1127 ***************************/
1128static int smb5_configure_typec(struct smb_charger *chg)
1129{
1130 int rc;
1131
1132 rc = smblib_write(chg, TYPE_C_INTERRUPT_EN_CFG_1_REG,
1133 TYPEC_CCOUT_DETACH_INT_EN_BIT |
1134 TYPEC_CCOUT_ATTACH_INT_EN_BIT);
1135 if (rc < 0) {
1136 dev_err(chg->dev,
1137 "Couldn't configure Type-C interrupts rc=%d\n", rc);
1138 return rc;
1139 }
1140
1141 rc = smblib_write(chg, TYPE_C_INTERRUPT_EN_CFG_2_REG,
1142 MICRO_USB_STATE_CHANGE_INT_EN_BIT |
1143 TYPEC_WATER_DETECTION_INT_EN_BIT);
1144 if (rc < 0) {
1145 dev_err(chg->dev,
1146 "Couldn't configure Type-C interrupts rc=%d\n", rc);
1147 return rc;
1148 }
1149
1150 /* configure VCONN for software control */
1151 rc = smblib_masked_write(chg, TYPE_C_VCONN_CONTROL_REG,
1152 VCONN_EN_SRC_BIT | VCONN_EN_VALUE_BIT,
1153 VCONN_EN_SRC_BIT);
1154 if (rc < 0) {
1155 dev_err(chg->dev,
1156 "Couldn't configure VCONN for SW control rc=%d\n", rc);
1157 return rc;
1158 }
1159
1160 return rc;
1161}
1162
1163static int smb5_configure_micro_usb(struct smb_charger *chg)
1164{
1165 int rc;
1166
1167 /* configure micro USB mode */
1168 rc = smblib_masked_write(chg, TYPEC_U_USB_CFG_REG,
1169 EN_MICRO_USB_MODE_BIT, EN_MICRO_USB_MODE_BIT);
1170 if (rc < 0) {
1171 dev_err(chg->dev, "Couldn't enable micro USB mode rc=%d\n", rc);
1172 return rc;
1173 }
1174
1175 return rc;
1176}
1177
1178static int smb5_init_hw(struct smb5 *chip)
1179{
1180 struct smb_charger *chg = &chip->chg;
1181 int rc;
1182 u8 val;
1183
1184 if (chip->dt.no_battery)
1185 chg->fake_capacity = 50;
1186
1187 if (chip->dt.batt_profile_fcc_ua < 0)
1188 smblib_get_charge_param(chg, &chg->param.fcc,
1189 &chg->batt_profile_fcc_ua);
1190
1191 if (chip->dt.batt_profile_fv_uv < 0)
1192 smblib_get_charge_param(chg, &chg->param.fv,
1193 &chg->batt_profile_fv_uv);
1194
1195 smblib_get_charge_param(chg, &chg->param.usb_icl,
1196 &chg->default_icl_ua);
1197 if (chip->dt.usb_icl_ua < 0)
1198 chip->dt.usb_icl_ua = chg->default_icl_ua;
1199
1200 /* vote 0mA on usb_icl for non battery platforms */
1201 vote(chg->usb_icl_votable,
1202 DEFAULT_VOTER, chip->dt.no_battery, 0);
1203 vote(chg->dc_suspend_votable,
1204 DEFAULT_VOTER, chip->dt.no_battery, 0);
1205 vote(chg->fcc_votable, HW_LIMIT_VOTER,
1206 chip->dt.batt_profile_fcc_ua > 0, chip->dt.batt_profile_fcc_ua);
1207 vote(chg->fv_votable, HW_LIMIT_VOTER,
1208 chip->dt.batt_profile_fv_uv > 0, chip->dt.batt_profile_fv_uv);
1209 vote(chg->fcc_votable,
1210 BATT_PROFILE_VOTER, true, chg->batt_profile_fcc_ua);
1211 vote(chg->fv_votable,
1212 BATT_PROFILE_VOTER, true, chg->batt_profile_fv_uv);
1213 vote(chg->pd_disallowed_votable_indirect, CC_DETACHED_VOTER,
1214 true, 0);
1215 vote(chg->pd_disallowed_votable_indirect, APSD_VOTER,
1216 true, 0);
1217 vote(chg->pd_disallowed_votable_indirect, MICRO_USB_VOTER,
1218 chg->micro_usb_mode, 0);
1219
1220 /*
1221 * AICL configuration:
1222 * start from min and AICL ADC disable
1223 */
1224 rc = smblib_masked_write(chg, USBIN_AICL_OPTIONS_CFG_REG,
1225 USBIN_AICL_ADC_EN_BIT, 0);
1226 if (rc < 0) {
1227 dev_err(chg->dev, "Couldn't configure AICL rc=%d\n", rc);
1228 return rc;
1229 }
1230
1231 /* enable the charging path */
1232 rc = vote(chg->chg_disable_votable, DEFAULT_VOTER, false, 0);
1233 if (rc < 0) {
1234 dev_err(chg->dev, "Couldn't enable charging rc=%d\n", rc);
1235 return rc;
1236 }
1237
1238 if (chg->micro_usb_mode)
1239 rc = smb5_configure_micro_usb(chg);
1240 else
1241 rc = smb5_configure_typec(chg);
1242 if (rc < 0) {
1243 dev_err(chg->dev,
1244 "Couldn't configure TypeC/micro-USB mode rc=%d\n", rc);
1245 return rc;
1246 }
1247
1248 /* configure VBUS for software control */
1249 rc = smblib_masked_write(chg, DCDC_OTG_CFG_REG, OTG_EN_SRC_CFG_BIT, 0);
1250 if (rc < 0) {
1251 dev_err(chg->dev,
1252 "Couldn't configure VBUS for SW control rc=%d\n", rc);
1253 return rc;
1254 }
1255
1256 val = (ilog2(chip->dt.wd_bark_time / 16) << BARK_WDOG_TIMEOUT_SHIFT)
1257 & BARK_WDOG_TIMEOUT_MASK;
1258 val |= BITE_WDOG_TIMEOUT_8S;
1259 rc = smblib_masked_write(chg, SNARL_BARK_BITE_WD_CFG_REG,
1260 BITE_WDOG_DISABLE_CHARGING_CFG_BIT |
1261 BARK_WDOG_TIMEOUT_MASK | BITE_WDOG_TIMEOUT_MASK,
1262 val);
1263 if (rc < 0) {
1264 pr_err("Couldn't configue WD config rc=%d\n", rc);
1265 return rc;
1266 }
1267
1268 /* enable WD BARK and enable it on plugin */
1269 rc = smblib_masked_write(chg, WD_CFG_REG,
1270 WATCHDOG_TRIGGER_AFP_EN_BIT |
1271 WDOG_TIMER_EN_ON_PLUGIN_BIT |
1272 BARK_WDOG_INT_EN_BIT,
1273 WDOG_TIMER_EN_ON_PLUGIN_BIT |
1274 BARK_WDOG_INT_EN_BIT);
1275 if (rc < 0) {
1276 pr_err("Couldn't configue WD config rc=%d\n", rc);
1277 return rc;
1278 }
1279
1280 /* configure float charger options */
1281 switch (chip->dt.float_option) {
1282 case FLOAT_DCP:
1283 rc = smblib_masked_write(chg, USBIN_OPTIONS_2_CFG_REG,
1284 FLOAT_OPTIONS_MASK, 0);
1285 break;
1286 case FLOAT_SDP:
1287 rc = smblib_masked_write(chg, USBIN_OPTIONS_2_CFG_REG,
1288 FLOAT_OPTIONS_MASK, FORCE_FLOAT_SDP_CFG_BIT);
1289 break;
1290 case DISABLE_CHARGING:
1291 rc = smblib_masked_write(chg, USBIN_OPTIONS_2_CFG_REG,
1292 FLOAT_OPTIONS_MASK, FLOAT_DIS_CHGING_CFG_BIT);
1293 break;
1294 case SUSPEND_INPUT:
1295 rc = smblib_masked_write(chg, USBIN_OPTIONS_2_CFG_REG,
1296 FLOAT_OPTIONS_MASK, SUSPEND_FLOAT_CFG_BIT);
1297 break;
1298 default:
1299 rc = 0;
1300 break;
1301 }
1302
1303 if (rc < 0) {
1304 dev_err(chg->dev, "Couldn't configure float charger options rc=%d\n",
1305 rc);
1306 return rc;
1307 }
1308
1309 rc = smblib_read(chg, USBIN_OPTIONS_2_CFG_REG, &chg->float_cfg);
1310 if (rc < 0) {
1311 dev_err(chg->dev, "Couldn't read float charger options rc=%d\n",
1312 rc);
1313 return rc;
1314 }
1315
1316 switch (chip->dt.chg_inhibit_thr_mv) {
1317 case 50:
1318 rc = smblib_masked_write(chg, CHARGE_INHIBIT_THRESHOLD_CFG_REG,
1319 CHARGE_INHIBIT_THRESHOLD_MASK,
1320 INHIBIT_ANALOG_VFLT_MINUS_50MV);
1321 break;
1322 case 100:
1323 rc = smblib_masked_write(chg, CHARGE_INHIBIT_THRESHOLD_CFG_REG,
1324 CHARGE_INHIBIT_THRESHOLD_MASK,
1325 INHIBIT_ANALOG_VFLT_MINUS_100MV);
1326 break;
1327 case 200:
1328 rc = smblib_masked_write(chg, CHARGE_INHIBIT_THRESHOLD_CFG_REG,
1329 CHARGE_INHIBIT_THRESHOLD_MASK,
1330 INHIBIT_ANALOG_VFLT_MINUS_200MV);
1331 break;
1332 case 300:
1333 rc = smblib_masked_write(chg, CHARGE_INHIBIT_THRESHOLD_CFG_REG,
1334 CHARGE_INHIBIT_THRESHOLD_MASK,
1335 INHIBIT_ANALOG_VFLT_MINUS_300MV);
1336 break;
1337 case 0:
1338 rc = smblib_masked_write(chg, CHGR_CFG2_REG,
1339 CHARGER_INHIBIT_BIT, 0);
1340 default:
1341 break;
1342 }
1343
1344 if (rc < 0) {
1345 dev_err(chg->dev, "Couldn't configure charge inhibit threshold rc=%d\n",
1346 rc);
1347 return rc;
1348 }
1349
1350 rc = smblib_masked_write(chg, CHGR_CFG2_REG,
1351 SOC_BASED_RECHG_BIT,
1352 chip->dt.auto_recharge_soc ? SOC_BASED_RECHG_BIT : 0);
1353 if (rc < 0) {
1354 dev_err(chg->dev, "Couldn't configure FG_UPDATE_CFG2_SEL_REG rc=%d\n",
1355 rc);
1356 return rc;
1357 }
1358
1359 if (chg->sw_jeita_enabled) {
1360 rc = smblib_disable_hw_jeita(chg, true);
1361 if (rc < 0) {
1362 dev_err(chg->dev, "Couldn't set hw jeita rc=%d\n", rc);
1363 return rc;
1364 }
1365 }
1366
1367 return rc;
1368}
1369
1370static int smb5_post_init(struct smb5 *chip)
1371{
1372 struct smb_charger *chg = &chip->chg;
1373 union power_supply_propval pval;
1374 int rc;
1375
1376 /*
1377 * In case the usb path is suspended, we would have missed disabling
1378 * the icl change interrupt because the interrupt could have been
1379 * not requested
1380 */
1381 rerun_election(chg->usb_icl_votable);
1382
1383 /* configure power role for dual-role */
1384 pval.intval = POWER_SUPPLY_TYPEC_PR_DUAL;
1385 rc = smblib_set_prop_typec_power_role(chg, &pval);
1386 if (rc < 0) {
1387 dev_err(chg->dev,
1388 "Couldn't configure power role for DRP rc=%d\n", rc);
1389 return rc;
1390 }
1391
1392 rerun_election(chg->usb_irq_enable_votable);
1393
1394 return 0;
1395}
1396
1397/****************************
1398 * DETERMINE INITIAL STATUS *
1399 ****************************/
1400
1401static int smb5_determine_initial_status(struct smb5 *chip)
1402{
1403 struct smb_irq_data irq_data = {chip, "determine-initial-status"};
1404 struct smb_charger *chg = &chip->chg;
1405
1406 if (chg->bms_psy)
1407 smblib_suspend_on_debug_battery(chg);
1408 usb_plugin_irq_handler(0, &irq_data);
1409 typec_state_change_irq_handler(0, &irq_data);
1410 usb_source_change_irq_handler(0, &irq_data);
1411 chg_state_change_irq_handler(0, &irq_data);
1412 icl_change_irq_handler(0, &irq_data);
1413 batt_temp_changed_irq_handler(0, &irq_data);
1414 wdog_bark_irq_handler(0, &irq_data);
1415
1416 return 0;
1417}
1418
1419/**************************
1420 * INTERRUPT REGISTRATION *
1421 **************************/
1422
1423static struct smb_irq_info smb5_irqs[] = {
1424 /* CHARGER IRQs */
1425 [CHGR_ERROR_IRQ] = {
1426 .name = "chgr-error",
1427 .handler = default_irq_handler,
1428 },
1429 [CHG_STATE_CHANGE_IRQ] = {
1430 .name = "chg-state-change",
1431 .handler = chg_state_change_irq_handler,
1432 },
1433 [STEP_CHG_STATE_CHANGE_IRQ] = {
1434 .name = "step-chg-state-change",
1435 .handler = default_irq_handler,
1436 },
1437 [STEP_CHG_SOC_UPDATE_FAIL_IRQ] = {
1438 .name = "step-chg-soc-update-fail",
1439 .handler = default_irq_handler,
1440 },
1441 [STEP_CHG_SOC_UPDATE_REQ_IRQ] = {
1442 .name = "step-chg-soc-update-req",
1443 .handler = default_irq_handler,
1444 },
1445 [FG_FVCAL_QUALIFIED_IRQ] = {
1446 .name = "fg-fvcal-qualified",
1447 .handler = default_irq_handler,
1448 },
1449 [VPH_ALARM_IRQ] = {
1450 .name = "vph-alarm",
1451 .handler = default_irq_handler,
1452 },
1453 [VPH_DROP_PRECHG_IRQ] = {
1454 .name = "vph-drop-prechg",
1455 .handler = default_irq_handler,
1456 },
1457 /* DCDC IRQs */
1458 [OTG_FAIL_IRQ] = {
1459 .name = "otg-fail",
1460 .handler = default_irq_handler,
1461 },
1462 [OTG_OC_DISABLE_SW_IRQ] = {
1463 .name = "otg-oc-disable-sw",
1464 .handler = default_irq_handler,
1465 },
1466 [OTG_OC_HICCUP_IRQ] = {
1467 .name = "otg-oc-hiccup",
1468 .handler = default_irq_handler,
1469 },
1470 [BSM_ACTIVE_IRQ] = {
1471 .name = "bsm-active",
1472 .handler = default_irq_handler,
1473 },
1474 [HIGH_DUTY_CYCLE_IRQ] = {
1475 .name = "high-duty-cycle",
1476 .handler = high_duty_cycle_irq_handler,
1477 },
1478 [INPUT_CURRENT_LIMITING_IRQ] = {
1479 .name = "input-current-limiting",
1480 .handler = default_irq_handler,
1481 },
1482 [CONCURRENT_MODE_DISABLE_IRQ] = {
1483 .name = "concurrent-mode-disable",
1484 .handler = default_irq_handler,
1485 },
1486 [SWITCHER_POWER_OK_IRQ] = {
1487 .name = "switcher-power-ok",
1488 .handler = switcher_power_ok_irq_handler,
1489 },
1490 /* BATTERY IRQs */
1491 [BAT_TEMP_IRQ] = {
1492 .name = "bat-temp",
1493 .handler = batt_temp_changed_irq_handler,
1494 },
1495 [ALL_CHNL_CONV_DONE_IRQ] = {
1496 .name = "all-chnl-conv-done",
1497 .handler = default_irq_handler,
1498 },
1499 [BAT_OV_IRQ] = {
1500 .name = "bat-ov",
1501 .handler = batt_psy_changed_irq_handler,
1502 },
1503 [BAT_LOW_IRQ] = {
1504 .name = "bat-low",
1505 .handler = batt_psy_changed_irq_handler,
1506 },
1507 [BAT_THERM_OR_ID_MISSING_IRQ] = {
1508 .name = "bat-therm-or-id-missing",
1509 .handler = batt_psy_changed_irq_handler,
1510 },
1511 [BAT_TERMINAL_MISSING_IRQ] = {
1512 .name = "bat-terminal-missing",
1513 .handler = batt_psy_changed_irq_handler,
1514 },
1515 [BUCK_OC_IRQ] = {
1516 .name = "buck-oc",
1517 .handler = default_irq_handler,
1518 },
1519 [VPH_OV_IRQ] = {
1520 .name = "vph-ov",
1521 .handler = default_irq_handler,
1522 },
1523 /* USB INPUT IRQs */
1524 [USBIN_COLLAPSE_IRQ] = {
1525 .name = "usbin-collapse",
1526 .handler = default_irq_handler,
1527 },
1528 [USBIN_VASHDN_IRQ] = {
1529 .name = "usbin-vashdn",
1530 .handler = default_irq_handler,
1531 },
1532 [USBIN_UV_IRQ] = {
1533 .name = "usbin-uv",
1534 .handler = usbin_uv_irq_handler,
1535 },
1536 [USBIN_OV_IRQ] = {
1537 .name = "usbin-ov",
1538 .handler = default_irq_handler,
1539 },
1540 [USBIN_PLUGIN_IRQ] = {
1541 .name = "usbin-plugin",
1542 .handler = usb_plugin_irq_handler,
1543 },
1544 [USBIN_REVI_CHANGE_IRQ] = {
1545 .name = "usbin-revi-change",
1546 .handler = default_irq_handler,
1547 },
1548 [USBIN_SRC_CHANGE_IRQ] = {
1549 .name = "usbin-src-change",
1550 .handler = usb_source_change_irq_handler,
1551 },
1552 [USBIN_ICL_CHANGE_IRQ] = {
1553 .name = "usbin-icl-change",
1554 .handler = icl_change_irq_handler,
1555 },
1556 /* DC INPUT IRQs */
1557 [DCIN_VASHDN_IRQ] = {
1558 .name = "dcin-vashdn",
1559 .handler = default_irq_handler,
1560 },
1561 [DCIN_UV_IRQ] = {
1562 .name = "dcin-uv",
1563 .handler = default_irq_handler,
1564 },
1565 [DCIN_OV_IRQ] = {
1566 .name = "dcin-ov",
1567 .handler = default_irq_handler,
1568 },
1569 [DCIN_PLUGIN_IRQ] = {
1570 .name = "dcin-plugin",
1571 .handler = dc_plugin_irq_handler,
1572 .wake = true,
1573 },
1574 [DCIN_REVI_IRQ] = {
1575 .name = "dcin-revi",
1576 .handler = default_irq_handler,
1577 },
1578 [DCIN_PON_IRQ] = {
1579 .name = "dcin-pon",
1580 .handler = default_irq_handler,
1581 },
1582 [DCIN_EN_IRQ] = {
1583 .name = "dcin-en",
1584 .handler = default_irq_handler,
1585 },
1586 /* TYPEC IRQs */
1587 [TYPEC_OR_RID_DETECTION_CHANGE_IRQ] = {
1588 .name = "typec-or-rid-detect-change",
1589 .handler = default_irq_handler,
1590 },
1591 [TYPEC_VPD_DETECT_IRQ] = {
1592 .name = "typec-vpd-detect",
1593 .handler = default_irq_handler,
1594 },
1595 [TYPEC_CC_STATE_CHANGE_IRQ] = {
1596 .name = "typec-cc-state-change",
1597 .handler = typec_state_change_irq_handler,
1598 },
1599 [TYPEC_VCONN_OC_IRQ] = {
1600 .name = "typec-vconn-oc",
1601 .handler = default_irq_handler,
1602 },
1603 [TYPEC_VBUS_CHANGE_IRQ] = {
1604 .name = "typec-vbus-change",
1605 .handler = default_irq_handler,
1606 },
1607 [TYPEC_ATTACH_DETACH_IRQ] = {
1608 .name = "typec-attach-detach",
1609 .handler = default_irq_handler,
1610 },
1611 [TYPEC_LEGACY_CABLE_DETECT_IRQ] = {
1612 .name = "typec-legacy-cable-detect",
1613 .handler = default_irq_handler,
1614 },
1615 [TYPEC_TRY_SNK_SRC_DETECT_IRQ] = {
1616 .name = "typec-try-snk-src-detect",
1617 .handler = default_irq_handler,
1618 },
1619 /* MISCELLANEOUS IRQs */
1620 [WDOG_SNARL_IRQ] = {
1621 .name = "wdog-snarl",
1622 .handler = NULL,
1623 },
1624 [WDOG_BARK_IRQ] = {
1625 .name = "wdog-bark",
1626 .handler = wdog_bark_irq_handler,
1627 },
1628 [AICL_FAIL_IRQ] = {
1629 .name = "aicl-fail",
1630 .handler = default_irq_handler,
1631 },
1632 [AICL_DONE_IRQ] = {
1633 .name = "aicl-done",
1634 .handler = default_irq_handler,
1635 },
1636 [SMB_EN_IRQ] = {
1637 .name = "smb-en",
1638 .handler = default_irq_handler,
1639 },
1640 [IMP_TRIGGER_IRQ] = {
1641 .name = "imp-trigger",
1642 .handler = default_irq_handler,
1643 },
1644 [TEMP_CHANGE_IRQ] = {
1645 .name = "temp-change",
1646 .handler = default_irq_handler,
1647 },
1648 [TEMP_CHANGE_SMB_IRQ] = {
1649 .name = "temp-change-smb",
1650 .handler = default_irq_handler,
1651 },
1652};
1653
1654static int smb5_get_irq_index_byname(const char *irq_name)
1655{
1656 int i;
1657
1658 for (i = 0; i < ARRAY_SIZE(smb5_irqs); i++) {
1659 if (strcmp(smb5_irqs[i].name, irq_name) == 0)
1660 return i;
1661 }
1662
1663 return -ENOENT;
1664}
1665
1666static int smb5_request_interrupt(struct smb5 *chip,
1667 struct device_node *node, const char *irq_name)
1668{
1669 struct smb_charger *chg = &chip->chg;
1670 int rc, irq, irq_index;
1671 struct smb_irq_data *irq_data;
1672
1673 irq = of_irq_get_byname(node, irq_name);
1674 if (irq < 0) {
1675 pr_err("Couldn't get irq %s byname\n", irq_name);
1676 return irq;
1677 }
1678
1679 irq_index = smb5_get_irq_index_byname(irq_name);
1680 if (irq_index < 0) {
1681 pr_err("%s is not a defined irq\n", irq_name);
1682 return irq_index;
1683 }
1684
1685 if (!smb5_irqs[irq_index].handler)
1686 return 0;
1687
1688 irq_data = devm_kzalloc(chg->dev, sizeof(*irq_data), GFP_KERNEL);
1689 if (!irq_data)
1690 return -ENOMEM;
1691
1692 irq_data->parent_data = chip;
1693 irq_data->name = irq_name;
1694 irq_data->storm_data = smb5_irqs[irq_index].storm_data;
1695 mutex_init(&irq_data->storm_data.storm_lock);
1696
1697 rc = devm_request_threaded_irq(chg->dev, irq, NULL,
1698 smb5_irqs[irq_index].handler,
1699 IRQF_ONESHOT, irq_name, irq_data);
1700 if (rc < 0) {
1701 pr_err("Couldn't request irq %d\n", irq);
1702 return rc;
1703 }
1704
1705 smb5_irqs[irq_index].irq = irq;
1706 smb5_irqs[irq_index].irq_data = irq_data;
1707 if (smb5_irqs[irq_index].wake)
1708 enable_irq_wake(irq);
1709
1710 return rc;
1711}
1712
1713static int smb5_request_interrupts(struct smb5 *chip)
1714{
1715 struct smb_charger *chg = &chip->chg;
1716 struct device_node *node = chg->dev->of_node;
1717 struct device_node *child;
1718 int rc = 0;
1719 const char *name;
1720 struct property *prop;
1721
1722 for_each_available_child_of_node(node, child) {
1723 of_property_for_each_string(child, "interrupt-names",
1724 prop, name) {
1725 rc = smb5_request_interrupt(chip, child, name);
1726 if (rc < 0)
1727 return rc;
1728 }
1729 }
1730 if (chg->irq_info[USBIN_ICL_CHANGE_IRQ].irq)
1731 chg->usb_icl_change_irq_enabled = true;
1732
1733 return rc;
1734}
1735
1736static void smb5_free_interrupts(struct smb_charger *chg)
1737{
1738 int i;
1739
1740 for (i = 0; i < ARRAY_SIZE(smb5_irqs); i++) {
1741 if (smb5_irqs[i].irq > 0) {
1742 if (smb5_irqs[i].wake)
1743 disable_irq_wake(smb5_irqs[i].irq);
1744
1745 devm_free_irq(chg->dev, smb5_irqs[i].irq,
1746 smb5_irqs[i].irq_data);
1747 }
1748 }
1749}
1750
1751static void smb5_disable_interrupts(struct smb_charger *chg)
1752{
1753 int i;
1754
1755 for (i = 0; i < ARRAY_SIZE(smb5_irqs); i++) {
1756 if (smb5_irqs[i].irq > 0)
1757 disable_irq(smb5_irqs[i].irq);
1758 }
1759}
1760
1761#if defined(CONFIG_DEBUG_FS)
1762
1763static int force_batt_psy_update_write(void *data, u64 val)
1764{
1765 struct smb_charger *chg = data;
1766
1767 power_supply_changed(chg->batt_psy);
1768 return 0;
1769}
1770DEFINE_SIMPLE_ATTRIBUTE(force_batt_psy_update_ops, NULL,
1771 force_batt_psy_update_write, "0x%02llx\n");
1772
1773static int force_usb_psy_update_write(void *data, u64 val)
1774{
1775 struct smb_charger *chg = data;
1776
1777 power_supply_changed(chg->usb_psy);
1778 return 0;
1779}
1780DEFINE_SIMPLE_ATTRIBUTE(force_usb_psy_update_ops, NULL,
1781 force_usb_psy_update_write, "0x%02llx\n");
1782
1783static int force_dc_psy_update_write(void *data, u64 val)
1784{
1785 struct smb_charger *chg = data;
1786
1787 power_supply_changed(chg->dc_psy);
1788 return 0;
1789}
1790DEFINE_SIMPLE_ATTRIBUTE(force_dc_psy_update_ops, NULL,
1791 force_dc_psy_update_write, "0x%02llx\n");
1792
1793static void smb5_create_debugfs(struct smb5 *chip)
1794{
1795 struct dentry *file;
1796
1797 chip->dfs_root = debugfs_create_dir("charger", NULL);
1798 if (IS_ERR_OR_NULL(chip->dfs_root)) {
1799 pr_err("Couldn't create charger debugfs rc=%ld\n",
1800 (long)chip->dfs_root);
1801 return;
1802 }
1803
1804 file = debugfs_create_file("force_batt_psy_update", 0600,
1805 chip->dfs_root, chip, &force_batt_psy_update_ops);
1806 if (IS_ERR_OR_NULL(file))
1807 pr_err("Couldn't create force_batt_psy_update file rc=%ld\n",
1808 (long)file);
1809
1810 file = debugfs_create_file("force_usb_psy_update", 0600,
1811 chip->dfs_root, chip, &force_usb_psy_update_ops);
1812 if (IS_ERR_OR_NULL(file))
1813 pr_err("Couldn't create force_usb_psy_update file rc=%ld\n",
1814 (long)file);
1815
1816 file = debugfs_create_file("force_dc_psy_update", 0600,
1817 chip->dfs_root, chip, &force_dc_psy_update_ops);
1818 if (IS_ERR_OR_NULL(file))
1819 pr_err("Couldn't create force_dc_psy_update file rc=%ld\n",
1820 (long)file);
1821}
1822
1823#else
1824
1825static void smb5_create_debugfs(struct smb5 *chip)
1826{}
1827
1828#endif
1829
1830static int smb5_show_charger_status(struct smb5 *chip)
1831{
1832 struct smb_charger *chg = &chip->chg;
1833 union power_supply_propval val;
1834 int usb_present, batt_present, batt_health, batt_charge_type;
1835 int rc;
1836
1837 rc = smblib_get_prop_usb_present(chg, &val);
1838 if (rc < 0) {
1839 pr_err("Couldn't get usb present rc=%d\n", rc);
1840 return rc;
1841 }
1842 usb_present = val.intval;
1843
1844 rc = smblib_get_prop_batt_present(chg, &val);
1845 if (rc < 0) {
1846 pr_err("Couldn't get batt present rc=%d\n", rc);
1847 return rc;
1848 }
1849 batt_present = val.intval;
1850
1851 rc = smblib_get_prop_batt_health(chg, &val);
1852 if (rc < 0) {
1853 pr_err("Couldn't get batt health rc=%d\n", rc);
1854 val.intval = POWER_SUPPLY_HEALTH_UNKNOWN;
1855 }
1856 batt_health = val.intval;
1857
1858 rc = smblib_get_prop_batt_charge_type(chg, &val);
1859 if (rc < 0) {
1860 pr_err("Couldn't get batt charge type rc=%d\n", rc);
1861 return rc;
1862 }
1863 batt_charge_type = val.intval;
1864
1865 pr_info("SMB5 status - usb:present=%d type=%d batt:present = %d health = %d charge = %d\n",
1866 usb_present, chg->real_charger_type,
1867 batt_present, batt_health, batt_charge_type);
1868 return rc;
1869}
1870
1871static int smb5_probe(struct platform_device *pdev)
1872{
1873 struct smb5 *chip;
1874 struct smb_charger *chg;
1875 int rc = 0;
1876
1877 chip = devm_kzalloc(&pdev->dev, sizeof(*chip), GFP_KERNEL);
1878 if (!chip)
1879 return -ENOMEM;
1880
1881 chg = &chip->chg;
1882 chg->dev = &pdev->dev;
1883 chg->param = smb5_params;
1884 chg->debug_mask = &__debug_mask;
1885 chg->weak_chg_icl_ua = &__weak_chg_icl_ua;
1886 chg->mode = PARALLEL_MASTER;
1887 chg->irq_info = smb5_irqs;
1888 chg->die_health = -EINVAL;
1889 chg->name = "pm855b_charger";
1890
1891 chg->regmap = dev_get_regmap(chg->dev->parent, NULL);
1892 if (!chg->regmap) {
1893 pr_err("parent regmap is missing\n");
1894 return -EINVAL;
1895 }
1896
1897 rc = smb5_parse_dt(chip);
1898 if (rc < 0) {
1899 pr_err("Couldn't parse device tree rc=%d\n", rc);
1900 goto cleanup;
1901 }
1902
1903 rc = smblib_init(chg);
1904 if (rc < 0) {
1905 pr_err("Smblib_init failed rc=%d\n", rc);
1906 goto cleanup;
1907 }
1908
1909 /* set driver data before resources request it */
1910 platform_set_drvdata(pdev, chip);
1911
1912 rc = smb5_init_vbus_regulator(chip);
1913 if (rc < 0) {
1914 pr_err("Couldn't initialize vbus regulator rc=%d\n",
1915 rc);
1916 goto cleanup;
1917 }
1918
1919 rc = smb5_init_vconn_regulator(chip);
1920 if (rc < 0) {
1921 pr_err("Couldn't initialize vconn regulator rc=%d\n",
1922 rc);
1923 goto cleanup;
1924 }
1925
1926 /* extcon registration */
1927 chg->extcon = devm_extcon_dev_allocate(chg->dev, smblib_extcon_cable);
1928 if (IS_ERR(chg->extcon)) {
1929 rc = PTR_ERR(chg->extcon);
1930 dev_err(chg->dev, "failed to allocate extcon device rc=%d\n",
1931 rc);
1932 goto cleanup;
1933 }
1934
1935 rc = devm_extcon_dev_register(chg->dev, chg->extcon);
1936 if (rc < 0) {
1937 dev_err(chg->dev, "failed to register extcon device rc=%d\n",
1938 rc);
1939 goto cleanup;
1940 }
1941
1942 rc = smb5_init_hw(chip);
1943 if (rc < 0) {
1944 pr_err("Couldn't initialize hardware rc=%d\n", rc);
1945 goto cleanup;
1946 }
1947
1948 rc = smb5_init_dc_psy(chip);
1949 if (rc < 0) {
1950 pr_err("Couldn't initialize dc psy rc=%d\n", rc);
1951 goto cleanup;
1952 }
1953
1954 rc = smb5_init_usb_psy(chip);
1955 if (rc < 0) {
1956 pr_err("Couldn't initialize usb psy rc=%d\n", rc);
1957 goto cleanup;
1958 }
1959
1960 rc = smb5_init_usb_main_psy(chip);
1961 if (rc < 0) {
1962 pr_err("Couldn't initialize usb main psy rc=%d\n", rc);
1963 goto cleanup;
1964 }
1965
1966 rc = smb5_init_usb_port_psy(chip);
1967 if (rc < 0) {
1968 pr_err("Couldn't initialize usb pc_port psy rc=%d\n", rc);
1969 goto cleanup;
1970 }
1971
1972 rc = smb5_init_batt_psy(chip);
1973 if (rc < 0) {
1974 pr_err("Couldn't initialize batt psy rc=%d\n", rc);
1975 goto cleanup;
1976 }
1977
1978 rc = smb5_determine_initial_status(chip);
1979 if (rc < 0) {
1980 pr_err("Couldn't determine initial status rc=%d\n",
1981 rc);
1982 goto cleanup;
1983 }
1984
1985 rc = smb5_request_interrupts(chip);
1986 if (rc < 0) {
1987 pr_err("Couldn't request interrupts rc=%d\n", rc);
1988 goto cleanup;
1989 }
1990
1991 rc = smb5_post_init(chip);
1992 if (rc < 0) {
1993 pr_err("Failed in post init rc=%d\n", rc);
1994 goto cleanup;
1995 }
1996
1997 smb5_create_debugfs(chip);
1998
1999 rc = smb5_show_charger_status(chip);
2000 if (rc < 0) {
2001 pr_err("Failed in getting charger status rc=%d\n", rc);
2002 goto cleanup;
2003 }
2004
2005 device_init_wakeup(chg->dev, true);
2006
2007 pr_info("QPNP SMB5 probed successfully\n");
2008
2009 return rc;
2010
2011cleanup:
2012 smb5_free_interrupts(chg);
2013 smblib_deinit(chg);
2014 platform_set_drvdata(pdev, NULL);
2015
2016 return rc;
2017}
2018
2019static int smb5_remove(struct platform_device *pdev)
2020{
2021 struct smb5 *chip = platform_get_drvdata(pdev);
2022 struct smb_charger *chg = &chip->chg;
2023
2024 smb5_free_interrupts(chg);
2025 smblib_deinit(chg);
2026 platform_set_drvdata(pdev, NULL);
2027 return 0;
2028}
2029
2030static void smb5_shutdown(struct platform_device *pdev)
2031{
2032 struct smb5 *chip = platform_get_drvdata(pdev);
2033 struct smb_charger *chg = &chip->chg;
2034
2035 /* disable all interrupts */
2036 smb5_disable_interrupts(chg);
2037
2038 /* configure power role for UFP */
2039 if (!chg->micro_usb_mode)
2040 smblib_masked_write(chg, TYPE_C_MODE_CFG_REG,
2041 TYPEC_POWER_ROLE_CMD_MASK, EN_SNK_ONLY_BIT);
2042
2043 /* force HVDCP to 5V */
2044 smblib_masked_write(chg, USBIN_OPTIONS_1_CFG_REG,
2045 HVDCP_AUTONOMOUS_MODE_EN_CFG_BIT, 0);
2046 smblib_write(chg, CMD_HVDCP_2_REG, FORCE_5V_BIT);
2047
2048 /* force enable APSD */
2049 smblib_masked_write(chg, USBIN_OPTIONS_1_CFG_REG,
2050 BC1P2_SRC_DETECT_BIT, BC1P2_SRC_DETECT_BIT);
2051}
2052
2053static const struct of_device_id match_table[] = {
2054 { .compatible = "qcom,qpnp-smb5", },
2055 { },
2056};
2057
2058static struct platform_driver smb5_driver = {
2059 .driver = {
2060 .name = "qcom,qpnp-smb5",
2061 .owner = THIS_MODULE,
2062 .of_match_table = match_table,
2063 },
2064 .probe = smb5_probe,
2065 .remove = smb5_remove,
2066 .shutdown = smb5_shutdown,
2067};
2068module_platform_driver(smb5_driver);
2069
2070MODULE_DESCRIPTION("QPNP SMB5 Charger Driver");
2071MODULE_LICENSE("GPL v2");