1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (C) 2011 Samsung Electronics Co., Ltd.
4  * MyungJoo Ham <myungjoo.ham@samsung.com>
5  *
6  * This driver enables to monitor battery health and control charger
7  * during suspend-to-mem.
8  * Charger manager depends on other devices. Register this later than
9  * the depending devices.
10  *
11 **/
12 
13 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
14 
15 #include <linux/io.h>
16 #include <linux/module.h>
17 #include <linux/irq.h>
18 #include <linux/interrupt.h>
19 #include <linux/rtc.h>
20 #include <linux/slab.h>
21 #include <linux/workqueue.h>
22 #include <linux/platform_device.h>
23 #include <linux/power/charger-manager.h>
24 #include <linux/regulator/consumer.h>
25 #include <linux/sysfs.h>
26 #include <linux/of.h>
27 #include <linux/thermal.h>
28 
29 /*
30  * Default temperature threshold for charging.
31  * Every temperature units are in tenth of centigrade.
32  */
33 #define CM_DEFAULT_RECHARGE_TEMP_DIFF	50
34 #define CM_DEFAULT_CHARGE_TEMP_MAX	500
35 
36 static const char * const default_event_names[] = {
37 	[CM_EVENT_UNKNOWN] = "Unknown",
38 	[CM_EVENT_BATT_FULL] = "Battery Full",
39 	[CM_EVENT_BATT_IN] = "Battery Inserted",
40 	[CM_EVENT_BATT_OUT] = "Battery Pulled Out",
41 	[CM_EVENT_BATT_OVERHEAT] = "Battery Overheat",
42 	[CM_EVENT_BATT_COLD] = "Battery Cold",
43 	[CM_EVENT_EXT_PWR_IN_OUT] = "External Power Attach/Detach",
44 	[CM_EVENT_CHG_START_STOP] = "Charging Start/Stop",
45 	[CM_EVENT_OTHERS] = "Other battery events"
46 };
47 
48 /*
49  * Regard CM_JIFFIES_SMALL jiffies is small enough to ignore for
50  * delayed works so that we can run delayed works with CM_JIFFIES_SMALL
51  * without any delays.
52  */
53 #define	CM_JIFFIES_SMALL	(2)
54 
55 /* If y is valid (> 0) and smaller than x, do x = y */
56 #define CM_MIN_VALID(x, y)	x = (((y > 0) && ((x) > (y))) ? (y) : (x))
57 
58 /*
59  * Regard CM_RTC_SMALL (sec) is small enough to ignore error in invoking
60  * rtc alarm. It should be 2 or larger
61  */
62 #define CM_RTC_SMALL		(2)
63 
64 #define UEVENT_BUF_SIZE		32
65 
66 static LIST_HEAD(cm_list);
67 static DEFINE_MUTEX(cm_list_mtx);
68 
69 /* About in-suspend (suspend-again) monitoring */
70 static struct alarm *cm_timer;
71 
72 static bool cm_suspended;
73 static bool cm_timer_set;
74 static unsigned long cm_suspend_duration_ms;
75 
76 /* About normal (not suspended) monitoring */
77 static unsigned long polling_jiffy = ULONG_MAX; /* ULONG_MAX: no polling */
78 static unsigned long next_polling; /* Next appointed polling time */
79 static struct workqueue_struct *cm_wq; /* init at driver add */
80 static struct delayed_work cm_monitor_work; /* init at driver add */
81 
82 /**
83  * is_batt_present - See if the battery presents in place.
84  * @cm: the Charger Manager representing the battery.
85  */
86 static bool is_batt_present(struct charger_manager *cm)
87 {
88 	union power_supply_propval val;
89 	struct power_supply *psy;
90 	bool present = false;
91 	int i, ret;
92 
93 	switch (cm->desc->battery_present) {
94 	case CM_BATTERY_PRESENT:
95 		present = true;
96 		break;
97 	case CM_NO_BATTERY:
98 		break;
99 	case CM_FUEL_GAUGE:
100 		psy = power_supply_get_by_name(cm->desc->psy_fuel_gauge);
101 		if (!psy)
102 			break;
103 
104 		ret = power_supply_get_property(psy, POWER_SUPPLY_PROP_PRESENT,
105 				&val);
106 		if (ret == 0 && val.intval)
107 			present = true;
108 		power_supply_put(psy);
109 		break;
110 	case CM_CHARGER_STAT:
111 		for (i = 0; cm->desc->psy_charger_stat[i]; i++) {
112 			psy = power_supply_get_by_name(
113 					cm->desc->psy_charger_stat[i]);
114 			if (!psy) {
115 				dev_err(cm->dev, "Cannot find power supply \"%s\"\n",
116 					cm->desc->psy_charger_stat[i]);
117 				continue;
118 			}
119 
120 			ret = power_supply_get_property(psy,
121 				POWER_SUPPLY_PROP_PRESENT, &val);
122 			power_supply_put(psy);
123 			if (ret == 0 && val.intval) {
124 				present = true;
125 				break;
126 			}
127 		}
128 		break;
129 	}
130 
131 	return present;
132 }
133 
134 /**
135  * is_ext_pwr_online - See if an external power source is attached to charge
136  * @cm: the Charger Manager representing the battery.
137  *
138  * Returns true if at least one of the chargers of the battery has an external
139  * power source attached to charge the battery regardless of whether it is
140  * actually charging or not.
141  */
142 static bool is_ext_pwr_online(struct charger_manager *cm)
143 {
144 	union power_supply_propval val;
145 	struct power_supply *psy;
146 	bool online = false;
147 	int i, ret;
148 
149 	/* If at least one of them has one, it's yes. */
150 	for (i = 0; cm->desc->psy_charger_stat[i]; i++) {
151 		psy = power_supply_get_by_name(cm->desc->psy_charger_stat[i]);
152 		if (!psy) {
153 			dev_err(cm->dev, "Cannot find power supply \"%s\"\n",
154 					cm->desc->psy_charger_stat[i]);
155 			continue;
156 		}
157 
158 		ret = power_supply_get_property(psy, POWER_SUPPLY_PROP_ONLINE,
159 				&val);
160 		power_supply_put(psy);
161 		if (ret == 0 && val.intval) {
162 			online = true;
163 			break;
164 		}
165 	}
166 
167 	return online;
168 }
169 
170 /**
171  * get_batt_uV - Get the voltage level of the battery
172  * @cm: the Charger Manager representing the battery.
173  * @uV: the voltage level returned.
174  *
175  * Returns 0 if there is no error.
176  * Returns a negative value on error.
177  */
178 static int get_batt_uV(struct charger_manager *cm, int *uV)
179 {
180 	union power_supply_propval val;
181 	struct power_supply *fuel_gauge;
182 	int ret;
183 
184 	fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge);
185 	if (!fuel_gauge)
186 		return -ENODEV;
187 
188 	ret = power_supply_get_property(fuel_gauge,
189 				POWER_SUPPLY_PROP_VOLTAGE_NOW, &val);
190 	power_supply_put(fuel_gauge);
191 	if (ret)
192 		return ret;
193 
194 	*uV = val.intval;
195 	return 0;
196 }
197 
198 /**
199  * is_charging - Returns true if the battery is being charged.
200  * @cm: the Charger Manager representing the battery.
201  */
202 static bool is_charging(struct charger_manager *cm)
203 {
204 	int i, ret;
205 	bool charging = false;
206 	struct power_supply *psy;
207 	union power_supply_propval val;
208 
209 	/* If there is no battery, it cannot be charged */
210 	if (!is_batt_present(cm))
211 		return false;
212 
213 	/* If at least one of the charger is charging, return yes */
214 	for (i = 0; cm->desc->psy_charger_stat[i]; i++) {
215 		/* 1. The charger sholuld not be DISABLED */
216 		if (cm->emergency_stop)
217 			continue;
218 		if (!cm->charger_enabled)
219 			continue;
220 
221 		psy = power_supply_get_by_name(cm->desc->psy_charger_stat[i]);
222 		if (!psy) {
223 			dev_err(cm->dev, "Cannot find power supply \"%s\"\n",
224 					cm->desc->psy_charger_stat[i]);
225 			continue;
226 		}
227 
228 		/* 2. The charger should be online (ext-power) */
229 		ret = power_supply_get_property(psy, POWER_SUPPLY_PROP_ONLINE,
230 				&val);
231 		if (ret) {
232 			dev_warn(cm->dev, "Cannot read ONLINE value from %s\n",
233 				 cm->desc->psy_charger_stat[i]);
234 			power_supply_put(psy);
235 			continue;
236 		}
237 		if (val.intval == 0) {
238 			power_supply_put(psy);
239 			continue;
240 		}
241 
242 		/*
243 		 * 3. The charger should not be FULL, DISCHARGING,
244 		 * or NOT_CHARGING.
245 		 */
246 		ret = power_supply_get_property(psy, POWER_SUPPLY_PROP_STATUS,
247 				&val);
248 		power_supply_put(psy);
249 		if (ret) {
250 			dev_warn(cm->dev, "Cannot read STATUS value from %s\n",
251 				 cm->desc->psy_charger_stat[i]);
252 			continue;
253 		}
254 		if (val.intval == POWER_SUPPLY_STATUS_FULL ||
255 				val.intval == POWER_SUPPLY_STATUS_DISCHARGING ||
256 				val.intval == POWER_SUPPLY_STATUS_NOT_CHARGING)
257 			continue;
258 
259 		/* Then, this is charging. */
260 		charging = true;
261 		break;
262 	}
263 
264 	return charging;
265 }
266 
267 /**
268  * is_full_charged - Returns true if the battery is fully charged.
269  * @cm: the Charger Manager representing the battery.
270  */
271 static bool is_full_charged(struct charger_manager *cm)
272 {
273 	struct charger_desc *desc = cm->desc;
274 	union power_supply_propval val;
275 	struct power_supply *fuel_gauge;
276 	bool is_full = false;
277 	int ret = 0;
278 	int uV;
279 
280 	/* If there is no battery, it cannot be charged */
281 	if (!is_batt_present(cm))
282 		return false;
283 
284 	fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge);
285 	if (!fuel_gauge)
286 		return false;
287 
288 	if (desc->fullbatt_full_capacity > 0) {
289 		val.intval = 0;
290 
291 		/* Not full if capacity of fuel gauge isn't full */
292 		ret = power_supply_get_property(fuel_gauge,
293 				POWER_SUPPLY_PROP_CHARGE_FULL, &val);
294 		if (!ret && val.intval > desc->fullbatt_full_capacity) {
295 			is_full = true;
296 			goto out;
297 		}
298 	}
299 
300 	/* Full, if it's over the fullbatt voltage */
301 	if (desc->fullbatt_uV > 0) {
302 		ret = get_batt_uV(cm, &uV);
303 		if (!ret && uV >= desc->fullbatt_uV) {
304 			is_full = true;
305 			goto out;
306 		}
307 	}
308 
309 	/* Full, if the capacity is more than fullbatt_soc */
310 	if (desc->fullbatt_soc > 0) {
311 		val.intval = 0;
312 
313 		ret = power_supply_get_property(fuel_gauge,
314 				POWER_SUPPLY_PROP_CAPACITY, &val);
315 		if (!ret && val.intval >= desc->fullbatt_soc) {
316 			is_full = true;
317 			goto out;
318 		}
319 	}
320 
321 out:
322 	power_supply_put(fuel_gauge);
323 	return is_full;
324 }
325 
326 /**
327  * is_polling_required - Return true if need to continue polling for this CM.
328  * @cm: the Charger Manager representing the battery.
329  */
330 static bool is_polling_required(struct charger_manager *cm)
331 {
332 	switch (cm->desc->polling_mode) {
333 	case CM_POLL_DISABLE:
334 		return false;
335 	case CM_POLL_ALWAYS:
336 		return true;
337 	case CM_POLL_EXTERNAL_POWER_ONLY:
338 		return is_ext_pwr_online(cm);
339 	case CM_POLL_CHARGING_ONLY:
340 		return is_charging(cm);
341 	default:
342 		dev_warn(cm->dev, "Incorrect polling_mode (%d)\n",
343 			 cm->desc->polling_mode);
344 	}
345 
346 	return false;
347 }
348 
349 /**
350  * try_charger_enable - Enable/Disable chargers altogether
351  * @cm: the Charger Manager representing the battery.
352  * @enable: true: enable / false: disable
353  *
354  * Note that Charger Manager keeps the charger enabled regardless whether
355  * the charger is charging or not (because battery is full or no external
356  * power source exists) except when CM needs to disable chargers forcibly
357  * because of emergency causes; when the battery is overheated or too cold.
358  */
359 static int try_charger_enable(struct charger_manager *cm, bool enable)
360 {
361 	int err = 0, i;
362 	struct charger_desc *desc = cm->desc;
363 
364 	/* Ignore if it's redundant command */
365 	if (enable == cm->charger_enabled)
366 		return 0;
367 
368 	if (enable) {
369 		if (cm->emergency_stop)
370 			return -EAGAIN;
371 
372 		/*
373 		 * Save start time of charging to limit
374 		 * maximum possible charging time.
375 		 */
376 		cm->charging_start_time = ktime_to_ms(ktime_get());
377 		cm->charging_end_time = 0;
378 
379 		for (i = 0 ; i < desc->num_charger_regulators ; i++) {
380 			if (desc->charger_regulators[i].externally_control)
381 				continue;
382 
383 			err = regulator_enable(desc->charger_regulators[i].consumer);
384 			if (err < 0) {
385 				dev_warn(cm->dev, "Cannot enable %s regulator\n",
386 					 desc->charger_regulators[i].regulator_name);
387 			}
388 		}
389 	} else {
390 		/*
391 		 * Save end time of charging to maintain fully charged state
392 		 * of battery after full-batt.
393 		 */
394 		cm->charging_start_time = 0;
395 		cm->charging_end_time = ktime_to_ms(ktime_get());
396 
397 		for (i = 0 ; i < desc->num_charger_regulators ; i++) {
398 			if (desc->charger_regulators[i].externally_control)
399 				continue;
400 
401 			err = regulator_disable(desc->charger_regulators[i].consumer);
402 			if (err < 0) {
403 				dev_warn(cm->dev, "Cannot disable %s regulator\n",
404 					 desc->charger_regulators[i].regulator_name);
405 			}
406 		}
407 
408 		/*
409 		 * Abnormal battery state - Stop charging forcibly,
410 		 * even if charger was enabled at the other places
411 		 */
412 		for (i = 0; i < desc->num_charger_regulators; i++) {
413 			if (regulator_is_enabled(
414 				    desc->charger_regulators[i].consumer)) {
415 				regulator_force_disable(
416 					desc->charger_regulators[i].consumer);
417 				dev_warn(cm->dev, "Disable regulator(%s) forcibly\n",
418 					 desc->charger_regulators[i].regulator_name);
419 			}
420 		}
421 	}
422 
423 	if (!err)
424 		cm->charger_enabled = enable;
425 
426 	return err;
427 }
428 
429 /**
430  * try_charger_restart - Restart charging.
431  * @cm: the Charger Manager representing the battery.
432  *
433  * Restart charging by turning off and on the charger.
434  */
435 static int try_charger_restart(struct charger_manager *cm)
436 {
437 	int err;
438 
439 	if (cm->emergency_stop)
440 		return -EAGAIN;
441 
442 	err = try_charger_enable(cm, false);
443 	if (err)
444 		return err;
445 
446 	return try_charger_enable(cm, true);
447 }
448 
449 /**
450  * uevent_notify - Let users know something has changed.
451  * @cm: the Charger Manager representing the battery.
452  * @event: the event string.
453  *
454  * If @event is null, it implies that uevent_notify is called
455  * by resume function. When called in the resume function, cm_suspended
456  * should be already reset to false in order to let uevent_notify
457  * notify the recent event during the suspend to users. While
458  * suspended, uevent_notify does not notify users, but tracks
459  * events so that uevent_notify can notify users later after resumed.
460  */
461 static void uevent_notify(struct charger_manager *cm, const char *event)
462 {
463 	static char env_str[UEVENT_BUF_SIZE + 1] = "";
464 	static char env_str_save[UEVENT_BUF_SIZE + 1] = "";
465 
466 	if (cm_suspended) {
467 		/* Nothing in suspended-event buffer */
468 		if (env_str_save[0] == 0) {
469 			if (!strncmp(env_str, event, UEVENT_BUF_SIZE))
470 				return; /* status not changed */
471 			strncpy(env_str_save, event, UEVENT_BUF_SIZE);
472 			return;
473 		}
474 
475 		if (!strncmp(env_str_save, event, UEVENT_BUF_SIZE))
476 			return; /* Duplicated. */
477 		strncpy(env_str_save, event, UEVENT_BUF_SIZE);
478 		return;
479 	}
480 
481 	if (event == NULL) {
482 		/* No messages pending */
483 		if (!env_str_save[0])
484 			return;
485 
486 		strncpy(env_str, env_str_save, UEVENT_BUF_SIZE);
487 		kobject_uevent(&cm->dev->kobj, KOBJ_CHANGE);
488 		env_str_save[0] = 0;
489 
490 		return;
491 	}
492 
493 	/* status not changed */
494 	if (!strncmp(env_str, event, UEVENT_BUF_SIZE))
495 		return;
496 
497 	/* save the status and notify the update */
498 	strncpy(env_str, event, UEVENT_BUF_SIZE);
499 	kobject_uevent(&cm->dev->kobj, KOBJ_CHANGE);
500 
501 	dev_info(cm->dev, "%s\n", event);
502 }
503 
504 /**
505  * fullbatt_vchk - Check voltage drop some times after "FULL" event.
506  * @work: the work_struct appointing the function
507  *
508  * If a user has designated "fullbatt_vchkdrop_ms/uV" values with
509  * charger_desc, Charger Manager checks voltage drop after the battery
510  * "FULL" event. It checks whether the voltage has dropped more than
511  * fullbatt_vchkdrop_uV by calling this function after fullbatt_vchkrop_ms.
512  */
513 static void fullbatt_vchk(struct work_struct *work)
514 {
515 	struct delayed_work *dwork = to_delayed_work(work);
516 	struct charger_manager *cm = container_of(dwork,
517 			struct charger_manager, fullbatt_vchk_work);
518 	struct charger_desc *desc = cm->desc;
519 	int batt_uV, err, diff;
520 
521 	/* remove the appointment for fullbatt_vchk */
522 	cm->fullbatt_vchk_jiffies_at = 0;
523 
524 	if (!desc->fullbatt_vchkdrop_uV || !desc->fullbatt_vchkdrop_ms)
525 		return;
526 
527 	err = get_batt_uV(cm, &batt_uV);
528 	if (err) {
529 		dev_err(cm->dev, "%s: get_batt_uV error(%d)\n", __func__, err);
530 		return;
531 	}
532 
533 	diff = desc->fullbatt_uV - batt_uV;
534 	if (diff < 0)
535 		return;
536 
537 	dev_info(cm->dev, "VBATT dropped %duV after full-batt\n", diff);
538 
539 	if (diff > desc->fullbatt_vchkdrop_uV) {
540 		try_charger_restart(cm);
541 		uevent_notify(cm, "Recharging");
542 	}
543 }
544 
545 /**
546  * check_charging_duration - Monitor charging/discharging duration
547  * @cm: the Charger Manager representing the battery.
548  *
549  * If whole charging duration exceed 'charging_max_duration_ms',
550  * cm stop charging to prevent overcharge/overheat. If discharging
551  * duration exceed 'discharging _max_duration_ms', charger cable is
552  * attached, after full-batt, cm start charging to maintain fully
553  * charged state for battery.
554  */
555 static int check_charging_duration(struct charger_manager *cm)
556 {
557 	struct charger_desc *desc = cm->desc;
558 	u64 curr = ktime_to_ms(ktime_get());
559 	u64 duration;
560 	int ret = false;
561 
562 	if (!desc->charging_max_duration_ms &&
563 			!desc->discharging_max_duration_ms)
564 		return ret;
565 
566 	if (cm->charger_enabled) {
567 		duration = curr - cm->charging_start_time;
568 
569 		if (duration > desc->charging_max_duration_ms) {
570 			dev_info(cm->dev, "Charging duration exceed %ums\n",
571 				 desc->charging_max_duration_ms);
572 			uevent_notify(cm, "Discharging");
573 			try_charger_enable(cm, false);
574 			ret = true;
575 		}
576 	} else if (is_ext_pwr_online(cm) && !cm->charger_enabled) {
577 		duration = curr - cm->charging_end_time;
578 
579 		if (duration > desc->discharging_max_duration_ms &&
580 				is_ext_pwr_online(cm)) {
581 			dev_info(cm->dev, "Discharging duration exceed %ums\n",
582 				 desc->discharging_max_duration_ms);
583 			uevent_notify(cm, "Recharging");
584 			try_charger_enable(cm, true);
585 			ret = true;
586 		}
587 	}
588 
589 	return ret;
590 }
591 
592 static int cm_get_battery_temperature_by_psy(struct charger_manager *cm,
593 					int *temp)
594 {
595 	struct power_supply *fuel_gauge;
596 	int ret;
597 
598 	fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge);
599 	if (!fuel_gauge)
600 		return -ENODEV;
601 
602 	ret = power_supply_get_property(fuel_gauge,
603 				POWER_SUPPLY_PROP_TEMP,
604 				(union power_supply_propval *)temp);
605 	power_supply_put(fuel_gauge);
606 
607 	return ret;
608 }
609 
610 static int cm_get_battery_temperature(struct charger_manager *cm,
611 					int *temp)
612 {
613 	int ret;
614 
615 	if (!cm->desc->measure_battery_temp)
616 		return -ENODEV;
617 
618 #ifdef CONFIG_THERMAL
619 	if (cm->tzd_batt) {
620 		ret = thermal_zone_get_temp(cm->tzd_batt, temp);
621 		if (!ret)
622 			/* Calibrate temperature unit */
623 			*temp /= 100;
624 	} else
625 #endif
626 	{
627 		/* if-else continued from CONFIG_THERMAL */
628 		ret = cm_get_battery_temperature_by_psy(cm, temp);
629 	}
630 
631 	return ret;
632 }
633 
634 static int cm_check_thermal_status(struct charger_manager *cm)
635 {
636 	struct charger_desc *desc = cm->desc;
637 	int temp, upper_limit, lower_limit;
638 	int ret = 0;
639 
640 	ret = cm_get_battery_temperature(cm, &temp);
641 	if (ret) {
642 		/* FIXME:
643 		 * No information of battery temperature might
644 		 * occur hazardous result. We have to handle it
645 		 * depending on battery type.
646 		 */
647 		dev_err(cm->dev, "Failed to get battery temperature\n");
648 		return 0;
649 	}
650 
651 	upper_limit = desc->temp_max;
652 	lower_limit = desc->temp_min;
653 
654 	if (cm->emergency_stop) {
655 		upper_limit -= desc->temp_diff;
656 		lower_limit += desc->temp_diff;
657 	}
658 
659 	if (temp > upper_limit)
660 		ret = CM_EVENT_BATT_OVERHEAT;
661 	else if (temp < lower_limit)
662 		ret = CM_EVENT_BATT_COLD;
663 
664 	return ret;
665 }
666 
667 /**
668  * _cm_monitor - Monitor the temperature and return true for exceptions.
669  * @cm: the Charger Manager representing the battery.
670  *
671  * Returns true if there is an event to notify for the battery.
672  * (True if the status of "emergency_stop" changes)
673  */
674 static bool _cm_monitor(struct charger_manager *cm)
675 {
676 	int temp_alrt;
677 
678 	temp_alrt = cm_check_thermal_status(cm);
679 
680 	/* It has been stopped already */
681 	if (temp_alrt && cm->emergency_stop)
682 		return false;
683 
684 	/*
685 	 * Check temperature whether overheat or cold.
686 	 * If temperature is out of range normal state, stop charging.
687 	 */
688 	if (temp_alrt) {
689 		cm->emergency_stop = temp_alrt;
690 		if (!try_charger_enable(cm, false))
691 			uevent_notify(cm, default_event_names[temp_alrt]);
692 
693 	/*
694 	 * Check whole charging duration and discharging duration
695 	 * after full-batt.
696 	 */
697 	} else if (!cm->emergency_stop && check_charging_duration(cm)) {
698 		dev_dbg(cm->dev,
699 			"Charging/Discharging duration is out of range\n");
700 	/*
701 	 * Check dropped voltage of battery. If battery voltage is more
702 	 * dropped than fullbatt_vchkdrop_uV after fully charged state,
703 	 * charger-manager have to recharge battery.
704 	 */
705 	} else if (!cm->emergency_stop && is_ext_pwr_online(cm) &&
706 			!cm->charger_enabled) {
707 		fullbatt_vchk(&cm->fullbatt_vchk_work.work);
708 
709 	/*
710 	 * Check whether fully charged state to protect overcharge
711 	 * if charger-manager is charging for battery.
712 	 */
713 	} else if (!cm->emergency_stop && is_full_charged(cm) &&
714 			cm->charger_enabled) {
715 		dev_info(cm->dev, "EVENT_HANDLE: Battery Fully Charged\n");
716 		uevent_notify(cm, default_event_names[CM_EVENT_BATT_FULL]);
717 
718 		try_charger_enable(cm, false);
719 
720 		fullbatt_vchk(&cm->fullbatt_vchk_work.work);
721 	} else {
722 		cm->emergency_stop = 0;
723 		if (is_ext_pwr_online(cm)) {
724 			if (!try_charger_enable(cm, true))
725 				uevent_notify(cm, "CHARGING");
726 		}
727 	}
728 
729 	return true;
730 }
731 
732 /**
733  * cm_monitor - Monitor every battery.
734  *
735  * Returns true if there is an event to notify from any of the batteries.
736  * (True if the status of "emergency_stop" changes)
737  */
738 static bool cm_monitor(void)
739 {
740 	bool stop = false;
741 	struct charger_manager *cm;
742 
743 	mutex_lock(&cm_list_mtx);
744 
745 	list_for_each_entry(cm, &cm_list, entry) {
746 		if (_cm_monitor(cm))
747 			stop = true;
748 	}
749 
750 	mutex_unlock(&cm_list_mtx);
751 
752 	return stop;
753 }
754 
755 /**
756  * _setup_polling - Setup the next instance of polling.
757  * @work: work_struct of the function _setup_polling.
758  */
759 static void _setup_polling(struct work_struct *work)
760 {
761 	unsigned long min = ULONG_MAX;
762 	struct charger_manager *cm;
763 	bool keep_polling = false;
764 	unsigned long _next_polling;
765 
766 	mutex_lock(&cm_list_mtx);
767 
768 	list_for_each_entry(cm, &cm_list, entry) {
769 		if (is_polling_required(cm) && cm->desc->polling_interval_ms) {
770 			keep_polling = true;
771 
772 			if (min > cm->desc->polling_interval_ms)
773 				min = cm->desc->polling_interval_ms;
774 		}
775 	}
776 
777 	polling_jiffy = msecs_to_jiffies(min);
778 	if (polling_jiffy <= CM_JIFFIES_SMALL)
779 		polling_jiffy = CM_JIFFIES_SMALL + 1;
780 
781 	if (!keep_polling)
782 		polling_jiffy = ULONG_MAX;
783 	if (polling_jiffy == ULONG_MAX)
784 		goto out;
785 
786 	WARN(cm_wq == NULL, "charger-manager: workqueue not initialized"
787 			    ". try it later. %s\n", __func__);
788 
789 	/*
790 	 * Use mod_delayed_work() iff the next polling interval should
791 	 * occur before the currently scheduled one.  If @cm_monitor_work
792 	 * isn't active, the end result is the same, so no need to worry
793 	 * about stale @next_polling.
794 	 */
795 	_next_polling = jiffies + polling_jiffy;
796 
797 	if (time_before(_next_polling, next_polling)) {
798 		mod_delayed_work(cm_wq, &cm_monitor_work, polling_jiffy);
799 		next_polling = _next_polling;
800 	} else {
801 		if (queue_delayed_work(cm_wq, &cm_monitor_work, polling_jiffy))
802 			next_polling = _next_polling;
803 	}
804 out:
805 	mutex_unlock(&cm_list_mtx);
806 }
807 static DECLARE_WORK(setup_polling, _setup_polling);
808 
809 /**
810  * cm_monitor_poller - The Monitor / Poller.
811  * @work: work_struct of the function cm_monitor_poller
812  *
813  * During non-suspended state, cm_monitor_poller is used to poll and monitor
814  * the batteries.
815  */
816 static void cm_monitor_poller(struct work_struct *work)
817 {
818 	cm_monitor();
819 	schedule_work(&setup_polling);
820 }
821 
822 /**
823  * fullbatt_handler - Event handler for CM_EVENT_BATT_FULL
824  * @cm: the Charger Manager representing the battery.
825  */
826 static void fullbatt_handler(struct charger_manager *cm)
827 {
828 	struct charger_desc *desc = cm->desc;
829 
830 	if (!desc->fullbatt_vchkdrop_uV || !desc->fullbatt_vchkdrop_ms)
831 		goto out;
832 
833 	if (cm_suspended)
834 		device_set_wakeup_capable(cm->dev, true);
835 
836 	mod_delayed_work(cm_wq, &cm->fullbatt_vchk_work,
837 			 msecs_to_jiffies(desc->fullbatt_vchkdrop_ms));
838 	cm->fullbatt_vchk_jiffies_at = jiffies + msecs_to_jiffies(
839 				       desc->fullbatt_vchkdrop_ms);
840 
841 	if (cm->fullbatt_vchk_jiffies_at == 0)
842 		cm->fullbatt_vchk_jiffies_at = 1;
843 
844 out:
845 	dev_info(cm->dev, "EVENT_HANDLE: Battery Fully Charged\n");
846 	uevent_notify(cm, default_event_names[CM_EVENT_BATT_FULL]);
847 }
848 
849 /**
850  * battout_handler - Event handler for CM_EVENT_BATT_OUT
851  * @cm: the Charger Manager representing the battery.
852  */
853 static void battout_handler(struct charger_manager *cm)
854 {
855 	if (cm_suspended)
856 		device_set_wakeup_capable(cm->dev, true);
857 
858 	if (!is_batt_present(cm)) {
859 		dev_emerg(cm->dev, "Battery Pulled Out!\n");
860 		uevent_notify(cm, default_event_names[CM_EVENT_BATT_OUT]);
861 	} else {
862 		uevent_notify(cm, "Battery Reinserted?");
863 	}
864 }
865 
866 /**
867  * misc_event_handler - Handler for other events
868  * @cm: the Charger Manager representing the battery.
869  * @type: the Charger Manager representing the battery.
870  */
871 static void misc_event_handler(struct charger_manager *cm,
872 			enum cm_event_types type)
873 {
874 	if (cm_suspended)
875 		device_set_wakeup_capable(cm->dev, true);
876 
877 	if (is_polling_required(cm) && cm->desc->polling_interval_ms)
878 		schedule_work(&setup_polling);
879 	uevent_notify(cm, default_event_names[type]);
880 }
881 
882 static int charger_get_property(struct power_supply *psy,
883 		enum power_supply_property psp,
884 		union power_supply_propval *val)
885 {
886 	struct charger_manager *cm = power_supply_get_drvdata(psy);
887 	struct charger_desc *desc = cm->desc;
888 	struct power_supply *fuel_gauge = NULL;
889 	int ret = 0;
890 	int uV;
891 
892 	switch (psp) {
893 	case POWER_SUPPLY_PROP_STATUS:
894 		if (is_charging(cm))
895 			val->intval = POWER_SUPPLY_STATUS_CHARGING;
896 		else if (is_ext_pwr_online(cm))
897 			val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
898 		else
899 			val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
900 		break;
901 	case POWER_SUPPLY_PROP_HEALTH:
902 		if (cm->emergency_stop > 0)
903 			val->intval = POWER_SUPPLY_HEALTH_OVERHEAT;
904 		else if (cm->emergency_stop < 0)
905 			val->intval = POWER_SUPPLY_HEALTH_COLD;
906 		else
907 			val->intval = POWER_SUPPLY_HEALTH_GOOD;
908 		break;
909 	case POWER_SUPPLY_PROP_PRESENT:
910 		if (is_batt_present(cm))
911 			val->intval = 1;
912 		else
913 			val->intval = 0;
914 		break;
915 	case POWER_SUPPLY_PROP_VOLTAGE_NOW:
916 		ret = get_batt_uV(cm, &val->intval);
917 		break;
918 	case POWER_SUPPLY_PROP_CURRENT_NOW:
919 		fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge);
920 		if (!fuel_gauge) {
921 			ret = -ENODEV;
922 			break;
923 		}
924 		ret = power_supply_get_property(fuel_gauge,
925 				POWER_SUPPLY_PROP_CURRENT_NOW, val);
926 		break;
927 	case POWER_SUPPLY_PROP_TEMP:
928 	case POWER_SUPPLY_PROP_TEMP_AMBIENT:
929 		return cm_get_battery_temperature(cm, &val->intval);
930 	case POWER_SUPPLY_PROP_CAPACITY:
931 		if (!is_batt_present(cm)) {
932 			/* There is no battery. Assume 100% */
933 			val->intval = 100;
934 			break;
935 		}
936 
937 		fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge);
938 		if (!fuel_gauge) {
939 			ret = -ENODEV;
940 			break;
941 		}
942 
943 		ret = power_supply_get_property(fuel_gauge,
944 					POWER_SUPPLY_PROP_CAPACITY, val);
945 		if (ret)
946 			break;
947 
948 		if (val->intval > 100) {
949 			val->intval = 100;
950 			break;
951 		}
952 		if (val->intval < 0)
953 			val->intval = 0;
954 
955 		/* Do not adjust SOC when charging: voltage is overrated */
956 		if (is_charging(cm))
957 			break;
958 
959 		/*
960 		 * If the capacity value is inconsistent, calibrate it base on
961 		 * the battery voltage values and the thresholds given as desc
962 		 */
963 		ret = get_batt_uV(cm, &uV);
964 		if (ret) {
965 			/* Voltage information not available. No calibration */
966 			ret = 0;
967 			break;
968 		}
969 
970 		if (desc->fullbatt_uV > 0 && uV >= desc->fullbatt_uV &&
971 		    !is_charging(cm)) {
972 			val->intval = 100;
973 			break;
974 		}
975 
976 		break;
977 	case POWER_SUPPLY_PROP_ONLINE:
978 		if (is_ext_pwr_online(cm))
979 			val->intval = 1;
980 		else
981 			val->intval = 0;
982 		break;
983 	case POWER_SUPPLY_PROP_CHARGE_FULL:
984 		if (is_full_charged(cm))
985 			val->intval = 1;
986 		else
987 			val->intval = 0;
988 		ret = 0;
989 		break;
990 	case POWER_SUPPLY_PROP_CHARGE_NOW:
991 		if (is_charging(cm)) {
992 			fuel_gauge = power_supply_get_by_name(
993 					cm->desc->psy_fuel_gauge);
994 			if (!fuel_gauge) {
995 				ret = -ENODEV;
996 				break;
997 			}
998 
999 			ret = power_supply_get_property(fuel_gauge,
1000 						POWER_SUPPLY_PROP_CHARGE_NOW,
1001 						val);
1002 			if (ret) {
1003 				val->intval = 1;
1004 				ret = 0;
1005 			} else {
1006 				/* If CHARGE_NOW is supplied, use it */
1007 				val->intval = (val->intval > 0) ?
1008 						val->intval : 1;
1009 			}
1010 		} else {
1011 			val->intval = 0;
1012 		}
1013 		break;
1014 	default:
1015 		return -EINVAL;
1016 	}
1017 	if (fuel_gauge)
1018 		power_supply_put(fuel_gauge);
1019 	return ret;
1020 }
1021 
1022 #define NUM_CHARGER_PSY_OPTIONAL	(4)
1023 static enum power_supply_property default_charger_props[] = {
1024 	/* Guaranteed to provide */
1025 	POWER_SUPPLY_PROP_STATUS,
1026 	POWER_SUPPLY_PROP_HEALTH,
1027 	POWER_SUPPLY_PROP_PRESENT,
1028 	POWER_SUPPLY_PROP_VOLTAGE_NOW,
1029 	POWER_SUPPLY_PROP_CAPACITY,
1030 	POWER_SUPPLY_PROP_ONLINE,
1031 	POWER_SUPPLY_PROP_CHARGE_FULL,
1032 	/*
1033 	 * Optional properties are:
1034 	 * POWER_SUPPLY_PROP_CHARGE_NOW,
1035 	 * POWER_SUPPLY_PROP_CURRENT_NOW,
1036 	 * POWER_SUPPLY_PROP_TEMP, and
1037 	 * POWER_SUPPLY_PROP_TEMP_AMBIENT,
1038 	 */
1039 };
1040 
1041 static const struct power_supply_desc psy_default = {
1042 	.name = "battery",
1043 	.type = POWER_SUPPLY_TYPE_BATTERY,
1044 	.properties = default_charger_props,
1045 	.num_properties = ARRAY_SIZE(default_charger_props),
1046 	.get_property = charger_get_property,
1047 	.no_thermal = true,
1048 };
1049 
1050 /**
1051  * cm_setup_timer - For in-suspend monitoring setup wakeup alarm
1052  *		    for suspend_again.
1053  *
1054  * Returns true if the alarm is set for Charger Manager to use.
1055  * Returns false if
1056  *	cm_setup_timer fails to set an alarm,
1057  *	cm_setup_timer does not need to set an alarm for Charger Manager,
1058  *	or an alarm previously configured is to be used.
1059  */
1060 static bool cm_setup_timer(void)
1061 {
1062 	struct charger_manager *cm;
1063 	unsigned int wakeup_ms = UINT_MAX;
1064 	int timer_req = 0;
1065 
1066 	if (time_after(next_polling, jiffies))
1067 		CM_MIN_VALID(wakeup_ms,
1068 			jiffies_to_msecs(next_polling - jiffies));
1069 
1070 	mutex_lock(&cm_list_mtx);
1071 	list_for_each_entry(cm, &cm_list, entry) {
1072 		unsigned int fbchk_ms = 0;
1073 
1074 		/* fullbatt_vchk is required. setup timer for that */
1075 		if (cm->fullbatt_vchk_jiffies_at) {
1076 			fbchk_ms = jiffies_to_msecs(cm->fullbatt_vchk_jiffies_at
1077 						    - jiffies);
1078 			if (time_is_before_eq_jiffies(
1079 				cm->fullbatt_vchk_jiffies_at) ||
1080 				msecs_to_jiffies(fbchk_ms) < CM_JIFFIES_SMALL) {
1081 				fullbatt_vchk(&cm->fullbatt_vchk_work.work);
1082 				fbchk_ms = 0;
1083 			}
1084 		}
1085 		CM_MIN_VALID(wakeup_ms, fbchk_ms);
1086 
1087 		/* Skip if polling is not required for this CM */
1088 		if (!is_polling_required(cm) && !cm->emergency_stop)
1089 			continue;
1090 		timer_req++;
1091 		if (cm->desc->polling_interval_ms == 0)
1092 			continue;
1093 		CM_MIN_VALID(wakeup_ms, cm->desc->polling_interval_ms);
1094 	}
1095 	mutex_unlock(&cm_list_mtx);
1096 
1097 	if (timer_req && cm_timer) {
1098 		ktime_t now, add;
1099 
1100 		/*
1101 		 * Set alarm with the polling interval (wakeup_ms)
1102 		 * The alarm time should be NOW + CM_RTC_SMALL or later.
1103 		 */
1104 		if (wakeup_ms == UINT_MAX ||
1105 			wakeup_ms < CM_RTC_SMALL * MSEC_PER_SEC)
1106 			wakeup_ms = 2 * CM_RTC_SMALL * MSEC_PER_SEC;
1107 
1108 		pr_info("Charger Manager wakeup timer: %u ms\n", wakeup_ms);
1109 
1110 		now = ktime_get_boottime();
1111 		add = ktime_set(wakeup_ms / MSEC_PER_SEC,
1112 				(wakeup_ms % MSEC_PER_SEC) * NSEC_PER_MSEC);
1113 		alarm_start(cm_timer, ktime_add(now, add));
1114 
1115 		cm_suspend_duration_ms = wakeup_ms;
1116 
1117 		return true;
1118 	}
1119 	return false;
1120 }
1121 
1122 /**
1123  * charger_extcon_work - enable/diable charger according to the state
1124  *			of charger cable
1125  *
1126  * @work: work_struct of the function charger_extcon_work.
1127  */
1128 static void charger_extcon_work(struct work_struct *work)
1129 {
1130 	struct charger_cable *cable =
1131 			container_of(work, struct charger_cable, wq);
1132 	int ret;
1133 
1134 	if (cable->attached && cable->min_uA != 0 && cable->max_uA != 0) {
1135 		ret = regulator_set_current_limit(cable->charger->consumer,
1136 					cable->min_uA, cable->max_uA);
1137 		if (ret < 0) {
1138 			pr_err("Cannot set current limit of %s (%s)\n",
1139 			       cable->charger->regulator_name, cable->name);
1140 			return;
1141 		}
1142 
1143 		pr_info("Set current limit of %s : %duA ~ %duA\n",
1144 			cable->charger->regulator_name,
1145 			cable->min_uA, cable->max_uA);
1146 	}
1147 
1148 	try_charger_enable(cable->cm, cable->attached);
1149 }
1150 
1151 /**
1152  * charger_extcon_notifier - receive the state of charger cable
1153  *			when registered cable is attached or detached.
1154  *
1155  * @self: the notifier block of the charger_extcon_notifier.
1156  * @event: the cable state.
1157  * @ptr: the data pointer of notifier block.
1158  */
1159 static int charger_extcon_notifier(struct notifier_block *self,
1160 			unsigned long event, void *ptr)
1161 {
1162 	struct charger_cable *cable =
1163 		container_of(self, struct charger_cable, nb);
1164 
1165 	/*
1166 	 * The newly state of charger cable.
1167 	 * If cable is attached, cable->attached is true.
1168 	 */
1169 	cable->attached = event;
1170 
1171 	/*
1172 	 * Setup monitoring to check battery state
1173 	 * when charger cable is attached.
1174 	 */
1175 	if (cable->attached && is_polling_required(cable->cm)) {
1176 		cancel_work_sync(&setup_polling);
1177 		schedule_work(&setup_polling);
1178 	}
1179 
1180 	/*
1181 	 * Setup work for controlling charger(regulator)
1182 	 * according to charger cable.
1183 	 */
1184 	schedule_work(&cable->wq);
1185 
1186 	return NOTIFY_DONE;
1187 }
1188 
1189 /**
1190  * charger_extcon_init - register external connector to use it
1191  *			as the charger cable
1192  *
1193  * @cm: the Charger Manager representing the battery.
1194  * @cable: the Charger cable representing the external connector.
1195  */
1196 static int charger_extcon_init(struct charger_manager *cm,
1197 		struct charger_cable *cable)
1198 {
1199 	int ret;
1200 
1201 	/*
1202 	 * Charger manager use Extcon framework to identify
1203 	 * the charger cable among various external connector
1204 	 * cable (e.g., TA, USB, MHL, Dock).
1205 	 */
1206 	INIT_WORK(&cable->wq, charger_extcon_work);
1207 	cable->nb.notifier_call = charger_extcon_notifier;
1208 	ret = extcon_register_interest(&cable->extcon_dev,
1209 			cable->extcon_name, cable->name, &cable->nb);
1210 	if (ret < 0) {
1211 		pr_info("Cannot register extcon_dev for %s(cable: %s)\n",
1212 			cable->extcon_name, cable->name);
1213 	}
1214 
1215 	return ret;
1216 }
1217 
1218 /**
1219  * charger_manager_register_extcon - Register extcon device to receive state
1220  *				     of charger cable.
1221  * @cm: the Charger Manager representing the battery.
1222  *
1223  * This function support EXTCON(External Connector) subsystem to detect the
1224  * state of charger cables for enabling or disabling charger(regulator) and
1225  * select the charger cable for charging among a number of external cable
1226  * according to policy of H/W board.
1227  */
1228 static int charger_manager_register_extcon(struct charger_manager *cm)
1229 {
1230 	struct charger_desc *desc = cm->desc;
1231 	struct charger_regulator *charger;
1232 	int ret;
1233 	int i;
1234 	int j;
1235 
1236 	for (i = 0; i < desc->num_charger_regulators; i++) {
1237 		charger = &desc->charger_regulators[i];
1238 
1239 		charger->consumer = regulator_get(cm->dev,
1240 					charger->regulator_name);
1241 		if (IS_ERR(charger->consumer)) {
1242 			dev_err(cm->dev, "Cannot find charger(%s)\n",
1243 				charger->regulator_name);
1244 			return PTR_ERR(charger->consumer);
1245 		}
1246 		charger->cm = cm;
1247 
1248 		for (j = 0; j < charger->num_cables; j++) {
1249 			struct charger_cable *cable = &charger->cables[j];
1250 
1251 			ret = charger_extcon_init(cm, cable);
1252 			if (ret < 0) {
1253 				dev_err(cm->dev, "Cannot initialize charger(%s)\n",
1254 					charger->regulator_name);
1255 				return ret;
1256 			}
1257 			cable->charger = charger;
1258 			cable->cm = cm;
1259 		}
1260 	}
1261 
1262 	return 0;
1263 }
1264 
1265 /* help function of sysfs node to control charger(regulator) */
1266 static ssize_t charger_name_show(struct device *dev,
1267 				struct device_attribute *attr, char *buf)
1268 {
1269 	struct charger_regulator *charger
1270 		= container_of(attr, struct charger_regulator, attr_name);
1271 
1272 	return sprintf(buf, "%s\n", charger->regulator_name);
1273 }
1274 
1275 static ssize_t charger_state_show(struct device *dev,
1276 				struct device_attribute *attr, char *buf)
1277 {
1278 	struct charger_regulator *charger
1279 		= container_of(attr, struct charger_regulator, attr_state);
1280 	int state = 0;
1281 
1282 	if (!charger->externally_control)
1283 		state = regulator_is_enabled(charger->consumer);
1284 
1285 	return sprintf(buf, "%s\n", state ? "enabled" : "disabled");
1286 }
1287 
1288 static ssize_t charger_externally_control_show(struct device *dev,
1289 				struct device_attribute *attr, char *buf)
1290 {
1291 	struct charger_regulator *charger = container_of(attr,
1292 			struct charger_regulator, attr_externally_control);
1293 
1294 	return sprintf(buf, "%d\n", charger->externally_control);
1295 }
1296 
1297 static ssize_t charger_externally_control_store(struct device *dev,
1298 				struct device_attribute *attr, const char *buf,
1299 				size_t count)
1300 {
1301 	struct charger_regulator *charger
1302 		= container_of(attr, struct charger_regulator,
1303 					attr_externally_control);
1304 	struct charger_manager *cm = charger->cm;
1305 	struct charger_desc *desc = cm->desc;
1306 	int i;
1307 	int ret;
1308 	int externally_control;
1309 	int chargers_externally_control = 1;
1310 
1311 	ret = sscanf(buf, "%d", &externally_control);
1312 	if (ret == 0) {
1313 		ret = -EINVAL;
1314 		return ret;
1315 	}
1316 
1317 	if (!externally_control) {
1318 		charger->externally_control = 0;
1319 		return count;
1320 	}
1321 
1322 	for (i = 0; i < desc->num_charger_regulators; i++) {
1323 		if (&desc->charger_regulators[i] != charger &&
1324 			!desc->charger_regulators[i].externally_control) {
1325 			/*
1326 			 * At least, one charger is controlled by
1327 			 * charger-manager
1328 			 */
1329 			chargers_externally_control = 0;
1330 			break;
1331 		}
1332 	}
1333 
1334 	if (!chargers_externally_control) {
1335 		if (cm->charger_enabled) {
1336 			try_charger_enable(charger->cm, false);
1337 			charger->externally_control = externally_control;
1338 			try_charger_enable(charger->cm, true);
1339 		} else {
1340 			charger->externally_control = externally_control;
1341 		}
1342 	} else {
1343 		dev_warn(cm->dev,
1344 			 "'%s' regulator should be controlled in charger-manager because charger-manager must need at least one charger for charging\n",
1345 			 charger->regulator_name);
1346 	}
1347 
1348 	return count;
1349 }
1350 
1351 /**
1352  * charger_manager_prepare_sysfs - Prepare sysfs entry for each charger
1353  * @cm: the Charger Manager representing the battery.
1354  *
1355  * This function add sysfs entry for charger(regulator) to control charger from
1356  * user-space. If some development board use one more chargers for charging
1357  * but only need one charger on specific case which is dependent on user
1358  * scenario or hardware restrictions, the user enter 1 or 0(zero) to '/sys/
1359  * class/power_supply/battery/charger.[index]/externally_control'. For example,
1360  * if user enter 1 to 'sys/class/power_supply/battery/charger.[index]/
1361  * externally_control, this charger isn't controlled from charger-manager and
1362  * always stay off state of regulator.
1363  */
1364 static int charger_manager_prepare_sysfs(struct charger_manager *cm)
1365 {
1366 	struct charger_desc *desc = cm->desc;
1367 	struct charger_regulator *charger;
1368 	int chargers_externally_control = 1;
1369 	char *name;
1370 	int i;
1371 
1372 	/* Create sysfs entry to control charger(regulator) */
1373 	for (i = 0; i < desc->num_charger_regulators; i++) {
1374 		charger = &desc->charger_regulators[i];
1375 
1376 		name = devm_kasprintf(cm->dev, GFP_KERNEL, "charger.%d", i);
1377 		if (!name)
1378 			return -ENOMEM;
1379 
1380 		charger->attrs[0] = &charger->attr_name.attr;
1381 		charger->attrs[1] = &charger->attr_state.attr;
1382 		charger->attrs[2] = &charger->attr_externally_control.attr;
1383 		charger->attrs[3] = NULL;
1384 
1385 		charger->attr_grp.name = name;
1386 		charger->attr_grp.attrs = charger->attrs;
1387 		desc->sysfs_groups[i] = &charger->attr_grp;
1388 
1389 		sysfs_attr_init(&charger->attr_name.attr);
1390 		charger->attr_name.attr.name = "name";
1391 		charger->attr_name.attr.mode = 0444;
1392 		charger->attr_name.show = charger_name_show;
1393 
1394 		sysfs_attr_init(&charger->attr_state.attr);
1395 		charger->attr_state.attr.name = "state";
1396 		charger->attr_state.attr.mode = 0444;
1397 		charger->attr_state.show = charger_state_show;
1398 
1399 		sysfs_attr_init(&charger->attr_externally_control.attr);
1400 		charger->attr_externally_control.attr.name
1401 				= "externally_control";
1402 		charger->attr_externally_control.attr.mode = 0644;
1403 		charger->attr_externally_control.show
1404 				= charger_externally_control_show;
1405 		charger->attr_externally_control.store
1406 				= charger_externally_control_store;
1407 
1408 		if (!desc->charger_regulators[i].externally_control ||
1409 				!chargers_externally_control)
1410 			chargers_externally_control = 0;
1411 
1412 		dev_info(cm->dev, "'%s' regulator's externally_control is %d\n",
1413 			 charger->regulator_name, charger->externally_control);
1414 	}
1415 
1416 	if (chargers_externally_control) {
1417 		dev_err(cm->dev, "Cannot register regulator because charger-manager must need at least one charger for charging battery\n");
1418 		return -EINVAL;
1419 	}
1420 
1421 	return 0;
1422 }
1423 
1424 static int cm_init_thermal_data(struct charger_manager *cm,
1425 		struct power_supply *fuel_gauge)
1426 {
1427 	struct charger_desc *desc = cm->desc;
1428 	union power_supply_propval val;
1429 	int ret;
1430 
1431 	/* Verify whether fuel gauge provides battery temperature */
1432 	ret = power_supply_get_property(fuel_gauge,
1433 					POWER_SUPPLY_PROP_TEMP, &val);
1434 
1435 	if (!ret) {
1436 		cm->charger_psy_desc.properties[cm->charger_psy_desc.num_properties] =
1437 				POWER_SUPPLY_PROP_TEMP;
1438 		cm->charger_psy_desc.num_properties++;
1439 		cm->desc->measure_battery_temp = true;
1440 	}
1441 #ifdef CONFIG_THERMAL
1442 	if (ret && desc->thermal_zone) {
1443 		cm->tzd_batt =
1444 			thermal_zone_get_zone_by_name(desc->thermal_zone);
1445 		if (IS_ERR(cm->tzd_batt))
1446 			return PTR_ERR(cm->tzd_batt);
1447 
1448 		/* Use external thermometer */
1449 		cm->charger_psy_desc.properties[cm->charger_psy_desc.num_properties] =
1450 				POWER_SUPPLY_PROP_TEMP_AMBIENT;
1451 		cm->charger_psy_desc.num_properties++;
1452 		cm->desc->measure_battery_temp = true;
1453 		ret = 0;
1454 	}
1455 #endif
1456 	if (cm->desc->measure_battery_temp) {
1457 		/* NOTICE : Default allowable minimum charge temperature is 0 */
1458 		if (!desc->temp_max)
1459 			desc->temp_max = CM_DEFAULT_CHARGE_TEMP_MAX;
1460 		if (!desc->temp_diff)
1461 			desc->temp_diff = CM_DEFAULT_RECHARGE_TEMP_DIFF;
1462 	}
1463 
1464 	return ret;
1465 }
1466 
1467 static const struct of_device_id charger_manager_match[] = {
1468 	{
1469 		.compatible = "charger-manager",
1470 	},
1471 	{},
1472 };
1473 
1474 static struct charger_desc *of_cm_parse_desc(struct device *dev)
1475 {
1476 	struct charger_desc *desc;
1477 	struct device_node *np = dev->of_node;
1478 	u32 poll_mode = CM_POLL_DISABLE;
1479 	u32 battery_stat = CM_NO_BATTERY;
1480 	int num_chgs = 0;
1481 
1482 	desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL);
1483 	if (!desc)
1484 		return ERR_PTR(-ENOMEM);
1485 
1486 	of_property_read_string(np, "cm-name", &desc->psy_name);
1487 
1488 	of_property_read_u32(np, "cm-poll-mode", &poll_mode);
1489 	desc->polling_mode = poll_mode;
1490 
1491 	of_property_read_u32(np, "cm-poll-interval",
1492 				&desc->polling_interval_ms);
1493 
1494 	of_property_read_u32(np, "cm-fullbatt-vchkdrop-ms",
1495 					&desc->fullbatt_vchkdrop_ms);
1496 	of_property_read_u32(np, "cm-fullbatt-vchkdrop-volt",
1497 					&desc->fullbatt_vchkdrop_uV);
1498 	of_property_read_u32(np, "cm-fullbatt-voltage", &desc->fullbatt_uV);
1499 	of_property_read_u32(np, "cm-fullbatt-soc", &desc->fullbatt_soc);
1500 	of_property_read_u32(np, "cm-fullbatt-capacity",
1501 					&desc->fullbatt_full_capacity);
1502 
1503 	of_property_read_u32(np, "cm-battery-stat", &battery_stat);
1504 	desc->battery_present = battery_stat;
1505 
1506 	/* chargers */
1507 	of_property_read_u32(np, "cm-num-chargers", &num_chgs);
1508 	if (num_chgs) {
1509 		int i;
1510 
1511 		/* Allocate empty bin at the tail of array */
1512 		desc->psy_charger_stat = devm_kcalloc(dev,
1513 						      num_chgs + 1,
1514 						      sizeof(char *),
1515 						      GFP_KERNEL);
1516 		if (!desc->psy_charger_stat)
1517 			return ERR_PTR(-ENOMEM);
1518 
1519 		for (i = 0; i < num_chgs; i++)
1520 			of_property_read_string_index(np, "cm-chargers",
1521 						      i, &desc->psy_charger_stat[i]);
1522 	}
1523 
1524 	of_property_read_string(np, "cm-fuel-gauge", &desc->psy_fuel_gauge);
1525 
1526 	of_property_read_string(np, "cm-thermal-zone", &desc->thermal_zone);
1527 
1528 	of_property_read_u32(np, "cm-battery-cold", &desc->temp_min);
1529 	if (of_get_property(np, "cm-battery-cold-in-minus", NULL))
1530 		desc->temp_min *= -1;
1531 	of_property_read_u32(np, "cm-battery-hot", &desc->temp_max);
1532 	of_property_read_u32(np, "cm-battery-temp-diff", &desc->temp_diff);
1533 
1534 	of_property_read_u32(np, "cm-charging-max",
1535 				&desc->charging_max_duration_ms);
1536 	of_property_read_u32(np, "cm-discharging-max",
1537 				&desc->discharging_max_duration_ms);
1538 
1539 	/* battery charger regulators */
1540 	desc->num_charger_regulators = of_get_child_count(np);
1541 	if (desc->num_charger_regulators) {
1542 		struct charger_regulator *chg_regs;
1543 		struct device_node *child;
1544 
1545 		chg_regs = devm_kcalloc(dev,
1546 					desc->num_charger_regulators,
1547 					sizeof(*chg_regs),
1548 					GFP_KERNEL);
1549 		if (!chg_regs)
1550 			return ERR_PTR(-ENOMEM);
1551 
1552 		desc->charger_regulators = chg_regs;
1553 
1554 		desc->sysfs_groups = devm_kcalloc(dev,
1555 					desc->num_charger_regulators + 1,
1556 					sizeof(*desc->sysfs_groups),
1557 					GFP_KERNEL);
1558 		if (!desc->sysfs_groups)
1559 			return ERR_PTR(-ENOMEM);
1560 
1561 		for_each_child_of_node(np, child) {
1562 			struct charger_cable *cables;
1563 			struct device_node *_child;
1564 
1565 			of_property_read_string(child, "cm-regulator-name",
1566 					&chg_regs->regulator_name);
1567 
1568 			/* charger cables */
1569 			chg_regs->num_cables = of_get_child_count(child);
1570 			if (chg_regs->num_cables) {
1571 				cables = devm_kcalloc(dev,
1572 						      chg_regs->num_cables,
1573 						      sizeof(*cables),
1574 						      GFP_KERNEL);
1575 				if (!cables) {
1576 					of_node_put(child);
1577 					return ERR_PTR(-ENOMEM);
1578 				}
1579 
1580 				chg_regs->cables = cables;
1581 
1582 				for_each_child_of_node(child, _child) {
1583 					of_property_read_string(_child,
1584 					"cm-cable-name", &cables->name);
1585 					of_property_read_string(_child,
1586 					"cm-cable-extcon",
1587 					&cables->extcon_name);
1588 					of_property_read_u32(_child,
1589 					"cm-cable-min",
1590 					&cables->min_uA);
1591 					of_property_read_u32(_child,
1592 					"cm-cable-max",
1593 					&cables->max_uA);
1594 					cables++;
1595 				}
1596 			}
1597 			chg_regs++;
1598 		}
1599 	}
1600 	return desc;
1601 }
1602 
1603 static inline struct charger_desc *cm_get_drv_data(struct platform_device *pdev)
1604 {
1605 	if (pdev->dev.of_node)
1606 		return of_cm_parse_desc(&pdev->dev);
1607 	return dev_get_platdata(&pdev->dev);
1608 }
1609 
1610 static enum alarmtimer_restart cm_timer_func(struct alarm *alarm, ktime_t now)
1611 {
1612 	cm_timer_set = false;
1613 	return ALARMTIMER_NORESTART;
1614 }
1615 
1616 static int charger_manager_probe(struct platform_device *pdev)
1617 {
1618 	struct charger_desc *desc = cm_get_drv_data(pdev);
1619 	struct charger_manager *cm;
1620 	int ret, i = 0;
1621 	int j = 0;
1622 	union power_supply_propval val;
1623 	struct power_supply *fuel_gauge;
1624 	struct power_supply_config psy_cfg = {};
1625 
1626 	if (IS_ERR(desc)) {
1627 		dev_err(&pdev->dev, "No platform data (desc) found\n");
1628 		return PTR_ERR(desc);
1629 	}
1630 
1631 	cm = devm_kzalloc(&pdev->dev, sizeof(*cm), GFP_KERNEL);
1632 	if (!cm)
1633 		return -ENOMEM;
1634 
1635 	/* Basic Values. Unspecified are Null or 0 */
1636 	cm->dev = &pdev->dev;
1637 	cm->desc = desc;
1638 	psy_cfg.drv_data = cm;
1639 
1640 	/* Initialize alarm timer */
1641 	if (alarmtimer_get_rtcdev()) {
1642 		cm_timer = devm_kzalloc(cm->dev, sizeof(*cm_timer), GFP_KERNEL);
1643 		if (!cm_timer)
1644 			return -ENOMEM;
1645 		alarm_init(cm_timer, ALARM_BOOTTIME, cm_timer_func);
1646 	}
1647 
1648 	/*
1649 	 * Some of the following do not need to be errors.
1650 	 * Users may intentionally ignore those features.
1651 	 */
1652 	if (desc->fullbatt_uV == 0) {
1653 		dev_info(&pdev->dev, "Ignoring full-battery voltage threshold as it is not supplied\n");
1654 	}
1655 	if (!desc->fullbatt_vchkdrop_ms || !desc->fullbatt_vchkdrop_uV) {
1656 		dev_info(&pdev->dev, "Disabling full-battery voltage drop checking mechanism as it is not supplied\n");
1657 		desc->fullbatt_vchkdrop_ms = 0;
1658 		desc->fullbatt_vchkdrop_uV = 0;
1659 	}
1660 	if (desc->fullbatt_soc == 0) {
1661 		dev_info(&pdev->dev, "Ignoring full-battery soc(state of charge) threshold as it is not supplied\n");
1662 	}
1663 	if (desc->fullbatt_full_capacity == 0) {
1664 		dev_info(&pdev->dev, "Ignoring full-battery full capacity threshold as it is not supplied\n");
1665 	}
1666 
1667 	if (!desc->charger_regulators || desc->num_charger_regulators < 1) {
1668 		dev_err(&pdev->dev, "charger_regulators undefined\n");
1669 		return -EINVAL;
1670 	}
1671 
1672 	if (!desc->psy_charger_stat || !desc->psy_charger_stat[0]) {
1673 		dev_err(&pdev->dev, "No power supply defined\n");
1674 		return -EINVAL;
1675 	}
1676 
1677 	if (!desc->psy_fuel_gauge) {
1678 		dev_err(&pdev->dev, "No fuel gauge power supply defined\n");
1679 		return -EINVAL;
1680 	}
1681 
1682 	/* Check if charger's supplies are present at probe */
1683 	for (i = 0; desc->psy_charger_stat[i]; i++) {
1684 		struct power_supply *psy;
1685 
1686 		psy = power_supply_get_by_name(desc->psy_charger_stat[i]);
1687 		if (!psy) {
1688 			dev_err(&pdev->dev, "Cannot find power supply \"%s\"\n",
1689 				desc->psy_charger_stat[i]);
1690 			return -ENODEV;
1691 		}
1692 		power_supply_put(psy);
1693 	}
1694 
1695 	if (cm->desc->polling_mode != CM_POLL_DISABLE &&
1696 	    (desc->polling_interval_ms == 0 ||
1697 	     msecs_to_jiffies(desc->polling_interval_ms) <= CM_JIFFIES_SMALL)) {
1698 		dev_err(&pdev->dev, "polling_interval_ms is too small\n");
1699 		return -EINVAL;
1700 	}
1701 
1702 	if (!desc->charging_max_duration_ms ||
1703 			!desc->discharging_max_duration_ms) {
1704 		dev_info(&pdev->dev, "Cannot limit charging duration checking mechanism to prevent overcharge/overheat and control discharging duration\n");
1705 		desc->charging_max_duration_ms = 0;
1706 		desc->discharging_max_duration_ms = 0;
1707 	}
1708 
1709 	platform_set_drvdata(pdev, cm);
1710 
1711 	memcpy(&cm->charger_psy_desc, &psy_default, sizeof(psy_default));
1712 
1713 	if (!desc->psy_name)
1714 		strncpy(cm->psy_name_buf, psy_default.name, PSY_NAME_MAX);
1715 	else
1716 		strncpy(cm->psy_name_buf, desc->psy_name, PSY_NAME_MAX);
1717 	cm->charger_psy_desc.name = cm->psy_name_buf;
1718 
1719 	/* Allocate for psy properties because they may vary */
1720 	cm->charger_psy_desc.properties =
1721 		devm_kcalloc(&pdev->dev,
1722 			     ARRAY_SIZE(default_charger_props) +
1723 				NUM_CHARGER_PSY_OPTIONAL,
1724 			     sizeof(enum power_supply_property), GFP_KERNEL);
1725 	if (!cm->charger_psy_desc.properties)
1726 		return -ENOMEM;
1727 
1728 	memcpy(cm->charger_psy_desc.properties, default_charger_props,
1729 		sizeof(enum power_supply_property) *
1730 		ARRAY_SIZE(default_charger_props));
1731 	cm->charger_psy_desc.num_properties = psy_default.num_properties;
1732 
1733 	/* Find which optional psy-properties are available */
1734 	fuel_gauge = power_supply_get_by_name(desc->psy_fuel_gauge);
1735 	if (!fuel_gauge) {
1736 		dev_err(&pdev->dev, "Cannot find power supply \"%s\"\n",
1737 			desc->psy_fuel_gauge);
1738 		return -ENODEV;
1739 	}
1740 	if (!power_supply_get_property(fuel_gauge,
1741 					  POWER_SUPPLY_PROP_CHARGE_NOW, &val)) {
1742 		cm->charger_psy_desc.properties[cm->charger_psy_desc.num_properties] =
1743 				POWER_SUPPLY_PROP_CHARGE_NOW;
1744 		cm->charger_psy_desc.num_properties++;
1745 	}
1746 	if (!power_supply_get_property(fuel_gauge,
1747 					  POWER_SUPPLY_PROP_CURRENT_NOW,
1748 					  &val)) {
1749 		cm->charger_psy_desc.properties[cm->charger_psy_desc.num_properties] =
1750 				POWER_SUPPLY_PROP_CURRENT_NOW;
1751 		cm->charger_psy_desc.num_properties++;
1752 	}
1753 
1754 	ret = cm_init_thermal_data(cm, fuel_gauge);
1755 	if (ret) {
1756 		dev_err(&pdev->dev, "Failed to initialize thermal data\n");
1757 		cm->desc->measure_battery_temp = false;
1758 	}
1759 	power_supply_put(fuel_gauge);
1760 
1761 	INIT_DELAYED_WORK(&cm->fullbatt_vchk_work, fullbatt_vchk);
1762 
1763 	/* Register sysfs entry for charger(regulator) */
1764 	ret = charger_manager_prepare_sysfs(cm);
1765 	if (ret < 0) {
1766 		dev_err(&pdev->dev,
1767 			"Cannot prepare sysfs entry of regulators\n");
1768 		return ret;
1769 	}
1770 	psy_cfg.attr_grp = desc->sysfs_groups;
1771 
1772 	cm->charger_psy = power_supply_register(&pdev->dev,
1773 						&cm->charger_psy_desc,
1774 						&psy_cfg);
1775 	if (IS_ERR(cm->charger_psy)) {
1776 		dev_err(&pdev->dev, "Cannot register charger-manager with name \"%s\"\n",
1777 			cm->charger_psy_desc.name);
1778 		return PTR_ERR(cm->charger_psy);
1779 	}
1780 
1781 	/* Register extcon device for charger cable */
1782 	ret = charger_manager_register_extcon(cm);
1783 	if (ret < 0) {
1784 		dev_err(&pdev->dev, "Cannot initialize extcon device\n");
1785 		goto err_reg_extcon;
1786 	}
1787 
1788 	/* Add to the list */
1789 	mutex_lock(&cm_list_mtx);
1790 	list_add(&cm->entry, &cm_list);
1791 	mutex_unlock(&cm_list_mtx);
1792 
1793 	/*
1794 	 * Charger-manager is capable of waking up the systme from sleep
1795 	 * when event is happened through cm_notify_event()
1796 	 */
1797 	device_init_wakeup(&pdev->dev, true);
1798 	device_set_wakeup_capable(&pdev->dev, false);
1799 
1800 	/*
1801 	 * Charger-manager have to check the charging state right after
1802 	 * initialization of charger-manager and then update current charging
1803 	 * state.
1804 	 */
1805 	cm_monitor();
1806 
1807 	schedule_work(&setup_polling);
1808 
1809 	return 0;
1810 
1811 err_reg_extcon:
1812 	for (i = 0; i < desc->num_charger_regulators; i++) {
1813 		struct charger_regulator *charger;
1814 
1815 		charger = &desc->charger_regulators[i];
1816 		for (j = 0; j < charger->num_cables; j++) {
1817 			struct charger_cable *cable = &charger->cables[j];
1818 			/* Remove notifier block if only edev exists */
1819 			if (cable->extcon_dev.edev)
1820 				extcon_unregister_interest(&cable->extcon_dev);
1821 		}
1822 
1823 		regulator_put(desc->charger_regulators[i].consumer);
1824 	}
1825 
1826 	power_supply_unregister(cm->charger_psy);
1827 
1828 	return ret;
1829 }
1830 
1831 static int charger_manager_remove(struct platform_device *pdev)
1832 {
1833 	struct charger_manager *cm = platform_get_drvdata(pdev);
1834 	struct charger_desc *desc = cm->desc;
1835 	int i = 0;
1836 	int j = 0;
1837 
1838 	/* Remove from the list */
1839 	mutex_lock(&cm_list_mtx);
1840 	list_del(&cm->entry);
1841 	mutex_unlock(&cm_list_mtx);
1842 
1843 	cancel_work_sync(&setup_polling);
1844 	cancel_delayed_work_sync(&cm_monitor_work);
1845 
1846 	for (i = 0 ; i < desc->num_charger_regulators ; i++) {
1847 		struct charger_regulator *charger
1848 				= &desc->charger_regulators[i];
1849 		for (j = 0 ; j < charger->num_cables ; j++) {
1850 			struct charger_cable *cable = &charger->cables[j];
1851 			extcon_unregister_interest(&cable->extcon_dev);
1852 		}
1853 	}
1854 
1855 	for (i = 0 ; i < desc->num_charger_regulators ; i++)
1856 		regulator_put(desc->charger_regulators[i].consumer);
1857 
1858 	power_supply_unregister(cm->charger_psy);
1859 
1860 	try_charger_enable(cm, false);
1861 
1862 	return 0;
1863 }
1864 
1865 static const struct platform_device_id charger_manager_id[] = {
1866 	{ "charger-manager", 0 },
1867 	{ },
1868 };
1869 MODULE_DEVICE_TABLE(platform, charger_manager_id);
1870 
1871 static int cm_suspend_noirq(struct device *dev)
1872 {
1873 	if (device_may_wakeup(dev)) {
1874 		device_set_wakeup_capable(dev, false);
1875 		return -EAGAIN;
1876 	}
1877 
1878 	return 0;
1879 }
1880 
1881 static bool cm_need_to_awake(void)
1882 {
1883 	struct charger_manager *cm;
1884 
1885 	if (cm_timer)
1886 		return false;
1887 
1888 	mutex_lock(&cm_list_mtx);
1889 	list_for_each_entry(cm, &cm_list, entry) {
1890 		if (is_charging(cm)) {
1891 			mutex_unlock(&cm_list_mtx);
1892 			return true;
1893 		}
1894 	}
1895 	mutex_unlock(&cm_list_mtx);
1896 
1897 	return false;
1898 }
1899 
1900 static int cm_suspend_prepare(struct device *dev)
1901 {
1902 	struct charger_manager *cm = dev_get_drvdata(dev);
1903 
1904 	if (cm_need_to_awake())
1905 		return -EBUSY;
1906 
1907 	if (!cm_suspended)
1908 		cm_suspended = true;
1909 
1910 	cm_timer_set = cm_setup_timer();
1911 
1912 	if (cm_timer_set) {
1913 		cancel_work_sync(&setup_polling);
1914 		cancel_delayed_work_sync(&cm_monitor_work);
1915 		cancel_delayed_work(&cm->fullbatt_vchk_work);
1916 	}
1917 
1918 	return 0;
1919 }
1920 
1921 static void cm_suspend_complete(struct device *dev)
1922 {
1923 	struct charger_manager *cm = dev_get_drvdata(dev);
1924 
1925 	if (cm_suspended)
1926 		cm_suspended = false;
1927 
1928 	if (cm_timer_set) {
1929 		ktime_t remain;
1930 
1931 		alarm_cancel(cm_timer);
1932 		cm_timer_set = false;
1933 		remain = alarm_expires_remaining(cm_timer);
1934 		cm_suspend_duration_ms -= ktime_to_ms(remain);
1935 		schedule_work(&setup_polling);
1936 	}
1937 
1938 	_cm_monitor(cm);
1939 
1940 	/* Re-enqueue delayed work (fullbatt_vchk_work) */
1941 	if (cm->fullbatt_vchk_jiffies_at) {
1942 		unsigned long delay = 0;
1943 		unsigned long now = jiffies + CM_JIFFIES_SMALL;
1944 
1945 		if (time_after_eq(now, cm->fullbatt_vchk_jiffies_at)) {
1946 			delay = (unsigned long)((long)now
1947 				- (long)(cm->fullbatt_vchk_jiffies_at));
1948 			delay = jiffies_to_msecs(delay);
1949 		} else {
1950 			delay = 0;
1951 		}
1952 
1953 		/*
1954 		 * Account for cm_suspend_duration_ms with assuming that
1955 		 * timer stops in suspend.
1956 		 */
1957 		if (delay > cm_suspend_duration_ms)
1958 			delay -= cm_suspend_duration_ms;
1959 		else
1960 			delay = 0;
1961 
1962 		queue_delayed_work(cm_wq, &cm->fullbatt_vchk_work,
1963 				   msecs_to_jiffies(delay));
1964 	}
1965 	device_set_wakeup_capable(cm->dev, false);
1966 }
1967 
1968 static const struct dev_pm_ops charger_manager_pm = {
1969 	.prepare	= cm_suspend_prepare,
1970 	.suspend_noirq	= cm_suspend_noirq,
1971 	.complete	= cm_suspend_complete,
1972 };
1973 
1974 static struct platform_driver charger_manager_driver = {
1975 	.driver = {
1976 		.name = "charger-manager",
1977 		.pm = &charger_manager_pm,
1978 		.of_match_table = charger_manager_match,
1979 	},
1980 	.probe = charger_manager_probe,
1981 	.remove = charger_manager_remove,
1982 	.id_table = charger_manager_id,
1983 };
1984 
1985 static int __init charger_manager_init(void)
1986 {
1987 	cm_wq = create_freezable_workqueue("charger_manager");
1988 	if (unlikely(!cm_wq))
1989 		return -ENOMEM;
1990 
1991 	INIT_DELAYED_WORK(&cm_monitor_work, cm_monitor_poller);
1992 
1993 	return platform_driver_register(&charger_manager_driver);
1994 }
1995 late_initcall(charger_manager_init);
1996 
1997 static void __exit charger_manager_cleanup(void)
1998 {
1999 	destroy_workqueue(cm_wq);
2000 	cm_wq = NULL;
2001 
2002 	platform_driver_unregister(&charger_manager_driver);
2003 }
2004 module_exit(charger_manager_cleanup);
2005 
2006 /**
2007  * cm_notify_event - charger driver notify Charger Manager of charger event
2008  * @psy: pointer to instance of charger's power_supply
2009  * @type: type of charger event
2010  * @msg: optional message passed to uevent_notify function
2011  */
2012 void cm_notify_event(struct power_supply *psy, enum cm_event_types type,
2013 		     char *msg)
2014 {
2015 	struct charger_manager *cm;
2016 	bool found_power_supply = false;
2017 
2018 	if (psy == NULL)
2019 		return;
2020 
2021 	mutex_lock(&cm_list_mtx);
2022 	list_for_each_entry(cm, &cm_list, entry) {
2023 		if (match_string(cm->desc->psy_charger_stat, -1,
2024 				 psy->desc->name) >= 0) {
2025 			found_power_supply = true;
2026 			break;
2027 		}
2028 	}
2029 	mutex_unlock(&cm_list_mtx);
2030 
2031 	if (!found_power_supply)
2032 		return;
2033 
2034 	switch (type) {
2035 	case CM_EVENT_BATT_FULL:
2036 		fullbatt_handler(cm);
2037 		break;
2038 	case CM_EVENT_BATT_OUT:
2039 		battout_handler(cm);
2040 		break;
2041 	case CM_EVENT_BATT_IN:
2042 	case CM_EVENT_EXT_PWR_IN_OUT ... CM_EVENT_CHG_START_STOP:
2043 		misc_event_handler(cm, type);
2044 		break;
2045 	case CM_EVENT_UNKNOWN:
2046 	case CM_EVENT_OTHERS:
2047 		uevent_notify(cm, msg ? msg : default_event_names[type]);
2048 		break;
2049 	default:
2050 		dev_err(cm->dev, "%s: type not specified\n", __func__);
2051 		break;
2052 	}
2053 }
2054 EXPORT_SYMBOL_GPL(cm_notify_event);
2055 
2056 MODULE_AUTHOR("MyungJoo Ham <myungjoo.ham@samsung.com>");
2057 MODULE_DESCRIPTION("Charger Manager");
2058 MODULE_LICENSE("GPL");
2059