From ea9cb1b6b827fbf9f1e40993eba8b00c570a2cbe Mon Sep 17 00:00:00 2001 From: Steinar Bakkemo Date: Tue, 4 Aug 2020 13:32:22 +0200 Subject: [PATCH] max77818-battery: skip default verify/write for all custom params Due to uncertainty related to how safe it is to verify each custom param during every boot, set the skip_verify flag for every custom param except for the config register which is verified against current DT and reset if changed for some reason since last boot. This ensures that if an operation performed through the max77818 charger driver was aborted by a reboot for instance, and the FGCC bit remained 0, it will be restored to 1 after a reboot. --- drivers/power/supply/max77818_battery.c | 82 ++++++++++++++----------- 1 file changed, 46 insertions(+), 36 deletions(-) diff --git a/drivers/power/supply/max77818_battery.c b/drivers/power/supply/max77818_battery.c index 503869493fa2..6a1e60ad1d69 100644 --- a/drivers/power/supply/max77818_battery.c +++ b/drivers/power/supply/max77818_battery.c @@ -184,7 +184,7 @@ struct max77818_of_property { int (*reg_write_op)(struct regmap *map, unsigned int reg, unsigned int value); - bool is_learned_value; + bool skip_verify; }; static void max77818_do_init_completion(struct max77818_chip *chip) @@ -1037,61 +1037,64 @@ static void max77818_lock_extra_config_registers(struct max77818_chip *chip) } static struct max77818_of_property max77818_relax_cfg = - {"maxim,relax-cfg", MAX17042_RelaxCFG, regmap_write}; + {"maxim,relax-cfg", MAX17042_RelaxCFG, regmap_write, true}; static struct max77818_of_property max77818_custom_param_list [] = { { "maxim,learn-cfg", MAX17042_LearnCFG, regmap_write, true }, - { "maxim,config", MAX17042_CONFIG, regmap_write }, - { "maxim,config2", MAX77818_Config2, regmap_write }, - { "maxim,full-soc-threshold", MAX17047_FullSOCThr, regmap_write }, + + /* Verified and restored if required after reboot to ensure FGCC=1 */ + { "maxim,config", MAX17042_CONFIG, regmap_write}, + + { "maxim,config2", MAX77818_Config2, regmap_write, true }, + { "maxim,full-soc-threshold", MAX17047_FullSOCThr, regmap_write, true }, /* learned value, skipped during verify/write operation at boot */ { "maxim,fullcaprep", MAX17042_FullCAP0, max77818_write_verify_reg, true }, - { "maxim,design-cap", MAX17042_DesignCap, regmap_write }, + { "maxim,design-cap", MAX17042_DesignCap, regmap_write, true }, /* learned values, skipped during verify/write operation at boot */ { "maxim,dpacc", MAX17042_dPacc, max77818_write_verify_reg, true }, { "maxim,dqacc", MAX17042_dQacc, max77818_write_verify_reg, true }, { "maxim,fullcapnom", MAX17042_FullCAPNom, max77818_write_verify_reg, true }, - { "maxim,misc-cfg", MAX17042_MiscCFG, regmap_write }, - { "maxim,v-empty", MAX17047_V_empty, regmap_write }, - { "maxim,qresidual00", MAX17047_QRTbl00, max77818_write_verify_reg }, - { "maxim,qresidual10", MAX17047_QRTbl10, max77818_write_verify_reg }, - { "maxim,qresidual20", MAX17047_QRTbl20, max77818_write_verify_reg }, - { "maxim,qresidual30", MAX17047_QRTbl30, max77818_write_verify_reg }, + { "maxim,misc-cfg", MAX17042_MiscCFG, regmap_write, true }, + { "maxim,v-empty", MAX17047_V_empty, regmap_write, true }, + { "maxim,qresidual00", MAX17047_QRTbl00, max77818_write_verify_reg, true }, + { "maxim,qresidual10", MAX17047_QRTbl10, max77818_write_verify_reg, true }, + { "maxim,qresidual20", MAX17047_QRTbl20, max77818_write_verify_reg, true }, + { "maxim,qresidual30", MAX17047_QRTbl30, max77818_write_verify_reg, true }, /* learned value, skipped during verify/write operation at boot */ { "maxim,rcomp0", MAX17042_RCOMP0, max77818_write_verify_reg, true }, - { "maxim,tempco", MAX17042_TempCo, max77818_write_verify_reg }, - { "maxim,ichg-term", MAX17042_ICHGTerm, regmap_write }, - { "maxim,filter-cfg", MAX17042_FilterCFG, regmap_write }, + { "maxim,tempco", MAX17042_TempCo, max77818_write_verify_reg, true }, + { "maxim,ichg-term", MAX17042_ICHGTerm, regmap_write, true }, + { "maxim,filter-cfg", MAX17042_FilterCFG, regmap_write, true }, /* learned value, skipped during verify/write operation at boot */ { "maxim,iavg-empty", MAX17042_LAvg_empty, regmap_write, true }, - { "maxim,tgain", MAX17042_TGAIN, regmap_write }, - { "maxim,toff", MAx17042_TOFF, regmap_write }, - { "maxim,tcurve", MAX77818_TCURVE, regmap_write }, - { "maxim,talrt-th", MAX17042_TALRT_Th, regmap_write }, - { "maxim,talrt-th2", MAX77818_TALRT_Th2, regmap_write }, - { "maxim,jeita-curr", MAX77818_JEITA_Curr, regmap_write }, - { "maxim,jeita-volt", MAX77818_JEITA_Volt, regmap_write }, - { "maxim,chargestate0", MAX77818_ChargeState0, regmap_write }, - { "maxim,chargestate1", MAX77818_ChargeState1, regmap_write }, - { "maxim,chargestate2", MAX77818_ChargeState2, regmap_write }, - { "maxim,chargestate3", MAX77818_ChargeState3, regmap_write }, - { "maxim,chargestate4", MAX77818_ChargeState4, regmap_write }, - { "maxim,chargestate5", MAX77818_ChargeState5, regmap_write }, - { "maxim,chargestate6", MAX77818_ChargeState6, regmap_write }, - { "maxim,chargestate7", MAX77818_ChargeState7, regmap_write }, + { "maxim,tgain", MAX17042_TGAIN, regmap_write, true }, + { "maxim,toff", MAx17042_TOFF, regmap_write, true }, + { "maxim,tcurve", MAX77818_TCURVE, regmap_write, true }, + { "maxim,talrt-th", MAX17042_TALRT_Th, regmap_write, true }, + { "maxim,talrt-th2", MAX77818_TALRT_Th2, regmap_write, true }, + { "maxim,jeita-curr", MAX77818_JEITA_Curr, regmap_write, true }, + { "maxim,jeita-volt", MAX77818_JEITA_Volt, regmap_write, true }, + { "maxim,chargestate0", MAX77818_ChargeState0, regmap_write, true }, + { "maxim,chargestate1", MAX77818_ChargeState1, regmap_write, true }, + { "maxim,chargestate2", MAX77818_ChargeState2, regmap_write, true }, + { "maxim,chargestate3", MAX77818_ChargeState3, regmap_write, true }, + { "maxim,chargestate4", MAX77818_ChargeState4, regmap_write, true }, + { "maxim,chargestate5", MAX77818_ChargeState5, regmap_write, true }, + { "maxim,chargestate6", MAX77818_ChargeState6, regmap_write, true }, + { "maxim,chargestate7", MAX77818_ChargeState7, regmap_write, true }, /* The order of the following ones should be respected */ - { "maxim,at-rate", MAX17042_AtRate, regmap_write }, - { "maxim,smart-chg-cfg", MAX77818_SmartChgCfg, regmap_write }, - { "maxim,convgcfg", MAX77818_ConvgCfg, regmap_write }, + { "maxim,at-rate", MAX17042_AtRate, regmap_write, true }, + { "maxim,smart-chg-cfg", MAX77818_SmartChgCfg, regmap_write, true }, + { "maxim,convgcfg", MAX77818_ConvgCfg, regmap_write, true }, }; static void max77818_verify_custom_params(struct max77818_chip *chip) @@ -1100,14 +1103,21 @@ static void max77818_verify_custom_params(struct max77818_chip *chip) dev_dbg(chip->dev, "Verifying custom params\n"); - max77818_read_param_and_verify(chip, &max77818_relax_cfg); + if (max77818_relax_cfg.skip_verify) { + dev_dbg(chip->dev, + "Skipping verify/write for register '%s'\n", + max77818_relax_cfg.property_name); + } + else { + max77818_read_param_and_verify(chip, &max77818_relax_cfg); + } max77818_unlock_extra_config_registers(chip); for(i = 0; i < ARRAY_SIZE(max77818_custom_param_list); i++) { - if (max77818_custom_param_list[i].is_learned_value) { + if (max77818_custom_param_list[i].skip_verify) { dev_dbg(chip->dev, - "Skipping 'learned' value '%s'\n", + "Skipping verify/write for register '%s'\n", max77818_custom_param_list[i].property_name); continue; }