kernel_samsung_a53x/include/linux/power/s2m_chg_manager.h

449 lines
11 KiB
C
Raw Normal View History

2024-06-15 21:02:09 +02:00
/*
* s2m_chg_manager.h
*
* Copyright (C) 2019 Samsung Electronics, Inc.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#ifndef __S2M_BATTERY_H
#define __S2M_BATTERY_H
#include <linux/module.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/err.h>
#include <linux/delay.h>
#include <linux/of_gpio.h>
#include <linux/irq.h>
#include <linux/interrupt.h>
#include <linux/i2c.h>
#include <linux/slab.h>
#include <linux/power_supply.h>
#include <linux/alarmtimer.h>
#if IS_ENABLED(CONFIG_IFCONN_NOTIFIER)
#include <linux/ifconn/ifconn_notifier.h>
#include <linux/ifconn/ifconn_manager.h>
#include <linux/muic_s2m/common/muic.h>
#endif
#define FAKE_BAT_LEVEL 50
#define DEFAULT_ALARM_INTERVAL 30
#define SLEEP_ALARM_INTERVAL 30
#define NORMAL_CURR 10
static char *bat_status_str[] = {
"Unknown",
"Charging",
"Discharging",
"Not-charging",
"Full"
};
static char *health_str[] = {
"Unknown",
"Good",
"Overheat",
"Dead",
"OverVoltage",
"UnspecFailure",
"Cold",
"WatchdogTimerExpire",
"SafetyTimerExpire",
"OverCurrent",
"CalibrationRequired",
"Warm",
"Cool",
"Hot",
"UnderVoltage",
"ColdLimit",
"OverheatLimit",
};
enum s2m_power_supply_type {
POWER_SUPPLY_TYPE_MAX = 0xFF,
POWER_SUPPLY_TYPE_OTG = 0xFF,
POWER_SUPPLY_TYPE_HV_MAINS,
POWER_SUPPLY_TYPE_PREPARE_TA,
POWER_SUPPLY_TYPE_SMART_NOTG,
POWER_SUPPLY_TYPE_USB_PD_APDO, /* Direct Charger */
POWER_SUPPLY_TYPE_END,
};
enum s2m_power_supply_health {
POWER_SUPPLY_S2M_HEALTH_UNDERVOLTAGE = 0x0E,
POWER_SUPPLY_S2M_HEALTH_COLD_LIMIT,
POWER_SUPPLY_S2M_HEALTH_OVERHEAT_LIMIT,
POWER_SUPPLY_S2M_HEALTH_DC_ERR,
};
enum s2m_power_supply_property {
POWER_SUPPLY_S2M_PROP_MIN = 0xFF,
POWER_SUPPLY_S2M_PROP_INPUT_VOLTAGE_REGULATION,
POWER_SUPPLY_S2M_PROP_SOH,
POWER_SUPPLY_S2M_PROP_CHARGING_ENABLED,
POWER_SUPPLY_S2M_PROP_CHARGE_OTG_CONTROL,
POWER_SUPPLY_S2M_PROP_CHARGE_POWERED_OTG_CONTROL,
POWER_SUPPLY_S2M_PROP_CHARGE_TEMP,
POWER_SUPPLY_S2M_PROP_FUELGAUGE_RESET,
POWER_SUPPLY_S2M_PROP_CURRENT_FULL,
POWER_SUPPLY_S2M_PROP_VCHGIN,
POWER_SUPPLY_S2M_PROP_VWCIN,
POWER_SUPPLY_S2M_PROP_VBAT,
POWER_SUPPLY_S2M_PROP_VGPADC,
POWER_SUPPLY_S2M_PROP_VCC1,
POWER_SUPPLY_S2M_PROP_VCC2,
POWER_SUPPLY_S2M_PROP_VDCIN,
POWER_SUPPLY_S2M_PROP_VF_BST,
POWER_SUPPLY_S2M_PROP_VOUT,
POWER_SUPPLY_S2M_PROP_VCELL,
POWER_SUPPLY_S2M_PROP_ICHGIN,
POWER_SUPPLY_S2M_PROP_IOTG,
POWER_SUPPLY_S2M_PROP_ITX,
POWER_SUPPLY_S2M_PROP_IIN,
POWER_SUPPLY_S2M_PROP_IINREV,
POWER_SUPPLY_S2M_PROP_TDIE,
POWER_SUPPLY_S2M_PROP_CO_ENABLE,
POWER_SUPPLY_S2M_PROP_RR_ENABLE,
POWER_SUPPLY_S2M_PROP_USBPD_RESET,
POWER_SUPPLY_S2M_PROP_USBPD_TEST_READ,
POWER_SUPPLY_S2M_PROP_DP_ENABLED,
POWER_SUPPLY_S2M_PROP_VBYP,
POWER_SUPPLY_S2M_PROP_VSYS,
POWER_SUPPLY_S2M_PROP_IWCIN,
POWER_SUPPLY_S2M_PROP_AFC_CHARGER_MODE,
POWER_SUPPLY_S2M_PROP_CHG_EFFICIENCY,
POWER_SUPPLY_S2M_PROP_2LV_3LV_CHG_MODE,
/* s2asl01 */
POWER_SUPPLY_S2M_PROP_CHGIN_OK,
POWER_SUPPLY_S2M_PROP_SUPLLEMENT_MODE,
POWER_SUPPLY_S2M_PROP_DISCHG_MODE,
POWER_SUPPLY_S2M_PROP_CHG_MODE,
POWER_SUPPLY_S2M_PROP_CHG_VOLTAGE,
POWER_SUPPLY_S2M_PROP_BAT_VOLTAGE,
POWER_SUPPLY_S2M_PROP_CHG_CURRENT,
POWER_SUPPLY_S2M_PROP_DISCHG_CURRENT,
POWER_SUPPLY_S2M_PROP_FASTCHG_LIMIT_CURRENT,
POWER_SUPPLY_S2M_PROP_TRICKLECHG_LIMIT_CURRENT,
POWER_SUPPLY_S2M_PROP_DISCHG_LIMIT_CURRENT,
POWER_SUPPLY_S2M_PROP_RECHG_VOLTAGE,
POWER_SUPPLY_S2M_PROP_EOC_VOLTAGE,
POWER_SUPPLY_S2M_PROP_EOC_CURRENT,
POWER_SUPPLY_S2M_PROP_POWERMETER_ENABLE,
POWER_SUPPLY_S2M_PROP_RECHG_ON,
POWER_SUPPLY_S2M_PROP_EOC_ON,
/* s2mf301_top for 501 dc */
POWER_SUPPLY_S2M_PROP_TOP_DC_INT_MASK,
POWER_SUPPLY_S2M_PROP_TOP_THERMAL_EN,
POWER_SUPPLY_S2M_PROP_TOP_THERMAL_SELECTION,
POWER_SUPPLY_S2M_PROP_TOP_CC_ICHG_SEL,
POWER_SUPPLY_S2M_PROP_TOP_DC_PDO_MAX_CUR_SEL,
POWER_SUPPLY_S2M_PROP_TOP_EN_STEP_CC,
POWER_SUPPLY_S2M_PROP_TOP_AUTO_PPS_START,
POWER_SUPPLY_S2M_PROP_TOP_DC_DONE_SOC,
POWER_SUPPLY_S2M_PROP_TOP_DC_TOP_OFF_CURRENT,
POWER_SUPPLY_S2M_PROP_TOP_DC_CV,
POWER_SUPPLY_S2M_PROP_TOP_THERMAL_END,
POWER_SUPPLY_S2M_PROP_TOP_THERMAL_START,
POWER_SUPPLY_S2M_PROP_TOP_CC_STEP_VBAT1,
POWER_SUPPLY_S2M_PROP_TOP_CC_STEP_VBAT2,
POWER_SUPPLY_S2M_PROP_TOP_DC_CC_STEP_1,
POWER_SUPPLY_S2M_PROP_TOP_DC_CC_STEP_2,
POWER_SUPPLY_S2M_PROP_TOP_DC_CC_STEP_3,
POWER_SUPPLY_S2M_PROP_TOP_THERMAL_RECOVERY_WAITING,
POWER_SUPPLY_S2M_PROP_TOP_THERMAL_CONTROL_WAITING,
POWER_SUPPLY_S2M_PROP_TOP_AUTO_PPS_STATUS,
POWER_SUPPLY_S2M_PROP_DIRECT_CHARGER_MODE,
POWER_SUPPLY_S2M_PROP_DIRECT_CHARGE_DONE,
POWER_SUPPLY_S2M_PROP_PCP_CLK,
POWER_SUPPLY_S2M_PROP_MAX,
};
static enum power_supply_property s2m_chg_manager_props[] = {
POWER_SUPPLY_PROP_STATUS,
POWER_SUPPLY_PROP_HEALTH,
POWER_SUPPLY_PROP_ONLINE,
POWER_SUPPLY_PROP_PRESENT,
POWER_SUPPLY_PROP_VOLTAGE_NOW,
POWER_SUPPLY_PROP_VOLTAGE_AVG,
POWER_SUPPLY_PROP_TEMP,
POWER_SUPPLY_PROP_CHARGE_NOW,
POWER_SUPPLY_PROP_CAPACITY,
POWER_SUPPLY_PROP_CURRENT_NOW,
POWER_SUPPLY_PROP_CURRENT_AVG,
POWER_SUPPLY_PROP_CHARGE_COUNTER,
POWER_SUPPLY_PROP_CHARGE_FULL,
POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
POWER_SUPPLY_PROP_TIME_TO_FULL_NOW,
};
static enum power_supply_property s2m_dc_manager_props[] = {
POWER_SUPPLY_PROP_ONLINE,
};
static enum power_supply_property s2m_power_props[] = {
POWER_SUPPLY_PROP_ONLINE,
};
static char *s2m_supplied_to[] = {
"s2m-battery",
};
enum sec_battery_rp_curr {
RP_CURRENT1 = 500,
RP_CURRENT2 = 1500,
RP_CURRENT3 = 3000,
};
enum s2m_battery_voltage_mode {
S2M_BATTERY_VOLTAGE_AVERAGE = 0,
S2M_BATTERY_VOLTAGE_OCV,
};
enum s2m_battery_current_mode {
S2M_BATTERY_CURRENT_UA = 0,
S2M_BATTERY_CURRENT_MA,
};
enum s2m_battery_voltage_type {
/* uA */
S2M_BATTERY_VOLTAGE_UV = 0,
/* mA */
S2M_BATTERY_VOLTAGE_MV,
};
enum s2m_battery_charger_mode {
S2M_BAT_CHG_MODE_CHARGING = 0,
S2M_BAT_CHG_MODE_CHARGING_OFF,
S2M_BAT_CHG_MODE_BUCK_OFF,
};
enum s2m_battery_factory_mode {
S2M_BAT_FAC_MODE_VBAT = 0,
S2M_BAT_FAC_MODE_VBUS,
S2M_BAT_FAC_MODE_NORMAL,
};
#if IS_ENABLED(CONFIG_DIRECT_CHARGER)
enum s2m_charging_source {
S2M_SC = 0,
S2M_DC,
};
enum s2m_direct_charging_mode {
S2M_DIRECT_CHG_MODE_OFF = 0,
S2M_DIRECT_CHG_MODE_CHECK_VBAT,
S2M_DIRECT_CHG_MODE_PRESET,
S2M_DIRECT_CHG_MODE_ON,
S2M_DIRECT_CHG_MODE_DONE,
};
#endif
struct s2m_charging_current {
#if IS_ENABLED(CONFIG_OF)
unsigned int input_current_limit;
unsigned int fast_charging_current;
unsigned int full_check_current;
#else
int input_current_limit;
int fast_charging_current;
int full_check_current;
#endif
};
#define s2m_charging_current_t struct s2m_charging_current
struct s2m_chg_manager_platform_data {
s2m_charging_current_t *charging_current;
s2m_charging_current_t *charging_current_expand;
char *charger_name;
char *pmeter_name;
char *fuelgauge_name;
#if IS_ENABLED(CONFIG_DIRECT_CHARGER)
char *direct_charger_name;
char *switching_charger_name;
#endif
int default_limit_current;
int max_input_current;
int max_charging_current;
int chg_float_voltage;
/* full check */
unsigned int full_check_count;
unsigned int chg_recharge_vcell;
unsigned int chg_full_vcell;
/* Initial maximum raw SOC */
unsigned int max_rawsoc;
unsigned int max_rawsoc_offset;
/* battery */
char *vendor;
int technology;
/* board */
int erd;
#if IS_ENABLED(CONFIG_SMALL_CHARGER)
char *smallcharger_name;
int small_input_current;
int small_charging_current;
int small_limit_current;
#endif
int temp_high;
int temp_high_recovery;
int temp_high_limit;
int temp_high_limit_recovery;
int temp_low;
int temp_low_recovery;
int temp_low_limit;
int temp_low_limit_recovery;
int temp_limit_float_voltage;
#if IS_ENABLED(CONFIG_USE_S2M_PDIC)
int pdo_max_input_vol;
int pdo_max_chg_power;
#endif
#if IS_ENABLED(CONFIG_S2M_THERMAL)
int *thermal_limit_level;
#endif
};
struct s2m_chg_manager_info {
struct s2m_chg_manager_platform_data *pdata;
struct device *dev;
struct power_supply *psy_battery;
struct power_supply_desc psy_battery_desc;
struct power_supply *psy_usb;
struct power_supply_desc psy_usb_desc;
struct power_supply *psy_ac;
struct power_supply_desc psy_ac_desc;
#if IS_ENABLED(CONFIG_DIRECT_CHARGER)
struct power_supply *psy_dc_manager;
struct power_supply_desc psy_dc_manager_desc;
int direct_chg_mode;
bool direct_chg_done;
bool dc_err;
#endif
struct mutex iolock;
struct mutex ifconn_lock;
struct workqueue_struct *monitor_wqueue;
struct delayed_work monitor_work;
struct delayed_work soc_control;
struct wakeup_source *monitor_ws;
struct wakeup_source *vbus_ws;
struct alarm monitor_alarm;
unsigned int monitor_alarm_interval;
int default_limit_current;
int input_current;
int max_input_current;
int charging_current;
int max_charging_current;
int topoff_current;
int cable_type;
unsigned int charging_mode;
int vchg_current;
int vchg_voltage;
int full_check_cnt;
/* charging */
bool is_recharging;
bool battery_valid;
int status;
int health;
int voltage_now;
int voltage_avg;
int voltage_ocv;
unsigned int capacity;
unsigned int max_rawsoc;
unsigned int max_rawsoc_offset;
int soh; /* State of Health (%) */
int current_now; /* current (mA) */
int current_avg; /* average current (mA) */
int current_max; /* input current limit (mA) */
int current_chg; /* charge current limit (mA) */
#if IS_ENABLED(CONFIG_IFCONN_NOTIFIER)
struct notifier_block ifconn_nb;
struct notifier_block ifconn_cc_nb;
#endif
#if IS_ENABLED(CONFIG_SMALL_CHARGER)
int small_input; /* input current limit (mA) */
int small_chg; /* charge current limit (mA) */
int small_input_flag;
int small_limit_current;
#endif
/* temperature check */
#if IS_ENABLED(CONFIG_BAT_TEMP)
bool is_temp_control;
#endif
int temperature; /* battery temperature(0.1 Celsius)*/
int temp_high;
int temp_high_recovery;
int temp_high_limit;
int temp_high_limit_recovery;
int temp_low;
int temp_low_recovery;
int temp_low_limit;
int temp_low_limit_recovery;
#if IS_ENABLED(CONFIG_USE_S2M_PDIC)
struct delayed_work select_pdo_work;
int pdo_max_input_vol;
int pdo_max_chg_power;
int pdo_sel_num;
int pdo_sel_vol;
int pdo_sel_cur;
bool is_apdo;
int pd_input_current;
bool pd_attach;
bool rp_attach;
int rp_input_current;
int rp_charging_current;
#if IS_ENABLED(CONFIG_DIRECT_CHARGER)
int chg_src;
#endif
#endif
#if IS_ENABLED(CONFIG_S2M_THERMAL)
bool thermal_enable;
int thermal_limit;
int thermal_limit_max;
#endif
bool monitor_trigger;
};
#endif /* __S2M_BATTERY_H */