All of lore.kernel.org
 help / color / mirror / Atom feed
From: Aidan MacDonald <aidanmacdonald.0x0@gmail.com>
To: linus.walleij@linaro.org, brgl@bgdev.pl, robh+dt@kernel.org,
	krzysztof.kozlowski+dt@linaro.org, wens@csie.org,
	jic23@kernel.org, lee.jones@linaro.org, sre@kernel.org,
	broonie@kernel.org, gregkh@linuxfoundation.org,
	lgirdwood@gmail.com
Cc: lars@metafoo.de, rafael@kernel.org, quic_gurus@quicinc.com,
	sebastian.reichel@collabora.com, andy.shevchenko@gmail.com,
	michael@walle.cc, linux-gpio@vger.kernel.org,
	devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-iio@vger.kernel.org, linux-pm@vger.kernel.org
Subject: [PATCH v3 14/16] power: axp20x_battery: Add constant charge current table
Date: Sat, 18 Jun 2022 22:40:07 +0100	[thread overview]
Message-ID: <20220618214009.2178567-15-aidanmacdonald.0x0@gmail.com> (raw)
In-Reply-To: <20220618214009.2178567-1-aidanmacdonald.0x0@gmail.com>

Add a table-based lookup method for constant charge current,
which is necessary when the setting cannot be represented as
a linear range.

This also replaces the hard-coded 300 mA default ccc setting
if the DT-specified value is unsupported; the minimum value
for the device is now set exactly instead of relying on the
value being rounded down to a supported value.

Signed-off-by: Aidan MacDonald <aidanmacdonald.0x0@gmail.com>
---
 drivers/power/supply/axp20x_battery.c | 60 +++++++++++++++++++++------
 1 file changed, 48 insertions(+), 12 deletions(-)

diff --git a/drivers/power/supply/axp20x_battery.c b/drivers/power/supply/axp20x_battery.c
index 9106077c0dbb..ce22c0a92878 100644
--- a/drivers/power/supply/axp20x_battery.c
+++ b/drivers/power/supply/axp20x_battery.c
@@ -61,6 +61,14 @@ struct axp20x_batt_ps;
 struct axp_data {
 	int	ccc_scale;
 	int	ccc_offset;
+	/*
+	 * Lookup table for constant charge current, if provided this is used
+	 * instead of ccc_scale/ccc_offset.
+	 *
+	 * The table is indexed by the field AXP20X_CHRG_CTRL1_TGT_CURR so it
+	 * must have AXP20X_CHRG_CTRL1_TGT_CURR+1 elements.
+	 */
+	const int *ccc_table;
 	bool	has_fg_valid;
 	int	(*get_max_voltage)(struct axp20x_batt_ps *batt, int *val);
 	int	(*set_max_voltage)(struct axp20x_batt_ps *batt, int val);
@@ -176,7 +184,10 @@ static int axp20x_get_constant_charge_current(struct axp20x_batt_ps *axp,
 
 	*val &= AXP20X_CHRG_CTRL1_TGT_CURR;
 
-	*val = *val * axp->data->ccc_scale + axp->data->ccc_offset;
+	if (axp->data->ccc_table)
+		*val = axp->data->ccc_table[*val];
+	else
+		*val = *val * axp->data->ccc_scale + axp->data->ccc_offset;
 
 	return 0;
 }
@@ -389,16 +400,36 @@ static int axp20x_battery_set_max_voltage(struct axp20x_batt_ps *axp20x_batt,
 				  AXP20X_CHRG_CTRL1_TGT_VOLT, val);
 }
 
