From nobody Thu Apr 9 01:43:54 2026 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 86DC7C4332F for ; Tue, 1 Nov 2022 19:54:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229988AbiKATyO (ORCPT ); Tue, 1 Nov 2022 15:54:14 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44192 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229670AbiKATyK (ORCPT ); Tue, 1 Nov 2022 15:54:10 -0400 Received: from mail-wm1-x32f.google.com (mail-wm1-x32f.google.com [IPv6:2a00:1450:4864:20::32f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B3A251B9E6; Tue, 1 Nov 2022 12:54:07 -0700 (PDT) Received: by mail-wm1-x32f.google.com with SMTP id l16-20020a05600c4f1000b003c6c0d2a445so10532270wmq.4; Tue, 01 Nov 2022 12:54:07 -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=qMLvz91JxdD1ON81vyAGas2R1qe681rjzzgx71DZVdI=; b=AsdJI5HULHCv9VmdCc1ZdAEq2+6JDar7zcys5fSi//ueKHj00uKnY+5eADzPW4qjrT TDPm3e+QZfXB82yAzyptOsINAZBw1BcML1pjhTMw86prwCtl9AZWwqwqry1aDJ0lr6CO RSUqHcZaZZP4qAe+TrAhVnWuikr9jBXMdN3McRN6dOHk8pRRXA7snsDRPREpTsOllddB rtCfYmqOeaKsi1Co4mX76wSXaReBfRkuU+M3n/6L36eXOnTVyqdUU2/qNwD8apAM5VpU OjX7SH1yRx9Vom7TAcj7KG5Nc+R48ZOaUfD2TXy0Up6QPs9BsgM4UGhHnUrspI+AYyO7 RXXg== 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=qMLvz91JxdD1ON81vyAGas2R1qe681rjzzgx71DZVdI=; b=cxJmmxFKKF0MQrwZRFjz3pM066z5COEB4zT2yJJsTp9OLVvFs2t+fuLmoVYsr4kOA1 XNOSFfwZ6M52/5ZeyULBNszE7LxXt5U/2xQW5P4GxoFaa0BWXbwRjrUq5SHSA7ZunL/8 Q4HiqI/v0QLA3v9/AUbJOxSG7emG+Jc/51q0CdWZUMB7QpZMk18q8u9aQCQ/dQ7p+e3W mQcpm3u/Vr1dD9uNJvHfLuwSHbAoRordpFVI0R5UvIErUdnriAukGmQZKvlXB985Vz3F 6bMRN9gLC7SiD0cz9aCQPv1Qh0jwrr4jFcwD+KlnmodLvfreSIPJDKKXoU21DWyurl8t oEdQ== X-Gm-Message-State: ACrzQf0eIR3GMa4exUQc+JTvj8t8U8tWhCu4s1WxtoQKdgvg+sD+sLNq FscqFec2TO1BrkG3gl/yE34= X-Google-Smtp-Source: AMsMyM7WLsCc05cIThUdud6Lj0K45zQUc9KUVE7a9mC0NbZvXA8gHPwBvnmOU5HfgOUL9LO4yNjj+A== X-Received: by 2002:a05:600c:4e47:b0:3c6:fc59:5eff with SMTP id e7-20020a05600c4e4700b003c6fc595effmr23083213wmq.18.1667332446282; Tue, 01 Nov 2022 12:54:06 -0700 (PDT) Received: from localhost.localdomain ([46.249.74.23]) by smtp.gmail.com with ESMTPSA id p11-20020a05600c468b00b003cf75213bb9sm6092617wmo.8.2022.11.01.12.54.05 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 01 Nov 2022 12:54:05 -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: Tue, 1 Nov 2022 21:53:43 +0200 Message-Id: <1667332425-12536-2-git-send-email-ivo.g.dimitrov.75@gmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1667332425-12536-1-git-send-email-ivo.g.dimitrov.75@gmail.com> References: <1667332425-12536-1-git-send-email-ivo.g.dimitrov.75@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@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 | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/drivers/power/supply/cpcap-battery.c b/drivers/power/supply/cp= cap-battery.c index 4676560..2659df7 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 timer_list low_timer; u32 cc_lsb; /* =CE=BCAms per LSB */ atomic_t active; int charge_full; @@ -914,9 +915,14 @@ static irqreturn_t cpcap_battery_irq_thread(int irq, v= oid *data) dev_info(ddata->dev, "Coulomb counter calibration done\n"); break; case CPCAP_BATTERY_IRQ_ACTION_BATTERY_LOW: - if (latest->current_ua >=3D 0) + if (latest->current_ua >=3D 0 && + !timer_pending(&ddata->low_timer)) { dev_warn(ddata->dev, "Battery low at %imV!\n", latest->voltage / 1000); + mod_timer(&ddata->low_timer, + jiffies + msecs_to_jiffies(30000)); + disable_irq_nosync(d->irq); + } break; case CPCAP_BATTERY_IRQ_ACTION_POWEROFF: if (latest->current_ua >=3D 0 && latest->voltage <=3D 3200000) { @@ -1087,6 +1093,19 @@ static int cpcap_battery_calibrate(struct cpcap_batt= ery_ddata *ddata) return error; } =20 +static void cpcap_battery_lowbph_enable(struct timer_list *t) +{ + struct cpcap_battery_ddata *ddata =3D from_timer(ddata, t, low_timer); + struct cpcap_interrupt_desc *d; + + list_for_each_entry(d, &ddata->irq_list, node) { + if (d->action =3D=3D CPCAP_BATTERY_IRQ_ACTION_BATTERY_LOW) + break; + } + + enable_irq(d->irq); +} + #ifdef CONFIG_OF static const struct of_device_id cpcap_battery_id_table[] =3D { { @@ -1118,6 +1137,8 @@ static int cpcap_battery_probe(struct platform_device= *pdev) if (!ddata) return -ENOMEM; =20 + timer_setup(&ddata->low_timer, cpcap_battery_lowbph_enable, 0); + cpcap_battery_detect_battery_type(ddata); =20 INIT_LIST_HEAD(&ddata->irq_list); @@ -1185,6 +1206,8 @@ static int cpcap_battery_remove(struct platform_devic= e *pdev) if (error) dev_err(&pdev->dev, "could not disable: %i\n", error); =20 + del_timer_sync(&ddata->low_timer); + return 0; } =20 --=20 1.9.1 From nobody Thu Apr 9 01:43:54 2026 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 701DAC4332F for ; Tue, 1 Nov 2022 19:54:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229650AbiKATyV (ORCPT ); Tue, 1 Nov 2022 15:54:21 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44198 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229819AbiKATyL (ORCPT ); Tue, 1 Nov 2022 15:54:11 -0400 Received: from mail-wm1-x32a.google.com (mail-wm1-x32a.google.com [IPv6:2a00:1450:4864:20::32a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AEE321838B; Tue, 1 Nov 2022 12:54:08 -0700 (PDT) Received: by mail-wm1-x32a.google.com with SMTP id m29-20020a05600c3b1d00b003c6bf423c71so13378wms.0; Tue, 01 Nov 2022 12:54:08 -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=vye8HxSgbJ5V+jvH1roXnBTgLilfVcEjREHvPLd1+J4=; b=ZKjLYhzCb5kTc/pGMmnAS+QjR79KN9xMzxUqE9fSAXuiSt1COUtdggm2+he/fVBjDa UffrpFN+eIv7RsNliCrL6iST546Gm1g7qlnvFoMYmS4yGMTyUCTBhl2Xy0G9lJR6HkKZ WI90Zk+RDl8caGilT5dFVlcaaisOfw1t+TfZzooPW9ZD4we02xZKRHsNspb5mNqZrihY 6X2+A0XBLeSZSco4dafmOQ5SBzya0LOS5e3Cb8fJRa2fO7CVoO9oRIHP5K9aMeOFbN76 QIam82coNksFbpinnUe6jEV/WrdaeKDXBEijrPI0YVs89kBirAnfVT9GzWUPi4egyvQC Dl3g== 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=vye8HxSgbJ5V+jvH1roXnBTgLilfVcEjREHvPLd1+J4=; b=m7yegr31mTC1R6ziJUC3NvEs47TTI/bfNBIK3qmqbtBWSKEn1+e0dq9j2fKFMfI4qS FHAsdU+O9UvTNqJElF9zpnyQOTYN1J8CO9qNH6Fmb/RJEgPwx17oB9c/3etDoMEkbMum ngfKukWjJXL1xvCajY31U5Yj+7Iw0sUD3At2rHeqoM0+7mBeTm4olHh/C6wWn5+Kqw6R dRrtLsi08QVy/oR5731yNcvbZ2gux0kq0DOfJYMjnD6lVL23VESZ13tA8lBtEYPyz7fz g0bMJrRHQFQHg2J77YJvCdnCIIL3K7RB5OWbQyz7Hp2xDWUVSceb3dBDkdut1bfbXA+U Zw5A== X-Gm-Message-State: ACrzQf0oauxjTCZ3gM2VtMC7AK7GDIe0goUpll85ULCSrrKD3F5WkbZF yyjuf2KYm3MQUOQPDwxlihA= X-Google-Smtp-Source: AMsMyM5qbVnKtO+Qn1pVRX6dPqvarmtqXvMGFBaoGOpVyb9l7NxYM18TzWIDmJxm0jOQbFoo7ObHKw== X-Received: by 2002:a7b:c5d6:0:b0:3c6:f970:e755 with SMTP id n22-20020a7bc5d6000000b003c6f970e755mr13080991wmk.132.1667332447328; Tue, 01 Nov 2022 12:54:07 -0700 (PDT) Received: from localhost.localdomain ([46.249.74.23]) by smtp.gmail.com with ESMTPSA id p11-20020a05600c468b00b003cf75213bb9sm6092617wmo.8.2022.11.01.12.54.06 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 01 Nov 2022 12:54:06 -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 2/3] power: supply: cpcap-battery: Fix battery identification Date: Tue, 1 Nov 2022 21:53:44 +0200 Message-Id: <1667332425-12536-3-git-send-email-ivo.g.dimitrov.75@gmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1667332425-12536-1-git-send-email-ivo.g.dimitrov.75@gmail.com> References: <1667332425-12536-1-git-send-email-ivo.g.dimitrov.75@gmail.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Use the same logic to identify genuine batteries as Android does. Signed-off-by: Ivaylo Dimitrov --- drivers/power/supply/cpcap-battery.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/drivers/power/supply/cpcap-battery.c b/drivers/power/supply/cp= cap-battery.c index 2659df7..4cfc325 100644 --- a/drivers/power/supply/cpcap-battery.c +++ b/drivers/power/supply/cpcap-battery.c @@ -422,7 +422,7 @@ static int cpcap_battery_cc_to_ua(struct cpcap_battery_= ddata *ddata, =20 static int cpcap_battery_match_nvmem(struct device *dev, const void *data) { - if (strcmp(dev_name(dev), "89-500029ba0f73") =3D=3D 0) + if (strncmp(dev_name(dev), "89-500", 6) =3D=3D 0) return 1; else return 0; @@ -439,10 +439,19 @@ static void cpcap_battery_detect_battery_type(struct = cpcap_battery_ddata *ddata) if (IS_ERR_OR_NULL(nvmem)) { ddata->check_nvmem =3D true; dev_info_once(ddata->dev, "Can not find battery nvmem device. Assuming g= eneric lipo battery\n"); - } else if (nvmem_device_read(nvmem, 2, 1, &battery_id) < 0) { - battery_id =3D 0; - ddata->check_nvmem =3D true; - dev_warn(ddata->dev, "Can not read battery nvmem device. Assuming generi= c lipo battery\n"); + } else { + char buf[24]; + + if (nvmem_device_read(nvmem, 96, 4, buf) < 0 || + strncmp(buf, "COPR", 4) !=3D 0 || + nvmem_device_read(nvmem, 104, 24, buf) < 0 || + strncmp(buf, "MOTOROLA E.P CHARGE ONLY", 24) !=3D 0 || + nvmem_device_read(nvmem, 2, 1, &battery_id) < 0) { + battery_id =3D 0; + ddata->check_nvmem =3D true; + dev_warn(ddata->dev, "Can not read battery nvmem device. Assuming gener= ic lipo battery\n"); + } + } =20 switch (battery_id) { --=20 1.9.1 From nobody Thu Apr 9 01:43:54 2026 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 BF3FFC433FE for ; Tue, 1 Nov 2022 19:54:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229993AbiKATyR (ORCPT ); Tue, 1 Nov 2022 15:54:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44196 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229846AbiKATyL (ORCPT ); Tue, 1 Nov 2022 15:54:11 -0400 Received: from mail-wm1-x330.google.com (mail-wm1-x330.google.com [IPv6:2a00:1450:4864:20::330]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9F32918E27; Tue, 1 Nov 2022 12:54:09 -0700 (PDT) Received: by mail-wm1-x330.google.com with SMTP id a11-20020a05600c2d4b00b003cf6f5fd9f1so4342512wmg.2; Tue, 01 Nov 2022 12:54:09 -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=DqgDcLSZNA5Saaon/Fmk29zadvFURd3kHj533JQMAZI=; b=L3wtkvYXHlDG15kqSgQX9OEeEdTYNSkh7poQs18k8dBe/Uz6uEfZIzt16BhbzPKd2p RTz32NgKZY16G9g2S8SMpAqi8L/9Lp+yyq1nNeIKhwP1seuGjpowo1Tz7RDQnZY2ssA6 haFJkb603fzoXpaGGzFWPtaTvQ0rP8lG2xyFUZHYjSgIGg9LRom+F51XEcU1cq4/Nbhu ATrgsKgpyZp2vhT/MARL3WVLhEsrHbWfUoIPb3cjfHwCrOyU+080G75vMs2UCmyV6tpM 5o6TwpDMjQK8zWChJxJaWF1lf3GPBdtQPcPUeht+lmwvI2DJd6hOuLhbpNhnpwdnCMw9 2Fcg== 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=DqgDcLSZNA5Saaon/Fmk29zadvFURd3kHj533JQMAZI=; b=acStzKqrC6EQnA0j6Kvhg6NJQNAWQ4WdIFMVrxsN+H1fRemJRr2j16qqSOGLlxE22o DEbU4X+TI19tGDbVDYRIHdZBn4KI9ZI3L328n/eeExQZ4lPL5iUnxDC2dZ8DkjyR9bK0 5PxgZil9gFB3S/aUHkNEl3g08yUuffyBn6R5t4Y94HFCcAASd4Wlq0sghxYgpd6Fq5BQ ExgvhxhSx1U75m4n1aEV80nThQnZNCbHNV2xyBV7tRWSU0hDrOpaTI5TJsj0Rct1NOXL ssvcF77jeBAkonElSkMkBn9KI5ymHXK8feCbSSOpQ7dqlPY76lnFwJen1bOlkb6E7UDM 9KoA== X-Gm-Message-State: ACrzQf1r5qOgmkC0ULZalFXwMUh/cKhtQNR/Uv05BohfdSG9JURSnsiI tB49viW9AByOstsWDT+Wkiw= X-Google-Smtp-Source: AMsMyM4scvnGtmJEI6L/0Q7Wcs3P0BW9nd6Ahkk/Xzw4ydDyis0Wsxx+GDBffAi2z+KCbeDkRKseLQ== X-Received: by 2002:a05:600c:3147:b0:3c6:f860:9610 with SMTP id h7-20020a05600c314700b003c6f8609610mr23655070wmo.170.1667332448210; Tue, 01 Nov 2022 12:54:08 -0700 (PDT) Received: from localhost.localdomain ([46.249.74.23]) by smtp.gmail.com with ESMTPSA id p11-20020a05600c468b00b003cf75213bb9sm6092617wmo.8.2022.11.01.12.54.07 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 01 Nov 2022 12:54:07 -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: Tue, 1 Nov 2022 21:53:45 +0200 Message-Id: <1667332425-12536-4-git-send-email-ivo.g.dimitrov.75@gmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1667332425-12536-1-git-send-email-ivo.g.dimitrov.75@gmail.com> References: <1667332425-12536-1-git-send-email-ivo.g.dimitrov.75@gmail.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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/cp= cap-battery.c index 4cfc325..5c51685 100644 --- a/drivers/power/supply/cpcap-battery.c +++ b/drivers/power/supply/cpcap-battery.c @@ -74,9 +74,6 @@ =20 #define CPCAP_BATTERY_CC_SAMPLE_PERIOD_MS 250 =20 -#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 =3D { - .cd_factor =3D 0x3cc, - .info.technology =3D POWER_SUPPLY_TECHNOLOGY_LION, - .info.voltage_max_design =3D 4351000, - .info.voltage_min_design =3D 3100000, - .info.charge_full_design =3D 1740000, - .bat.constant_charge_voltage_max_uv =3D 4200000, -}; - -/* Values for the extended Droid Bionic battery bw8x. */ -static const struct cpcap_battery_config cpcap_battery_bw8x_data =3D { +static struct cpcap_battery_config cpcap_battery_mot_data =3D { .cd_factor =3D 0x3cc, .info.technology =3D POWER_SUPPLY_TECHNOLOGY_LION, - .info.voltage_max_design =3D 4200000, - .info.voltage_min_design =3D 3200000, - .info.charge_full_design =3D 2760000, .bat.constant_charge_voltage_max_uv =3D 4200000, }; =20 @@ -431,39 +415,63 @@ static int cpcap_battery_match_nvmem(struct device *d= ev, const void *data) static void cpcap_battery_detect_battery_type(struct cpcap_battery_ddata *= ddata) { struct nvmem_device *nvmem; - u8 battery_id =3D 0; + char buf[24]; + u8 capacity; + u8 mul_idx; + u8 charge_voltage; + u32 v; + static const u32 multipliers[] =3D {20, 10, 10, 10, 10, 40, 10, 20, 40}; =20 ddata->check_nvmem =3D false; =20 nvmem =3D nvmem_device_find(NULL, &cpcap_battery_match_nvmem); if (IS_ERR_OR_NULL(nvmem)) { - ddata->check_nvmem =3D true; dev_info_once(ddata->dev, "Can not find battery nvmem device. Assuming g= eneric lipo battery\n"); - } else { - char buf[24]; - - if (nvmem_device_read(nvmem, 96, 4, buf) < 0 || - strncmp(buf, "COPR", 4) !=3D 0 || - nvmem_device_read(nvmem, 104, 24, buf) < 0 || - strncmp(buf, "MOTOROLA E.P CHARGE ONLY", 24) !=3D 0 || - nvmem_device_read(nvmem, 2, 1, &battery_id) < 0) { - battery_id =3D 0; - ddata->check_nvmem =3D true; - dev_warn(ddata->dev, "Can not read battery nvmem device. Assuming gener= ic lipo battery\n"); - } + goto unknown; + } =20 + if (nvmem_device_read(nvmem, 96, 4, buf) < 0 || + strncmp(buf, "COPR", 4) !=3D 0 || + nvmem_device_read(nvmem, 104, 24, buf) < 0 || + strncmp(buf, "MOTOROLA E.P CHARGE ONLY", 24) !=3D 0) { + dev_warn(ddata->dev, "Unknown battery nvmem device. Assuming generic lip= o battery\n"); + goto unknown; } =20 - switch (battery_id) { - case CPCAP_BATTERY_EB41_HW4X_ID: - ddata->config =3D cpcap_battery_eb41_data; - break; - case CPCAP_BATTERY_BW8X_ID: - ddata->config =3D cpcap_battery_bw8x_data; - break; - default: - ddata->config =3D 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 generi= c lipo battery\n"); + goto unknown; } + + /* design capacity */ + mul_idx -=3D 2; + + if (mul_idx < ARRAY_SIZE(multipliers)) + v =3D multipliers[mul_idx]; + else + v =3D 10; + + cpcap_battery_mot_data.info.charge_full_design =3D 1000 * v * capacity; + + /* design max voltage */ + v =3D 1000 * ((16702 * charge_voltage) / 1000 + 1260); + cpcap_battery_mot_data.info.voltage_max_design =3D v; + + /* design min voltage */ + if (v > 4200000) + cpcap_battery_mot_data.info.voltage_min_design =3D 3100000; + else + cpcap_battery_mot_data.info.voltage_min_design =3D 3200000; + + ddata->config =3D cpcap_battery_mot_data; + + return; + +unknown: + ddata->check_nvmem =3D true; + ddata->config =3D cpcap_battery_unkown_data; } =20 /** --=20 1.9.1