kernel_samsung_a34x-permissive/drivers/power/supply/mtk_charger.h
2024-04-28 15:51:13 +02:00

350 lines
8.4 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (c) 2019 MediaTek Inc.
*/
#ifndef __MTK_CHARGER_H
#define __MTK_CHARGER_H
#include <linux/alarmtimer.h>
#include "charger_class.h"
#include "adapter_class.h"
#include "mtk_charger_algorithm_class.h"
#define CHARGING_INTERVAL 10
#define CHARGING_FULL_INTERVAL 20
#define CHRLOG_ERROR_LEVEL 1
#define CHRLOG_INFO_LEVEL 2
#define CHRLOG_DEBUG_LEVEL 3
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;
#define BATTERY_CV 4350000
#define V_CHARGER_MAX 6500000 /* 6.5 V */
#define V_CHARGER_MIN 4600000 /* 4.6 V */
#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
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;
};
/* 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 (*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 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;
/* 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;
int disable_charging_count;
int input_current_limit_by_aicl;
int junction_temp_min;
int junction_temp_max;
};
enum chg_data_idx_enum {
CHG1_SETTING,
CHG2_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_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 *chg_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_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 timespec 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 disable_charger;
int battery_temp;
bool can_charging;
bool cmd_discharging;
bool safety_timeout;
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 timespec charging_begin_time;
/* 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];
struct notifier_block chg_alg_nb;
bool enable_hv_charging;
/* water detection */
bool water_detected;
bool enable_dynamic_mivr;
};
/* 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_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 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 */