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 		enum power_supply_property *properties,
1427 		size_t *num_properties)
1428 {
1429 	struct charger_desc *desc = cm->desc;
1430 	union power_supply_propval val;
1431 	int ret;
1432 
1433 	/* Verify whether fuel gauge provides battery temperature */
1434 	ret = power_supply_get_property(fuel_gauge,
1435 					POWER_SUPPLY_PROP_TEMP, &val);
1436 
1437 	if (!ret) {
1438 		properties[*num_properties] = POWER_SUPPLY_PROP_TEMP;
1439 		(*num_properties)++;
1440 		cm->desc->measure_battery_temp = true;
1441 	}
1442 #ifdef CONFIG_THERMAL
1443 	if (ret && desc->thermal_zone) {
1444 		cm->tzd_batt =
1445 			thermal_zone_get_zone_by_name(desc->thermal_zone);
1446 		if (IS_ERR(cm->tzd_batt))
1447 			return PTR_ERR(cm->tzd_batt);
1448 
1449 		/* Use external thermometer */
1450 		properties[*num_properties] = POWER_SUPPLY_PROP_TEMP_AMBIENT;
1451 		(*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 	enum power_supply_property *properties;
1625 	size_t num_properties;
1626 	struct power_supply_config psy_cfg = {};
1627 
1628 	if (IS_ERR(desc)) {
1629 		dev_err(&pdev->dev, "No platform data (desc) found\n");
1630 		return PTR_ERR(desc);
1631 	}
1632 
1633 	cm = devm_kzalloc(&pdev->dev, sizeof(*cm), GFP_KERNEL);
1634 	if (!cm)
1635 		return -ENOMEM;
1636 
1637 	/* Basic Values. Unspecified are Null or 0 */
1638 	cm->dev = &pdev->dev;
1639 	cm->desc = desc;
1640 	psy_cfg.drv_data = cm;
1641 
1642 	/* Initialize alarm timer */
1643 	if (alarmtimer_get_rtcdev()) {
1644 		cm_timer = devm_kzalloc(cm->dev, sizeof(*cm_timer), GFP_KERNEL);
1645 		if (!cm_timer)
1646 			return -ENOMEM;
1647 		alarm_init(cm_timer, ALARM_BOOTTIME, cm_timer_func);
1648 	}
1649 
1650 	/*
1651 	 * Some of the following do not need to be errors.
1652 	 * Users may intentionally ignore those features.
1653 	 */
1654 	if (desc->fullbatt_uV == 0) {
1655 		dev_info(&pdev->dev, "Ignoring full-battery voltage threshold as it is not supplied\n");
1656 	}
1657 	if (!desc->fullbatt_vchkdrop_ms || !desc->fullbatt_vchkdrop_uV) {
1658 		dev_info(&pdev->dev, "Disabling full-battery voltage drop checking mechanism as it is not supplied\n");
1659 		desc->fullbatt_vchkdrop_ms = 0;
1660 		desc->fullbatt_vchkdrop_uV = 0;
1661 	}
1662 	if (desc->fullbatt_soc == 0) {
1663 		dev_info(&pdev->dev, "Ignoring full-battery soc(state of charge) threshold as it is not supplied\n");
1664 	}
1665 	if (desc->fullbatt_full_capacity == 0) {
1666 		dev_info(&pdev->dev, "Ignoring full-battery full capacity threshold as it is not supplied\n");
1667 	}
1668 
1669 	if (!desc->charger_regulators || desc->num_charger_regulators < 1) {
1670 		dev_err(&pdev->dev, "charger_regulators undefined\n");
1671 		return -EINVAL;
1672 	}
1673 
1674 	if (!desc->psy_charger_stat || !desc->psy_charger_stat[0]) {
1675 		dev_err(&pdev->dev, "No power supply defined\n");
1676 		return -EINVAL;
1677 	}
1678 
1679 	if (!desc->psy_fuel_gauge) {
1680 		dev_err(&pdev->dev, "No fuel gauge power supply defined\n");
1681 		return -EINVAL;
1682 	}
1683 
1684 	/* Check if charger's supplies are present at probe */
1685 	for (i = 0; desc->psy_charger_stat[i]; i++) {
1686 		struct power_supply *psy;
1687 
1688 		psy = power_supply_get_by_name(desc->psy_charger_stat[i]);
1689 		if (!psy) {
1690 			dev_err(&pdev->dev, "Cannot find power supply \"%s\"\n",
1691 				desc->psy_charger_stat[i]);
1692 			return -ENODEV;
1693 		}
1694 		power_supply_put(psy);
1695 	}
1696 
1697 	if (cm->desc->polling_mode != CM_POLL_DISABLE &&
1698 	    (desc->polling_interval_ms == 0 ||
1699 	     msecs_to_jiffies(desc->polling_interval_ms) <= CM_JIFFIES_SMALL)) {
1700 		dev_err(&pdev->dev, "polling_interval_ms is too small\n");
1701 		return -EINVAL;
1702 	}
1703 
1704 	if (!desc->charging_max_duration_ms ||
1705 			!desc->discharging_max_duration_ms) {
1706 		dev_info(&pdev->dev, "Cannot limit charging duration checking mechanism to prevent overcharge/overheat and control discharging duration\n");
1707 		desc->charging_max_duration_ms = 0;
1708 		desc->discharging_max_duration_ms = 0;
1709 	}
1710 
1711 	platform_set_drvdata(pdev, cm);
1712 
1713 	memcpy(&cm->charger_psy_desc, &psy_default, sizeof(psy_default));
1714 
1715 	if (!desc->psy_name)
1716 		strncpy(cm->psy_name_buf, psy_default.name, PSY_NAME_MAX);
1717 	else
1718 		strncpy(cm->psy_name_buf, desc->psy_name, PSY_NAME_MAX);
1719 	cm->charger_psy_desc.name = cm->psy_name_buf;
1720 
1721 	/* Allocate for psy properties because they may vary */
1722 	properties = devm_kcalloc(&pdev->dev,
1723 			     ARRAY_SIZE(default_charger_props) +
1724 				NUM_CHARGER_PSY_OPTIONAL,
1725 			     sizeof(*properties), GFP_KERNEL);
1726 	if (!properties)
1727 		return -ENOMEM;
1728 
1729 	memcpy(properties, default_charger_props,
1730 		sizeof(enum power_supply_property) *
1731 		ARRAY_SIZE(default_charger_props));
1732 	num_properties = ARRAY_SIZE(default_charger_props);
1733 
1734 	/* Find which optional psy-properties are available */
1735 	fuel_gauge = power_supply_get_by_name(desc->psy_fuel_gauge);
1736 	if (!fuel_gauge) {
1737 		dev_err(&pdev->dev, "Cannot find power supply \"%s\"\n",
1738 			desc->psy_fuel_gauge);
1739 		return -ENODEV;
1740 	}
1741 	if (!power_supply_get_property(fuel_gauge,
1742 					  POWER_SUPPLY_PROP_CHARGE_NOW, &val)) {
1743 		properties[num_properties] =
1744 				POWER_SUPPLY_PROP_CHARGE_NOW;
1745 		num_properties++;
1746 	}
1747 	if (!power_supply_get_property(fuel_gauge,
1748 					  POWER_SUPPLY_PROP_CURRENT_NOW,
1749 					  &val)) {
1750 		properties[num_properties] =
1751 				POWER_SUPPLY_PROP_CURRENT_NOW;
1752 		num_properties++;
1753 	}
1754 
1755 	ret = cm_init_thermal_data(cm, fuel_gauge, properties, &num_properties);
1756 	if (ret) {
1757 		dev_err(&pdev->dev, "Failed to initialize thermal data\n");
1758 		cm->desc->measure_battery_temp = false;
1759 	}
1760 	power_supply_put(fuel_gauge);
1761 
1762 	cm->charger_psy_desc.properties = properties;
1763 	cm->charger_psy_desc.num_properties = num_properties;
1764 
1765 	INIT_DELAYED_WORK(&cm->fullbatt_vchk_work, fullbatt_vchk);
1766 
1767 	/* Register sysfs entry for charger(regulator) */
1768 	ret = charger_manager_prepare_sysfs(cm);
1769 	if (ret < 0) {
1770 		dev_err(&pdev->dev,
1771 			"Cannot prepare sysfs entry of regulators\n");
1772 		return ret;
1773 	}
1774 	psy_cfg.attr_grp = desc->sysfs_groups;
1775 
1776 	cm->charger_psy = power_supply_register(&pdev->dev,
1777 						&cm->charger_psy_desc,
1778 						&psy_cfg);
1779 	if (IS_ERR(cm->charger_psy)) {
1780 		dev_err(&pdev->dev, "Cannot register charger-manager with name \"%s\"\n",
1781 			cm->charger_psy_desc.name);
1782 		return PTR_ERR(cm->charger_psy);
1783 	}
1784 
1785 	/* Register extcon device for charger cable */
1786 	ret = charger_manager_register_extcon(cm);
1787 	if (ret < 0) {
1788 		dev_err(&pdev->dev, "Cannot initialize extcon device\n");
1789 		goto err_reg_extcon;
1790 	}
1791 
1792 	/* Add to the list */
1793 	mutex_lock(&cm_list_mtx);
1794 	list_add(&cm->entry, &cm_list);
1795 	mutex_unlock(&cm_list_mtx);
1796 
1797 	/*
1798 	 * Charger-manager is capable of waking up the systme from sleep
1799 	 * when event is happened through cm_notify_event()
1800 	 */
1801 	device_init_wakeup(&pdev->dev, true);
1802 	device_set_wakeup_capable(&pdev->dev, false);
1803 
1804 	/*
1805 	 * Charger-manager have to check the charging state right after
1806 	 * initialization of charger-manager and then update current charging
1807 	 * state.
1808 	 */
1809 	cm_monitor();
1810 
1811 	schedule_work(&setup_polling);
1812 
1813 	return 0;
1814 
1815 err_reg_extcon:
1816 	for (i = 0; i < desc->num_charger_regulators; i++) {
1817 		struct charger_regulator *charger;
1818 
1819 		charger = &desc->charger_regulators[i];
1820 		for (j = 0; j < charger->num_cables; j++) {
1821 			struct charger_cable *cable = &charger->cables[j];
1822 			/* Remove notifier block if only edev exists */
1823 			if (cable->extcon_dev.edev)
1824 				extcon_unregister_interest(&cable->extcon_dev);
1825 		}
1826 
1827 		regulator_put(desc->charger_regulators[i].consumer);
1828 	}
1829 
1830 	power_supply_unregister(cm->charger_psy);
1831 
1832 	return ret;
1833 }
1834 
1835 static int charger_manager_remove(struct platform_device *pdev)
1836 {
1837 	struct charger_manager *cm = platform_get_drvdata(pdev);
1838 	struct charger_desc *desc = cm->desc;
1839 	int i = 0;
1840 	int j = 0;
1841 
1842 	/* Remove from the list */
1843 	mutex_lock(&cm_list_mtx);
1844 	list_del(&cm->entry);
1845 	mutex_unlock(&cm_list_mtx);
1846 
1847 	cancel_work_sync(&setup_polling);
1848 	cancel_delayed_work_sync(&cm_monitor_work);
1849 
1850 	for (i = 0 ; i < desc->num_charger_regulators ; i++) {
1851 		struct charger_regulator *charger
1852 				= &desc->charger_regulators[i];
1853 		for (j = 0 ; j < charger->num_cables ; j++) {
1854 			struct charger_cable *cable = &charger->cables[j];
1855 			extcon_unregister_interest(&cable->extcon_dev);
1856 		}
1857 	}
1858 
1859 	for (i = 0 ; i < desc->num_charger_regulators ; i++)
1860 		regulator_put(desc->charger_regulators[i].consumer);
1861 
1862 	power_supply_unregister(cm->charger_psy);
1863 
1864 	try_charger_enable(cm, false);
1865 
1866 	return 0;
1867 }
1868 
1869 static const struct platform_device_id charger_manager_id[] = {
1870 	{ "charger-manager", 0 },
1871 	{ },
1872 };
1873 MODULE_DEVICE_TABLE(platform, charger_manager_id);
1874 
1875 static int cm_suspend_noirq(struct device *dev)
1876 {
1877 	if (device_may_wakeup(dev)) {
1878 		device_set_wakeup_capable(dev, false);
1879 		return -EAGAIN;
1880 	}
1881 
1882 	return 0;
1883 }
1884 
1885 static bool cm_need_to_awake(void)
1886 {
1887 	struct charger_manager *cm;
1888 
1889 	if (cm_timer)
1890 		return false;
1891 
1892 	mutex_lock(&cm_list_mtx);
1893 	list_for_each_entry(cm, &cm_list, entry) {
1894 		if (is_charging(cm)) {
1895 			mutex_unlock(&cm_list_mtx);
1896 			return true;
1897 		}
1898 	}
1899 	mutex_unlock(&cm_list_mtx);
1900 
1901 	return false;
1902 }
1903 
1904 static int cm_suspend_prepare(struct device *dev)
1905 {
1906 	struct charger_manager *cm = dev_get_drvdata(dev);
1907 
1908 	if (cm_need_to_awake())
1909 		return -EBUSY;
1910 
1911 	if (!cm_suspended)
1912 		cm_suspended = true;
1913 
1914 	cm_timer_set = cm_setup_timer();
1915 
1916 	if (cm_timer_set) {
1917 		cancel_work_sync(&setup_polling);
1918 		cancel_delayed_work_sync(&cm_monitor_work);
1919 		cancel_delayed_work(&cm->fullbatt_vchk_work);
1920 	}
1921 
1922 	return 0;
1923 }
1924 
1925 static void cm_suspend_complete(struct device *dev)
1926 {
1927 	struct charger_manager *cm = dev_get_drvdata(dev);
1928 
1929 	if (cm_suspended)
1930 		cm_suspended = false;
1931 
1932 	if (cm_timer_set) {
1933 		ktime_t remain;
1934 
1935 		alarm_cancel(cm_timer);
1936 		cm_timer_set = false;
1937 		remain = alarm_expires_remaining(cm_timer);
1938 		cm_suspend_duration_ms -= ktime_to_ms(remain);
1939 		schedule_work(&setup_polling);
1940 	}
1941 
1942 	_cm_monitor(cm);
1943 
1944 	/* Re-enqueue delayed work (fullbatt_vchk_work) */
1945 	if (cm->fullbatt_vchk_jiffies_at) {
1946 		unsigned long delay = 0;
1947 		unsigned long now = jiffies + CM_JIFFIES_SMALL;
1948 
1949 		if (time_after_eq(now, cm->fullbatt_vchk_jiffies_at)) {
1950 			delay = (unsigned long)((long)now
1951 				- (long)(cm->fullbatt_vchk_jiffies_at));
1952 			delay = jiffies_to_msecs(delay);
1953 		} else {
1954 			delay = 0;
1955 		}
1956 
1957 		/*
1958 		 * Account for cm_suspend_duration_ms with assuming that
1959 		 * timer stops in suspend.
1960 		 */
1961 		if (delay > cm_suspend_duration_ms)
1962 			delay -= cm_suspend_duration_ms;
1963 		else
1964 			delay = 0;
1965 
1966 		queue_delayed_work(cm_wq, &cm->fullbatt_vchk_work,
1967 				   msecs_to_jiffies(delay));
1968 	}
1969 	device_set_wakeup_capable(cm->dev, false);
1970 }
1971 
1972 static const struct dev_pm_ops charger_manager_pm = {
1973 	.prepare	= cm_suspend_prepare,
1974 	.suspend_noirq	= cm_suspend_noirq,
1975 	.complete	= cm_suspend_complete,
1976 };
1977 
1978 static struct platform_driver charger_manager_driver = {
1979 	.driver = {
1980 		.name = "charger-manager",
1981 		.pm = &charger_manager_pm,
1982 		.of_match_table = charger_manager_match,
1983 	},
1984 	.probe = charger_manager_probe,
1985 	.remove = charger_manager_remove,
1986 	.id_table = charger_manager_id,
1987 };
1988 
1989 static int __init charger_manager_init(void)
1990 {
1991 	cm_wq = create_freezable_workqueue("charger_manager");
1992 	if (unlikely(!cm_wq))
1993 		return -ENOMEM;
1994 
1995 	INIT_DELAYED_WORK(&cm_monitor_work, cm_monitor_poller);
1996 
1997 	return platform_driver_register(&charger_manager_driver);
1998 }
1999 late_initcall(charger_manager_init);
2000 
2001 static void __exit charger_manager_cleanup(void)
2002 {
2003 	destroy_workqueue(cm_wq);
2004 	cm_wq = NULL;
2005 
2006 	platform_driver_unregister(&charger_manager_driver);
2007 }
2008 module_exit(charger_manager_cleanup);
2009 
2010 /**
2011  * cm_notify_event - charger driver notify Charger Manager of charger event
2012  * @psy: pointer to instance of charger's power_supply
2013  * @type: type of charger event
2014  * @msg: optional message passed to uevent_notify function
2015  */
2016 void cm_notify_event(struct power_supply *psy, enum cm_event_types type,
2017 		     char *msg)
2018 {
2019 	struct charger_manager *cm;
2020 	bool found_power_supply = false;
2021 
2022 	if (psy == NULL)
2023 		return;
2024 
2025 	mutex_lock(&cm_list_mtx);
2026 	list_for_each_entry(cm, &cm_list, entry) {
2027 		if (match_string(cm->desc->psy_charger_stat, -1,
2028 				 psy->desc->name) >= 0) {
2029 			found_power_supply = true;
2030 			break;
2031 		}
2032 	}
2033 	mutex_unlock(&cm_list_mtx);
2034 
2035 	if (!found_power_supply)
2036 		return;
2037 
2038 	switch (type) {
2039 	case CM_EVENT_BATT_FULL:
2040 		fullbatt_handler(cm);
2041 		break;
2042 	case CM_EVENT_BATT_OUT:
2043 		battout_handler(cm);
2044 		break;
2045 	case CM_EVENT_BATT_IN:
2046 	case CM_EVENT_EXT_PWR_IN_OUT ... CM_EVENT_CHG_START_STOP:
2047 		misc_event_handler(cm, type);
2048 		break;
2049 	case CM_EVENT_UNKNOWN:
2050 	case CM_EVENT_OTHERS:
2051 		uevent_notify(cm, msg ? msg : default_event_names[type]);
2052 		break;
2053 	default:
2054 		dev_err(cm->dev, "%s: type not specified\n", __func__);
2055 		break;
2056 	}
2057 }
2058 EXPORT_SYMBOL_GPL(cm_notify_event);
2059 
2060 MODULE_AUTHOR("MyungJoo Ham <myungjoo.ham@samsung.com>");
2061 MODULE_DESCRIPTION("Charger Manager");
2062 MODULE_LICENSE("GPL");
2063