From patchwork Sat Nov 5 11:25:42 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Ivaylo Dimitrov X-Patchwork-Id: 621982 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 80820C433FE for ; Sat, 5 Nov 2022 11:26:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229777AbiKEL0T (ORCPT ); Sat, 5 Nov 2022 07:26:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55068 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229770AbiKEL0S (ORCPT ); Sat, 5 Nov 2022 07:26:18 -0400 Received: from mail-ej1-x62f.google.com (mail-ej1-x62f.google.com [IPv6:2a00:1450:4864:20::62f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D34C21CB16; Sat, 5 Nov 2022 04:26:16 -0700 (PDT) Received: by mail-ej1-x62f.google.com with SMTP id kt23so19234533ejc.7; Sat, 05 Nov 2022 04:26:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=PIJ7hf/fFBlHGb3gaHRXBAK5sDqMN3APy8LXApKcTCc=; b=hXEVWmvWnxe69ninDDQWYoIBl3qLZ9ZNzW8y40rtZJSMghjsDd4Vfzi7QTiExEYmJn rABOv+nXVLVMi6nqHFtaZrZ6pS7BQoLKUd3snMgUOsNVya9d6qsfLW9V5a+gP45JUHzY vWrkU9dhMLzE6Iq64tRYRjs5bRNFfutjuujlOCjhOyewPLvDkCvhLpLnJeYL9CehKLZA 3+5z3nAzqkDI61LlXRCwZtN3gqyoJbB/gwh1xWDuOFb3pRLLSBkzcftntcoJSRGMxTOj Y1CNujlBW+5ZjUXtLUMZ6gH5LyKluLehm3xTfqRNzcL9jRQlhV//CVbZKbPfIeo5mFCs D3fA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=PIJ7hf/fFBlHGb3gaHRXBAK5sDqMN3APy8LXApKcTCc=; b=JejPxMlVybff5IQqElGlLO7xj850CZBWayH0yZN7AxaD2nRCuZOO1DroA0eXbmNb4H VU/ZBfEjvGg5vzZ3BFs6xgGdF19M6y3oS6DScaCZRVHOtv0Fi9LsMX+SsHUZn+6RD2Ve MUDTnNZ1e64W/6MEqQoqN2c0x+pzgGAkGWgeYjwwdNffFwwpCMmE4go6PTaPqlT9rQpk 0GdHVjQGGGlXipjpqra0zDRipCfWZt/DOU/cTb/d8qJxP+b6skFAeZxb4LbkGlURivs4 4OzSjo5wV8XBpmH9ju9MKyXyCnoNzPoMItiNE6pQyrCOc3IBDj4W+m0CaUnN3plnTUDq EleQ== X-Gm-Message-State: ACrzQf1eVW7O3xehp7FK8FqNF+gtoW/sBGojM2GESEZG2+W5ONhnLCY3 7dyHQpVfFw7ZZAWUsc55FjY= X-Google-Smtp-Source: AMsMyM42wbM0wGWc+Zy67vMY8EC8TjcJmL+wr609ZZUxn0PZtfvV/82tgk04tYc8j0ZEYuXjjLV9LQ== X-Received: by 2002:a17:907:2063:b0:7ad:fa6b:e84b with SMTP id qp3-20020a170907206300b007adfa6be84bmr20372498ejb.69.1667647575280; Sat, 05 Nov 2022 04:26:15 -0700 (PDT) Received: from localhost.localdomain ([46.249.74.23]) by smtp.gmail.com with ESMTPSA id u18-20020a509512000000b004611c230bd0sm1050069eda.37.2022.11.05.04.26.14 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Sat, 05 Nov 2022 04:26:14 -0700 (PDT) From: Ivaylo Dimitrov To: sre@kernel.org Cc: linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, tony@atomide.com, philipp@uvos.xyz, Ivaylo Dimitrov Subject: [PATCH 1/3] power: cpcap-battery: Do not issue low signal too frequently Date: Sat, 5 Nov 2022 13:25:42 +0200 Message-Id: <1667647544-12945-2-git-send-email-ivo.g.dimitrov.75@gmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1667647544-12945-1-git-send-email-ivo.g.dimitrov.75@gmail.com> References: <1667647544-12945-1-git-send-email-ivo.g.dimitrov.75@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org It seems that low battery irq may be generated tens of times per second, leading to userspace being flooded with unnecessary events. Fix that by preventing such events being generated more than once every 30 seconds. Signed-off-by: Ivaylo Dimitrov --- drivers/power/supply/cpcap-battery.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/drivers/power/supply/cpcap-battery.c b/drivers/power/supply/cpcap-battery.c index 4676560..8869067 100644 --- a/drivers/power/supply/cpcap-battery.c +++ b/drivers/power/supply/cpcap-battery.c @@ -137,6 +137,7 @@ struct cpcap_battery_ddata { struct power_supply *psy; struct cpcap_battery_config config; struct cpcap_battery_state_data state[CPCAP_BATTERY_STATE_NR]; + struct delayed_work low_irq_work; u32 cc_lsb; /* μAms per LSB */ atomic_t active; int charge_full; @@ -914,9 +915,13 @@ static irqreturn_t cpcap_battery_irq_thread(int irq, void *data) dev_info(ddata->dev, "Coulomb counter calibration done\n"); break; case CPCAP_BATTERY_IRQ_ACTION_BATTERY_LOW: - if (latest->current_ua >= 0) + if (latest->current_ua >= 0 && + !delayed_work_pending((&ddata->low_irq_work))) { dev_warn(ddata->dev, "Battery low at %imV!\n", latest->voltage / 1000); + schedule_delayed_work(&ddata->low_irq_work, 30 * HZ); + disable_irq_nosync(d->irq); + } break; case CPCAP_BATTERY_IRQ_ACTION_POWEROFF: if (latest->current_ua >= 0 && latest->voltage <= 3200000) { @@ -1087,6 +1092,21 @@ static int cpcap_battery_calibrate(struct cpcap_battery_ddata *ddata) return error; } +static void cpcap_battery_lowbph_enable(struct work_struct *work) +{ + struct delayed_work *d_work = to_delayed_work(work); + struct cpcap_battery_ddata *ddata = container_of(d_work, + struct cpcap_battery_ddata, low_irq_work); + struct cpcap_interrupt_desc *d; + + list_for_each_entry(d, &ddata->irq_list, node) { + if (d->action == CPCAP_BATTERY_IRQ_ACTION_BATTERY_LOW) + break; + } + + enable_irq(d->irq); +} + #ifdef CONFIG_OF static const struct of_device_id cpcap_battery_id_table[] = { { @@ -1118,6 +1138,8 @@ static int cpcap_battery_probe(struct platform_device *pdev) if (!ddata) return -ENOMEM; + INIT_DELAYED_WORK(&ddata->low_irq_work, cpcap_battery_lowbph_enable); + cpcap_battery_detect_battery_type(ddata); INIT_LIST_HEAD(&ddata->irq_list); @@ -1185,6 +1207,9 @@ static int cpcap_battery_remove(struct platform_device *pdev) if (error) dev_err(&pdev->dev, "could not disable: %i\n", error); + /* make sure to call enable_irq() if needed */ + flush_delayed_work(&ddata->low_irq_work); + return 0; } From patchwork Sat Nov 5 11:25:44 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ivaylo Dimitrov X-Patchwork-Id: 621981 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 60067C43217 for ; Sat, 5 Nov 2022 11:26:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229799AbiKEL0X (ORCPT ); Sat, 5 Nov 2022 07:26:23 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55158 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229802AbiKEL0V (ORCPT ); Sat, 5 Nov 2022 07:26:21 -0400 Received: from mail-ej1-x631.google.com (mail-ej1-x631.google.com [IPv6:2a00:1450:4864:20::631]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C43291CFC2; Sat, 5 Nov 2022 04:26:18 -0700 (PDT) Received: by mail-ej1-x631.google.com with SMTP id q9so19390224ejd.0; Sat, 05 Nov 2022 04:26:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=references:in-reply-to:message-id:date:subject:cc:to:from:from:to :cc:subject:date:message-id:reply-to; bh=rw/rE+YmWmiRZPKzY49HONfLX1Etfc66IXHD8xnQCQI=; b=YFPxzIfijNm+mc4mTACato2ckTCyuN6azDv8/8qbxxQKOGw8EVT1VsaDXezrd0CgLJ FH70Y4Jto7N04ToxCKcFeUvp81GsQlUdFhoCvlPzYjMeGJg68VjWmNd/o+l1c8b2845C AFzht7O3W/0rghV8WqCETpt39bG1KcNHHBFMZZWhYIEkJ6YhMkSXwz+z+pGb+RTcJIqj 836o8iPgIrV3YzYnxGd6Dmqa8ba8EabAUuDlCXtXj6EGWck3jOXh/YJcICgAu6ngiglD 0314ChbMzrsnRAYupKQHTAfok6OuRQyyBrjKBcnBwU5hxCUWQbDZkIvtePRxipgTwed2 RG7w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=references:in-reply-to:message-id:date:subject:cc:to:from :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=rw/rE+YmWmiRZPKzY49HONfLX1Etfc66IXHD8xnQCQI=; b=ezeASOOCDfi/hMG2P0Sn0knngz60SdbaTrLN7B617d+oDsEHlc5vVw03SCS9MCRJXS y67KFV1AywEG3dI+J9kAeuNs5GjhgNbI7q1VjgvHKnAgxLTnMDvDFT9vxzqbaU1kE/vM R97S6jI54AHdd+1vp9K9bgA9pziDEBxcXOg1DJQxsJexhOL4OV1qUmGkzK0I2fg6yxZ/ PKKgej/K9HFh2BHtJ+VCN1L7duE1rkVyCLbL1awHnrjfvRrucgruFWBrd7G3dAR768N4 X92IUm3/xLSmg8Xom5B26WyBcKm2N76YphtAaOG5UyR6OpJdqoPF6xPhBqbx1q7L0y7/ vOFw== X-Gm-Message-State: ACrzQf37Y/Yxn1dUnJJzuwtNoBIC7pE5hLAAs1EuI77MBhwRT680IKkH fMpzSItscKG7kiSRkDTixl1x1nCeBokvYg== X-Google-Smtp-Source: AMsMyM73VezoGUOkFB90+jlgzWTHUI8YILG1J5jgzzZ9RQzVzVSJ2pxkOb2tM3HwW+P2D44CV1lBMg== X-Received: by 2002:a17:906:285a:b0:7ae:127a:cc2e with SMTP id s26-20020a170906285a00b007ae127acc2emr14117814ejc.229.1667647577357; Sat, 05 Nov 2022 04:26:17 -0700 (PDT) Received: from localhost.localdomain ([46.249.74.23]) by smtp.gmail.com with ESMTPSA id u18-20020a509512000000b004611c230bd0sm1050069eda.37.2022.11.05.04.26.16 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Sat, 05 Nov 2022 04:26:16 -0700 (PDT) From: Ivaylo Dimitrov To: sre@kernel.org Cc: linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, tony@atomide.com, philipp@uvos.xyz, Ivaylo Dimitrov Subject: [PATCH 3/3] power: supply: cpcap_battery: Read battery parameters from nvram Date: Sat, 5 Nov 2022 13:25:44 +0200 Message-Id: <1667647544-12945-4-git-send-email-ivo.g.dimitrov.75@gmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1667647544-12945-1-git-send-email-ivo.g.dimitrov.75@gmail.com> References: <1667647544-12945-1-git-send-email-ivo.g.dimitrov.75@gmail.com> Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org Formulas were taken from android blob Signed-off-by: Ivaylo Dimitrov --- drivers/power/supply/cpcap-battery.c | 88 ++++++++++++++++++++---------------- 1 file changed, 48 insertions(+), 40 deletions(-) diff --git a/drivers/power/supply/cpcap-battery.c b/drivers/power/supply/cpcap-battery.c index ca6ee2b..92aa66c 100644 --- a/drivers/power/supply/cpcap-battery.c +++ b/drivers/power/supply/cpcap-battery.c @@ -74,9 +74,6 @@ #define CPCAP_BATTERY_CC_SAMPLE_PERIOD_MS 250 -#define CPCAP_BATTERY_EB41_HW4X_ID 0x9E -#define CPCAP_BATTERY_BW8X_ID 0x98 - enum { CPCAP_BATTERY_IIO_BATTDET, CPCAP_BATTERY_IIO_VOLTAGE, @@ -388,22 +385,9 @@ static int cpcap_battery_cc_to_ua(struct cpcap_battery_ddata *ddata, * kernel on droid 4, full is 4351000 and software initiates shutdown * at 3078000. The device will die around 2743000. */ -static const struct cpcap_battery_config cpcap_battery_eb41_data = { - .cd_factor = 0x3cc, - .info.technology = POWER_SUPPLY_TECHNOLOGY_LION, - .info.voltage_max_design = 4351000, - .info.voltage_min_design = 3100000, - .info.charge_full_design = 1740000, - .bat.constant_charge_voltage_max_uv = 4200000, -}; - -/* Values for the extended Droid Bionic battery bw8x. */ -static const struct cpcap_battery_config cpcap_battery_bw8x_data = { +static struct cpcap_battery_config cpcap_battery_mot_data = { .cd_factor = 0x3cc, .info.technology = POWER_SUPPLY_TECHNOLOGY_LION, - .info.voltage_max_design = 4200000, - .info.voltage_min_design = 3200000, - .info.charge_full_design = 2760000, .bat.constant_charge_voltage_max_uv = 4200000, }; @@ -431,39 +415,63 @@ static int cpcap_battery_match_nvmem(struct device *dev, const void *data) static void cpcap_battery_detect_battery_type(struct cpcap_battery_ddata *ddata) { struct nvmem_device *nvmem; - u8 battery_id = 0; + char buf[24]; + u8 capacity; + u8 mul_idx; + u8 charge_voltage; + u32 v; + static const u32 multipliers[] = {20, 10, 10, 10, 10, 40, 10, 20, 40}; ddata->check_nvmem = false; nvmem = nvmem_device_find(NULL, &cpcap_battery_match_nvmem); if (IS_ERR_OR_NULL(nvmem)) { - ddata->check_nvmem = true; dev_info_once(ddata->dev, "Can not find battery nvmem device. Assuming generic lipo battery\n"); - } else { - char buf[24]; - - if (nvmem_device_read(nvmem, 96, 4, buf) < 0 || - strncmp(buf, "COPR", 4) != 0 || - nvmem_device_read(nvmem, 104, 24, buf) < 0 || - strncmp(buf, "MOTOROLA E.P CHARGE ONLY", 24) != 0 || - nvmem_device_read(nvmem, 2, 1, &battery_id) < 0) { - battery_id = 0; - ddata->check_nvmem = true; - dev_warn(ddata->dev, "Can not read battery nvmem device. Assuming generic lipo battery\n"); - } + goto unknown; + } + if (nvmem_device_read(nvmem, 96, 4, buf) < 0 || + strncmp(buf, "COPR", 4) != 0 || + nvmem_device_read(nvmem, 104, 24, buf) < 0 || + strncmp(buf, "MOTOROLA E.P CHARGE ONLY", 24) != 0) { + dev_warn(ddata->dev, "Unknown battery nvmem device. Assuming generic lipo battery\n"); + goto unknown; } - switch (battery_id) { - case CPCAP_BATTERY_EB41_HW4X_ID: - ddata->config = cpcap_battery_eb41_data; - break; - case CPCAP_BATTERY_BW8X_ID: - ddata->config = cpcap_battery_bw8x_data; - break; - default: - ddata->config = cpcap_battery_unkown_data; + if (nvmem_device_read(nvmem, 49, 1, &mul_idx) < 0 || + nvmem_device_read(nvmem, 34, 1, &capacity) < 0 || + nvmem_device_read(nvmem, 65, 1, &charge_voltage) < 0) { + dev_warn(ddata->dev, "Can not read battery nvmem device. Assuming generic lipo battery\n"); + goto unknown; } + + /* design capacity */ + mul_idx -= 2; + + if (mul_idx < ARRAY_SIZE(multipliers)) + v = multipliers[mul_idx]; + else + v = 10; + + cpcap_battery_mot_data.info.charge_full_design = 1000 * v * capacity; + + /* design max voltage */ + v = 1000 * ((16702 * charge_voltage) / 1000 + 1260); + cpcap_battery_mot_data.info.voltage_max_design = v; + + /* design min voltage */ + if (v > 4200000) + cpcap_battery_mot_data.info.voltage_min_design = 3100000; + else + cpcap_battery_mot_data.info.voltage_min_design = 3200000; + + ddata->config = cpcap_battery_mot_data; + + return; + +unknown: + ddata->check_nvmem = true; + ddata->config = cpcap_battery_unkown_data; } /**