From nobody Thu Apr 9 01:57:42 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 34435C4332F for ; Sat, 5 Nov 2022 11:26:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229785AbiKEL0Y (ORCPT ); Sat, 5 Nov 2022 07:26:24 -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 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 | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/drivers/power/supply/cpcap-battery.c b/drivers/power/supply/cp= cap-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; /* =CE=BCAms per LSB */ atomic_t active; int charge_full; @@ -914,9 +915,13 @@ 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 && + !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 >=3D 0 && latest->voltage <=3D 3200000) { @@ -1087,6 +1092,21 @@ static int cpcap_battery_calibrate(struct cpcap_batt= ery_ddata *ddata) return error; } =20 +static void cpcap_battery_lowbph_enable(struct work_struct *work) +{ + struct delayed_work *d_work =3D to_delayed_work(work); + struct cpcap_battery_ddata *ddata =3D 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 =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 +1138,8 @@ static int cpcap_battery_probe(struct platform_device= *pdev) if (!ddata) return -ENOMEM; =20 + INIT_DELAYED_WORK(&ddata->low_irq_work, cpcap_battery_lowbph_enable); + cpcap_battery_detect_battery_type(ddata); =20 INIT_LIST_HEAD(&ddata->irq_list); @@ -1185,6 +1207,9 @@ static int cpcap_battery_remove(struct platform_devic= e *pdev) if (error) dev_err(&pdev->dev, "could not disable: %i\n", error); =20 + /* make sure to call enable_irq() if needed */ + flush_delayed_work(&ddata->low_irq_work); + return 0; } =20 --=20 1.9.1 From nobody Thu Apr 9 01:57:42 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 53A84C433FE for ; Sat, 5 Nov 2022 11:26:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229472AbiKEL03 (ORCPT ); Sat, 5 Nov 2022 07:26:29 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55070 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229776AbiKEL0S (ORCPT ); Sat, 5 Nov 2022 07:26:18 -0400 Received: from mail-ej1-x630.google.com (mail-ej1-x630.google.com [IPv6:2a00:1450:4864:20::630]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9E9F21C93B; Sat, 5 Nov 2022 04:26:17 -0700 (PDT) Received: by mail-ej1-x630.google.com with SMTP id b2so19256128eja.6; Sat, 05 Nov 2022 04:26:17 -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=mvbWRnJLjkEbJwbK1HqoKZYYWWWpHEGeJghtyoGl4P0=; b=C8gR2s0AAAG6uGJhhbsKl5NJ2n+1peuiSWA7QXTiZTMalCVYF+kWkYB4pzVxrQPawu RKLgbkvoQDXSjjiuyYupi3fNKABc1mppEqnPCuuNxIswwNEdB9js1on29IY/Y3KZYxp6 nnWbgja5HcwueVtL5j5vmXpzGc491l49mzUnQo+fIUJhPmEyQ4KPGnLsaX+y+8Zp08Ca ErkVwbpcVmFgQ3egvFuvyQOuEPy++nUCS2tf1zq0r+4wxAyTXX05mP3J4WFH28Mbe82V J868hOcDys45rd3Z7hxksZkNznnB+4q7796VJXRrIbDdnpB17jFdYItX5VVZhWRRpQDm W8yg== 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=mvbWRnJLjkEbJwbK1HqoKZYYWWWpHEGeJghtyoGl4P0=; b=P4GUQiILJkv+yQk9hvxhchX2xjR/8VviVHdN5pY3HY84szVXOQysHKIjfSfHVFuqHn 1m262+HrVjTVvVVaZNBQsffHapLdDexC+rfr+XOI7Cym77cEal9FssAQuwo/VAa+nesa 7ln8uumdi/SiW4iSoBldAX2jkJ6s86BjhOPvCq1ioo8m/BCCYIvRo+QmLwOBIBPCow4o hy1j57IcVbqpGLMbY7nUaKvP/YYngLEgxLUA3fV2WuzV256VzuaBftWo+kHsqotNMpwH 3rdHB7nv4I5sWuD53ZEzJYNTgEheLr8UCOalM4fi8ENqcBwfKLMJZnhmZiD0fIxyYbD5 EtRg== X-Gm-Message-State: ACrzQf3tRs7afrX78re9n43+jdmZKw5FE1yU+bxfJOoM0j0uS9+vEuba yeNDRRsqNCRvu/bh6nra/DQ= X-Google-Smtp-Source: AMsMyM5gSZ3vMm058PZBZ+dQHGu5BEHhBA2xxSSBckD8jzrtkNp0w2PkNJJdyWNC4caX/Fw4xiXNCA== X-Received: by 2002:a17:907:608f:b0:78e:1b60:60e2 with SMTP id ht15-20020a170907608f00b0078e1b6060e2mr39212115ejc.382.1667647576266; Sat, 05 Nov 2022 04:26:16 -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.15 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Sat, 05 Nov 2022 04:26:15 -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: Sat, 5 Nov 2022 13:25:43 +0200 Message-Id: <1667647544-12945-3-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-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 8869067..ca6ee2b 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:57:42 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 A7AB4C4332F for ; Sat, 5 Nov 2022 11:26:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229835AbiKEL0c (ORCPT ); Sat, 5 Nov 2022 07:26:32 -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-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 ca6ee2b..92aa66c 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