2 * battery-charger-gauge-comm.c -- Communication between battery charger and
3 * battery gauge driver.
5 * Copyright (c) 2013-2014, NVIDIA CORPORATION. All rights reserved.
7 * Author: Laxman Dewangan <ldewangan@nvidia.com>
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License as
11 * published by the Free Software Foundation version 2.
13 * This program is distributed "as is" WITHOUT ANY WARRANTY of any kind,
14 * whether express or implied; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
24 #include <linux/alarmtimer.h>
25 #include <linux/module.h>
26 #include <linux/err.h>
27 #include <linux/export.h>
28 #include <linux/workqueue.h>
29 #include <linux/delay.h>
30 #include <linux/sched.h>
31 #include <linux/slab.h>
32 #include <linux/mutex.h>
33 #include <linux/thermal.h>
34 #include <linux/list.h>
35 #include <linux/rtc.h>
36 #include <linux/time.h>
37 #include <linux/timer.h>
38 #include <linux/power/battery-charger-gauge-comm.h>
39 #include <linux/power/reset/system-pmic.h>
40 #include <linux/wakelock.h>
41 #include <linux/iio/consumer.h>
42 #include <linux/iio/types.h>
43 #include <linux/iio/iio.h>
45 #define JETI_TEMP_COLD 0
46 #define JETI_TEMP_COOL 10
47 #define JETI_TEMP_WARM 45
48 #define JETI_TEMP_HOT 60
50 #define MAX_STR_PRINT 50
52 static DEFINE_MUTEX(charger_gauge_list_mutex);
53 static LIST_HEAD(charger_list);
54 static LIST_HEAD(gauge_list);
56 struct battery_charger_dev {
59 struct device *parent_dev;
60 struct battery_charging_ops *ops;
61 struct list_head list;
63 struct delayed_work restart_charging_wq;
64 struct delayed_work poll_temp_monitor_wq;
66 struct thermal_zone_device *battery_tz;
67 bool start_monitoring;
68 struct wake_lock charger_wake_lock;
70 struct rtc_device *rtc;
71 bool enable_thermal_monitor;
74 struct battery_gauge_dev {
77 struct device *parent_dev;
78 struct battery_gauge_ops *ops;
79 struct list_head list;
81 struct thermal_zone_device *battery_tz;
84 int battery_snapshot_voltage;
85 int battery_snapshot_capacity;
86 const char *bat_curr_channel_name;
87 struct iio_channel *bat_current_iio_channel;
90 struct battery_gauge_dev *bg_temp;
92 static void battery_charger_restart_charging_wq(struct work_struct *work)
94 struct battery_charger_dev *bc_dev;
96 bc_dev = container_of(work, struct battery_charger_dev,
97 restart_charging_wq.work);
98 if (!bc_dev->ops->restart_charging) {
99 dev_err(bc_dev->parent_dev,
100 "No callback for restart charging\n");
103 bc_dev->ops->restart_charging(bc_dev);
106 static void battery_charger_thermal_monitor_wq(struct work_struct *work)
108 struct battery_charger_dev *bc_dev;
111 bool charger_enable_state;
112 bool charger_current_half;
113 int battery_thersold_voltage;
116 bc_dev = container_of(work, struct battery_charger_dev,
117 poll_temp_monitor_wq.work);
118 if (!bc_dev->tz_name)
121 dev = bc_dev->parent_dev;
122 if (!bc_dev->battery_tz) {
123 bc_dev->battery_tz = thermal_zone_device_find_by_name(
126 if (!bc_dev->battery_tz) {
128 "Battery thermal zone %s is not registered yet\n",
130 schedule_delayed_work(&bc_dev->poll_temp_monitor_wq,
131 msecs_to_jiffies(bc_dev->polling_time_sec * HZ));
136 ret = thermal_zone_get_temp(bc_dev->battery_tz, &temperature);
138 dev_err(dev, "Temperature read failed: %d\n ", ret);
141 temperature = temperature / 1000;
143 charger_enable_state = true;
144 charger_current_half = false;
145 battery_thersold_voltage = 4250;
147 if (temperature <= JETI_TEMP_COLD || temperature >= JETI_TEMP_HOT) {
148 charger_enable_state = false;
149 } else if (temperature <= JETI_TEMP_COOL ||
150 temperature >= JETI_TEMP_WARM) {
151 charger_current_half = true;
152 battery_thersold_voltage = 4100;
155 if (bc_dev->ops->thermal_configure)
156 bc_dev->ops->thermal_configure(bc_dev, temperature,
157 charger_enable_state, charger_current_half,
158 battery_thersold_voltage);
161 if (bc_dev->start_monitoring)
162 schedule_delayed_work(&bc_dev->poll_temp_monitor_wq,
163 msecs_to_jiffies(bc_dev->polling_time_sec * HZ));
167 int battery_charger_set_current_broadcast(struct battery_charger_dev *bc_dev)
169 struct battery_gauge_dev *bg_dev;
176 mutex_lock(&charger_gauge_list_mutex);
178 list_for_each_entry(bg_dev, &gauge_list, list) {
179 if (bg_dev->cell_id != bc_dev->cell_id)
181 if (bg_dev->ops && bg_dev->ops->set_current_broadcast)
182 ret = bg_dev->ops->set_current_broadcast(bg_dev);
185 mutex_unlock(&charger_gauge_list_mutex);
188 EXPORT_SYMBOL_GPL(battery_charger_set_current_broadcast);
190 int battery_charger_thermal_start_monitoring(
191 struct battery_charger_dev *bc_dev)
193 if (!bc_dev || !bc_dev->polling_time_sec || !bc_dev->tz_name)
196 bc_dev->start_monitoring = true;
197 schedule_delayed_work(&bc_dev->poll_temp_monitor_wq,
198 msecs_to_jiffies(bc_dev->polling_time_sec * HZ));
201 EXPORT_SYMBOL_GPL(battery_charger_thermal_start_monitoring);
203 int battery_charger_thermal_stop_monitoring(
204 struct battery_charger_dev *bc_dev)
206 if (!bc_dev || !bc_dev->polling_time_sec || !bc_dev->tz_name)
209 bc_dev->start_monitoring = false;
210 cancel_delayed_work(&bc_dev->poll_temp_monitor_wq);
213 EXPORT_SYMBOL_GPL(battery_charger_thermal_stop_monitoring);
215 int battery_charger_acquire_wake_lock(struct battery_charger_dev *bc_dev)
217 if (!bc_dev->locked) {
218 wake_lock(&bc_dev->charger_wake_lock);
219 bc_dev->locked = true;
223 EXPORT_SYMBOL_GPL(battery_charger_acquire_wake_lock);
225 int battery_charger_release_wake_lock(struct battery_charger_dev *bc_dev)
227 if (bc_dev->locked) {
228 wake_unlock(&bc_dev->charger_wake_lock);
229 bc_dev->locked = false;
233 EXPORT_SYMBOL_GPL(battery_charger_release_wake_lock);
235 int battery_charging_restart(struct battery_charger_dev *bc_dev, int after_sec)
237 if (!bc_dev->ops->restart_charging) {
238 dev_err(bc_dev->parent_dev,
239 "No callback for restart charging\n");
242 schedule_delayed_work(&bc_dev->restart_charging_wq,
243 msecs_to_jiffies(after_sec * HZ));
246 EXPORT_SYMBOL_GPL(battery_charging_restart);
248 static ssize_t battery_show_snapshot_voltage(struct device *dev,
249 struct device_attribute *attr,
252 struct battery_gauge_dev *bg_dev = bg_temp;
254 return snprintf(buf, MAX_STR_PRINT, "%d\n",
255 bg_dev->battery_snapshot_voltage);
258 static ssize_t battery_show_snapshot_capacity(struct device *dev,
259 struct device_attribute *attr,
262 struct battery_gauge_dev *bg_dev = bg_temp;
264 return snprintf(buf, MAX_STR_PRINT, "%d\n",
265 bg_dev->battery_snapshot_capacity);
268 static ssize_t battery_show_max_capacity(struct device *dev,
269 struct device_attribute *attr,
272 struct iio_channel *channel;
275 channel = iio_channel_get(dev, "batt_id");
276 if (IS_ERR(channel)) {
278 "%s: Failed to get channel batt_id, %ld\n",
279 __func__, PTR_ERR(channel));
283 ret = iio_read_channel_raw(channel, &val);
286 "%s: Failed to read channel, %d\n",
291 return snprintf(buf, MAX_STR_PRINT, "%d\n", val);
294 static DEVICE_ATTR(battery_snapshot_voltage, S_IRUGO,
295 battery_show_snapshot_voltage, NULL);
297 static DEVICE_ATTR(battery_snapshot_capacity, S_IRUGO,
298 battery_show_snapshot_capacity, NULL);
300 static DEVICE_ATTR(battery_max_capacity, S_IRUGO,
301 battery_show_max_capacity, NULL);
303 static struct attribute *battery_snapshot_attributes[] = {
304 &dev_attr_battery_snapshot_voltage.attr,
305 &dev_attr_battery_snapshot_capacity.attr,
306 &dev_attr_battery_max_capacity.attr,
310 static const struct attribute_group battery_snapshot_attr_group = {
311 .attrs = battery_snapshot_attributes,
314 int battery_gauge_record_voltage_value(struct battery_gauge_dev *bg_dev,
320 bg_dev->battery_voltage = voltage;
324 EXPORT_SYMBOL_GPL(battery_gauge_record_voltage_value);
326 int battery_gauge_record_capacity_value(struct battery_gauge_dev *bg_dev,
332 bg_dev->battery_capacity = capacity;
336 EXPORT_SYMBOL_GPL(battery_gauge_record_capacity_value);
338 int battery_gauge_record_snapshot_values(struct battery_gauge_dev *bg_dev,
345 bg_dev->battery_snapshot_voltage = bg_dev->battery_voltage;
346 bg_dev->battery_snapshot_capacity = bg_dev->battery_capacity;
350 EXPORT_SYMBOL_GPL(battery_gauge_record_snapshot_values);
352 int battery_gauge_report_battery_soc(struct battery_gauge_dev *bg_dev,
355 struct battery_charger_dev *node;
361 if (battery_soc < 90 || battery_soc > 100)
364 mutex_lock(&charger_gauge_list_mutex);
366 list_for_each_entry(node, &charger_list, list) {
367 if (node->cell_id != bg_dev->cell_id)
369 if (node->ops && node->ops->input_voltage_configure)
370 ret = node->ops->input_voltage_configure(node,
374 mutex_unlock(&charger_gauge_list_mutex);
377 EXPORT_SYMBOL_GPL(battery_gauge_report_battery_soc);
379 int battery_gauge_get_scaled_soc(struct battery_gauge_dev *bg_dev,
380 int actual_soc_semi, int thresod_soc)
382 int thresod_soc_semi = thresod_soc * 100;
384 if (actual_soc_semi >= 10000)
387 if (actual_soc_semi <= thresod_soc_semi)
390 return (actual_soc_semi - thresod_soc_semi) / (100 - thresod_soc);
392 EXPORT_SYMBOL_GPL(battery_gauge_get_scaled_soc);
394 int battery_gauge_get_adjusted_soc(struct battery_gauge_dev *bg_dev,
395 int min_soc, int max_soc, int actual_soc_semi)
397 int min_soc_semi = min_soc * 100;
398 int max_soc_semi = max_soc * 100;
400 if (actual_soc_semi >= max_soc_semi)
403 if (actual_soc_semi <= min_soc_semi)
406 return (actual_soc_semi - min_soc_semi + 50) / (max_soc - min_soc);
408 EXPORT_SYMBOL_GPL(battery_gauge_get_adjusted_soc);
410 void battery_charging_restart_cancel(struct battery_charger_dev *bc_dev)
412 if (!bc_dev->ops->restart_charging) {
413 dev_err(bc_dev->parent_dev,
414 "No callback for restart charging\n");
417 cancel_delayed_work(&bc_dev->restart_charging_wq);
419 EXPORT_SYMBOL_GPL(battery_charging_restart_cancel);
421 int battery_charging_wakeup(struct battery_charger_dev *bc_dev, int after_sec)
425 struct rtc_wkalrm alm;
426 int alarm_time = after_sec;
431 bc_dev->rtc = alarmtimer_get_rtcdev();
433 dev_err(bc_dev->parent_dev, "No RTC device found\n");
438 ret = rtc_read_time(bc_dev->rtc, &alm.time);
440 dev_err(bc_dev->parent_dev, "RTC read time failed %d\n", ret);
443 rtc_tm_to_time(&alm.time, &now);
445 rtc_time_to_tm(now + alarm_time, &alm.time);
446 ret = rtc_set_alarm(bc_dev->rtc, &alm);
448 dev_err(bc_dev->parent_dev, "RTC set alarm failed %d\n", ret);
455 EXPORT_SYMBOL_GPL(battery_charging_wakeup);
457 int battery_charging_system_reset_after(struct battery_charger_dev *bc_dev,
460 struct system_pmic_rtc_data rtc_data;
463 dev_info(bc_dev->parent_dev, "Setting system on after %d sec\n",
465 battery_charging_wakeup(bc_dev, after_sec);
466 rtc_data.power_on_after_sec = after_sec;
468 ret = system_pmic_set_power_on_event(SYSTEM_PMIC_RTC_ALARM, &rtc_data);
470 dev_err(bc_dev->parent_dev,
471 "Setting power on event failed: %d\n", ret);
474 EXPORT_SYMBOL_GPL(battery_charging_system_reset_after);
476 int battery_charging_system_power_on_usb_event(
477 struct battery_charger_dev *bc_dev)
481 dev_info(bc_dev->parent_dev,
482 "Setting system on with USB connect/disconnect\n");
484 ret = system_pmic_set_power_on_event(SYSTEM_PMIC_USB_VBUS_INSERTION,
487 dev_err(bc_dev->parent_dev,
488 "Setting power on event failed: %d\n", ret);
491 EXPORT_SYMBOL_GPL(battery_charging_system_power_on_usb_event);
493 struct battery_charger_dev *battery_charger_register(struct device *dev,
494 struct battery_charger_info *bci, void *drv_data)
496 struct battery_charger_dev *bc_dev;
498 dev_info(dev, "Registering battery charger driver\n");
501 dev_err(dev, "Invalid parameters\n");
502 return ERR_PTR(-EINVAL);
505 bc_dev = kzalloc(sizeof(*bc_dev), GFP_KERNEL);
507 dev_err(dev, "Memory alloc for bc_dev failed\n");
508 return ERR_PTR(-ENOMEM);
511 mutex_lock(&charger_gauge_list_mutex);
513 INIT_LIST_HEAD(&bc_dev->list);
514 bc_dev->cell_id = bci->cell_id;
515 bc_dev->ops = bci->bc_ops;
516 bc_dev->parent_dev = dev;
517 bc_dev->drv_data = drv_data;
519 /* Thermal monitoring */
521 bc_dev->tz_name = kstrdup(bci->tz_name, GFP_KERNEL);
522 bc_dev->polling_time_sec = bci->polling_time_sec;
523 bc_dev->enable_thermal_monitor = true;
524 INIT_DELAYED_WORK(&bc_dev->poll_temp_monitor_wq,
525 battery_charger_thermal_monitor_wq);
528 INIT_DELAYED_WORK(&bc_dev->restart_charging_wq,
529 battery_charger_restart_charging_wq);
531 wake_lock_init(&bc_dev->charger_wake_lock, WAKE_LOCK_SUSPEND,
532 "charger-suspend-lock");
533 list_add(&bc_dev->list, &charger_list);
534 mutex_unlock(&charger_gauge_list_mutex);
537 EXPORT_SYMBOL_GPL(battery_charger_register);
539 void battery_charger_unregister(struct battery_charger_dev *bc_dev)
541 mutex_lock(&charger_gauge_list_mutex);
542 list_del(&bc_dev->list);
543 if (bc_dev->polling_time_sec)
544 cancel_delayed_work(&bc_dev->poll_temp_monitor_wq);
545 cancel_delayed_work(&bc_dev->restart_charging_wq);
546 wake_lock_destroy(&bc_dev->charger_wake_lock);
547 mutex_unlock(&charger_gauge_list_mutex);
550 EXPORT_SYMBOL_GPL(battery_charger_unregister);
552 int battery_gauge_get_battery_temperature(struct battery_gauge_dev *bg_dev,
558 if (!bg_dev || !bg_dev->tz_name)
561 if (!bg_dev->battery_tz)
563 thermal_zone_device_find_by_name(bg_dev->tz_name);
565 if (!bg_dev->battery_tz) {
566 dev_info(bg_dev->parent_dev,
567 "Battery thermal zone %s is not registered yet\n",
572 ret = thermal_zone_get_temp(bg_dev->battery_tz, &temperature);
576 *temp = temperature / 1000;
579 EXPORT_SYMBOL_GPL(battery_gauge_get_battery_temperature);
581 int battery_gauge_get_battery_current(struct battery_gauge_dev *bg_dev,
586 if (!bg_dev || !bg_dev->bat_curr_channel_name)
589 if (!bg_dev->bat_current_iio_channel)
590 bg_dev->bat_current_iio_channel =
591 iio_channel_get(bg_dev->parent_dev,
592 bg_dev->bat_curr_channel_name);
593 if (!bg_dev->bat_current_iio_channel || IS_ERR(bg_dev->bat_current_iio_channel)) {
594 dev_info(bg_dev->parent_dev,
595 "Battery IIO current channel %s not registered yet\n",
596 bg_dev->bat_curr_channel_name);
597 bg_dev->bat_current_iio_channel = NULL;
601 ret = iio_read_channel_processed(bg_dev->bat_current_iio_channel,
604 dev_err(bg_dev->parent_dev, " The channel read failed: %d\n", ret);
609 EXPORT_SYMBOL_GPL(battery_gauge_get_battery_current);
611 struct battery_gauge_dev *battery_gauge_register(struct device *dev,
612 struct battery_gauge_info *bgi, void *drv_data)
614 struct battery_gauge_dev *bg_dev;
617 dev_info(dev, "Registering battery gauge driver\n");
620 dev_err(dev, "Invalid parameters\n");
621 return ERR_PTR(-EINVAL);
624 bg_dev = kzalloc(sizeof(*bg_dev), GFP_KERNEL);
626 dev_err(dev, "Memory alloc for bg_dev failed\n");
627 return ERR_PTR(-ENOMEM);
630 ret = sysfs_create_group(&dev->kobj, &battery_snapshot_attr_group);
632 dev_info(dev, "Could not create battery snapshot sysfs group\n");
634 mutex_lock(&charger_gauge_list_mutex);
636 INIT_LIST_HEAD(&bg_dev->list);
637 bg_dev->cell_id = bgi->cell_id;
638 bg_dev->ops = bgi->bg_ops;
639 bg_dev->parent_dev = dev;
640 bg_dev->drv_data = drv_data;
641 bg_dev->tz_name = NULL;
643 if (bgi->current_channel_name)
644 bg_dev->bat_curr_channel_name = bgi->current_channel_name;
647 bg_dev->tz_name = kstrdup(bgi->tz_name, GFP_KERNEL);
648 bg_dev->battery_tz = thermal_zone_device_find_by_name(
650 if (!bg_dev->battery_tz)
652 "Battery thermal zone %s is not registered yet\n",
656 list_add(&bg_dev->list, &gauge_list);
657 mutex_unlock(&charger_gauge_list_mutex);
662 EXPORT_SYMBOL_GPL(battery_gauge_register);
664 void battery_gauge_unregister(struct battery_gauge_dev *bg_dev)
666 mutex_lock(&charger_gauge_list_mutex);
667 list_del(&bg_dev->list);
668 mutex_unlock(&charger_gauge_list_mutex);
671 EXPORT_SYMBOL_GPL(battery_gauge_unregister);
673 int battery_charging_status_update(struct battery_charger_dev *bc_dev,
674 enum battery_charger_status status)
676 struct battery_gauge_dev *node;
680 dev_err(bc_dev->parent_dev, "Invalid parameters\n");
684 mutex_lock(&charger_gauge_list_mutex);
686 list_for_each_entry(node, &gauge_list, list) {
687 if (node->cell_id != bc_dev->cell_id)
689 if (node->ops && node->ops->update_battery_status)
690 ret = node->ops->update_battery_status(node, status);
693 mutex_unlock(&charger_gauge_list_mutex);
696 EXPORT_SYMBOL_GPL(battery_charging_status_update);
698 void *battery_charger_get_drvdata(struct battery_charger_dev *bc_dev)
701 return bc_dev->drv_data;
704 EXPORT_SYMBOL_GPL(battery_charger_get_drvdata);
706 void battery_charger_set_drvdata(struct battery_charger_dev *bc_dev, void *data)
709 bc_dev->drv_data = data;
711 EXPORT_SYMBOL_GPL(battery_charger_set_drvdata);
713 void *battery_gauge_get_drvdata(struct battery_gauge_dev *bg_dev)
716 return bg_dev->drv_data;
719 EXPORT_SYMBOL_GPL(battery_gauge_get_drvdata);
721 void battery_gauge_set_drvdata(struct battery_gauge_dev *bg_dev, void *data)
724 bg_dev->drv_data = data;
726 EXPORT_SYMBOL_GPL(battery_gauge_set_drvdata);