+static int axp20x_get_constant_charge_current_sel(struct axp20x_batt_ps *axp_batt,
+						  int charge_current)
+{
+	int i;
+
+	if (axp_batt->data->ccc_table) {
+		for (i = AXP20X_CHRG_CTRL1_TGT_CURR; i >= 0; --i) {
+			if (axp_batt->data->ccc_table[i] <= charge_current)
+				return i;
+		}
+
+		return -EINVAL;
+	}
+
+	i = (charge_current - axp_batt->data->ccc_offset) / axp_batt->data->ccc_scale;
+
+	if (i > AXP20X_CHRG_CTRL1_TGT_CURR || i < 0)
+		return -EINVAL;
+
+	return i;
+}
+
 static int axp20x_set_constant_charge_current(struct axp20x_batt_ps *axp_batt,
 					      int charge_current)
 {
 	if (charge_current > axp_batt->max_ccc)
 		return -EINVAL;
 
-	charge_current = (charge_current - axp_batt->data->ccc_offset) /
-		axp_batt->data->ccc_scale;
-
-	if (charge_current > AXP20X_CHRG_CTRL1_TGT_CURR || charge_current < 0)
+	charge_current = axp20x_get_constant_charge_current_sel(axp_batt, charge_current);
+	if (charge_current < 0)
 		return -EINVAL;
 
 	return regmap_update_bits(axp_batt->regmap, AXP20X_CHRG_CTRL1,
@@ -410,14 +441,14 @@ static int axp20x_set_max_constant_charge_current(struct axp20x_batt_ps *axp,
 {
 	bool lower_max = false;
 
-	charge_current = (charge_current - axp->data->ccc_offset) /
-		axp->data->ccc_scale;
-
-	if (charge_current > AXP20X_CHRG_CTRL1_TGT_CURR || charge_current < 0)
+	charge_current = axp20x_get_constant_charge_current_sel(axp, charge_current);
+	if (charge_current < 0)
 		return -EINVAL;
 
-	charge_current = charge_current * axp->data->ccc_scale +
-		axp->data->ccc_offset;
+	if (axp->data->ccc_table)
+		charge_current = axp->data->ccc_table[charge_current];
+	else
+		charge_current = charge_current * axp->data->ccc_scale + axp->data->ccc_offset;
 
 	if (charge_current > axp->max_ccc)
 		dev_warn(axp->dev,
@@ -629,7 +660,12 @@ static int axp20x_power_probe(struct platform_device *pdev)
 								   ccc)) {
 			dev_err(&pdev->dev,
 				"couldn't set constant charge current from DT: fallback to minimum value\n");
-			ccc = 300000;
+
+			if (axp20x_batt->data->ccc_table)
+				ccc = axp20x_batt->data->ccc_table[0];
+			else
+				ccc = axp20x_batt->data->ccc_offset;
+
 			axp20x_batt->max_ccc = ccc;
 			axp20x_set_constant_charge_current(axp20x_batt, ccc);
 		}
-- 
2.35.1


  parent reply	other threads:[~2022-06-18 21:40 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-06-18 21:39 [PATCH v3 00/16] Add support for AXP192 PMIC Aidan MacDonald
2022-06-18 21:39 ` [PATCH v3 01/16] regmap-irq: Use sub_irq_reg() to calculate unmask register address Aidan MacDonald
2022-06-18 21:39 ` [PATCH v3 02/16] regmap-irq: Add get_irq_reg to support unusual register layouts Aidan MacDonald
2022-06-18 21:39 ` [PATCH v3 03/16] dt-bindings: mfd: add bindings for AXP192 MFD device Aidan MacDonald
2022-06-19  3:21   ` Chen-Yu Tsai
2022-06-18 21:39 ` [PATCH v3 04/16] dt-bindings: iio: adc: axp209: Add AXP192 compatible Aidan MacDonald
2022-06-19  3:26   ` Chen-Yu Tsai
2022-06-18 21:39 ` [PATCH v3 05/16] dt-bindings: power: supply: axp20x: " Aidan MacDonald
2022-06-19  3:34   ` Chen-Yu Tsai
2022-06-18 21:39 ` [PATCH v3 06/16] dt-bindings: gpio: Add AXP192 GPIO bindings Aidan MacDonald
2022-06-19 11:12   ` Krzysztof Kozlowski
2022-06-19 17:20   ` Rob Herring
2022-06-18 21:40 ` [PATCH v3 07/16] dt-bindings: power: axp20x-battery: Add AXP192 compatible Aidan MacDonald
2022-06-18 21:40 ` [PATCH v3 08/16] mfd: axp20x: Add support for AXP192 Aidan MacDonald
2022-06-19 10:44   ` Andy Shevchenko
2022-06-18 21:40 ` [PATCH v3 09/16] regulator: " Aidan MacDonald
2022-06-19 10:46   ` Andy Shevchenko
2022-06-18 21:40 ` [PATCH v3 10/16] iio: adc: axp20x_adc: Minor code cleanups Aidan MacDonald
2022-06-19  3:56   ` Chen-Yu Tsai
2022-06-19 11:01     ` Jonathan Cameron
2022-06-19 10:51   ` Andy Shevchenko
2022-06-18 21:40 ` [PATCH v3 11/16] iio: adc: axp20x_adc: Add support for AXP192 Aidan MacDonald
2022-06-19 10:55   ` Andy Shevchenko
2022-06-19 11:13   ` Jonathan Cameron
2022-06-19 15:11     ` Aidan MacDonald
2022-06-18 21:40 ` [PATCH v3 12/16] power: supply: axp20x_usb_power: " Aidan MacDonald
2022-06-19  3:34   ` Chen-Yu Tsai
2022-06-19 11:02   ` Andy Shevchenko
2022-06-18 21:40 ` [PATCH v3 13/16] pinctrl: Add AXP192 pin control driver Aidan MacDonald
2022-06-18 21:59   ` Randy Dunlap
2022-06-19 11:20   ` Andy Shevchenko
2022-06-19 11:25     ` Andy Shevchenko
2022-06-27  8:10   ` Michael Walle
2022-06-27 13:12     ` Aidan MacDonald
2022-06-30  7:26       ` Michael Walle
2022-07-01 15:51         ` Aidan MacDonald
2022-06-18 21:40 ` Aidan MacDonald [this message]
2022-06-19 11:29   ` [PATCH v3 14/16] power: axp20x_battery: Add constant charge current table Andy Shevchenko
2022-06-18 21:40 ` [PATCH v3 15/16] power: axp20x_battery: Support battery status without fuel gauge Aidan MacDonald
2022-06-18 21:40 ` [PATCH v3 16/16] power: axp20x_battery: Add support for AXP192 Aidan MacDonald
     [not found] ` <CAHp75VfrzQFq4u0vMtPM7LRYNcQQC-padQ1yyFijbpWx8_LwBQ@mail.gmail.com>
2022-06-19 11:17   ` [PATCH v3 00/16] Add support for AXP192 PMIC Jonathan Cameron
2022-06-19 11:12     ` Andy Shevchenko
2022-06-19 14:54       ` Aidan MacDonald

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220618214009.2178567-15-aidanmacdonald.0x0@gmail.com \
    --to=aidanmacdonald.0x0@gmail.com \
    --cc=andy.shevchenko@gmail.com \
    --cc=brgl@bgdev.pl \
    --cc=broonie@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=jic23@kernel.org \
    --cc=krzysztof.kozlowski+dt@linaro.org \
    --cc=lars@metafoo.de \
    --cc=lee.jones@linaro.org \
    --cc=lgirdwood@gmail.com \
    --cc=linus.walleij@linaro.org \
    --cc=linux-gpio@vger.kernel.org \
    --cc=linux-iio@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=michael@walle.cc \
    --cc=quic_gurus@quicinc.com \
    --cc=rafael@kernel.org \
    --cc=robh+dt@kernel.org \
    --cc=sebastian.reichel@collabora.com \
    --cc=sre@kernel.org \
    --cc=wens@csie.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.