CP: Reorganize charge pump

move common code from pps charge policy file
to mmi charge core file

Change-Id: I975b21e1d2c30c1ffd5b3939db1dbbefb295ffe6
Signed-off-by: chailu1 <chailu1@lenovo.com>
Reviewed-on: https://gerrit.mot.com/1967488
SME-Granted: SME Approvals Granted
SLTApproved: Slta Waiver
Tested-by: Jira Key
Reviewed-by: Ying Xu <xuying9@motorola.com>
Reviewed-by: Haijian Ma <mahj8@motorola.com>
Reviewed-by: Huosheng Liao <liaohs@motorola.com>
Submit-Approved: Jira Key
This commit is contained in:
chailu1 2021-06-02 16:43:42 +08:00 • committed by Lu Chai
commit b657c809a6
5 changed files with 220 additions and 216 deletions

View file

@ -122,6 +122,8 @@ extern int mmi_set_input_current(struct mmi_charger_device *chrg, u32 uA);
extern int mmi_update_charger_status(struct mmi_charger_device *chrg);
extern int mmi_update_charger_error(struct mmi_charger_device *chrg);
extern int mmi_clear_charger_error(struct mmi_charger_device *chrg);
extern struct mmi_charger_ops sc8549_charger_ops;
extern struct mmi_charger_ops qpnp_pmic_charger_ops;
extern struct mmi_charger_device *mmi_charger_device_register(const char *name,
const char *psy_name,struct device *parent, void *devdata,
const struct mmi_charger_ops *ops);

View file

