mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-10 14:19:09 -04:00
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:
parent
2286350930
commit
b657c809a6
5 changed files with 220 additions and 216 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue