Received: by 2002:a05:6a10:6d10:0:0:0:0 with SMTP id gq16csp826483pxb; Fri, 22 Apr 2022 12:02:15 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwZ/RLPrQATWEBnMokneIK4dVHmgvFg6I1QmUBnAmNYs1GNMyEeb96iBnaMf4R+VWDW6Ct5 X-Received: by 2002:aca:180b:0:b0:2f7:23ae:8cd1 with SMTP id h11-20020aca180b000000b002f723ae8cd1mr7351214oih.146.1650654135179; Fri, 22 Apr 2022 12:02:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1650654135; cv=none; d=google.com; s=arc-20160816; b=ovyua/rlwzg4PLNPYlZZv6zJZnYujmtbgr2GgGw4jnXcUj6RH27PXafQsjDa8RBTjO wPkM+MNO1rkUIgNkLafE8xvgkNuo6KiKSp7dWjitKU0cnCiSEFRk9vs6FlEpSekpQkaT jwqXgC4oFZ9NyEwadv1NWAXgONdl9b5gZ41XhQO55/U2D8er3ll/d6qBE/xsMPSQQNek AFK0/vsV5JEp9rQvRDzZQifIUAJ2Sfz08UwjwtkrsDuC+pJ62HZ0HF/f9TON3EXLm2cw luwwmiPWFJ8NwhuOF3Ibb43k0JBcPIaRRZ1lKfbpJD5b6NI/dQmZXbOUJiTT2WytHtpq AbgA== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=7HzjJ2MTgMzaGj1CR/cito5UBoUP4du8uF9tfJ2guak=; b=kX99q5Zpua25VDIaRuMiVAKRMSpRbNfuKs81aIsBhTWflEcaADOyu1I2mOyC1GWil1 xEC0ece4TB5UAsbjBjbVYYkRbprx3F5IfqIyehXFjYbIihkjY9ZiV38fikBOy4TscA6p 406bQ69bkU5qAGrpg96neVDu63VejxEAltNtCjHAD6nAcbqFnG/K8WTgr0QMIS1Swa4O XvTmYwzg8IapAXIe1QIJPyDQtm/KTsy6vlGEkChnhloSyyj/8tzOeUTUSFIDfbKQO3K4 fLC/R31J16uzCMg8APwMsyQsljbropIrXJKbA0wIkhy5eixMZ5Rjx0wVZKBwhAtp/o77 dFZw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=DC46k7gY; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [2620:137:e000::1:18]) by mx.google.com with ESMTPS id s12-20020a05680810cc00b002f9a908955dsi6169273ois.267.2022.04.22.12.02.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 22 Apr 2022 12:02:15 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) client-ip=2620:137:e000::1:18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=DC46k7gY; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 0651518E0EA; Fri, 22 Apr 2022 11:23:35 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1358051AbiDSVkc (ORCPT + 99 others); Tue, 19 Apr 2022 17:40:32 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35792 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1357589AbiDSVk3 (ORCPT ); Tue, 19 Apr 2022 17:40:29 -0400 Received: from mail-wr1-x42a.google.com (mail-wr1-x42a.google.com [IPv6:2a00:1450:4864:20::42a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A4DE6381A0; Tue, 19 Apr 2022 14:37:45 -0700 (PDT) Received: by mail-wr1-x42a.google.com with SMTP id w4so24141822wrg.12; Tue, 19 Apr 2022 14:37:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=7HzjJ2MTgMzaGj1CR/cito5UBoUP4du8uF9tfJ2guak=; b=DC46k7gYUbv8MCUDj5L93SZ94PBWzbzq3rVih92WtQE31X09rOE8Xab8Vcv9HUE1rC yBIW9VKsi6iDKgmK8Q72k41MbVKMdyB3bdfIjwqLa9nuIreaVM0BG7j9xYK8Ln3Qj/fS XTU2KVZ+0yHPGHiobX3TkAPXujmB2fjSrz3YyzlaHVg7cNQGtXE+WuR3Z0I19Pg2TNAV l6AHzyZGPh4hLuwyq52WJoM6/GJOz5xtX+HITqC1NcfxIUElG6EgymS8/UYOf0FTFoeo 1slZcHXfldsVO8SK6eKrFjQDs7fsed4yAQYzPbV7N7iyxSPNb6LUnRcn7u42q+sBBtxL gCJg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=7HzjJ2MTgMzaGj1CR/cito5UBoUP4du8uF9tfJ2guak=; b=Mn6dJL/pKWRiHlxzlnkgVfElpG/40bq40TlMDrgIJr/IaC1YALIORUxT3tht1GChpR 0YYeehQOC/w59whZ3AZzGB8lSGYSvCDmUSkuZw7tHextirB31AaGEm/ZD01SM9CM7yak S3o8PTkl3TQ3QQIs79yNWW1/VElfnY4yfDgoTyeTftAFkHZ96G/rGeyUG01Zem/CJoFI 7XeKKgOUdiuzcKKT0TboEWfMSrrar49V+EBjkoOkiiu3vTAJwZiv1NxgRsgh0oEX541j G1m06Bvyi4kJWZ9ezKZ7Sh1D9pNanNqkLI7XhsX1zC2k3Jrd/PmfM2zOn7rBpiYg6Kpi N/Sw== X-Gm-Message-State: AOAM532Y8cpxf3mcrq67p6RwCYU6x8OoR6ROlFmcL7QHdZqdjUjGRyrT EiUjXqrUcqnC4l+tZjyXxP3K/eaIlDKxLA== X-Received: by 2002:a05:6000:15c8:b0:20a:92f1:c054 with SMTP id y8-20020a05600015c800b0020a92f1c054mr9846278wry.146.1650404263988; Tue, 19 Apr 2022 14:37:43 -0700 (PDT) Received: from tpt440p.steeds.sam ([69.63.75.250]) by smtp.gmail.com with ESMTPSA id n4-20020a1ca404000000b00392965e41d6sm6574512wme.39.2022.04.19.14.37.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Apr 2022 14:37:43 -0700 (PDT) From: "Sicelo A. Mhlongo" To: sre@kernel.org, pali@kernel.org Cc: linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, "Sicelo A. Mhlongo" Subject: [PATCH 1/1] power: supply: bq27xxx: expose battery data when CI=1 Date: Tue, 19 Apr 2022 23:36:47 +0200 Message-Id: <20220419213647.1186284-2-absicsz@gmail.com> X-Mailer: git-send-email 2.35.2 In-Reply-To: <20220419213647.1186284-1-absicsz@gmail.com> References: <20220419213647.1186284-1-absicsz@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RDNS_NONE, SPF_HELO_NONE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When the Capacity Inaccurate flag is set, the chip still provides data about the battery, albeit inaccurate. Instead of discarding capacity values for CI=1, expose the stale data and use the POWER_SUPPLY_HEALTH_CALIBRATION_REQUIRED property to indicate that the values should be used with care. Signed-off-by: Sicelo A. Mhlongo --- drivers/power/supply/bq27xxx_battery.c | 58 +++++++++++++------------- 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/drivers/power/supply/bq27xxx_battery.c b/drivers/power/supply/bq27xxx_battery.c index 72e727cd31e8..a524237b758e 100644 --- a/drivers/power/supply/bq27xxx_battery.c +++ b/drivers/power/supply/bq27xxx_battery.c @@ -1572,14 +1572,6 @@ static int bq27xxx_battery_read_charge(struct bq27xxx_device_info *di, u8 reg) */ static inline int bq27xxx_battery_read_nac(struct bq27xxx_device_info *di) { - int flags; - - if (di->opts & BQ27XXX_O_ZERO) { - flags = bq27xxx_read(di, BQ27XXX_REG_FLAGS, true); - if (flags >= 0 && (flags & BQ27000_FLAG_CI)) - return -ENODATA; - } - return bq27xxx_battery_read_charge(di, BQ27XXX_REG_NAC); } @@ -1742,6 +1734,18 @@ static bool bq27xxx_battery_dead(struct bq27xxx_device_info *di, u16 flags) return flags & (BQ27XXX_FLAG_SOC1 | BQ27XXX_FLAG_SOCF); } +/* + * Returns true if reported battery capacity is inaccurate + */ +static bool bq27xxx_battery_capacity_inaccurate(struct bq27xxx_device_info *di, + u16 flags) +{ + if (di->opts & BQ27XXX_O_HAS_CI) + return (flags & BQ27000_FLAG_CI); + else + return false; +} + static int bq27xxx_battery_read_health(struct bq27xxx_device_info *di) { /* Unlikely but important to return first */ @@ -1751,6 +1755,8 @@ static int bq27xxx_battery_read_health(struct bq27xxx_device_info *di) return POWER_SUPPLY_HEALTH_COLD; if (unlikely(bq27xxx_battery_dead(di, di->cache.flags))) return POWER_SUPPLY_HEALTH_DEAD; + if (unlikely(bq27xxx_battery_capacity_inaccurate(di, di->cache.flags))) + return POWER_SUPPLY_HEALTH_CALIBRATION_REQUIRED; return POWER_SUPPLY_HEALTH_GOOD; } @@ -1767,29 +1773,21 @@ void bq27xxx_battery_update(struct bq27xxx_device_info *di) if (cache.flags >= 0) { cache.temperature = bq27xxx_battery_read_temperature(di); if (has_ci_flag && (cache.flags & BQ27000_FLAG_CI)) { - dev_info_once(di->dev, "battery is not calibrated! ignoring capacity values\n"); - cache.capacity = -ENODATA; - cache.energy = -ENODATA; - cache.time_to_empty = -ENODATA; - cache.time_to_empty_avg = -ENODATA; - cache.time_to_full = -ENODATA; - cache.charge_full = -ENODATA; - cache.health = -ENODATA; - } else { - if (di->regs[BQ27XXX_REG_TTE] != INVALID_REG_ADDR) - cache.time_to_empty = bq27xxx_battery_read_time(di, BQ27XXX_REG_TTE); - if (di->regs[BQ27XXX_REG_TTECP] != INVALID_REG_ADDR) - cache.time_to_empty_avg = bq27xxx_battery_read_time(di, BQ27XXX_REG_TTECP); - if (di->regs[BQ27XXX_REG_TTF] != INVALID_REG_ADDR) - cache.time_to_full = bq27xxx_battery_read_time(di, BQ27XXX_REG_TTF); - - cache.charge_full = bq27xxx_battery_read_fcc(di); - cache.capacity = bq27xxx_battery_read_soc(di); - if (di->regs[BQ27XXX_REG_AE] != INVALID_REG_ADDR) - cache.energy = bq27xxx_battery_read_energy(di); - di->cache.flags = cache.flags; - cache.health = bq27xxx_battery_read_health(di); + dev_info_once(di->dev, "battery is not calibrated! capacity values are inaccurate\n"); } + if (di->regs[BQ27XXX_REG_TTE] != INVALID_REG_ADDR) + cache.time_to_empty = bq27xxx_battery_read_time(di, BQ27XXX_REG_TTE); + if (di->regs[BQ27XXX_REG_TTECP] != INVALID_REG_ADDR) + cache.time_to_empty_avg = bq27xxx_battery_read_time(di, BQ27XXX_REG_TTECP); + if (di->regs[BQ27XXX_REG_TTF] != INVALID_REG_ADDR) + cache.time_to_full = bq27xxx_battery_read_time(di, BQ27XXX_REG_TTF); + + cache.charge_full = bq27xxx_battery_read_fcc(di); + cache.capacity = bq27xxx_battery_read_soc(di); + if (di->regs[BQ27XXX_REG_AE] != INVALID_REG_ADDR) + cache.energy = bq27xxx_battery_read_energy(di); + di->cache.flags = cache.flags; + cache.health = bq27xxx_battery_read_health(di); if (di->regs[BQ27XXX_REG_CYCT] != INVALID_REG_ADDR) cache.cycle_count = bq27xxx_battery_read_cyct(di); -- 2.35.2