@ -53,6 +53,22 @@ module_param_named(
debug_mask, __debug_mask, int, S_IRUSR | S_IWUSR
);
struct mmi_cp_policy_dev g_chrg_list = {0};
const struct mmi_chrg_dev_ops dev_ops[] = {
{
.dev_name = "pmic-sw",
.ops = &qpnp_pmic_charger_ops,
},
{
.dev_name = "cp-master",
.ops = &sc8549_charger_ops,
},
{
.dev_name = "cp-slave",
.ops = &sc8549_charger_ops,
},
};
bool is_chan_valid(struct mmi_charger_manager *chip,
enum mmi_charger_ext_iio_channels chan)
{
@ -1043,29 +1059,56 @@ static void cancel_sm(struct mmi_charger_manager *chip)
"cancel sync and flush mmi chrg sm work\n");
}
void clear_chg_manager(struct mmi_charger_manager *chip)
void chrg_policy_error_clear(struct mmi_charger_manager *chip,
struct mmi_cp_policy_dev *chrg_list)
{
mmi_chrg_dbg(chip, PR_INTERRUPT, "clear mmi chrg manager!\n");
chip->pd_request_volt = 0;
chip->pd_request_curr = 0;
chip->pd_request_volt_prev = 0;
chip->pd_request_curr_prev = 0;
chip->pd_target_curr = 0;
chip->pd_target_volt = 0;
chip->pd_batt_therm_volt = 0;
chip->pd_batt_therm_curr = 0;
chip->pd_sys_therm_volt = 0;
chip->pd_sys_therm_curr = 0;
chip->recovery_pmic_chrg = false;
chip->sys_therm_cooling= false;
chip->sys_therm_force_pmic_chrg = false;
chip->batt_therm_cooling = false;
chip->batt_therm_cooling_cnt = 0;
int chrg_num = 0, i = 0;
struct mmi_charger_device *chrg_dev;
chrg_num = chip->mmi_chrg_dev_num;
memset(chip->mmi_pdo_info, 0,
sizeof(struct usbpd_pdo_info) * PD_MAX_PDO_NUM);
for (i = 0; i < chrg_num; i++) {
switch (i) {
case PMIC_SW:
break;
case CP_MASTER:
if (is_charger_exist(dev_ops[CP_MASTER].dev_name)) {
chrg_dev = chrg_list->chrg_dev[CP_MASTER];
mmi_clear_charger_error(chrg_dev);
}
break;
case CP_SLAVE:
break;
default:
mmi_chrg_err(chip,"mmi_chrg_dev not found %d !\n",i);
break;
}
}
return;
}
void clear_chrg_dev_error_cnt(struct mmi_charger_manager *chip, struct mmi_cp_policy_dev *chrg_list)
{
int chrg_num, i;
struct mmi_charger_device *chrg_dev;
chrg_num = chip->mmi_chrg_dev_num;
for (i = 0; i < chrg_num; i++) {
if (is_charger_exist(dev_ops[i].dev_name)) {
chrg_dev = chrg_list->chrg_dev[i];
chrg_dev->charger_error.chrg_err_type = 0;
chrg_dev->charger_error.bus_ucp_err_cnt = 0;
chrg_dev->charger_error.bus_ocp_err_cnt = 0;
}
}
return;
}
static void mmi_awake_vote(struct mmi_charger_manager *chip, bool awake)
{
if (awake == chip->awake)
@ -1419,7 +1462,7 @@ static void psy_changed_work_func(struct work_struct *work)
kick_sm(chip, 100);
} else {
cancel_sm(chip);
clear_chg_manager(chip);
chip->pd_pps_support = false;
}
return;
@ -1716,6 +1759,114 @@ cleanup:
return rc;
}
void chrg_dev_init(struct mmi_charger_manager *chip, struct mmi_cp_policy_dev *chrg_list)
{
int chrg_num, i;
chrg_num = chip->mmi_chrg_dev_num;
mmi_chrg_err(chip,"runing in chrg dev init!\n");
for (i = 0; i < chrg_num; i++) {
switch (i) {
case PMIC_SW:
if (is_charger_exist(dev_ops[PMIC_SW].dev_name)) {
chrg_list->pmic_sw = true;
chrg_list->chrg_dev[PMIC_SW] = chip->chrg_list[PMIC_SW];
}
break;
case CP_MASTER:
if (is_charger_exist(dev_ops[CP_MASTER].dev_name)) {
chrg_list->cp_master = true;
chrg_list->chrg_dev[CP_MASTER] = chip->chrg_list[CP_MASTER];
}
break;
case CP_SLAVE:
if (is_charger_exist(dev_ops[CP_SLAVE].dev_name)) {
chrg_list->cp_slave = true;
chrg_list->cp_clave_later = false;
chrg_list->chrg_dev[CP_SLAVE] = chip->chrg_list[CP_SLAVE];
}
break;
default:
mmi_chrg_err(chip,"No mmi_chrg_dev found %d !\n",i);
break;
}
}
return;
}
int mmi_chrg_policy_init(struct mmi_charger_manager *chip,
struct mmi_chrg_dts_info *chrg_dts,
int chrg_cnt) {
int i = 0, ops_cnt = 0, chrg_idx = 0;
struct mmi_charger_device *chrg_dev;
if (!chip ||!chrg_dts) {
mmi_chrg_err(chip, "invalid input param!\n");
return -EINVAL;
}
ops_cnt = ARRAY_SIZE(dev_ops);
if (chrg_cnt > ops_cnt ||
chrg_cnt > chip->mmi_chrg_dev_num) {
mmi_chrg_err(chip, "invalid input param!, chrg_cnt %d , ops_cnt %d, "
"mmi_chrg_dev_num %d\n",
chrg_cnt, ops_cnt, chip->mmi_chrg_dev_num);
return -EINVAL;
}
mmi_chrg_err(chip, "chrg_cnt %d\n", chrg_cnt);
for (i = 0; i < chrg_cnt; i++) {
if (!strcmp(chrg_dts[i].chrg_name, dev_ops[i].dev_name)) {
chrg_dev = mmi_charger_device_register(chrg_dts[i].chrg_name,
chrg_dts[i].psy_name, chip->dev, chip,
dev_ops[i].ops);
if (IS_ERR_OR_NULL(chrg_dev)
|| !is_charger_exist(chrg_dts[i].chrg_name)) {
mmi_chrg_err(chip,
"register mmi charger %s failed\n",
chrg_dts[i].chrg_name);
return -EINVAL;
} else {
mmi_chrg_info(chip,
"register mmi charger %s successfully, i %d, chrg_idx %d\n",
chrg_dts[i].chrg_name, i, chrg_idx);
chrg_dev->charging_curr_limited =
chrg_dts[i].charging_curr_limited;
mmi_chrg_err(chip, "charging_curr_limited %d\n",
chrg_dts[i].charging_curr_limited);
chrg_dev->charging_curr_min =
chrg_dts[i].charging_curr_min;
mmi_chrg_err(chip, "charging_curr_min %d, chrg_id %d\n",
chrg_dts[i].charging_curr_min, chrg_idx);
chip->chrg_list[chrg_idx] = chrg_dev;
mmi_chrg_err(chip, "--- over ----\n");
chrg_idx++;
}
}
}
mmi_chrg_info(chip,"chrg_cnt %d, ops_cnt %d, mmi_chrg_dev_num %d, "
"chrg_idx %d\n",
chrg_cnt, ops_cnt, chip->mmi_chrg_dev_num, chrg_idx);
if (chrg_idx != chip->mmi_chrg_dev_num
&& chrg_idx > 0) {
mmi_chrg_err(chip, "chrg_id %d != charger num %d\n",
chrg_idx, chip->mmi_chrg_dev_num);
for (i = 0; i < chrg_idx; i++)
mmi_charger_device_unregister(chip->chrg_list[i]);
return -EINVAL;
}
chrg_dev_init(chip, &g_chrg_list);
chip->pps_volt_comp = PPS_INIT_VOLT_COMP;
INIT_DELAYED_WORK(&chip->mmi_chrg_sm_work, mmi_chrg_sm_work_func);
return 0;
}
static int mmi_chrg_manager_probe(struct platform_device *pdev)
{
int ret = 0;

View file

@ -158,6 +158,21 @@ struct mmi_chrg_dts_info {
int charging_curr_min;
};
enum mmi_chrg_dev {
PMIC_SW = 0,
CP_MASTER,
CP_SLAVE,
CHRG_NUM,
};
struct mmi_cp_policy_dev {
bool pmic_sw;
bool cp_master;
bool cp_slave;
bool cp_clave_later;
struct mmi_charger_device *chrg_dev[CHRG_NUM];
};
#define PPS_RET_HISTORY_SIZE 8
#define PD_SRC_PDO_TYPE_FIXED 0
#define PD_SRC_PDO_TYPE_BATTERY 1
@ -267,13 +282,19 @@ struct mmi_charger_manager {
struct mmi_charger_device **chrg_list; /*charger device list*/
};
#define PPS_INIT_VOLT_COMP 500000
extern struct mmi_cp_policy_dev g_chrg_list;
extern const struct mmi_chrg_dev_ops dev_ops[];
extern void clear_chrg_dev_error_cnt(struct mmi_charger_manager *chip, struct mmi_cp_policy_dev *chrg_list);
extern void chrg_policy_error_clear(struct mmi_charger_manager *chip, struct mmi_cp_policy_dev *chrg_list);
extern void mmi_chrg_sm_work_func(struct work_struct *work);
extern void chrg_dev_init(struct mmi_charger_manager *chip, struct mmi_cp_policy_dev *chrg_list);
extern bool mmi_get_pps_result_history(struct mmi_charger_manager *chip);
extern void mmi_set_pps_result_history(struct mmi_charger_manager *chip, int pps_result);
extern void mmi_clear_pps_result_history(struct mmi_charger_manager *chip);
extern int mmi_calculate_delta_volt(int pps_voltage, int pps_current, int delta_curr);
extern bool mmi_find_chrg_step(struct mmi_charger_manager *chip, int temp_zone, int vbatt_volt);
extern bool mmi_find_temp_zone(struct mmi_charger_manager *chip, int temp_c, bool ignore_hysteresis_degc);
extern void clear_chg_manager(struct mmi_charger_manager *chip);
extern void mmi_update_all_charger_status(struct mmi_charger_manager *chip);
extern void mmi_update_all_charger_error(struct mmi_charger_manager *chip);
extern void mmi_dump_charger_error(struct mmi_charger_manager *chip,

View file

@ -27,9 +27,6 @@
*/
#ifndef __MMI_CHRG_POLICY_H_
#define __MMI_CHRG_POLICY_H_
extern int mmi_chrg_policy_init(struct mmi_charger_manager *chip,
struct mmi_chrg_dts_info *chrg_dts,
int chrg_cnt);
extern void mmi_chrg_policy_clear(struct mmi_charger_manager *chip);
extern void mmi_chrg_enable_all_cp(struct mmi_charger_manager *chip, int val);
#endif

View file

@ -43,39 +43,6 @@
#include <linux/types.h>
#include "mmi_charger_core.h"
extern struct mmi_charger_ops sc8549_charger_ops;
extern struct mmi_charger_ops qpnp_pmic_charger_ops;
static const struct mmi_chrg_dev_ops dev_ops[] = {
{
.dev_name = "pmic-sw",
.ops = &qpnp_pmic_charger_ops,
},
{
.dev_name = "cp-master",
.ops = &sc8549_charger_ops,
},
{
.dev_name = "cp-slave",
.ops = &sc8549_charger_ops,
},
};
enum mmi_chrg_dev {
PMIC_SW = 0,
CP_MASTER,
CP_SLAVE,
CHRG_NUM,
};
struct mmi_cp_policy_dev {
bool pmic_sw;
bool cp_master;
bool cp_slave;
bool cp_clave_later;
struct mmi_charger_device *chrg_dev[CHRG_NUM];
};
typedef enum {
PM_STATE_DISCONNECT,
PM_STATE_ENTRY,
@ -119,7 +86,6 @@ static int chrg_cv_delta_volt = 0;
static int quit_slave_chrg_cnt = 0;
static int batt_curr_roof = 0;
static int pd_constant_power_cnt = 0;
static struct mmi_cp_policy_dev g_chrg_list = {0};
static void mmi_chrg_sm_move_state(struct mmi_charger_manager *chip, pm_sm_state_t state)
{
@ -130,60 +96,6 @@ static void mmi_chrg_sm_move_state(struct mmi_charger_manager *chip, pm_sm_state
batt_curr_roof = 0;
}
static void chrg_dev_init(struct mmi_charger_manager *chip, struct mmi_cp_policy_dev *chrg_list)
{
int chrg_num, i;
chrg_num = chip->mmi_chrg_dev_num;
mmi_chrg_err(chip,"runing in chrg dev init!\n");
for (i = 0; i < chrg_num; i++) {
switch (i) {
case PMIC_SW:
if (is_charger_exist(dev_ops[PMIC_SW].dev_name)) {
chrg_list->pmic_sw = true;
chrg_list->chrg_dev[PMIC_SW] = chip->chrg_list[PMIC_SW];
}
break;
case CP_MASTER:
if (is_charger_exist(dev_ops[CP_MASTER].dev_name)) {
chrg_list->cp_master = true;
chrg_list->chrg_dev[CP_MASTER] = chip->chrg_list[CP_MASTER];
}
break;
case CP_SLAVE:
if (is_charger_exist(dev_ops[CP_SLAVE].dev_name)) {
chrg_list->cp_slave = true;
chrg_list->cp_clave_later = false;
chrg_list->chrg_dev[CP_SLAVE] = chip->chrg_list[CP_SLAVE];
}
break;
default:
mmi_chrg_err(chip,"No mmi_chrg_dev found %d !\n",i);
break;
}
}
return;
}
static void clear_chrg_dev_error_cnt(struct mmi_charger_manager *chip, struct mmi_cp_policy_dev *chrg_list)
{
int chrg_num, i;
struct mmi_charger_device *chrg_dev;
chrg_num = chip->mmi_chrg_dev_num;
for (i = 0; i < chrg_num; i++) {
if (is_charger_exist(dev_ops[i].dev_name)) {
chrg_dev = chrg_list->chrg_dev[i];
chrg_dev->charger_error.chrg_err_type = 0;
chrg_dev->charger_error.bus_ucp_err_cnt = 0;
chrg_dev->charger_error.bus_ocp_err_cnt = 0;
}
}
return;
}
#define PPS_INIT_VOLT_COMP 500000
#define PPS_VOLT_COMP_DELTA 300000
static void chrg_policy_error_recovery(struct mmi_charger_manager *chip,
struct mmi_cp_policy_dev *chrg_list)
@ -273,37 +185,6 @@ static void chrg_policy_error_recovery(struct mmi_charger_manager *chip,
return;
}
static void chrg_policy_error_clear(struct mmi_charger_manager *chip,
struct mmi_cp_policy_dev *chrg_list)
{
int chrg_num = 0, i = 0;
struct mmi_charger_device *chrg_dev;
chrg_num = chip->mmi_chrg_dev_num;
for (i = 0; i < chrg_num; i++) {
switch (i) {
case PMIC_SW:
break;
case CP_MASTER:
if (is_charger_exist(dev_ops[CP_MASTER].dev_name)) {
chrg_dev = chrg_list->chrg_dev[CP_MASTER];
mmi_clear_charger_error(chrg_dev);
}
break;
case CP_SLAVE:
break;
default:
mmi_chrg_err(chip,"mmi_chrg_dev not found %d !\n",i);
break;
}
}
return;
}
void mmi_chrg_enable_all_cp(struct mmi_charger_manager *chip, int val)
{
struct mmi_cp_policy_dev *chrg_list = &g_chrg_list;
@ -361,6 +242,29 @@ void mmi_chrg_enable_all_cp(struct mmi_charger_manager *chip, int val)
#define CP_CHRG_SOC_LIMIT 90
#define PD_CONT_PWR_CNT 5
static void clear_chg_manager(struct mmi_charger_manager *chip)
{
mmi_chrg_dbg(chip, PR_INTERRUPT, "clear mmi chrg manager!\n");
chip->pd_request_volt = 0;
chip->pd_request_curr = 0;
chip->pd_request_volt_prev = 0;
chip->pd_request_curr_prev = 0;
chip->pd_target_curr = 0;
chip->pd_target_volt = 0;
chip->pd_batt_therm_volt = 0;
chip->pd_batt_therm_curr = 0;
chip->pd_sys_therm_volt = 0;
chip->pd_sys_therm_curr = 0;
chip->recovery_pmic_chrg = false;
chip->sys_therm_cooling= false;
chip->sys_therm_force_pmic_chrg = false;
chip->batt_therm_cooling = false;
chip->batt_therm_cooling_cnt = 0;
memset(chip->mmi_pdo_info, 0,
sizeof(struct usbpd_pdo_info) * PD_MAX_PDO_NUM);
}
void mmi_chrg_policy_clear(struct mmi_charger_manager *chip) {
struct mmi_cp_policy_dev *chrg_list = &g_chrg_list;
chrg_dev_init(chip, &g_chrg_list);
@ -379,7 +283,7 @@ void mmi_chrg_policy_clear(struct mmi_charger_manager *chip) {
return;
}
static void mmi_chrg_sm_work_func(struct work_struct *work)
void mmi_chrg_sm_work_func(struct work_struct *work)
{
struct mmi_charger_manager *chip = container_of(work,
struct mmi_charger_manager, mmi_chrg_sm_work.work);
@ -1589,75 +1493,4 @@ skip_pd_select:
return;
}
int mmi_chrg_policy_init(struct mmi_charger_manager *chip,
struct mmi_chrg_dts_info *chrg_dts,
int chrg_cnt) {
int i = 0, ops_cnt = 0, chrg_idx = 0;
struct mmi_charger_device *chrg_dev;
if (!chip ||!chrg_dts) {
mmi_chrg_err(chip, "invalid input param!\n");
return -EINVAL;
}
ops_cnt = ARRAY_SIZE(dev_ops);
if (chrg_cnt > ops_cnt ||
chrg_cnt > chip->mmi_chrg_dev_num) {
mmi_chrg_err(chip, "invalid input param!, chrg_cnt %d , ops_cnt %d, "
"mmi_chrg_dev_num %d\n",
chrg_cnt, ops_cnt, chip->mmi_chrg_dev_num);
return -EINVAL;
}
mmi_chrg_err(chip, "chrg_cnt %d\n", chrg_cnt);
for (i = 0; i < chrg_cnt; i++) {
if (!strcmp(chrg_dts[i].chrg_name, dev_ops[i].dev_name)) {
chrg_dev = mmi_charger_device_register(chrg_dts[i].chrg_name,
chrg_dts[i].psy_name, chip->dev, chip,
dev_ops[i].ops);
if (IS_ERR_OR_NULL(chrg_dev)
|| !is_charger_exist(chrg_dts[i].chrg_name)) {
mmi_chrg_err(chip,
"register mmi charger %s failed\n",
chrg_dts[i].chrg_name);
return -EINVAL;
} else {
mmi_chrg_info(chip,
"register mmi charger %s successfully, i %d, chrg_idx %d\n",
chrg_dts[i].chrg_name, i, chrg_idx);
chrg_dev->charging_curr_limited =
chrg_dts[i].charging_curr_limited;
mmi_chrg_err(chip, "charging_curr_limited %d\n",
chrg_dts[i].charging_curr_limited);
chrg_dev->charging_curr_min =
chrg_dts[i].charging_curr_min;
mmi_chrg_err(chip, "charging_curr_min %d, chrg_id %d\n",
chrg_dts[i].charging_curr_min, chrg_idx);
chip->chrg_list[chrg_idx] = chrg_dev;
mmi_chrg_err(chip, "--- over ----\n");
chrg_idx++;
}
}
}
mmi_chrg_info(chip,"chrg_cnt %d, ops_cnt %d, mmi_chrg_dev_num %d, "
"chrg_idx %d\n",
chrg_cnt, ops_cnt, chip->mmi_chrg_dev_num, chrg_idx);
if (chrg_idx != chip->mmi_chrg_dev_num
&& chrg_idx > 0) {
mmi_chrg_err(chip, "chrg_id %d != charger num %d\n",
chrg_idx, chip->mmi_chrg_dev_num);
for (i = 0; i < chrg_idx; i++)
mmi_charger_device_unregister(chip->chrg_list[i]);
return -EINVAL;
}
chrg_dev_init(chip, &g_chrg_list);
chip->pps_volt_comp = PPS_INIT_VOLT_COMP;
INIT_DELAYED_WORK(&chip->mmi_chrg_sm_work, mmi_chrg_sm_work_func);
return 0;
}