Re: [PATCH 4/6] power: bq24190_charger: Don't read fault register outside irq_handle_thread()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Jan 11, 2017 at 4:41 PM, Tony Lindgren <tony@xxxxxxxxxxx> wrote:
> From: Liam Breck <kernel@xxxxxxxxxxxxxxxxx>
>
> Caching the fault register after a single read may not keep an accurate
> value.
>
> Fix the issue by doing two reads of the fault register as specified in the
> data sheet. And let's do this only irq_handle_thread() to avoid accidentally
> clearing the fault status as specified in the data sheet:
>
> "When a fault occurs, the charger device sends out INT
>  and keeps the fault state in REG09 until the host reads the fault register.
>  Before the host reads REG09 and all the faults are cleared, the charger
>  device would not send any INT upon new faults. In order to read the
>  current fault status, the host has to read REG09 two times consecutively.
>  The 1st reads fault register status from the last read [1] and the 2nd reads
>  the current fault register status."
>
> [1] presumably a typo; should be "last fault"
>
> Fixes: d7bf353fd0aa3 ("bq24190_charger: Add support for TI BQ24190 Battery
> Charger")
> Cc: Mark A. Greer <mgreer@xxxxxxxxxxxxxxx>
> Cc: Matt Ranostay <matt@ranostay.consulting>
> Signed-off-by: Liam Breck <kernel@xxxxxxxxxxxxxxxxx>
> [tony@xxxxxxxxxxx: cleaned up a bit]
> Signed-off-by: Tony Lindgren <tony@xxxxxxxxxxx>
> ---
>  drivers/power/supply/bq24190_charger.c | 99 ++++++++++------------------------
>  1 file changed, 29 insertions(+), 70 deletions(-)
>
> diff --git a/drivers/power/supply/bq24190_charger.c b/drivers/power/supply/bq24190_charger.c
> --- a/drivers/power/supply/bq24190_charger.c
> +++ b/drivers/power/supply/bq24190_charger.c
> @@ -144,10 +144,7 @@
>   * so the first read after a fault returns the latched value and subsequent
>   * reads return the current value.  In order to return the fault status
>   * to the user, have the interrupt handler save the reg's value and retrieve
> - * it in the appropriate health/status routine.  Each routine has its own
> - * flag indicating whether it should use the value stored by the last run
> - * of the interrupt handler or do an actual reg read.  That way each routine
> - * can report back whatever fault may have occured.
> + * it in the appropriate health/status routine.
>   */
>  struct bq24190_dev_info {
>         struct i2c_client               *client;
> @@ -159,9 +156,6 @@ struct bq24190_dev_info {
>         unsigned int                    gpio_int;
>         unsigned int                    irq;
>         struct mutex                    f_reg_lock;
> -       bool                            charger_health_valid;
> -       bool                            battery_health_valid;
> -       bool                            battery_status_valid;
>         u8                              f_reg;
>         u8                              ss_reg;
>         u8                              watchdog;
> @@ -635,21 +629,11 @@ static int bq24190_charger_get_health(struct bq24190_dev_info *bdi,
>                 union power_supply_propval *val)
>  {
>         u8 v;
> -       int health, ret;
> +       int health;
>
>         mutex_lock(&bdi->f_reg_lock);
> -
> -       if (bdi->charger_health_valid) {
> -               v = bdi->f_reg;
> -               bdi->charger_health_valid = false;
> -               mutex_unlock(&bdi->f_reg_lock);
> -       } else {
> -               mutex_unlock(&bdi->f_reg_lock);
> -
> -               ret = bq24190_read(bdi, BQ24190_REG_F, &v);
> -               if (ret < 0)
> -                       return ret;
> -       }
> +       v = bdi->f_reg;
> +       mutex_unlock(&bdi->f_reg_lock);

bdi->f_reg is the only thing protected by the mutex, and is only ever
set or read. Is it OK to use an atomic type here?
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux