Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp2481745pxj; Mon, 10 May 2021 04:09:15 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwSFGlFu/mMRqs6ycZ/fyBN6QFHnpvwzYrpdEroHCNd5DfRT7konQRcXOmV+5HM2XKsBDwd X-Received: by 2002:a92:bf11:: with SMTP id z17mr21736180ilh.146.1620644954871; Mon, 10 May 2021 04:09:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620644954; cv=none; d=google.com; s=arc-20160816; b=MFUjzFYpcv0YN1jNxVrMuX/YyIeiKJKlQ8i7uBXk38wXirVJddW8nBCKfhAp9v5siR F89jtScL7gCw2v4FtnsL5PDOwKODVCYKgW7QWk7IiIkBOGlAXhYiQstZ1P1uGpbKV2aD uy0iWnY0TUPZM4y994q9n2v54m9P+z4C2O6zpWq4TmiE1YsRVE/xhinHjYDs1oPLRtLV 4NhEl8ZdnRJ6xEGZB3cDyk7E37OcVcqK0OEBecWpb/gz09Z5zDfuPNeq6CSpdiIdhsdO Wrw5e812vss/EMZcF9SH6A7OdGDX1VoN1CSi6YKDGf2N3ZtNasgJRNd4Y4uuKCwUQNYT TgHg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=rEGhy986wFt6XIXqHy1LsJRJxyXRRlCVo6Z/d4W+STA=; b=0R9HXeBR+rDEiOJ+dhkEAUeYjk9iNCCUypjHIvKtcTN55jBTmzzr1huXzZLjB/x2p7 piXKhtllxI+fUaOJwl0U4XMXwcel9pGIfjF1F9152NiKNSu6pOCaLxRY5EOsZTqVzmjA oCtHIWeNgSY2RCNCNkeITNk+M+mMHgjD7XyNot+LQKomO70JlKtt9c/a/auAmAq+rVwg X/qBsQFkDOLHfn6evPUJ872Xj2OgDklBcEsLO7p4LPoILGMhlhLLMNjmF50T7EUA11xa a9DhJd6Ct4OkNYJDY4NXo8q/OrfGQs22d2342v3Gg+R8IVSX/vmjEngto9Y1bAen9G53 qL8Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=fzA8lJb6; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id x20si15365726jao.3.2021.05.10.04.09.02; Mon, 10 May 2021 04:09:14 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=fzA8lJb6; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234678AbhEJLFO (ORCPT + 99 others); Mon, 10 May 2021 07:05:14 -0400 Received: from mail.kernel.org ([198.145.29.99]:59362 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232230AbhEJKpw (ORCPT ); Mon, 10 May 2021 06:45:52 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 4575A619A9; Mon, 10 May 2021 10:36:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1620642988; bh=ZU2OOxlhm8Xwe6mgPEa1KOVHakIA5RSh6Z5xq5VAw5Y=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=fzA8lJb6wd55bR5N8BEcA+AAVmqpBUrcoX/O9B9TElxNhSQGH5tBvPNMuBe4NsTD5 zlnzsuLWDHPsQ/RpuZMYodCl/NL1U9+xpRM4G/JAuH3Jlp5txuq0+XyEeQECh/gB+N 3dJRmeWz/O6DjYkor9cyi2kN5N9+yPZoqCZRhGac= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Matthias Schiffer , Sebastian Reichel , Sasha Levin Subject: [PATCH 5.10 133/299] power: supply: bq27xxx: fix power_avg for newer ICs Date: Mon, 10 May 2021 12:18:50 +0200 Message-Id: <20210510102009.367176008@linuxfoundation.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210510102004.821838356@linuxfoundation.org> References: <20210510102004.821838356@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Matthias Schiffer [ Upstream commit c4d57c22ac65bd503716062a06fad55a01569cac ] On all newer bq27xxx ICs, the AveragePower register contains a signed value; in addition to handling the raw value as unsigned, the driver code also didn't convert it to µW as expected. At least for the BQ28Z610, the reference manual incorrectly states that the value is in units of 1mW and not 10mW. I have no way of knowing whether the manuals of other supported ICs contain the same error, or if there are models that actually use 1mW. At least, the new code shouldn't be *less* correct than the old version for any device. power_avg is removed from the cache structure, se we don't have to extend it to store both a signed value and an error code. Always getting an up-to-date value may be desirable anyways, as it avoids inconsistent current and power readings when switching between charging and discharging. Signed-off-by: Matthias Schiffer Signed-off-by: Sebastian Reichel Signed-off-by: Sasha Levin --- drivers/power/supply/bq27xxx_battery.c | 51 ++++++++++++++------------ include/linux/power/bq27xxx_battery.h | 1 - 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/drivers/power/supply/bq27xxx_battery.c b/drivers/power/supply/bq27xxx_battery.c index 315e0909e6a4..72a2bcf3ab32 100644 --- a/drivers/power/supply/bq27xxx_battery.c +++ b/drivers/power/supply/bq27xxx_battery.c @@ -1631,27 +1631,6 @@ static int bq27xxx_battery_read_time(struct bq27xxx_device_info *di, u8 reg) return tval * 60; } -/* - * Read an average power register. - * Return < 0 if something fails. - */ -static int bq27xxx_battery_read_pwr_avg(struct bq27xxx_device_info *di) -{ - int tval; - - tval = bq27xxx_read(di, BQ27XXX_REG_AP, false); - if (tval < 0) { - dev_err(di->dev, "error reading average power register %02x: %d\n", - BQ27XXX_REG_AP, tval); - return tval; - } - - if (di->opts & BQ27XXX_O_ZERO) - return (tval * BQ27XXX_POWER_CONSTANT) / BQ27XXX_RS; - else - return tval; -} - /* * Returns true if a battery over temperature condition is detected */ @@ -1739,8 +1718,6 @@ void bq27xxx_battery_update(struct bq27xxx_device_info *di) } if (di->regs[BQ27XXX_REG_CYCT] != INVALID_REG_ADDR) cache.cycle_count = bq27xxx_battery_read_cyct(di); - if (di->regs[BQ27XXX_REG_AP] != INVALID_REG_ADDR) - cache.power_avg = bq27xxx_battery_read_pwr_avg(di); /* We only have to read charge design full once */ if (di->charge_design_full <= 0) @@ -1803,6 +1780,32 @@ static int bq27xxx_battery_current(struct bq27xxx_device_info *di, return 0; } +/* + * Get the average power in µW + * Return < 0 if something fails. + */ +static int bq27xxx_battery_pwr_avg(struct bq27xxx_device_info *di, + union power_supply_propval *val) +{ + int power; + + power = bq27xxx_read(di, BQ27XXX_REG_AP, false); + if (power < 0) { + dev_err(di->dev, + "error reading average power register %02x: %d\n", + BQ27XXX_REG_AP, power); + return power; + } + + if (di->opts & BQ27XXX_O_ZERO) + val->intval = (power * BQ27XXX_POWER_CONSTANT) / BQ27XXX_RS; + else + /* Other gauges return a signed value in units of 10mW */ + val->intval = (int)((s16)power) * 10000; + + return 0; +} + static int bq27xxx_battery_status(struct bq27xxx_device_info *di, union power_supply_propval *val) { @@ -1987,7 +1990,7 @@ static int bq27xxx_battery_get_property(struct power_supply *psy, ret = bq27xxx_simple_value(di->cache.energy, val); break; case POWER_SUPPLY_PROP_POWER_AVG: - ret = bq27xxx_simple_value(di->cache.power_avg, val); + ret = bq27xxx_battery_pwr_avg(di, val); break; case POWER_SUPPLY_PROP_HEALTH: ret = bq27xxx_simple_value(di->cache.health, val); diff --git a/include/linux/power/bq27xxx_battery.h b/include/linux/power/bq27xxx_battery.h index 111a40d0d3d5..8d5f4f40fb41 100644 --- a/include/linux/power/bq27xxx_battery.h +++ b/include/linux/power/bq27xxx_battery.h @@ -53,7 +53,6 @@ struct bq27xxx_reg_cache { int capacity; int energy; int flags; - int power_avg; int health; }; -- 2.30.2