From: Anton Vorontsov <anton.vorontsov@linaro.org>
To: mathieu.poirier@linaro.org
Cc: linux-kernel@vger.kernel.org, dwmw2@infradead.org
Subject: Re: [PATCH 51/57] power: ab8500: Re-alignment with internal developement.
Date: Thu, 27 Sep 2012 19:35:11 -0700 [thread overview]
Message-ID: <20120928023510.GJ5040@lizard> (raw)
In-Reply-To: <1348589574-25655-52-git-send-email-mathieu.poirier@linaro.org>
On Tue, Sep 25, 2012 at 10:12:48AM -0600, mathieu.poirier@linaro.org wrote:
> From: "Mathieu J. Poirier" <mathieu.poirier@linaro.org>
>
> A lot of developement happened internally since the first
> mainlining of the battery managmenent driver. Most of the
> new code can be historically accounted for but some of it
> can't.
>
> This patch is a gathering of the code for which history was
> lost but still relevant to the well being of the driver.
Nope, sorry. The patch has to be logically separated and the description
should precisely describe the change(s), not 'let's gather some missing
bits.'
> Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
> ---
> drivers/power/ab8500_charger.c | 2 +-
> drivers/power/abx500_chargalg.c | 66 +++++++++++++++++++++++++++------------
> 2 files changed, 47 insertions(+), 21 deletions(-)
>
> diff --git a/drivers/power/ab8500_charger.c b/drivers/power/ab8500_charger.c
> index 1290470..3a97012 100644
> --- a/drivers/power/ab8500_charger.c
> +++ b/drivers/power/ab8500_charger.c
> @@ -720,7 +720,7 @@ static int ab8500_charger_max_usb_curr(struct ab8500_charger *di,
> di->is_aca_rid = 0;
> break;
> case USB_STAT_ACA_RID_C_HS_CHIRP:
> - case USB_STAT_ACA_RID_C_NM:
> + case USB_STAT_ACA_RID_C_NM:
> di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_1P5;
> di->is_aca_rid = 1;
> break;
> diff --git a/drivers/power/abx500_chargalg.c b/drivers/power/abx500_chargalg.c
> index 1df238f..636d970 100644
> --- a/drivers/power/abx500_chargalg.c
> +++ b/drivers/power/abx500_chargalg.c
> @@ -27,7 +27,7 @@
> #include <linux/notifier.h>
>
> /* Watchdog kick interval */
> -#define CHG_WD_INTERVAL (6 * HZ)
> +#define CHG_WD_INTERVAL (60 * HZ)
>
> /* End-of-charge criteria counter */
> #define EOC_COND_CNT 10
> @@ -513,7 +513,7 @@ static int abx500_chargalg_kick_watchdog(struct abx500_chargalg *di)
> static int abx500_chargalg_ac_en(struct abx500_chargalg *di, int enable,
> int vset, int iset)
> {
> - static int ab8500_chargalg_ex_ac_enable_toggle;
> + static int abx500_chargalg_ex_ac_enable_toggle;
>
> if (!di->ac_chg || !di->ac_chg->ops.enable)
> return -ENXIO;
> @@ -529,10 +529,10 @@ static int abx500_chargalg_ac_en(struct abx500_chargalg *di, int enable,
>
> /*enable external charger*/
> if (enable && di->ac_chg->external &&
> - !ab8500_chargalg_ex_ac_enable_toggle) {
> + !abx500_chargalg_ex_ac_enable_toggle) {
> blocking_notifier_call_chain(&charger_notifier_list,
> 0, di->dev);
> - ab8500_chargalg_ex_ac_enable_toggle++;
> + abx500_chargalg_ex_ac_enable_toggle++;
> }
>
> return di->ac_chg->ops.enable(di->ac_chg, enable, vset, iset);
> @@ -899,6 +899,27 @@ static void handle_maxim_chg_curr(struct abx500_chargalg *di)
> }
> }
>
> +static void abx500_chargalg_check_safety_timer(struct abx500_chargalg *di)
> +{
> + /*
> + * The safety timer will not be started until the capacity reported
> + * from the FG algorithm is 100%. Then we know that the amount of
> + * charge that's gone into the battery is enough for the battery
> + * to be full. If it has not reached end-of-charge before the safety
> + * timer has expired then we know that the battery is overcharged
> + * and charging will be stopped to protect the battery.
> + */
> + if (di->batt_data.percent == 100 &&
> + !timer_pending(&di->safety_timer)) {
Wrong indentation.
> + abx500_chargalg_start_safety_timer(di);
> + dev_dbg(di->dev, "start safety timer\n");
> + } else if (di->batt_data.percent != 100 &&
> + timer_pending(&di->safety_timer)) {
Ditto.
Plus, I think this can be simplified, you can just do.
abx500_chargalg_check_safety_timer()
{
if (di->batt_data.percent < 100) {
dev_dbg(di->dev, "stopping safety timer\n");
abx500_chargalg_stop_safety_timer(di);
return;
}
dev_dbg(di->dev, "starting safety timer\n");
abx500_chargalg_start_safety_timer(di);
}
The thing is, restarting an already pending timer is no-op, unless you
program the timer before the previously programmed value.
And stopping unarmed timer should be alo no-op.
(btw, these dev_dbg() should probably be placed into the start/stop
functions, to catch all the users/invocations in the debug log).
> + abx500_chargalg_stop_safety_timer(di);
> + dev_dbg(di->dev, "stop safety timer\n");
> + }
> +}
> +
> static int abx500_chargalg_get_ext_psy_data(struct device *dev, void *data)
> {
> struct power_supply *psy;
> @@ -1125,6 +1146,10 @@ static int abx500_chargalg_get_ext_psy_data(struct device *dev, void *data)
> switch (ext->type) {
> case POWER_SUPPLY_TYPE_BATTERY:
> di->batt_data.volt = ret.intval / 1000;
> + if (di->batt_data.volt >= BATT_OVV_VALUE)
> + di->events.batt_ovv = true;
> + else
> + di->events.batt_ovv = false;
> break;
> case POWER_SUPPLY_TYPE_MAINS:
> di->chg_info.ac_volt = ret.intval / 1000;
> @@ -1214,7 +1239,6 @@ static int abx500_chargalg_get_ext_psy_data(struct device *dev, void *data)
> }
> break;
> case POWER_SUPPLY_PROP_CAPACITY:
> - di->batt_data.percent = ret.intval;
> if (!capacity_updated)
> di->batt_data.percent = ret.intval;
> break;
> @@ -1465,12 +1489,12 @@ static void abx500_chargalg_algorithm(struct abx500_chargalg *di)
> di->bat->bat_type[di->bat->batt_id].normal_vol_lvl,
> di->bat->bat_type[di->bat->batt_id].normal_cur_lvl);
> abx500_chargalg_state_to(di, STATE_NORMAL);
> - abx500_chargalg_start_safety_timer(di);
> abx500_chargalg_stop_maintenance_timer(di);
> init_maxim_chg_curr(di);
> di->charge_status = POWER_SUPPLY_STATUS_CHARGING;
> di->eoc_cnt = 0;
> di->maintenance_chg = false;
> + di->maint_state = MAINT_A;
> power_supply_changed(&di->chargalg_psy);
>
> break;
> @@ -1478,17 +1502,14 @@ static void abx500_chargalg_algorithm(struct abx500_chargalg *di)
> case STATE_NORMAL:
> handle_maxim_chg_curr(di);
> if (di->charge_status == POWER_SUPPLY_STATUS_FULL &&
> - di->maintenance_chg) {
> - if (di->bat->no_maintenance)
> - abx500_chargalg_state_to(di,
> - STATE_WAIT_FOR_RECHARGE_INIT);
> - else
> - abx500_chargalg_state_to(di,
> - STATE_MAINTENANCE_A_INIT);
> - }
> + di->maintenance_chg)
> + abx500_chargalg_state_to(di,
> + STATE_WAIT_FOR_RECHARGE_INIT);
> +
> + /* Check whether we should start the safety timer or not */
> + abx500_chargalg_check_safety_timer(di);
> break;
>
> - /* This state will be used when the maintenance state is disabled */
> case STATE_WAIT_FOR_RECHARGE_INIT:
> abx500_chargalg_hold_charging(di);
> abx500_chargalg_state_to(di, STATE_WAIT_FOR_RECHARGE);
> @@ -1531,13 +1552,15 @@ static void abx500_chargalg_algorithm(struct abx500_chargalg *di)
> di->bat->bat_type[
> di->bat->batt_id].maint_a_cur_lvl);
> abx500_chargalg_state_to(di, STATE_MAINTENANCE_A);
> + di->maint_state = MAINT_B;
> power_supply_changed(&di->chargalg_psy);
> /* Intentional fallthrough*/
>
> case STATE_MAINTENANCE_A:
> if (di->events.maintenance_timer_expired) {
> abx500_chargalg_stop_maintenance_timer(di);
> - abx500_chargalg_state_to(di, STATE_MAINTENANCE_B_INIT);
> + abx500_chargalg_state_to(di,
> + STATE_WAIT_FOR_RECHARGE_INIT);
> }
> break;
>
> @@ -1603,7 +1626,8 @@ static void abx500_chargalg_algorithm(struct abx500_chargalg *di)
> /* Start charging directly if the new state is a charge state */
> if (di->charge_state == STATE_NORMAL_INIT ||
> di->charge_state == STATE_MAINTENANCE_A_INIT ||
> - di->charge_state == STATE_MAINTENANCE_B_INIT)
> + di->charge_state == STATE_MAINTENANCE_B_INIT ||
> + di->charge_state == STATE_WAIT_FOR_RECHARGE_INIT)
> queue_work(di->chargalg_wq, &di->chargalg_work);
> }
>
> @@ -1824,7 +1848,7 @@ static struct attribute *abx500_chargalg_chg[] = {
> NULL
> };
>
> -static const struct sysfs_ops abx500_chargalg_sysfs_ops = {
> +const struct sysfs_ops abx500_chargalg_sysfs_ops = {
Why?..
> .show = abx500_chargalg_sysfs_show,
> .store = abx500_chargalg_sysfs_charger,
> };
> @@ -2009,10 +2033,12 @@ static int __devinit abx500_chargalg_probe(struct platform_device *pdev)
> goto free_psy;
> }
>
> + di->charge_status = POWER_SUPPLY_STATUS_DISCHARGING;
> + abx500_chargalg_state_to(di, STATE_HANDHELD);
> +
> /* Run the charging algorithm */
> queue_delayed_work(di->chargalg_wq, &di->chargalg_periodic_work, 0);
>
> - dev_info(di->dev, "probe success\n");
> return ret;
>
> free_psy:
> @@ -2052,4 +2078,4 @@ module_exit(abx500_chargalg_exit);
> MODULE_LICENSE("GPL v2");
> MODULE_AUTHOR("Johan Palsson, Karl Komierowski");
> MODULE_ALIAS("platform:abx500-chargalg");
> -MODULE_DESCRIPTION("abx500 battery charging algorithm");
> +MODULE_DESCRIPTION("abx500 battery temperatur driver");
typo?
Thanks,
Anton.
next prev parent reply other threads:[~2012-09-28 2:37 UTC|newest]
Thread overview: 108+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-09-25 16:11 [PATCH 00/57] power: Upgrade to ux500 battery management driver mathieu.poirier
2012-09-25 16:11 ` [PATCH 01/57] power: ab8500_bm: Charger current step-up/down mathieu.poirier
2012-09-28 3:41 ` Anton Vorontsov
2012-09-25 16:11 ` [PATCH 02/57] power: ab8500_bm: Don't clear the CCMuxOffset bit mathieu.poirier
2012-09-28 3:42 ` Anton Vorontsov
2012-09-25 16:12 ` [PATCH 03/57] power: ab8500_btemp: Detect battery type in workqueue mathieu.poirier
2012-09-25 16:12 ` [PATCH 04/57] power: ab8500: bm: movimg back to ab8500 platform data managment mathieu.poirier
2012-09-27 2:42 ` Anton Vorontsov
2012-09-27 2:53 ` Anton Vorontsov
2012-09-25 16:12 ` [PATCH 05/57] power: ab8500_bm: Rename the power_loss function mathieu.poirier
2012-09-25 16:12 ` [PATCH 06/57] power: ab8500_bm: Skip first CCEOC irq for instant current mathieu.poirier
2012-09-25 16:12 ` [PATCH 07/57] power: ab8500_bm: Detect removed charger mathieu.poirier
2012-09-27 3:09 ` Anton Vorontsov
2012-09-25 16:12 ` [PATCH 08/57] power: ab8500_fg: flush sync on suspend mathieu.poirier
2012-09-27 3:11 ` Anton Vorontsov
2012-09-25 16:12 ` [PATCH 09/57] power: ab8500_fg: usleep_range instead of short msleep mathieu.poirier
2012-09-27 2:36 ` Anton Vorontsov
2012-09-25 16:12 ` [PATCH 10/57] power: ab8500_charger: Handle gpadc errors mathieu.poirier
2012-09-25 16:12 ` [PATCH 11/57] power: Recharge condition not optimal for battery mathieu.poirier
2012-09-27 3:29 ` Anton Vorontsov
2012-09-25 16:12 ` [PATCH 12/57] power: ab8500_fg: balance IRQ enable mathieu.poirier
2012-09-25 16:12 ` [PATCH 13/57] power: ab8500_bm: Ignore false btemp low interrupt mathieu.poirier
2012-09-27 3:32 ` Anton Vorontsov
2012-09-25 16:12 ` [PATCH 14/57] power: Adds support for Car/Travel Adapters mathieu.poirier
2012-09-25 16:12 ` [PATCH 15/57] power: ab8500_fg: Round capacity output mathieu.poirier
2012-09-25 16:12 ` [PATCH 16/57] power: bm remove superfluous BTEMP thermal comp mathieu.poirier
2012-09-25 16:12 ` [PATCH 17/57] power: ab8500_bm: Added support for BATT_OVV mathieu.poirier
2012-09-27 3:36 ` Anton Vorontsov
2012-09-28 18:24 ` Mathieu Poirier
2012-09-28 18:26 ` Anton Vorontsov
2012-09-25 16:12 ` [PATCH 18/57] power: Add sysfs interfaces for capacity mathieu.poirier
2012-09-27 7:08 ` Anton Vorontsov
2012-09-28 18:26 ` Mathieu Poirier
2012-09-28 19:11 ` Anton Vorontsov
2012-09-25 16:12 ` [PATCH 19/57] power: remove unused defines mathieu.poirier
2012-09-25 16:12 ` [PATCH 20/57] power: Adds support for legacy USB chargers mathieu.poirier
2012-09-27 7:15 ` Anton Vorontsov
2012-09-25 16:12 ` [PATCH 21/57] power: Overflow in current calculation mathieu.poirier
2012-09-25 16:12 ` [PATCH 22/57] power: AB workaround for invalid charger mathieu.poirier
2012-09-25 16:12 ` [PATCH 23/57] power: Add plaform data charger configurables mathieu.poirier
2012-09-25 16:12 ` [PATCH 24/57] power: ab8500_fg: Adjust for RF bursts voltage drops mathieu.poirier
2012-09-25 16:12 ` [PATCH 25/57] power: ab8500: adaptation to ab version mathieu.poirier
2012-09-25 16:12 ` [PATCH 26/57] power: charge: update watchdog for pm2xxx support mathieu.poirier
2012-09-25 16:12 ` [PATCH 27/57] power: sysfs interface update mathieu.poirier
2012-09-27 7:20 ` Anton Vorontsov
2012-09-28 18:26 ` Mathieu Poirier
2012-09-25 16:12 ` [PATCH 28/57] power: ab8500 - Accessing Autopower register fails mathieu.poirier
2012-09-25 16:12 ` [PATCH 29/57] power: ab8500_fg: Goto INIT_RECOVERY when charger removed mathieu.poirier
2012-09-25 16:12 ` [PATCH 30/57] power: ab8500: Flush & sync all works mathieu.poirier
2012-09-27 7:23 ` Anton Vorontsov
2012-09-28 18:28 ` Mathieu Poirier
2012-09-28 19:54 ` Anton Vorontsov
2012-09-25 16:12 ` [PATCH 31/57] power: ab8500_fg: fix to use correct battery charge full design mathieu.poirier
2012-09-27 7:27 ` Anton Vorontsov
2012-09-25 16:12 ` [PATCH 32/57] power: ab8500_charger: Do not touch VBUSOVV bits mathieu.poirier
2012-09-25 16:12 ` [PATCH 33/57] power: u8500_charger: Delay for USB enumeration mathieu.poirier
2012-09-27 7:42 ` Anton Vorontsov
2012-09-28 16:56 ` Mathieu Poirier
2012-09-28 17:09 ` Anton Vorontsov
2012-09-25 16:12 ` [PATCH 34/57] power: ab8500_fg: add power cut feature for ab8505 mathieu.poirier
2012-09-28 0:01 ` Anton Vorontsov
2012-09-25 16:12 ` [PATCH 35/57] power: ab8500_fg: Report unscaled capacity mathieu.poirier
2012-09-25 16:12 ` [PATCH 36/57] power: add backup battery charge voltages mathieu.poirier
2012-09-25 16:12 ` [PATCH 37/57] power: ab8500_bm: Quick re-attach charging behaviour mathieu.poirier
2012-09-28 0:13 ` Anton Vorontsov
2012-09-25 16:12 ` [PATCH 38/57] power: l9540: Charge only mode fixes mathieu.poirier
2012-09-28 0:27 ` Anton Vorontsov
2012-09-28 18:32 ` Mathieu Poirier
2012-09-25 16:12 ` [PATCH 39/57] power: ab8500_charger: Prevent auto drop of VBUS mathieu.poirier
2012-09-28 0:52 ` Anton Vorontsov
2012-09-25 16:12 ` [PATCH 40/57] power: ab8500: ADC for battery thermistor mathieu.poirier
2012-09-28 0:57 ` Anton Vorontsov
2012-09-25 16:12 ` [PATCH 41/57] power: ab8500_btemp: Filter btemp readings mathieu.poirier
2012-09-25 16:12 ` [PATCH 42/57] power: charging: Allow capacity to raise from 1% mathieu.poirier
2012-09-25 16:12 ` [PATCH 43/57] power: charging: Add AB8505_USB_LINK_STATUS mathieu.poirier
2012-09-25 16:12 ` [PATCH 44/57] power: ab8500: remove unecesary define flag mathieu.poirier
2012-09-28 1:05 ` Anton Vorontsov
2012-09-25 16:12 ` [PATCH 45/57] power: ab8500: defer btemp filtering while init mathieu.poirier
2012-09-28 1:08 ` Anton Vorontsov
2012-09-25 16:12 ` [PATCH 46/57] power: chargealg: Realign with upstream version mathieu.poirier
2012-09-28 1:17 ` Anton Vorontsov
2012-09-25 16:12 ` [PATCH 47/57] power: Harmonising platform data declaration/handling mathieu.poirier
2012-09-28 1:11 ` Anton Vorontsov
2012-09-25 16:12 ` [PATCH 48/57] power: ab8500 : quick re-attach for ext charger mathieu.poirier
2012-09-28 1:19 ` Anton Vorontsov
2012-09-25 16:12 ` [PATCH 49/57] power: Cancelling status charging notification mathieu.poirier
2012-09-28 2:16 ` Anton Vorontsov
2012-09-25 16:12 ` [PATCH 50/57] power: ab8500-chargalg: update battery health on safety timer exp mathieu.poirier
2012-09-28 2:21 ` Anton Vorontsov
2012-09-25 16:12 ` [PATCH 51/57] power: ab8500: Re-alignment with internal developement mathieu.poirier
2012-09-28 2:35 ` Anton Vorontsov [this message]
2012-09-28 2:45 ` Anton Vorontsov
2012-09-25 16:12 ` [PATCH 52/57] power: abx500_chargalg: Use hrtimer mathieu.poirier
2012-09-28 2:47 ` Anton Vorontsov
2012-09-28 18:33 ` Mathieu Poirier
2012-09-28 19:41 ` Anton Vorontsov
2012-09-25 16:12 ` [PATCH 53/57] power: ab8500_fg: Moving structure definitions to header file mathieu.poirier
2012-09-28 2:51 ` Anton Vorontsov
2012-09-25 16:12 ` [PATCH 54/57] power: ab8500_charger: Use USBLink1Status Register mathieu.poirier
2012-09-28 2:56 ` Anton Vorontsov
2012-09-25 16:12 ` [PATCH 55/57] power: ab8500_charger: Add UsbLineCtrl2 reference mathieu.poirier
2012-09-28 2:58 ` Anton Vorontsov
2012-09-25 16:12 ` [PATCH 56/57] power: abx500_chargalg: Fix quick re-attach charger issue mathieu.poirier
2012-09-28 3:00 ` Anton Vorontsov
2012-09-25 16:12 ` [PATCH 57/57] power: ab8500_charger: Limit USB charger current mathieu.poirier
2012-09-27 3:38 ` [PATCH 00/57] power: Upgrade to ux500 battery management driver Anton Vorontsov
2012-09-27 22:08 ` Mathieu Poirier
2012-09-28 0:36 ` Anton Vorontsov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20120928023510.GJ5040@lizard \
--to=anton.vorontsov@linaro.org \
--cc=dwmw2@infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mathieu.poirier@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).