From 3e7f3122914314bd94f9860ce8d9683c1024ddaf Mon Sep 17 00:00:00 2001 From: Steinar Bakkemo Date: Wed, 5 Feb 2020 16:07:29 +0100 Subject: [PATCH] max77818-battery: improve FGCC enable/disable (configurable delay) Add post_fgcc_change_delay_us module parameter with default value 100000 us. Move delay into FGCC enable/disable function. Add delay both after FGCC enable and disable. --- drivers/power/supply/max77818_battery.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/drivers/power/supply/max77818_battery.c b/drivers/power/supply/max77818_battery.c index 038f6e02bdbe..ea52e2e6d7bb 100644 --- a/drivers/power/supply/max77818_battery.c +++ b/drivers/power/supply/max77818_battery.c @@ -120,6 +120,15 @@ MODULE_PARM_DESC(config_update, "the device if required, depending on versioning scheme or other " "means of determining if a complete or partial update is required."); +/* Parameter to be given from command line in order to tune the delay introduced after + * clearing the FGCC bit before forwarding requests to the charger driver */ +static int post_fgcc_change_delay_us = 100000; +module_param(post_fgcc_change_delay_us, int, 0644); +MODULE_PARM_DESC(post_fgcc_change_delay_us, + "Debug parameter used to tune the post FGCC change delay introduced " + "to let the charger/fuelgauge take back charging control before doing " + "any other configuration changes on either"); + struct max77818_chip { struct device *dev; int irq; @@ -334,6 +343,7 @@ static int max77818_set_fgcc_mode(struct max77818_chip *chip, bool enabled, bool MAX17042_CONFIG, CONFIG_FGCC_BIT, enabled ? CONFIG_FGCC_BIT : 0x0000); + if (ret) { dev_err(chip->dev, "Failed to %s FGCC bit in CONFIG register\n", @@ -341,6 +351,9 @@ static int max77818_set_fgcc_mode(struct max77818_chip *chip, bool enabled, bool return ret; } + dev_dbg(chip->dev, "Waiting %d us after FGCC mode change..\n", post_fgcc_change_delay_us); + usleep_range(post_fgcc_change_delay_us, post_fgcc_change_delay_us + 100000); + return 0; } @@ -358,8 +371,11 @@ static int max77818_set_charger_mode(struct max77818_chip *chip, dev_dbg(chip->dev, "Clearing FGCC mode\n"); ret = max77818_set_fgcc_mode(chip, false, &restore_state); - if (ret) + if (ret) { + dev_err(chip->dev, + "Failed to clear FGCC bit in CONFIG register\n"); goto out; + } dev_dbg(chip->dev, "Trying to set charger mode (%d) through charger driver\n", @@ -373,7 +389,6 @@ static int max77818_set_charger_mode(struct max77818_chip *chip, "Failed to forward charger mode to charger driver\n"); goto out; } - usleep_range(100, 200); if (restore_state) { dev_dbg(chip->dev, @@ -417,7 +432,6 @@ static int max77818_get_charger_mode(struct max77818_chip *chip, "Failed to clear FGCC bit in CONFIG register\n"); goto out; } - usleep_range(100, 200); dev_dbg(chip->dev, "Trying to read charger mode through charger driver\n");