mmi_parallel_charger: UI support for 45W charger

when User attaches a 45W charger, the UI : 45W Hyper charging
In kernel space, driver module report "Hyper" to user space
when the 45w charger adapter connected
and report "Super" to user space when the 27w charger connected
/sys/class/power_supply/battery/charger_rate

Change-Id: I54041e6289fcea3808c1270bc70f2022c8d840cf
Signed-off-by: xuwt2 <xuwt2@lenovo.com>
Reviewed-on: https://gerrit.mot.com/1450586
SME-Granted: SME Approvals Granted
SLTApproved: Slta Waiver
Tested-by: Jira Key
Reviewed-by: Jianqi Yang <yangj@motorola.com>
Submit-Approved: Jira Key
Reviewed-on: https://gerrit.mot.com/1893600
Reviewed-by: Xiangpo Zhao <zhaoxp3@motorola.com>
Reviewed-by: Wei Xu <xuwei9@lenovo.com>
This commit is contained in:
xuwt2 2019-11-07 13:33:02 +08:00 • committed by Wei Xu
commit 20762a20ae

View file

@ -55,11 +55,12 @@ static int pd_curr_max_init = 0;
static int *dt_temp_zones;
static struct mmi_chrg_dts_info *chrg_name_list;
static char *charge_rate[] = {
"None", "Normal", "Weak", "Turbo"
"None", "Normal", "Weak", "Turbo", "Hyper"
};
#define MIN_TEMP_C -20
#define MAX_TEMP_C 60
#define HYSTEREISIS_DEGC 2
void mmi_chrg_rate_check(struct mmi_charger_manager *chg);
bool mmi_find_temp_zone(struct mmi_charger_manager *chip, int temp_c, bool ignore_hysteresis_degc)
{
int prev_zone, num_zones;
@ -494,6 +495,10 @@ static int batt_get_property(struct power_supply *psy,
}
}
break;
case POWER_SUPPLY_PROP_CHARGE_RATE:
mmi_chrg_rate_check(chip);
val->intval = chip->charger_rate;
break;
default:
rc = power_supply_get_property(chip->qcom_psy,
psp, &prop);
@ -795,11 +800,15 @@ static int get_prop_charger_present(struct mmi_charger_manager *chg,
#define WEAK_CHRG_THRSH 450
#define TURBO_CHRG_THRSH 2500
#define TURBO_CHRG_THRSH_UW 12500000
#define HYPER_CHRG_THRSH_UW 40000000
void mmi_chrg_rate_check(struct mmi_charger_manager *chg)
{
union power_supply_propval val;
int chrg_cm_ma = 0;
int chrg_cs_ma = 0;
int charger_power = 0;
int prev_chg_rate = chg->charger_rate;
int rc = -EINVAL;
@ -846,6 +855,13 @@ void mmi_chrg_rate_check(struct mmi_charger_manager *chg)
else if (prev_chg_rate == POWER_SUPPLY_CHARGE_RATE_NONE)
chg->charger_rate = POWER_SUPPLY_CHARGE_RATE_NORMAL;
if (chg->pd_pps_support) {
charger_power = (chg->pd_curr_max / 1000) * (chg->pd_volt_max / 1000);
if (charger_power >= HYPER_CHRG_THRSH_UW)
chg->charger_rate = POWER_SUPPLY_CHARGE_RATE_HYPER;
else if (charger_power >= TURBO_CHRG_THRSH_UW)
chg->charger_rate = POWER_SUPPLY_CHARGE_RATE_TURBO;
}
end_rate_check:
if (prev_chg_rate != chg->charger_rate)
mmi_chrg_info(chg, "%s Charger Detected\n",
@ -999,6 +1015,8 @@ static void cancel_sm(struct mmi_charger_manager *chip)
flush_delayed_work(&chip->mmi_chrg_sm_work);
mmi_chrg_policy_clear(chip);
chip->sm_work_running = false;
chip->pd_volt_max = pd_volt_max_init;
chip->pd_curr_max = pd_curr_max_init;
mmi_chrg_dbg(chip, PR_INTERRUPT,
"cancel sync and flush mmi chrg sm work\n");
}
@ -1012,8 +1030,6 @@ void clear_chg_manager(struct mmi_charger_manager *chip)
chip->pd_request_curr_prev = 0;
chip->pd_target_curr = 0;
chip->pd_target_volt = 0;
chip->pd_volt_max = pd_volt_max_init;
chip->pd_curr_max = pd_curr_max_init;
chip->pd_batt_therm_volt = 0;
chip->pd_batt_therm_curr = 0;
chip->pd_sys_therm_volt = 0;
@ -1256,7 +1272,6 @@ static void mmi_heartbeat_work(struct work_struct *work)
}
chip->vbus_present = val.intval;
mmi_chrg_rate_check(chip);
hb_resch_time = HEARTBEAT_DELAY_MS;
if (chip->vbus_present)
@ -1266,26 +1281,6 @@ static void mmi_heartbeat_work(struct work_struct *work)
if (!chip->vbus_present)
mmi_awake_vote(chip, false);
chrg_rate_string = kmalloc(CHG_SHOW_MAX_SIZE, GFP_KERNEL);
if (!chrg_rate_string) {
mmi_chrg_err(chip, "SMBMMI: Failed to Get Uevent Mem\n");
envp[0] = NULL;
} else {
scnprintf(chrg_rate_string, CHG_SHOW_MAX_SIZE,
"POWER_SUPPLY_CHARGE_RATE=%s",
charge_rate[chip->charger_rate]);
envp[0] = chrg_rate_string;
envp[1] = NULL;
}
if (chip->qcom_psy) {
mmi_power_supply_changed(chip->batt_psy, envp);
}
kfree(chrg_rate_string);
__pm_relax(&chip->mmi_hb_wake_source);
ret = power_supply_get_property(chip->usb_psy,
POWER_SUPPLY_PROP_PD_ACTIVE, &val);
if (ret) {
@ -1346,6 +1341,29 @@ static void mmi_heartbeat_work(struct work_struct *work)
if (chip->use_batt_age)
mmi_cycle_counts(chip);
mmi_chrg_rate_check(chip);
chrg_rate_string = kmalloc(CHG_SHOW_MAX_SIZE, GFP_KERNEL);
if (!chrg_rate_string) {
mmi_chrg_err(chip, "SMBMMI: Failed to Get Uevent Mem\n");
envp[0] = NULL;
} else {
scnprintf(chrg_rate_string, CHG_SHOW_MAX_SIZE,
"POWER_SUPPLY_CHARGE_RATE=%s",
charge_rate[chip->charger_rate]);
envp[0] = chrg_rate_string;
envp[1] = NULL;
}
if (chip->qcom_psy) {
mmi_power_supply_changed(chip->batt_psy, envp);
}
kfree(chrg_rate_string);
__pm_relax(&chip->mmi_hb_wake_source);
schedule_work:
schedule_delayed_work(&chip->heartbeat_work,
msecs_to_jiffies(hb_resch_time));