xref: /linux/drivers/power/supply/max8971_charger.c (revision c7c18635363f06c1943514c2f4c8170b325302e8)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 
3 #include <linux/devm-helpers.h>
4 #include <linux/delay.h>
5 #include <linux/device.h>
6 #include <linux/err.h>
7 #include <linux/extcon.h>
8 #include <linux/i2c.h>
9 #include <linux/mod_devicetable.h>
10 #include <linux/of_graph.h>
11 #include <linux/property.h>
12 #include <linux/interrupt.h>
13 #include <linux/module.h>
14 #include <linux/pm.h>
15 #include <linux/power_supply.h>
16 #include <linux/regmap.h>
17 #include <linux/sysfs.h>
18 #include <linux/types.h>
19 
20 #define MAX8971_REG_CHGINT		0x0f
21 #define   MAX8971_REG_CHG_RST		BIT(0)
22 #define MAX8971_REG_CHGINT_MASK		0x01
23 #define   MAX8971_AICL_MASK		BIT(7)
24 #define MAX8971_REG_CHG_STAT		0x02
25 #define   MAX8971_CHG_MASK		BIT(3)
26 #define MAX8971_REG_DETAILS1		0x03
27 #define MAX8971_REG_DETAILS2		0x04
28 #define MAX8971_REG_CHGCNTL1		0x05
29 #define MAX8971_REG_FCHGCRNT		0x06
30 #define MAX8971_REG_DCCRNT		0x07
31 #define   MAX8971_CHGRSTRT_MASK		BIT(6)
32 #define MAX8971_REG_TOPOFF		0x08
33 #define MAX8971_REG_TEMPREG		0x09
34 #define MAX8971_REG_PROTCMD		0x0a
35 #define   MAX8971_CHGPROT_LOCKED	0x00
36 #define   MAX8971_CHGPROT_UNLOCKED	0x03
37 
38 #define MAX8971_FCHGT_DEFAULT		2
39 #define MAX8971_TOPOFFT_DEFAULT		3
40 
41 static const char *max8971_manufacturer	= "Maxim Integrated";
42 static const char *max8971_model	= "MAX8971";
43 
44 enum max8971_charging_state {
45 	MAX8971_CHARGING_DEAD_BATTERY,
46 	MAX8971_CHARGING_PREQUALIFICATION,
47 	MAX8971_CHARGING_FAST_CONST_CURRENT,
48 	MAX8971_CHARGING_FAST_CONST_VOLTAGE,
49 	MAX8971_CHARGING_TOP_OFF,
50 	MAX8971_CHARGING_DONE,
51 	MAX8971_CHARGING_TIMER_FAULT,
52 	MAX8971_CHARGING_SUSPENDED_THERMAL,
53 	MAX8971_CHARGING_OFF,
54 	MAX8971_CHARGING_THERMAL_LOOP,
55 };
56 
57 enum max8971_health_state {
58 	MAX8971_HEALTH_UNKNOWN,
59 	MAX8971_HEALTH_COLD,
60 	MAX8971_HEALTH_COOL,
61 	MAX8971_HEALTH_WARM,
62 	MAX8971_HEALTH_HOT,
63 	MAX8971_HEALTH_OVERHEAT,
64 };
65 
66 /* Fast-Charge current limit, 250..1550 mA, 50 mA steps */
67 #define MAX8971_CHG_CC_STEP			  50000U
68 #define MAX8971_CHG_CC_MIN			 250000U
69 #define MAX8971_CHG_CC_MAX			1550000U
70 
71 /* Input current limit, 250..1500 mA, 25 mA steps */
72 #define MAX8971_DCILMT_STEP			  25000U
73 #define MAX8971_DCILMT_MIN			 250000U
74 #define MAX8971_DCILMT_MAX			1500000U
75 
76 enum max8971_field_idx {
77 	THM_DTLS,		/* DETAILS1 */
78 	BAT_DTLS, CHG_DTLS,	/* DETAILS2 */
79 	CHG_CC, FCHG_T,		/* FCHGCRNT */
80 	DCI_LMT,		/* DCCRNT */
81 	TOPOFF_T, TOPOFF_S,	/* TOPOFF */
82 	CPROT,			/* PROTCMD */
83 	MAX8971_N_REGMAP_FIELDS
84 };
85 
86 static const struct reg_field max8971_reg_field[MAX8971_N_REGMAP_FIELDS] = {
87 	[THM_DTLS] = REG_FIELD(MAX8971_REG_DETAILS1, 0, 2),
88 	[BAT_DTLS] = REG_FIELD(MAX8971_REG_DETAILS2, 4, 5),
89 	[CHG_DTLS] = REG_FIELD(MAX8971_REG_DETAILS2, 0, 3),
90 	[CHG_CC]   = REG_FIELD(MAX8971_REG_FCHGCRNT, 0, 4),
91 	[FCHG_T]   = REG_FIELD(MAX8971_REG_FCHGCRNT, 5, 7),
92 	[DCI_LMT]  = REG_FIELD(MAX8971_REG_DCCRNT,   0, 5),
93 	[TOPOFF_T] = REG_FIELD(MAX8971_REG_TOPOFF,   5, 7),
94 	[TOPOFF_S] = REG_FIELD(MAX8971_REG_TOPOFF,   2, 3),
95 	[CPROT]    = REG_FIELD(MAX8971_REG_PROTCMD,  2, 3),
96 };
97 
98 static const struct regmap_config max8971_regmap_config = {
99 	.reg_bits = 8,
100 	.val_bits = 8,
101 	.max_register = MAX8971_REG_CHGINT,
102 };
103 
104 struct max8971_data {
105 	struct device *dev;
106 	struct power_supply *psy_mains;
107 
108 	struct extcon_dev *edev;
109 	struct notifier_block extcon_nb;
110 	struct delayed_work extcon_work;
111 
112 	struct regmap *regmap;
113 	struct regmap_field *rfield[MAX8971_N_REGMAP_FIELDS];
114 
115 	enum power_supply_usb_type usb_type;
116 
117 	u32 fchgt;
118 	u32 tofft;
119 	u32 toffs;
120 
121 	bool present;
122 };
123 
max8971_get_status(struct max8971_data * priv,int * val)124 static int max8971_get_status(struct max8971_data *priv, int *val)
125 {
126 	u32 regval;
127 	int err;
128 
129 	err = regmap_field_read(priv->rfield[CHG_DTLS], &regval);
130 	if (err)
131 		return err;
132 
133 	switch (regval) {
134 	case MAX8971_CHARGING_DEAD_BATTERY:
135 	case MAX8971_CHARGING_PREQUALIFICATION:
136 	case MAX8971_CHARGING_FAST_CONST_CURRENT:
137 	case MAX8971_CHARGING_FAST_CONST_VOLTAGE:
138 	case MAX8971_CHARGING_TOP_OFF:
139 	case MAX8971_CHARGING_THERMAL_LOOP:
140 		*val = POWER_SUPPLY_STATUS_CHARGING;
141 		break;
142 	case MAX8971_CHARGING_DONE:
143 		*val = POWER_SUPPLY_STATUS_FULL;
144 		break;
145 	case MAX8971_CHARGING_TIMER_FAULT:
146 		*val = POWER_SUPPLY_STATUS_NOT_CHARGING;
147 		break;
148 	case MAX8971_CHARGING_OFF:
149 	case MAX8971_CHARGING_SUSPENDED_THERMAL:
150 		*val = POWER_SUPPLY_STATUS_DISCHARGING;
151 		break;
152 	default:
153 		*val = POWER_SUPPLY_STATUS_UNKNOWN;
154 	}
155 
156 	return 0;
157 }
158 
max8971_get_charge_type(struct max8971_data * priv,int * val)159 static int max8971_get_charge_type(struct max8971_data *priv, int *val)
160 {
161 	u32 regval;
162 	int err;
163 
164 	err = regmap_field_read(priv->rfield[CHG_DTLS], &regval);
165 	if (err)
166 		return err;
167 
168 	switch (regval) {
169 	case MAX8971_CHARGING_DEAD_BATTERY:
170 	case MAX8971_CHARGING_PREQUALIFICATION:
171 		*val = POWER_SUPPLY_CHARGE_TYPE_TRICKLE;
172 		break;
173 	case MAX8971_CHARGING_FAST_CONST_CURRENT:
174 	case MAX8971_CHARGING_FAST_CONST_VOLTAGE:
175 		*val = POWER_SUPPLY_CHARGE_TYPE_FAST;
176 		break;
177 	case MAX8971_CHARGING_TOP_OFF:
178 	case MAX8971_CHARGING_THERMAL_LOOP:
179 		*val = POWER_SUPPLY_CHARGE_TYPE_STANDARD;
180 		break;
181 	case MAX8971_CHARGING_DONE:
182 	case MAX8971_CHARGING_TIMER_FAULT:
183 	case MAX8971_CHARGING_SUSPENDED_THERMAL:
184 	case MAX8971_CHARGING_OFF:
185 		*val = POWER_SUPPLY_CHARGE_TYPE_NONE;
186 		break;
187 	default:
188 		*val = POWER_SUPPLY_CHARGE_TYPE_UNKNOWN;
189 	}
190 
191 	return 0;
192 }
193 
max8971_get_health(struct max8971_data * priv,int * val)194 static int max8971_get_health(struct max8971_data *priv, int *val)
195 {
196 	u32 regval;
197 	int err;
198 
199 	err = regmap_field_read(priv->rfield[THM_DTLS], &regval);
200 	if (err)
201 		return err;
202 
203 	switch (regval) {
204 	case MAX8971_HEALTH_COLD:
205 		*val = POWER_SUPPLY_HEALTH_COLD;
206 		break;
207 	case MAX8971_HEALTH_COOL:
208 		*val = POWER_SUPPLY_HEALTH_COOL;
209 		break;
210 	case MAX8971_HEALTH_WARM:
211 		*val = POWER_SUPPLY_HEALTH_GOOD;
212 		break;
213 	case MAX8971_HEALTH_HOT:
214 		*val = POWER_SUPPLY_HEALTH_HOT;
215 		break;
216 	case MAX8971_HEALTH_OVERHEAT:
217 		*val = POWER_SUPPLY_HEALTH_OVERHEAT;
218 		break;
219 	case MAX8971_HEALTH_UNKNOWN:
220 	default:
221 		*val = POWER_SUPPLY_HEALTH_UNKNOWN;
222 	}
223 
224 	return 0;
225 }
226 
max8971_get_online(struct max8971_data * priv,int * val)227 static int max8971_get_online(struct max8971_data *priv, int *val)
228 {
229 	u32 regval;
230 	int err;
231 
232 	err = regmap_read(priv->regmap, MAX8971_REG_CHG_STAT, &regval);
233 	if (err)
234 		return err;
235 
236 	if (priv->present)
237 		/* CHG_OK bit is 0 when charger is online */
238 		*val = !(regval & MAX8971_CHG_MASK);
239 	else
240 		*val = priv->present;
241 
242 	return 0;
243 }
244 
max8971_get_integer(struct max8971_data * priv,enum max8971_field_idx fidx,u32 clamp_min,u32 clamp_max,u32 mult,int * val)245 static int max8971_get_integer(struct max8971_data *priv, enum max8971_field_idx fidx,
246 			       u32 clamp_min, u32 clamp_max, u32 mult, int *val)
247 {
248 	u32 regval;
249 	int err;
250 
251 	err = regmap_field_read(priv->rfield[fidx], &regval);
252 	if (err)
253 		return err;
254 
255 	*val = clamp_val(regval * mult, clamp_min, clamp_max);
256 
257 	return 0;
258 }
259 
max8971_set_integer(struct max8971_data * priv,enum max8971_field_idx fidx,u32 clamp_min,u32 clamp_max,u32 div,int val)260 static int max8971_set_integer(struct max8971_data *priv, enum max8971_field_idx fidx,
261 			       u32 clamp_min, u32 clamp_max, u32 div, int val)
262 {
263 	u32 regval;
264 
265 	regval = clamp_val(val, clamp_min, clamp_max) / div;
266 
267 	return regmap_field_write(priv->rfield[fidx], regval);
268 }
269 
max8971_get_property(struct power_supply * psy,enum power_supply_property psp,union power_supply_propval * val)270 static int max8971_get_property(struct power_supply *psy, enum power_supply_property psp,
271 				union power_supply_propval *val)
272 {
273 	struct max8971_data *priv = power_supply_get_drvdata(psy);
274 	int err = 0;
275 
276 	switch (psp) {
277 	case POWER_SUPPLY_PROP_STATUS:
278 		err = max8971_get_status(priv, &val->intval);
279 		break;
280 	case POWER_SUPPLY_PROP_CHARGE_TYPE:
281 		err = max8971_get_charge_type(priv, &val->intval);
282 		break;
283 	case POWER_SUPPLY_PROP_USB_TYPE:
284 		val->intval = priv->usb_type;
285 		break;
286 	case POWER_SUPPLY_PROP_HEALTH:
287 		err = max8971_get_health(priv, &val->intval);
288 		break;
289 	case POWER_SUPPLY_PROP_ONLINE:
290 		err = max8971_get_online(priv, &val->intval);
291 		break;
292 	case POWER_SUPPLY_PROP_PRESENT:
293 		val->intval = priv->present;
294 		break;
295 	case POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT_MAX:
296 		val->intval = MAX8971_CHG_CC_MAX;
297 		break;
298 	case POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT:
299 		err = max8971_get_integer(priv, CHG_CC, MAX8971_CHG_CC_MIN, MAX8971_CHG_CC_MAX,
300 					  MAX8971_CHG_CC_STEP, &val->intval);
301 		break;
302 	case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
303 		err = max8971_get_integer(priv, DCI_LMT, MAX8971_DCILMT_MIN, MAX8971_DCILMT_MAX,
304 					  MAX8971_DCILMT_STEP, &val->intval);
305 		break;
306 	case POWER_SUPPLY_PROP_MODEL_NAME:
307 		val->strval = max8971_model;
308 		break;
309 	case POWER_SUPPLY_PROP_MANUFACTURER:
310 		val->strval = max8971_manufacturer;
311 		break;
312 	default:
313 		err = -EINVAL;
314 	}
315 
316 	return err;
317 }
318 
max8971_set_property(struct power_supply * psy,enum power_supply_property psp,const union power_supply_propval * val)319 static int max8971_set_property(struct power_supply *psy, enum power_supply_property psp,
320 				const union power_supply_propval *val)
321 {
322 	struct max8971_data *priv = power_supply_get_drvdata(psy);
323 	int err = 0;
324 
325 	switch (psp) {
326 	case POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT:
327 		err = max8971_set_integer(priv, CHG_CC, MAX8971_CHG_CC_MIN, MAX8971_CHG_CC_MAX,
328 					  MAX8971_CHG_CC_STEP, val->intval);
329 		break;
330 	case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
331 		err = max8971_set_integer(priv, DCI_LMT, MAX8971_DCILMT_MIN, MAX8971_DCILMT_MAX,
332 					  MAX8971_DCILMT_STEP, val->intval);
333 		break;
334 	default:
335 		err = -EINVAL;
336 	}
337 
338 	return err;
339 };
340 
max8971_property_is_writeable(struct power_supply * psy,enum power_supply_property psp)341 static int max8971_property_is_writeable(struct power_supply *psy,
342 					 enum power_supply_property psp)
343 {
344 	switch (psp) {
345 	case POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT:
346 	case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
347 		return true;
348 	default:
349 		return false;
350 	}
351 }
352 
353 static enum power_supply_property max8971_properties[] = {
354 	POWER_SUPPLY_PROP_STATUS,
355 	POWER_SUPPLY_PROP_CHARGE_TYPE,
356 	POWER_SUPPLY_PROP_USB_TYPE,
357 	POWER_SUPPLY_PROP_HEALTH,
358 	POWER_SUPPLY_PROP_ONLINE,
359 	POWER_SUPPLY_PROP_PRESENT,
360 	POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT,
361 	POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT_MAX,
362 	POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
363 	POWER_SUPPLY_PROP_MODEL_NAME,
364 	POWER_SUPPLY_PROP_MANUFACTURER,
365 };
366 
367 static const struct power_supply_desc max8971_charger_desc = {
368 	.name = "max8971-charger",
369 	.type = POWER_SUPPLY_TYPE_USB,
370 	.usb_types = BIT(POWER_SUPPLY_USB_TYPE_UNKNOWN) |
371 		     BIT(POWER_SUPPLY_USB_TYPE_SDP) |
372 		     BIT(POWER_SUPPLY_USB_TYPE_DCP) |
373 		     BIT(POWER_SUPPLY_USB_TYPE_CDP) |
374 		     BIT(POWER_SUPPLY_USB_TYPE_ACA),
375 	.properties = max8971_properties,
376 	.num_properties = ARRAY_SIZE(max8971_properties),
377 	.get_property = max8971_get_property,
378 	.set_property = max8971_set_property,
379 	.property_is_writeable = max8971_property_is_writeable,
380 };
381 
max8971_update_config(struct max8971_data * priv)382 static void max8971_update_config(struct max8971_data *priv)
383 {
384 	regmap_field_write(priv->rfield[CPROT], MAX8971_CHGPROT_UNLOCKED);
385 
386 	if (priv->fchgt != MAX8971_FCHGT_DEFAULT)
387 		regmap_field_write(priv->rfield[FCHG_T], priv->fchgt);
388 
389 	regmap_write_bits(priv->regmap, MAX8971_REG_DCCRNT, MAX8971_CHGRSTRT_MASK,
390 			  MAX8971_CHGRSTRT_MASK);
391 
392 	if (priv->tofft != MAX8971_TOPOFFT_DEFAULT)
393 		regmap_field_write(priv->rfield[TOPOFF_T], priv->tofft);
394 
395 	if (priv->toffs)
396 		regmap_field_write(priv->rfield[TOPOFF_S], priv->toffs);
397 
398 	regmap_field_write(priv->rfield[CPROT], MAX8971_CHGPROT_LOCKED);
399 }
400 
fast_charge_timer_show(struct device * dev,struct device_attribute * attr,char * buf)401 static ssize_t fast_charge_timer_show(struct device *dev, struct device_attribute *attr,
402 				      char *buf)
403 {
404 	struct power_supply *psy = to_power_supply(dev);
405 	struct max8971_data *priv = power_supply_get_drvdata(psy);
406 	u32 regval;
407 	int err;
408 
409 	err = regmap_field_read(priv->rfield[FCHG_T], &regval);
410 	if (err)
411 		return err;
412 
413 	switch (regval) {
414 	case 0x1 ... 0x7:
415 		/* Time is off by 3 hours comparing to value */
416 		regval += 3;
417 		break;
418 	case 0x0:
419 	default:
420 		regval = 0;
421 		break;
422 	}
423 
424 	return sysfs_emit(buf, "%u\n", regval);
425 }
426 
fast_charge_timer_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)427 static ssize_t fast_charge_timer_store(struct device *dev, struct device_attribute *attr,
428 				       const char *buf, size_t count)
429 {
430 	struct power_supply *psy = to_power_supply(dev);
431 	struct max8971_data *priv = power_supply_get_drvdata(psy);
432 	unsigned long hours;
433 	int val, err;
434 
435 	err = kstrtoul(buf, 10, &hours);
436 	if (err)
437 		return err;
438 
439 	val = hours - 3;
440 	if (val <= 0 || val > 7)
441 		priv->fchgt = 0;
442 	else
443 		priv->fchgt = val;
444 
445 	max8971_update_config(priv);
446 
447 	return count;
448 }
449 
top_off_threshold_current_show(struct device * dev,struct device_attribute * attr,char * buf)450 static ssize_t top_off_threshold_current_show(struct device *dev,
451 					      struct device_attribute *attr,
452 					      char *buf)
453 {
454 	struct power_supply *psy = to_power_supply(dev);
455 	struct max8971_data *priv = power_supply_get_drvdata(psy);
456 	u32 regval, val;
457 	int err;
458 
459 	err = regmap_field_read(priv->rfield[TOPOFF_S], &regval);
460 	if (err)
461 		return err;
462 
463 	/* 50uA start with 50uA step */
464 	val = regval * 50 + 50;
465 	val *= 1000;
466 
467 	return sysfs_emit(buf, "%u\n", val);
468 }
469 
top_off_threshold_current_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)470 static ssize_t top_off_threshold_current_store(struct device *dev,
471 					       struct device_attribute *attr,
472 					       const char *buf, size_t count)
473 {
474 	struct power_supply *psy = to_power_supply(dev);
475 	struct max8971_data *priv = power_supply_get_drvdata(psy);
476 	unsigned long uamp;
477 	int err;
478 
479 	err = kstrtoul(buf, 10, &uamp);
480 	if (err)
481 		return err;
482 
483 	if (uamp < 50000 || uamp > 200000)
484 		return -EINVAL;
485 
486 	priv->toffs = uamp / 50000 - 1;
487 
488 	max8971_update_config(priv);
489 
490 	return count;
491 }
492 
top_off_timer_show(struct device * dev,struct device_attribute * attr,char * buf)493 static ssize_t top_off_timer_show(struct device *dev, struct device_attribute *attr,
494 				  char *buf)
495 {
496 	struct power_supply *psy = to_power_supply(dev);
497 	struct max8971_data *priv = power_supply_get_drvdata(psy);
498 	u32 regval;
499 	int err;
500 
501 	err = regmap_field_read(priv->rfield[TOPOFF_T], &regval);
502 	if (err)
503 		return err;
504 
505 	/* 10 min intervals */
506 	regval *= 10;
507 
508 	return sysfs_emit(buf, "%u\n", regval);
509 }
510 
top_off_timer_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)511 static ssize_t top_off_timer_store(struct device *dev, struct device_attribute *attr,
512 				   const char *buf, size_t count)
513 {
514 	struct power_supply *psy = to_power_supply(dev);
515 	struct max8971_data *priv = power_supply_get_drvdata(psy);
516 	unsigned long minutes;
517 	int err;
518 
519 	err = kstrtoul(buf, 10, &minutes);
520 	if (err)
521 		return err;
522 
523 	if (minutes > 70)
524 		return -EINVAL;
525 
526 	priv->tofft = minutes / 10;
527 
528 	max8971_update_config(priv);
529 
530 	return count;
531 }
532 
533 static DEVICE_ATTR_RW(fast_charge_timer);
534 static DEVICE_ATTR_RW(top_off_threshold_current);
535 static DEVICE_ATTR_RW(top_off_timer);
536 
537 static struct attribute *max8971_attrs[] = {
538 	&dev_attr_fast_charge_timer.attr,
539 	&dev_attr_top_off_threshold_current.attr,
540 	&dev_attr_top_off_timer.attr,
541 	NULL
542 };
543 ATTRIBUTE_GROUPS(max8971);
544 
max8971_extcon_evt_worker(struct work_struct * work)545 static void max8971_extcon_evt_worker(struct work_struct *work)
546 {
547 	struct max8971_data *priv =
548 		container_of(work, struct max8971_data, extcon_work.work);
549 	struct device *dev = priv->dev;
550 	struct extcon_dev *edev = priv->edev;
551 	u32 chgcc, dcilmt;
552 
553 	if (extcon_get_state(edev, EXTCON_CHG_USB_SDP) > 0) {
554 		dev_dbg(dev, "USB SDP charger is connected\n");
555 		priv->usb_type = POWER_SUPPLY_USB_TYPE_SDP;
556 		chgcc = 500000;
557 		dcilmt = 500000;
558 	} else if (extcon_get_state(edev, EXTCON_USB) > 0) {
559 		dev_dbg(dev, "USB charger is connected\n");
560 		priv->usb_type = POWER_SUPPLY_USB_TYPE_SDP;
561 		chgcc = 500000;
562 		dcilmt = 500000;
563 	} else if (extcon_get_state(edev, EXTCON_DISP_MHL) > 0) {
564 		dev_dbg(dev, "MHL plug is connected\n");
565 		priv->usb_type = POWER_SUPPLY_USB_TYPE_SDP;
566 		chgcc = 500000;
567 		dcilmt = 500000;
568 	} else if (extcon_get_state(edev, EXTCON_CHG_USB_DCP) > 0) {
569 		dev_dbg(dev, "USB DCP charger is connected\n");
570 		priv->usb_type = POWER_SUPPLY_USB_TYPE_DCP;
571 		chgcc = 900000;
572 		dcilmt = 1200000;
573 	} else if (extcon_get_state(edev, EXTCON_CHG_USB_FAST) > 0) {
574 		dev_dbg(dev, "USB FAST charger is connected\n");
575 		priv->usb_type = POWER_SUPPLY_USB_TYPE_ACA;
576 		chgcc = 900000;
577 		dcilmt = 1200000;
578 	} else if (extcon_get_state(edev, EXTCON_CHG_USB_SLOW) > 0) {
579 		dev_dbg(dev, "USB SLOW charger is connected\n");
580 		priv->usb_type = POWER_SUPPLY_USB_TYPE_ACA;
581 		chgcc = 900000;
582 		dcilmt = 1200000;
583 	} else if (extcon_get_state(edev, EXTCON_CHG_USB_CDP) > 0) {
584 		dev_dbg(dev, "USB CDP charger is connected\n");
585 		priv->usb_type = POWER_SUPPLY_USB_TYPE_CDP;
586 		chgcc = 900000;
587 		dcilmt = 1200000;
588 	} else {
589 		dev_dbg(dev, "USB state is unknown\n");
590 		priv->usb_type = POWER_SUPPLY_USB_TYPE_UNKNOWN;
591 		return;
592 	}
593 
594 	regmap_field_write(priv->rfield[CPROT], MAX8971_CHGPROT_UNLOCKED);
595 
596 	max8971_set_integer(priv, CHG_CC, MAX8971_CHG_CC_MIN, MAX8971_CHG_CC_MAX,
597 			    MAX8971_CHG_CC_STEP, chgcc);
598 	max8971_set_integer(priv, DCI_LMT, MAX8971_DCILMT_MIN, MAX8971_DCILMT_MAX,
599 			    MAX8971_DCILMT_STEP, dcilmt);
600 
601 	regmap_field_write(priv->rfield[CPROT], MAX8971_CHGPROT_LOCKED);
602 }
603 
extcon_get_charger_type(struct notifier_block * nb,unsigned long state,void * data)604 static int extcon_get_charger_type(struct notifier_block *nb,
605 				   unsigned long state, void *data)
606 {
607 	struct max8971_data *priv =
608 		container_of(nb, struct max8971_data, extcon_nb);
609 	schedule_delayed_work(&priv->extcon_work, 0);
610 
611 	return NOTIFY_OK;
612 }
613 
max8971_interrupt(int irq,void * dev_id)614 static irqreturn_t max8971_interrupt(int irq, void *dev_id)
615 {
616 	struct max8971_data *priv = dev_id;
617 	struct device *dev = priv->dev;
618 	int err, state;
619 
620 	err = regmap_read(priv->regmap, MAX8971_REG_CHGINT, &state);
621 	if (err)
622 		dev_err(dev, "interrupt reg read failed %d\n", err);
623 
624 	err = regmap_write_bits(priv->regmap, MAX8971_REG_CHGINT_MASK,
625 				MAX8971_AICL_MASK, MAX8971_AICL_MASK);
626 	if (err)
627 		dev_err(dev, "failed to mask IRQ\n");
628 
629 	/* set presence prop */
630 	priv->present = state & MAX8971_REG_CHG_RST;
631 
632 	/* on every plug chip resets to default */
633 	if (priv->present)
634 		max8971_update_config(priv);
635 
636 	/* update supply status */
637 	power_supply_changed(priv->psy_mains);
638 
639 	return IRQ_HANDLED;
640 }
641 
max8971_probe(struct i2c_client * client)642 static int max8971_probe(struct i2c_client *client)
643 {
644 	struct device *dev = &client->dev;
645 	struct max8971_data *priv;
646 	struct device_node *extcon;
647 	struct power_supply_config cfg = { };
648 	int err, i;
649 
650 	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
651 	if (!priv)
652 		return -ENOMEM;
653 
654 	priv->dev = dev;
655 	priv->usb_type = POWER_SUPPLY_USB_TYPE_UNKNOWN;
656 
657 	i2c_set_clientdata(client, priv);
658 
659 	priv->regmap = devm_regmap_init_i2c(client, &max8971_regmap_config);
660 	if (IS_ERR(priv->regmap))
661 		return dev_err_probe(dev, PTR_ERR(priv->regmap), "cannot allocate regmap\n");
662 
663 	for (i = 0; i < MAX8971_N_REGMAP_FIELDS; i++) {
664 		priv->rfield[i] = devm_regmap_field_alloc(dev, priv->regmap, max8971_reg_field[i]);
665 		if (IS_ERR(priv->rfield[i]))
666 			return dev_err_probe(dev, PTR_ERR(priv->rfield[i]),
667 					     "cannot allocate regmap field\n");
668 	}
669 
670 	cfg.attr_grp = max8971_groups;
671 	cfg.drv_data = priv;
672 	cfg.fwnode = dev_fwnode(dev);
673 
674 	priv->psy_mains = devm_power_supply_register(dev, &max8971_charger_desc, &cfg);
675 	if (IS_ERR(priv->psy_mains))
676 		return dev_err_probe(dev, PTR_ERR(priv->psy_mains),
677 				     "failed to register mains supply\n");
678 
679 	err = regmap_write_bits(priv->regmap, MAX8971_REG_CHGINT_MASK, MAX8971_AICL_MASK,
680 				MAX8971_AICL_MASK);
681 	if (err)
682 		return dev_err_probe(dev, err, "failed to mask IRQ\n");
683 
684 	err = devm_request_threaded_irq(dev, client->irq, NULL, &max8971_interrupt,
685 					IRQF_ONESHOT | IRQF_SHARED, client->name, priv);
686 	if (err)
687 		return dev_err_probe(dev, err, "failed to register IRQ %d\n", client->irq);
688 
689 	extcon = of_graph_get_remote_node(dev->of_node, -1, -1);
690 	if (!extcon)
691 		return 0;
692 
693 	priv->edev = extcon_find_edev_by_node(extcon);
694 	of_node_put(extcon);
695 	if (IS_ERR(priv->edev))
696 		return dev_err_probe(dev, PTR_ERR(priv->edev), "failed to find extcon\n");
697 
698 	err = devm_delayed_work_autocancel(dev, &priv->extcon_work,
699 					   max8971_extcon_evt_worker);
700 	if (err)
701 		return dev_err_probe(dev, err, "failed to add extcon evt stop action\n");
702 
703 	priv->extcon_nb.notifier_call = extcon_get_charger_type;
704 
705 	err = devm_extcon_register_notifier_all(dev, priv->edev, &priv->extcon_nb);
706 	if (err)
707 		return dev_err_probe(dev, err, "failed to register notifier\n");
708 
709 	/* Initial configuration work with 1 sec delay */
710 	schedule_delayed_work(&priv->extcon_work, msecs_to_jiffies(1000));
711 
712 	return 0;
713 }
714 
max8971_resume(struct device * dev)715 static int __maybe_unused max8971_resume(struct device *dev)
716 {
717 	struct i2c_client *client = to_i2c_client(dev);
718 	struct max8971_data *priv = i2c_get_clientdata(client);
719 
720 	irq_wake_thread(client->irq, priv);
721 
722 	return 0;
723 }
724 
725 static SIMPLE_DEV_PM_OPS(max8971_pm_ops, NULL, max8971_resume);
726 
727 static const struct of_device_id max8971_match_ids[] = {
728 	{ .compatible = "maxim,max8971" },
729 	{ /* sentinel */ }
730 };
731 MODULE_DEVICE_TABLE(of, max8971_match_ids);
732 
733 static const struct i2c_device_id max8971_i2c_id[] = {
734 	{ "max8971" },
735 	{ }
736 };
737 MODULE_DEVICE_TABLE(i2c, max8971_i2c_id);
738 
739 static struct i2c_driver max8971_driver = {
740 	.driver = {
741 		.name = "max8971-charger",
742 		.of_match_table = max8971_match_ids,
743 		.pm = &max8971_pm_ops,
744 	},
745 	.probe = max8971_probe,
746 	.id_table = max8971_i2c_id,
747 };
748 module_i2c_driver(max8971_driver);
749 
750 MODULE_AUTHOR("Svyatoslav Ryhel <clamor95@gmail.com>");
751 MODULE_DESCRIPTION("MAX8971 Charger Driver");
752 MODULE_LICENSE("GPL");
753