/* SPDX-License-Identifier: GPL-2.0 */ /* * Copyright (c) 2019 MediaTek Inc. */ #ifndef __MTK_CHARGER_H #define __MTK_CHARGER_H #include #include "charger_class.h" #include "adapter_class.h" #include "mtk_charger_algorithm_class.h" #include #include "mtk_smartcharging.h" /* prize add by liuyong, modify for screen on charging 20230315 start */ #if IS_ENABLED(CONFIG_DRM_MEDIATEK) #include "../../gpu/drm/mediatek/mediatek_v2/mtk_panel_ext.h" #include "../../gpu/drm/mediatek/mediatek_v2/mtk_disp_notify.h" #endif /* prize add by liuyong, modify for screen on charging 20230315 end */ #define CHARGING_INTERVAL 10 #define CHARGING_FULL_INTERVAL 20 #define CHRLOG_ERROR_LEVEL 1 #define CHRLOG_INFO_LEVEL 2 #define CHRLOG_DEBUG_LEVEL 3 #define SC_TAG "smartcharging" extern int chr_get_debug_level(void); #define chr_err(fmt, args...) \ do { \ if (chr_get_debug_level() >= CHRLOG_ERROR_LEVEL) { \ pr_notice(fmt, ##args); \ } \ } while (0) #define chr_info(fmt, args...) \ do { \ if (chr_get_debug_level() >= CHRLOG_INFO_LEVEL) { \ pr_notice_ratelimited(fmt, ##args); \ } \ } while (0) #define chr_debug(fmt, args...) \ do { \ if (chr_get_debug_level() >= CHRLOG_DEBUG_LEVEL) { \ pr_notice(fmt, ##args); \ } \ } while (0) struct mtk_charger; struct charger_data; #define BATTERY_CV 4350000 #define V_CHARGER_MAX 6500000 /* 6.5 V */ #define V_CHARGER_MIN 4600000 /* 4.6 V */ #define VBUS_OVP_VOLTAGE 15000000 /* 15V */ #define USB_CHARGER_CURRENT_SUSPEND 0 /* def CONFIG_USB_IF */ #define USB_CHARGER_CURRENT_UNCONFIGURED 70000 /* 70mA */ #define USB_CHARGER_CURRENT_CONFIGURED 500000 /* 500mA */ #define USB_CHARGER_CURRENT 500000 /* 500mA */ #define AC_CHARGER_CURRENT 2050000 #define AC_CHARGER_INPUT_CURRENT 3200000 #define NON_STD_AC_CHARGER_CURRENT 500000 #define CHARGING_HOST_CHARGER_CURRENT 650000 /* dynamic mivr */ #define V_CHARGER_MIN_1 4400000 /* 4.4 V */ #define V_CHARGER_MIN_2 4200000 /* 4.2 V */ #define MAX_DMIVR_CHARGER_CURRENT 1800000 /* 1.8 A */ /* battery warning */ #define BATTERY_NOTIFY_CASE_0001_VCHARGER #define BATTERY_NOTIFY_CASE_0002_VBATTEMP /* charging abnormal status */ #define CHG_VBUS_OV_STATUS (1 << 0) #define CHG_BAT_OT_STATUS (1 << 1) #define CHG_OC_STATUS (1 << 2) #define CHG_BAT_OV_STATUS (1 << 3) #define CHG_ST_TMO_STATUS (1 << 4) #define CHG_BAT_LT_STATUS (1 << 5) #define CHG_TYPEC_WD_STATUS (1 << 6) /* Battery Temperature Protection */ #define MIN_CHARGE_TEMP 0 #define MIN_CHARGE_TEMP_PLUS_X_DEGREE 6 #define MAX_CHARGE_TEMP 50 #define MAX_CHARGE_TEMP_MINUS_X_DEGREE 47 #define MAX_ALG_NO 10 // drv add tankaikun, add battery temp debug, 20231212 start #define MTK_DEBUG_TEMP_EN_CMD 0xb5b #define MTK_DEBUG_TEMP_DIS_CMD 0x5b5 // drv add tankaikun, battery temp debug, 20231212 end // drv add by tankaikun, add for screen on charging 20230108 start #if IS_ENABLED(CONFIG_DRM_MEDIATEK) extern bool g_charge_is_screen_on; #endif // drv add by tankaikun, add for screen on charging 20230108 end enum bat_temp_state_enum { BAT_TEMP_LOW = 0, BAT_TEMP_NORMAL, BAT_TEMP_HIGH }; enum chg_dev_notifier_events { EVENT_FULL, EVENT_RECHARGE, EVENT_DISCHARGE, }; struct battery_thermal_protection_data { int sm; bool enable_min_charge_temp; int min_charge_temp; int min_charge_temp_plus_x_degree; int max_charge_temp; int max_charge_temp_minus_x_degree; }; /*prize LiuYong, modify for charging current config, 20230323 -start*/ /* sw jeita current*/ #define JEITA_TEMP_T0_TO_T1_INPUT_CURRENT 1500000 //1500mA #define JEITA_TEMP_T0_TO_T1_CHARGING_CURRENT 1500000 //1000mA #define JEITA_TEMP_T1_TO_T2_INPUT_CURRENT 1500000 //1500mA #define JEITA_TEMP_T1_TO_T2_CHARGING_CURRENT 1500000 //1500mA #define JEITA_TEMP_T2_TO_T3_INPUT_CURRENT 2000000 //2000mA #define JEITA_TEMP_T2_TO_T3_CHARGING_CURRENT 2000000 //2000mA #define JEITA_TEMP_T3_TO_T4_INPUT_CURRENT 1500000 //1500mA #define JEITA_TEMP_T3_TO_T4_CHARGING_CURRENT 1500000 //1000mA /*prize LiuYong, modify for charging current config, 20230323 -end*/ /* sw jeita */ #define JEITA_TEMP_ABOVE_T4_CV 4240000 #define JEITA_TEMP_T3_TO_T4_CV 4240000 #define JEITA_TEMP_T2_TO_T3_CV 4340000 #define JEITA_TEMP_T1_TO_T2_CV 4240000 #define JEITA_TEMP_T0_TO_T1_CV 4040000 #define JEITA_TEMP_BELOW_T0_CV 4040000 #define TEMP_T4_THRES 50 #define TEMP_T4_THRES_MINUS_X_DEGREE 47 #define TEMP_T3_THRES 45 #define TEMP_T3_THRES_MINUS_X_DEGREE 39 #define TEMP_T2_THRES 10 #define TEMP_T2_THRES_PLUS_X_DEGREE 16 #define TEMP_T1_THRES 0 #define TEMP_T1_THRES_PLUS_X_DEGREE 6 #define TEMP_T0_THRES 0 #define TEMP_T0_THRES_PLUS_X_DEGREE 0 #define TEMP_NEG_10_THRES 0 /* * Software JEITA * T0: -10 degree Celsius * T1: 0 degree Celsius * T2: 10 degree Celsius * T3: 45 degree Celsius * T4: 50 degree Celsius */ enum sw_jeita_state_enum { TEMP_BELOW_T0 = 0, TEMP_T0_TO_T1, TEMP_T1_TO_T2, TEMP_T2_TO_T3, TEMP_T3_TO_T4, TEMP_ABOVE_T4 }; struct sw_jeita_data { int sm; int pre_sm; int cv; bool charging; bool error_recovery_flag; }; struct mtk_charger_algorithm { int (*do_algorithm)(struct mtk_charger *info); int (*enable_charging)(struct mtk_charger *info, bool en); int (*do_event)(struct notifier_block *nb, unsigned long ev, void *v); int (*do_dvchg1_event)(struct notifier_block *nb, unsigned long ev, void *v); int (*do_dvchg2_event)(struct notifier_block *nb, unsigned long ev, void *v); int (*do_hvdvchg1_event)(struct notifier_block *nb, unsigned long ev, void *v); int (*do_hvdvchg2_event)(struct notifier_block *nb, unsigned long ev, void *v); int (*change_current_setting)(struct mtk_charger *info); void *algo_data; }; struct charger_custom_data { int battery_cv; /* uv */ int max_charger_voltage; int max_charger_voltage_setting; int min_charger_voltage; int vbus_sw_ovp_voltage; int usb_charger_current; int ac_charger_current; int ac_charger_input_current; int charging_host_charger_current; /* sw jeita */ int jeita_temp_above_t4_cv; int jeita_temp_t3_to_t4_cv; int jeita_temp_t2_to_t3_cv; int jeita_temp_t1_to_t2_cv; int jeita_temp_t0_to_t1_cv; int jeita_temp_below_t0_cv; int temp_t4_thres; int temp_t4_thres_minus_x_degree; int temp_t3_thres; int temp_t3_thres_minus_x_degree; int temp_t2_thres; int temp_t2_thres_plus_x_degree; int temp_t1_thres; int temp_t1_thres_plus_x_degree; int temp_t0_thres; int temp_t0_thres_plus_x_degree; int temp_neg_10_thres; /*prize LiuYong, modify for charging current config, 20221129 -start*/ unsigned int jeita_temp_t0_to_t1_input_current; unsigned int jeita_temp_t0_to_t1_charging_current; unsigned int jeita_temp_t1_to_t2_input_current; unsigned int jeita_temp_t1_to_t2_charging_current; unsigned int jeita_temp_t2_to_t3_input_current; unsigned int jeita_temp_t2_to_t3_charging_current; unsigned int jeita_temp_t3_to_t4_input_current; unsigned int jeita_temp_t3_to_t4_charging_current; unsigned int temp_screen_on_input_current; unsigned int temp_screen_on_charging_current; /*prize LiuYong, modify for charging current config, 20221129 -end*/ /* battery temperature protection */ int mtk_temperature_recharge_support; int max_charge_temp; int max_charge_temp_minus_x_degree; int min_charge_temp; int min_charge_temp_plus_x_degree; /* dynamic mivr */ int min_charger_voltage_1; int min_charger_voltage_2; int max_dmivr_charger_current; }; struct charger_data { int input_current_limit; int charging_current_limit; int force_charging_current; int thermal_input_current_limit; int thermal_charging_current_limit; bool thermal_throttle_record; int disable_charging_count; int input_current_limit_by_aicl; int junction_temp_min; int junction_temp_max; }; // drv add tankaikun, add facoryt charger class, 20231204 start enum mtk_charge_type { MTK_CHARGER_TYPE_UNKNOWN, MTK_CHARGER_TYPE_SDP, MTK_CHARGER_TYPE_CDP, MTK_CHARGER_TYPE_DCP, MTK_CHARGER_TYPE_WL_BPP, MTK_CHARGER_TYPE_WL_EPP, }; enum mtk_fast_charge_type { MTK_FAST_CHARGER_TYPE_UNKNOWN = 0, MTK_FAST_CHARGER_TYPE_PEP, MTK_FAST_CHARGER_TYPE_PE20, MTK_FAST_CHARGER_TYPE_PDC, MTK_FAST_CHARGER_TYPE_PE40, MTK_FAST_CHARGER_TYPE_PE50, MTK_FAST_CHARGER_TYPE_HVBP, MTK_FAST_CHARGER_TYPE_PE5P, MTK_FAST_CHARGER_TYPE_WIRELESS_FAST, MTK_FAST_CHARGER_TYPE_MAX, }; struct mtk_fast_chg_type_map { int fast_chg_type; int fast_chrg_id; }; static const char * const mtk_chg_type_name_list[] = { [MTK_CHARGER_TYPE_UNKNOWN] = "Unknown", [MTK_CHARGER_TYPE_SDP] = "USB_SDP", [MTK_CHARGER_TYPE_CDP] = "USB_CDP", [MTK_CHARGER_TYPE_DCP] = "USB_DCP", [MTK_CHARGER_TYPE_WL_BPP] = "WIRELESS_BPP", [MTK_CHARGER_TYPE_WL_EPP] = "WIRELESS_EPP", }; static const char * const mtk_fast_chg_algo_list[] = { [MTK_FAST_CHARGER_TYPE_UNKNOWN] = "Unknown", [MTK_FAST_CHARGER_TYPE_PEP] = "PE+", [MTK_FAST_CHARGER_TYPE_PE20] = "PE20", [MTK_FAST_CHARGER_TYPE_PDC] = "PDC", [MTK_FAST_CHARGER_TYPE_PE40] = "PE40", [MTK_FAST_CHARGER_TYPE_PE50] = "PE50", [MTK_FAST_CHARGER_TYPE_HVBP] = "HVBP", [MTK_FAST_CHARGER_TYPE_PE5P] = "PE5P", [MTK_FAST_CHARGER_TYPE_WIRELESS_FAST] = "WIRELESS_FAST_CHARGER", [MTK_FAST_CHARGER_TYPE_MAX] = "ERROR", }; // drv add tankaikun, add facoryt charger class, 20231204 start enum chg_data_idx_enum { CHG1_SETTING, CHG2_SETTING, DVCHG1_SETTING, DVCHG2_SETTING, HVDVCHG1_SETTING, HVDVCHG2_SETTING, CHGS_SETTING_MAX, }; struct mtk_charger { struct platform_device *pdev; struct charger_device *chg1_dev; struct notifier_block chg1_nb; struct charger_device *chg2_dev; struct charger_device *dvchg1_dev; struct notifier_block dvchg1_nb; struct charger_device *dvchg2_dev; struct notifier_block dvchg2_nb; struct charger_device *hvdvchg1_dev; struct notifier_block hvdvchg1_nb; struct charger_device *hvdvchg2_dev; struct notifier_block hvdvchg2_nb; struct charger_device *bkbstchg_dev; struct notifier_block bkbstchg_nb; struct charger_data chg_data[CHGS_SETTING_MAX]; struct chg_limit_setting setting; enum charger_configuration config; struct power_supply_desc psy_desc1; struct power_supply_config psy_cfg1; struct power_supply *psy1; struct power_supply_desc psy_desc2; struct power_supply_config psy_cfg2; struct power_supply *psy2; struct power_supply_desc psy_dvchg_desc1; struct power_supply_config psy_dvchg_cfg1; struct power_supply *psy_dvchg1; struct power_supply_desc psy_dvchg_desc2; struct power_supply_config psy_dvchg_cfg2; struct power_supply *psy_dvchg2; struct power_supply_desc psy_hvdvchg_desc1; struct power_supply_config psy_hvdvchg_cfg1; struct power_supply *psy_hvdvchg1; struct power_supply_desc psy_hvdvchg_desc2; struct power_supply_config psy_hvdvchg_cfg2; struct power_supply *psy_hvdvchg2; /* prize liuyong, add for charging config, 20231018, start */ struct power_supply_desc usb_desc; struct power_supply_config usb_cfg; struct power_supply *usb_psy; /* prize liuyong, add for charging config, 20231018, end */ struct power_supply *chg_psy; struct power_supply *bc12_psy; struct power_supply *bat_psy; struct adapter_device *pd_adapter; struct notifier_block pd_nb; struct mutex pd_lock; int pd_type; bool pd_reset; u32 bootmode; u32 boottype; int chr_type; int usb_type; int usb_state; struct mutex cable_out_lock; int cable_out_cnt; /* system lock */ spinlock_t slock; struct wakeup_source *charger_wakelock; struct mutex charger_lock; /* thread related */ wait_queue_head_t wait_que; bool charger_thread_timeout; unsigned int polling_interval; bool charger_thread_polling; /* alarm timer */ struct alarm charger_timer; struct timespec64 endtime; bool is_suspend; struct notifier_block pm_notifier; /* notify charger user */ struct srcu_notifier_head evt_nh; /* common info */ int log_level; bool usb_unlimited; bool charger_unlimited; bool disable_charger; bool disable_aicl; int battery_temp; bool can_charging; bool cmd_discharging; bool safety_timeout; int safety_timer_cmd; bool vbusov_stat; bool is_chg_done; /* ATM */ bool atm_enabled; const char *algorithm_name; struct mtk_charger_algorithm algo; /* dtsi custom data */ struct charger_custom_data data; /* battery warning */ unsigned int notify_code; unsigned int notify_test_mode; /* sw safety timer */ bool enable_sw_safety_timer; bool sw_safety_timer_setting; struct timespec64 charging_begin_time; /* vbat monitor, 6pin bat */ bool batpro_done; bool enable_vbat_mon; bool enable_vbat_mon_bak; int old_cv; bool stop_6pin_re_en; int vbat0_flag; /* sw jeita */ bool enable_sw_jeita; struct sw_jeita_data sw_jeita; /* battery thermal protection */ struct battery_thermal_protection_data thermal; struct chg_alg_device *alg[MAX_ALG_NO]; int lst_rnd_alg_idx; bool alg_new_arbitration; bool alg_unchangeable; struct notifier_block chg_alg_nb; bool enable_hv_charging; /* water detection */ bool water_detected; bool record_water_detected; bool enable_dynamic_mivr; /* fast charging algo support indicator */ bool enable_fast_charging_indicator; unsigned int fast_charging_indicator; /* diasable meta current limit for testing */ unsigned int enable_meta_current_limit; struct smartcharging sc; /*daemon related*/ struct sock *daemo_nl_sk; u_int g_scd_pid; struct scd_cmd_param_t_1 sc_data; /*charger IC charging status*/ bool is_charging; bool debug_temp_en; int debug_temp; // drv add tankaikun, add battery temp debug, 20231220 end ktime_t uevent_time_check; bool force_disable_pp[CHG2_SETTING + 1]; bool enable_pp[CHG2_SETTING + 1]; struct mutex pp_lock[CHG2_SETTING + 1]; #if IS_ENABLED(CONFIG_DRM_MEDIATEK) struct notifier_block disp_notifier; bool is_screen_on; #endif }; static inline int mtk_chg_alg_notify_call(struct mtk_charger *info, enum chg_alg_notifier_events evt, int value) { int i; struct chg_alg_notify notify = { .evt = evt, .value = value, }; for (i = 0; i < MAX_ALG_NO; i++) { if (info->alg[i]) chg_alg_notifier_call(info->alg[i], ¬ify); } return 0; } /* functions which framework needs*/ extern int mtk_basic_charger_init(struct mtk_charger *info); extern int mtk_pulse_charger_init(struct mtk_charger *info); extern int get_uisoc(struct mtk_charger *info); extern int get_battery_voltage(struct mtk_charger *info); extern int get_battery_temperature(struct mtk_charger *info); extern int get_battery_current(struct mtk_charger *info); extern int get_vbus(struct mtk_charger *info); extern int get_ibat(struct mtk_charger *info); extern int get_ibus(struct mtk_charger *info); extern bool is_battery_exist(struct mtk_charger *info); extern int get_charger_type(struct mtk_charger *info); extern int get_usb_type(struct mtk_charger *info); extern int disable_hw_ovp(struct mtk_charger *info, int en); extern bool is_charger_exist(struct mtk_charger *info); extern int get_charger_temperature(struct mtk_charger *info, struct charger_device *chg); extern int get_charger_charging_current(struct mtk_charger *info, struct charger_device *chg); extern int get_charger_input_current(struct mtk_charger *info, struct charger_device *chg); extern int get_charger_zcv(struct mtk_charger *info, struct charger_device *chg); extern void _wake_up_charger(struct mtk_charger *info); /* functions for other */ extern int mtk_chg_enable_vbus_ovp(bool enable); #endif /* __MTK_CHARGER_H */