1*3bb3dbbdSDonggeun Kim /* 2*3bb3dbbdSDonggeun Kim * Copyright (C) 2011 Samsung Electronics Co., Ltd. 3*3bb3dbbdSDonggeun Kim * MyungJoo.Ham <myungjoo.ham@samsung.com> 4*3bb3dbbdSDonggeun Kim * 5*3bb3dbbdSDonggeun Kim * Charger Manager. 6*3bb3dbbdSDonggeun Kim * This framework enables to control and multiple chargers and to 7*3bb3dbbdSDonggeun Kim * monitor charging even in the context of suspend-to-RAM with 8*3bb3dbbdSDonggeun Kim * an interface combining the chargers. 9*3bb3dbbdSDonggeun Kim * 10*3bb3dbbdSDonggeun Kim * This program is free software; you can redistribute it and/or modify 11*3bb3dbbdSDonggeun Kim * it under the terms of the GNU General Public License version 2 as 12*3bb3dbbdSDonggeun Kim * published by the Free Software Foundation. 13*3bb3dbbdSDonggeun Kim **/ 14*3bb3dbbdSDonggeun Kim 15*3bb3dbbdSDonggeun Kim #ifndef _CHARGER_MANAGER_H 16*3bb3dbbdSDonggeun Kim #define _CHARGER_MANAGER_H 17*3bb3dbbdSDonggeun Kim 18*3bb3dbbdSDonggeun Kim #include <linux/power_supply.h> 19*3bb3dbbdSDonggeun Kim 20*3bb3dbbdSDonggeun Kim enum data_source { 21*3bb3dbbdSDonggeun Kim CM_FUEL_GAUGE, 22*3bb3dbbdSDonggeun Kim CM_CHARGER_STAT, 23*3bb3dbbdSDonggeun Kim }; 24*3bb3dbbdSDonggeun Kim 25*3bb3dbbdSDonggeun Kim enum polling_modes { 26*3bb3dbbdSDonggeun Kim CM_POLL_DISABLE = 0, 27*3bb3dbbdSDonggeun Kim CM_POLL_ALWAYS, 28*3bb3dbbdSDonggeun Kim CM_POLL_EXTERNAL_POWER_ONLY, 29*3bb3dbbdSDonggeun Kim CM_POLL_CHARGING_ONLY, 30*3bb3dbbdSDonggeun Kim }; 31*3bb3dbbdSDonggeun Kim 32*3bb3dbbdSDonggeun Kim /** 33*3bb3dbbdSDonggeun Kim * struct charger_global_desc 34*3bb3dbbdSDonggeun Kim * @rtc_name: the name of RTC used to wake up the system from suspend. 35*3bb3dbbdSDonggeun Kim * @rtc_only_wakeup: 36*3bb3dbbdSDonggeun Kim * If the system is woken up by waekup-sources other than the RTC or 37*3bb3dbbdSDonggeun Kim * callbacks, Charger Manager should recognize with 38*3bb3dbbdSDonggeun Kim * rtc_only_wakeup() returning false. 39*3bb3dbbdSDonggeun Kim * If the RTC given to CM is the only wakeup reason, 40*3bb3dbbdSDonggeun Kim * rtc_only_wakeup should return true. 41*3bb3dbbdSDonggeun Kim */ 42*3bb3dbbdSDonggeun Kim struct charger_global_desc { 43*3bb3dbbdSDonggeun Kim char *rtc_name; 44*3bb3dbbdSDonggeun Kim 45*3bb3dbbdSDonggeun Kim bool (*rtc_only_wakeup)(void); 46*3bb3dbbdSDonggeun Kim }; 47*3bb3dbbdSDonggeun Kim 48*3bb3dbbdSDonggeun Kim /** 49*3bb3dbbdSDonggeun Kim * struct charger_desc 50*3bb3dbbdSDonggeun Kim * @polling_mode: 51*3bb3dbbdSDonggeun Kim * Determine which polling mode will be used 52*3bb3dbbdSDonggeun Kim * @polling_interval_ms: interval in millisecond at which 53*3bb3dbbdSDonggeun Kim * charger manager will monitor battery health 54*3bb3dbbdSDonggeun Kim * @battery_present: 55*3bb3dbbdSDonggeun Kim * Specify where information for existance of battery can be obtained 56*3bb3dbbdSDonggeun Kim * @psy_charger_stat: the names of power-supply for chargers 57*3bb3dbbdSDonggeun Kim * @num_charger_regulator: the number of entries in charger_regulators 58*3bb3dbbdSDonggeun Kim * @charger_regulators: array of regulator_bulk_data for chargers 59*3bb3dbbdSDonggeun Kim * @psy_fuel_gauge: the name of power-supply for fuel gauge 60*3bb3dbbdSDonggeun Kim * @temperature_out_of_range: 61*3bb3dbbdSDonggeun Kim * Determine whether the status is overheat or cold or normal. 62*3bb3dbbdSDonggeun Kim * return_value > 0: overheat 63*3bb3dbbdSDonggeun Kim * return_value == 0: normal 64*3bb3dbbdSDonggeun Kim * return_value < 0: cold 65*3bb3dbbdSDonggeun Kim */ 66*3bb3dbbdSDonggeun Kim struct charger_desc { 67*3bb3dbbdSDonggeun Kim enum polling_modes polling_mode; 68*3bb3dbbdSDonggeun Kim unsigned int polling_interval_ms; 69*3bb3dbbdSDonggeun Kim 70*3bb3dbbdSDonggeun Kim enum data_source battery_present; 71*3bb3dbbdSDonggeun Kim 72*3bb3dbbdSDonggeun Kim char **psy_charger_stat; 73*3bb3dbbdSDonggeun Kim 74*3bb3dbbdSDonggeun Kim int num_charger_regulators; 75*3bb3dbbdSDonggeun Kim struct regulator_bulk_data *charger_regulators; 76*3bb3dbbdSDonggeun Kim 77*3bb3dbbdSDonggeun Kim char *psy_fuel_gauge; 78*3bb3dbbdSDonggeun Kim 79*3bb3dbbdSDonggeun Kim int (*temperature_out_of_range)(int *mC); 80*3bb3dbbdSDonggeun Kim }; 81*3bb3dbbdSDonggeun Kim 82*3bb3dbbdSDonggeun Kim #define PSY_NAME_MAX 30 83*3bb3dbbdSDonggeun Kim 84*3bb3dbbdSDonggeun Kim /** 85*3bb3dbbdSDonggeun Kim * struct charger_manager 86*3bb3dbbdSDonggeun Kim * @entry: entry for list 87*3bb3dbbdSDonggeun Kim * @dev: device pointer 88*3bb3dbbdSDonggeun Kim * @desc: instance of charger_desc 89*3bb3dbbdSDonggeun Kim * @fuel_gauge: power_supply for fuel gauge 90*3bb3dbbdSDonggeun Kim * @charger_stat: array of power_supply for chargers 91*3bb3dbbdSDonggeun Kim * @charger_enabled: the state of charger 92*3bb3dbbdSDonggeun Kim * @emergency_stop: 93*3bb3dbbdSDonggeun Kim * When setting true, stop charging 94*3bb3dbbdSDonggeun Kim * @last_temp_mC: the measured temperature in milli-Celsius 95*3bb3dbbdSDonggeun Kim * @status_save_ext_pwr_inserted: 96*3bb3dbbdSDonggeun Kim * saved status of external power before entering suspend-to-RAM 97*3bb3dbbdSDonggeun Kim * @status_save_batt: 98*3bb3dbbdSDonggeun Kim * saved status of battery before entering suspend-to-RAM 99*3bb3dbbdSDonggeun Kim */ 100*3bb3dbbdSDonggeun Kim struct charger_manager { 101*3bb3dbbdSDonggeun Kim struct list_head entry; 102*3bb3dbbdSDonggeun Kim struct device *dev; 103*3bb3dbbdSDonggeun Kim struct charger_desc *desc; 104*3bb3dbbdSDonggeun Kim 105*3bb3dbbdSDonggeun Kim struct power_supply *fuel_gauge; 106*3bb3dbbdSDonggeun Kim struct power_supply **charger_stat; 107*3bb3dbbdSDonggeun Kim 108*3bb3dbbdSDonggeun Kim bool charger_enabled; 109*3bb3dbbdSDonggeun Kim 110*3bb3dbbdSDonggeun Kim int emergency_stop; 111*3bb3dbbdSDonggeun Kim int last_temp_mC; 112*3bb3dbbdSDonggeun Kim 113*3bb3dbbdSDonggeun Kim bool status_save_ext_pwr_inserted; 114*3bb3dbbdSDonggeun Kim bool status_save_batt; 115*3bb3dbbdSDonggeun Kim }; 116*3bb3dbbdSDonggeun Kim 117*3bb3dbbdSDonggeun Kim #ifdef CONFIG_CHARGER_MANAGER 118*3bb3dbbdSDonggeun Kim extern int setup_charger_manager(struct charger_global_desc *gd); 119*3bb3dbbdSDonggeun Kim extern bool cm_suspend_again(void); 120*3bb3dbbdSDonggeun Kim #else 121*3bb3dbbdSDonggeun Kim static void __maybe_unused setup_charger_manager(struct charger_global_desc *gd) 122*3bb3dbbdSDonggeun Kim { } 123*3bb3dbbdSDonggeun Kim 124*3bb3dbbdSDonggeun Kim static bool __maybe_unused cm_suspend_again(void) 125*3bb3dbbdSDonggeun Kim { 126*3bb3dbbdSDonggeun Kim return false; 127*3bb3dbbdSDonggeun Kim } 128*3bb3dbbdSDonggeun Kim #endif 129*3bb3dbbdSDonggeun Kim 130*3bb3dbbdSDonggeun Kim #endif /* _CHARGER_MANAGER_H */ 131