xref: /linux/drivers/power/supply/max77705_charger.c (revision 55a42f78ffd386e01a5404419f8c5ded7db70a21)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Based on max77650-charger.c
4  *
5  * Copyright (C) 2025 Dzmitry Sankouski <dsankouski@gmail.org>
6  *
7  * Battery charger driver for MAXIM 77705 charger/power-supply.
8  */
9 
10 #include <linux/devm-helpers.h>
11 #include <linux/i2c.h>
12 #include <linux/interrupt.h>
13 #include <linux/mfd/max77693-common.h>
14 #include <linux/mfd/max77705-private.h>
15 #include <linux/power/max77705_charger.h>
16 #include <linux/module.h>
17 #include <linux/platform_device.h>
18 #include <linux/power_supply.h>
19 #include <linux/regmap.h>
20 
21 static const char *max77705_charger_model		= "max77705";
22 static const char *max77705_charger_manufacturer	= "Maxim Integrated";
23 
24 static const struct regmap_config max77705_chg_regmap_config = {
25 	.reg_base = MAX77705_CHG_REG_BASE,
26 	.reg_bits = 8,
27 	.val_bits = 8,
28 	.max_register = MAX77705_CHG_REG_SAFEOUT_CTRL,
29 };
30 
31 static enum power_supply_property max77705_charger_props[] = {
32 	POWER_SUPPLY_PROP_ONLINE,
33 	POWER_SUPPLY_PROP_PRESENT,
34 	POWER_SUPPLY_PROP_STATUS,
35 	POWER_SUPPLY_PROP_CHARGE_TYPE,
36 	POWER_SUPPLY_PROP_HEALTH,
37 	POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN,
38 	POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
39 	POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
40 	POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
41 };
42 
43 static irqreturn_t max77705_chgin_irq(int irq, void *irq_drv_data)
44 {
45 	struct max77705_charger_data *chg = irq_drv_data;
46 
47 	queue_work(chg->wqueue, &chg->chgin_work);
48 
49 	return IRQ_HANDLED;
50 }
51 
52 static const struct regmap_irq max77705_charger_irqs[] = {
53 	REGMAP_IRQ_REG_LINE(MAX77705_BYP_I, BITS_PER_BYTE),
54 	REGMAP_IRQ_REG_LINE(MAX77705_INP_LIMIT_I, BITS_PER_BYTE),
55 	REGMAP_IRQ_REG_LINE(MAX77705_BATP_I, BITS_PER_BYTE),
56 	REGMAP_IRQ_REG_LINE(MAX77705_BAT_I, BITS_PER_BYTE),
57 	REGMAP_IRQ_REG_LINE(MAX77705_CHG_I, BITS_PER_BYTE),
58 	REGMAP_IRQ_REG_LINE(MAX77705_WCIN_I, BITS_PER_BYTE),
59 	REGMAP_IRQ_REG_LINE(MAX77705_CHGIN_I, BITS_PER_BYTE),
60 	REGMAP_IRQ_REG_LINE(MAX77705_AICL_I, BITS_PER_BYTE),
61 };
62 
63 static struct regmap_irq_chip max77705_charger_irq_chip = {
64 	.name			= "max77705-charger",
65 	.status_base		= MAX77705_CHG_REG_INT,
66 	.mask_base		= MAX77705_CHG_REG_INT_MASK,
67 	.num_regs		= 1,
68 	.irqs			= max77705_charger_irqs,
69 	.num_irqs		= ARRAY_SIZE(max77705_charger_irqs),
70 };
71 
72 static int max77705_charger_enable(struct max77705_charger_data *chg)
73 {
74 	int rv;
75 
76 	rv = regmap_field_write(chg->rfield[MAX77705_CHG_EN], 1);
77 	if (rv)
78 		dev_err(chg->dev, "unable to enable the charger: %d\n", rv);
79 
80 	return rv;
81 }
82 
83 static void max77705_charger_disable(void *data)
84 {
85 	struct max77705_charger_data *chg = data;
86 	int rv;
87 
88 	rv = regmap_field_write(chg->rfield[MAX77705_CHG_EN], MAX77705_CHG_DISABLE);
89 	if (rv)
90 		dev_err(chg->dev, "unable to disable the charger: %d\n", rv);
91 }
92 
93 static int max77705_get_online(struct regmap *regmap, int *val)
94 {
95 	unsigned int data;
96 	int ret;
97 
98 	ret = regmap_read(regmap, MAX77705_CHG_REG_INT_OK, &data);
99 	if (ret < 0)
100 		return ret;
101 
102 	*val = !!(data & MAX77705_CHGIN_OK);
103 
104 	return 0;
105 }
106 
107 static int max77705_set_integer(struct max77705_charger_data *chg, enum max77705_field_idx fidx,
108 				unsigned int clamp_min, unsigned int clamp_max,
109 				unsigned int div, int val)
110 {
111 	unsigned int regval;
112 
113 	regval = clamp_val(val, clamp_min, clamp_max) / div;
114 
115 	return regmap_field_write(chg->rfield[fidx], regval);
116 }
117 
118 static int max77705_check_battery(struct max77705_charger_data *chg, int *val)
119 {
120 	unsigned int reg_data;
121 	unsigned int reg_data2;
122 	struct regmap *regmap = chg->regmap;
123 
124 	regmap_read(regmap, MAX77705_CHG_REG_INT_OK, &reg_data);
125 
126 	dev_dbg(chg->dev, "CHG_INT_OK(0x%x)\n", reg_data);
127 
128 	regmap_read(regmap, MAX77705_CHG_REG_DETAILS_00, &reg_data2);
129 
130 	dev_dbg(chg->dev, "CHG_DETAILS00(0x%x)\n", reg_data2);
131 
132 	if ((reg_data & MAX77705_BATP_OK) || !(reg_data2 & MAX77705_BATP_DTLS))
133 		*val = true;
134 	else
135 		*val = false;
136 
137 	return 0;
138 }
139 
140 static int max77705_get_charge_type(struct max77705_charger_data *chg, int *val)
141 {
142 	struct regmap *regmap = chg->regmap;
143 	unsigned int reg_data, chg_en;
144 
145 	regmap_field_read(chg->rfield[MAX77705_CHG_EN], &chg_en);
146 	if (!chg_en) {
147 		*val = POWER_SUPPLY_CHARGE_TYPE_NONE;
148 		return 0;
149 	}
150 
151 	regmap_read(regmap, MAX77705_CHG_REG_DETAILS_01, &reg_data);
152 	reg_data &= MAX77705_CHG_DTLS;
153 
154 	switch (reg_data) {
155 	case 0x0:
156 	case MAX77705_CHARGER_CONSTANT_CURRENT:
157 	case MAX77705_CHARGER_CONSTANT_VOLTAGE:
158 		*val = POWER_SUPPLY_CHARGE_TYPE_FAST;
159 		return 0;
160 	default:
161 		*val = POWER_SUPPLY_CHARGE_TYPE_NONE;
162 		return 0;
163 	}
164 
165 	return 0;
166 }
167 
168 static int max77705_get_status(struct max77705_charger_data *chg, int *val)
169 {
170 	struct regmap *regmap = chg->regmap;
171 	unsigned int reg_data, chg_en;
172 
173 	regmap_field_read(chg->rfield[MAX77705_CHG_EN], &chg_en);
174 	if (!chg_en) {
175 		*val = POWER_SUPPLY_CHARGE_TYPE_NONE;
176 		return 0;
177 	}
178 
179 	regmap_read(regmap, MAX77705_CHG_REG_DETAILS_01, &reg_data);
180 	reg_data &= MAX77705_CHG_DTLS;
181 
182 	switch (reg_data) {
183 	case 0x0:
184 	case MAX77705_CHARGER_CONSTANT_CURRENT:
185 	case MAX77705_CHARGER_CONSTANT_VOLTAGE:
186 		*val = POWER_SUPPLY_STATUS_CHARGING;
187 		return 0;
188 	case MAX77705_CHARGER_END_OF_CHARGE:
189 	case MAX77705_CHARGER_DONE:
190 		*val = POWER_SUPPLY_STATUS_FULL;
191 		return 0;
192 	/* those values hard coded as in vendor kernel, because of */
193 	/* failure to determine it's actual meaning. */
194 	case 0x05:
195 	case 0x06:
196 	case 0x07:
197 		*val = POWER_SUPPLY_STATUS_NOT_CHARGING;
198 		return 0;
199 	case 0x08:
200 	case 0xA:
201 	case 0xB:
202 		*val = POWER_SUPPLY_STATUS_DISCHARGING;
203 		return 0;
204 	default:
205 		*val = POWER_SUPPLY_STATUS_UNKNOWN;
206 		return 0;
207 	}
208 
209 	return 0;
210 }
211 
212 static int max77705_get_vbus_state(struct regmap *regmap, int *value)
213 {
214 	int ret;
215 	unsigned int charge_dtls;
216 
217 	ret = regmap_read(regmap, MAX77705_CHG_REG_DETAILS_00, &charge_dtls);
218 	if (ret)
219 		return ret;
220 
221 	charge_dtls = ((charge_dtls & MAX77705_CHGIN_DTLS) >>
222 			MAX77705_CHGIN_DTLS_SHIFT);
223 
224 	switch (charge_dtls) {
225 	case 0x00:
226 		*value = POWER_SUPPLY_HEALTH_UNDERVOLTAGE;
227 		break;
228 	case 0x01:
229 		*value = POWER_SUPPLY_HEALTH_UNDERVOLTAGE;
230 		break;
231 	case 0x02:
232 		*value = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
233 		break;
234 	case 0x03:
235 		*value = POWER_SUPPLY_HEALTH_GOOD;
236 		break;
237 	default:
238 		return 0;
239 	}
240 	return 0;
241 }
242 
243 static int max77705_get_battery_health(struct max77705_charger_data *chg,
244 					int *value)
245 {
246 	struct regmap *regmap = chg->regmap;
247 	unsigned int bat_dtls;
248 
249 	regmap_read(regmap, MAX77705_CHG_REG_DETAILS_01, &bat_dtls);
250 	bat_dtls = ((bat_dtls & MAX77705_BAT_DTLS) >> MAX77705_BAT_DTLS_SHIFT);
251 
252 	switch (bat_dtls) {
253 	case MAX77705_BATTERY_NOBAT:
254 		dev_dbg(chg->dev, "%s: No battery and the chg is suspended\n",
255 			__func__);
256 		*value = POWER_SUPPLY_HEALTH_NO_BATTERY;
257 		break;
258 	case MAX77705_BATTERY_PREQUALIFICATION:
259 		dev_dbg(chg->dev, "%s: battery is okay but its voltage is low(~VPQLB)\n",
260 			__func__);
261 		break;
262 	case MAX77705_BATTERY_DEAD:
263 		dev_dbg(chg->dev, "%s: battery dead\n", __func__);
264 		*value = POWER_SUPPLY_HEALTH_DEAD;
265 		break;
266 	case MAX77705_BATTERY_GOOD:
267 	case MAX77705_BATTERY_LOWVOLTAGE:
268 		*value = POWER_SUPPLY_HEALTH_GOOD;
269 		break;
270 	case MAX77705_BATTERY_OVERVOLTAGE:
271 		dev_dbg(chg->dev, "%s: battery ovp\n", __func__);
272 		*value = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
273 		break;
274 	default:
275 		dev_dbg(chg->dev, "%s: battery unknown\n", __func__);
276 		*value = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
277 		break;
278 	}
279 
280 	return 0;
281 }
282 
283 static int max77705_get_health(struct max77705_charger_data *chg, int *val)
284 {
285 	struct regmap *regmap = chg->regmap;
286 	int ret, is_online = 0;
287 
288 	ret = max77705_get_online(regmap, &is_online);
289 	if (ret)
290 		return ret;
291 	if (is_online) {
292 		ret = max77705_get_vbus_state(regmap, val);
293 		if (ret || (*val != POWER_SUPPLY_HEALTH_GOOD))
294 			return ret;
295 	}
296 	return max77705_get_battery_health(chg, val);
297 }
298 
299 static int max77705_get_input_current(struct max77705_charger_data *chg,
300 					int *val)
301 {
302 	unsigned int reg_data;
303 	int get_current = 0;
304 
305 	regmap_field_read(chg->rfield[MAX77705_CHG_CHGIN_LIM], &reg_data);
306 
307 	if (reg_data <= 3)
308 		get_current = MAX77705_CURRENT_CHGIN_MIN;
309 	else
310 		get_current = (reg_data + 1) * MAX77705_CURRENT_CHGIN_STEP;
311 
312 	*val = get_current;
313 
314 	return 0;
315 }
316 
317 static int max77705_get_charge_current(struct max77705_charger_data *chg,
318 					int *val)
319 {
320 	unsigned int reg_data;
321 
322 	regmap_field_read(chg->rfield[MAX77705_CHG_CC_LIM], &reg_data);
323 
324 	*val = reg_data <= 0x2 ? MAX77705_CURRENT_CHGIN_MIN : reg_data * MAX77705_CURRENT_CHG_STEP;
325 
326 	return 0;
327 }
328 
329 static int max77705_set_float_voltage(struct max77705_charger_data *chg,
330 					int float_voltage)
331 {
332 	int float_voltage_mv;
333 	unsigned int reg_data = 0;
334 
335 	float_voltage_mv = float_voltage / 1000;
336 	reg_data = float_voltage_mv <= 4000 ? 0x0 :
337 		float_voltage_mv >= 4500 ? 0x23 :
338 		(float_voltage_mv <= 4200) ? (float_voltage_mv - 4000) / 50 :
339 		(((float_voltage_mv - 4200) / 10) + 0x04);
340 
341 	return regmap_field_write(chg->rfield[MAX77705_CHG_CV_PRM], reg_data);
342 }
343 
344 static int max77705_get_float_voltage(struct max77705_charger_data *chg,
345 					int *val)
346 {
347 	unsigned int reg_data = 0;
348 	int voltage_mv;
349 
350 	regmap_field_read(chg->rfield[MAX77705_CHG_CV_PRM], &reg_data);
351 	voltage_mv = reg_data <= 0x04 ? reg_data * 50 + 4000 :
352 					(reg_data - 4) * 10 + 4200;
353 	*val = voltage_mv * 1000;
354 
355 	return 0;
356 }
357 
358 static int max77705_chg_get_property(struct power_supply *psy,
359 					enum power_supply_property psp,
360 					union power_supply_propval *val)
361 {
362 	struct max77705_charger_data *chg = power_supply_get_drvdata(psy);
363 	struct regmap *regmap = chg->regmap;
364 
365 	switch (psp) {
366 	case POWER_SUPPLY_PROP_ONLINE:
367 		return max77705_get_online(regmap, &val->intval);
368 	case POWER_SUPPLY_PROP_PRESENT:
369 		return max77705_check_battery(chg, &val->intval);
370 	case POWER_SUPPLY_PROP_STATUS:
371 		return max77705_get_status(chg, &val->intval);
372 	case POWER_SUPPLY_PROP_CHARGE_TYPE:
373 		return max77705_get_charge_type(chg, &val->intval);
374 	case POWER_SUPPLY_PROP_HEALTH:
375 		return max77705_get_health(chg, &val->intval);
376 	case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
377 		return max77705_get_input_current(chg, &val->intval);
378 	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
379 		return max77705_get_charge_current(chg, &val->intval);
380 	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
381 		return max77705_get_float_voltage(chg, &val->intval);
382 	case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
383 		val->intval = chg->bat_info->voltage_max_design_uv;
384 		break;
385 	case POWER_SUPPLY_PROP_MODEL_NAME:
386 		val->strval = max77705_charger_model;
387 		break;
388 	case POWER_SUPPLY_PROP_MANUFACTURER:
389 		val->strval = max77705_charger_manufacturer;
390 		break;
391 	default:
392 		return -EINVAL;
393 	}
394 	return 0;
395 }
396 
397 static int max77705_set_property(struct power_supply *psy,
398 				 enum power_supply_property psp,
399 				 const union power_supply_propval *val)
400 {
401 	struct max77705_charger_data *chg = power_supply_get_drvdata(psy);
402 	int err = 0;
403 
404 	switch (psp) {
405 	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
406 		err = max77705_set_integer(chg, MAX77705_CHG_CC_LIM,
407 					   MAX77705_CURRENT_CHGIN_MIN,
408 					   MAX77705_CURRENT_CHGIN_MAX,
409 					   MAX77705_CURRENT_CHG_STEP,
410 					   val->intval);
411 		break;
412 	case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
413 		err = max77705_set_integer(chg, MAX77705_CHG_CHGIN_LIM,
414 					   MAX77705_CURRENT_CHGIN_MIN,
415 					   MAX77705_CURRENT_CHGIN_MAX,
416 					   MAX77705_CURRENT_CHGIN_STEP,
417 					   val->intval);
418 		break;
419 	default:
420 		err = -EINVAL;
421 	}
422 
423 	return err;
424 };
425 
426 static int max77705_property_is_writeable(struct power_supply *psy,
427 					  enum power_supply_property psp)
428 {
429 	switch (psp) {
430 	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
431 	case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
432 		return true;
433 	default:
434 		return false;
435 	}
436 }
437 
438 static const struct power_supply_desc max77705_charger_psy_desc = {
439 	.name = "max77705-charger",
440 	.type = POWER_SUPPLY_TYPE_USB,
441 	.properties = max77705_charger_props,
442 	.property_is_writeable = max77705_property_is_writeable,
443 	.num_properties = ARRAY_SIZE(max77705_charger_props),
444 	.get_property = max77705_chg_get_property,
445 	.set_property = max77705_set_property,
446 };
447 
448 static void max77705_chgin_isr_work(struct work_struct *work)
449 {
450 	struct max77705_charger_data *chg =
451 		container_of(work, struct max77705_charger_data, chgin_work);
452 
453 	power_supply_changed(chg->psy_chg);
454 }
455 
456 static int max77705_charger_initialize(struct max77705_charger_data *chg)
457 {
458 	struct power_supply_battery_info *info;
459 	struct regmap *regmap = chg->regmap;
460 	int err;
461 
462 	err = power_supply_get_battery_info(chg->psy_chg, &info);
463 	if (err)
464 		return dev_err_probe(chg->dev, err, "error on getting battery info");
465 
466 	chg->bat_info = info;
467 
468 	/* unlock charger setting protect */
469 	/* slowest LX slope */
470 	err = regmap_field_write(chg->rfield[MAX77705_CHGPROT], MAX77705_CHGPROT_UNLOCKED);
471 	if (err)
472 		goto err;
473 
474 	err = regmap_field_write(chg->rfield[MAX77705_LX_SLOPE], MAX77705_SLOWEST_LX_SLOPE);
475 	if (err)
476 		goto err;
477 
478 	/* fast charge timer disable */
479 	/* restart threshold disable */
480 	/* pre-qual charge disable */
481 	err = regmap_field_write(chg->rfield[MAX77705_FCHGTIME], MAX77705_FCHGTIME_DISABLE);
482 	if (err)
483 		goto err;
484 
485 	err = regmap_field_write(chg->rfield[MAX77705_CHG_RSTRT], MAX77705_CHG_RSTRT_DISABLE);
486 	if (err)
487 		goto err;
488 
489 	err = regmap_field_write(chg->rfield[MAX77705_CHG_PQEN], MAX77705_CHG_PQEN_DISABLE);
490 	if (err)
491 		goto err;
492 
493 	err = regmap_field_write(chg->rfield[MAX77705_MODE],
494 			MAX77705_CHG_MASK | MAX77705_BUCK_MASK);
495 	if (err)
496 		goto err;
497 
498 	/* charge current 450mA(default) */
499 	/* otg current limit 900mA */
500 	err = regmap_field_write(chg->rfield[MAX77705_OTG_ILIM], MAX77705_OTG_ILIM_900);
501 	if (err)
502 		goto err;
503 
504 	/* BAT to SYS OCP 4.80A */
505 	err = regmap_field_write(chg->rfield[MAX77705_REG_B2SOVRC], MAX77705_B2SOVRC_4_8A);
506 	if (err)
507 		goto err;
508 
509 	/* top off current 150mA */
510 	/* top off timer 30min */
511 	err = regmap_field_write(chg->rfield[MAX77705_TO], MAX77705_TO_ITH_150MA);
512 	if (err)
513 		goto err;
514 
515 	err = regmap_field_write(chg->rfield[MAX77705_TO_TIME], MAX77705_TO_TIME_30M);
516 	if (err)
517 		goto err;
518 
519 	err = regmap_field_write(chg->rfield[MAX77705_SYS_TRACK], MAX77705_SYS_TRACK_DISABLE);
520 	if (err)
521 		goto err;
522 
523 	/* cv voltage 4.2V or 4.35V */
524 	/* MINVSYS 3.6V(default) */
525 	if (info->voltage_max_design_uv < 0) {
526 		dev_warn(chg->dev, "missing battery:voltage-max-design-microvolt\n");
527 		max77705_set_float_voltage(chg, 4200000);
528 	} else {
529 		max77705_set_float_voltage(chg, info->voltage_max_design_uv);
530 	}
531 
532 	err = regmap_field_write(chg->rfield[MAX77705_VCHGIN], MAX77705_VCHGIN_4_5);
533 	if (err)
534 		goto err;
535 
536 	err = regmap_field_write(chg->rfield[MAX77705_WCIN], MAX77705_WCIN_4_5);
537 	if (err)
538 		goto err;
539 
540 	/* Watchdog timer */
541 	regmap_update_bits(regmap, MAX77705_CHG_REG_CNFG_00,
542 				MAX77705_WDTEN_MASK, 0);
543 
544 	/* VBYPSET=5.0V */
545 	err = regmap_field_write(chg->rfield[MAX77705_VBYPSET], 0);
546 	if (err)
547 		goto err;
548 
549 	/* Switching Frequency : 1.5MHz */
550 	err = regmap_field_write(chg->rfield[MAX77705_REG_FSW], MAX77705_CHG_FSW_1_5MHz);
551 	if (err)
552 		goto err;
553 
554 	/* Auto skip mode */
555 	err = regmap_field_write(chg->rfield[MAX77705_REG_DISKIP], MAX77705_AUTO_SKIP);
556 	if (err)
557 		goto err;
558 
559 	return 0;
560 
561 err:
562 	return dev_err_probe(chg->dev, err, "error while configuring");
563 
564 }
565 
566 static int max77705_charger_probe(struct i2c_client *i2c)
567 {
568 	struct power_supply_config pscfg = {};
569 	struct max77705_charger_data *chg;
570 	struct device *dev;
571 	struct regmap_irq_chip_data *irq_data;
572 	int ret;
573 
574 	dev = &i2c->dev;
575 
576 	chg = devm_kzalloc(dev, sizeof(*chg), GFP_KERNEL);
577 	if (!chg)
578 		return -ENOMEM;
579 
580 	chg->dev = dev;
581 	i2c_set_clientdata(i2c, chg);
582 
583 	chg->regmap = devm_regmap_init_i2c(i2c, &max77705_chg_regmap_config);
584 	if (IS_ERR(chg->regmap))
585 		return PTR_ERR(chg->regmap);
586 
587 	for (int i = 0; i < MAX77705_N_REGMAP_FIELDS; i++) {
588 		chg->rfield[i] = devm_regmap_field_alloc(dev, chg->regmap,
589 							 max77705_reg_field[i]);
590 		if (IS_ERR(chg->rfield[i]))
591 			return dev_err_probe(dev, PTR_ERR(chg->rfield[i]),
592 					     "cannot allocate regmap field\n");
593 	}
594 
595 	pscfg.fwnode = dev_fwnode(dev);
596 	pscfg.drv_data = chg;
597 
598 	chg->psy_chg = devm_power_supply_register(dev, &max77705_charger_psy_desc, &pscfg);
599 	if (IS_ERR(chg->psy_chg))
600 		return PTR_ERR(chg->psy_chg);
601 
602 	max77705_charger_irq_chip.irq_drv_data = chg;
603 	ret = devm_regmap_add_irq_chip(chg->dev, chg->regmap, i2c->irq,
604 					IRQF_ONESHOT, 0,
605 					&max77705_charger_irq_chip,
606 					&irq_data);
607 	if (ret)
608 		return dev_err_probe(dev, ret, "failed to add irq chip\n");
609 
610 	chg->wqueue = create_singlethread_workqueue(dev_name(dev));
611 	if (!chg->wqueue)
612 		return -ENOMEM;
613 
614 	ret = devm_work_autocancel(dev, &chg->chgin_work, max77705_chgin_isr_work);
615 	if (ret) {
616 		dev_err_probe(dev, ret, "failed to initialize interrupt work\n");
617 		goto destroy_wq;
618 	}
619 
620 	ret = max77705_charger_initialize(chg);
621 	if (ret) {
622 		dev_err_probe(dev, ret, "failed to initialize charger IC\n");
623 		goto destroy_wq;
624 	}
625 
626 	ret = devm_request_threaded_irq(dev, regmap_irq_get_virq(irq_data, MAX77705_CHGIN_I),
627 					NULL, max77705_chgin_irq,
628 					IRQF_TRIGGER_NONE,
629 					"chgin-irq", chg);
630 	if (ret) {
631 		dev_err_probe(dev, ret, "Failed to Request chgin IRQ\n");
632 		goto destroy_wq;
633 	}
634 
635 	ret = max77705_charger_enable(chg);
636 	if (ret) {
637 		dev_err_probe(dev, ret, "failed to enable charge\n");
638 		goto destroy_wq;
639 	}
640 
641 	return devm_add_action_or_reset(dev, max77705_charger_disable, chg);
642 
643 destroy_wq:
644 	destroy_workqueue(chg->wqueue);
645 	return ret;
646 }
647 
648 static const struct of_device_id max77705_charger_of_match[] = {
649 	{ .compatible = "maxim,max77705-charger" },
650 	{ }
651 };
652 MODULE_DEVICE_TABLE(of, max77705_charger_of_match);
653 
654 static struct i2c_driver max77705_charger_driver = {
655 	.driver = {
656 		.name = "max77705-charger",
657 		.of_match_table = max77705_charger_of_match,
658 	},
659 	.probe = max77705_charger_probe,
660 };
661 module_i2c_driver(max77705_charger_driver);
662 
663 MODULE_AUTHOR("Dzmitry Sankouski <dsankouski@gmail.com>");
664 MODULE_DESCRIPTION("Maxim MAX77705 charger driver");
665 MODULE_LICENSE("GPL");
666