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,
	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 v2 11/17] iio: adc: axp20x_adc: Consolidate ADC raw read functions
Date: Tue,  7 Jun 2022 16:53:18 +0100	[thread overview]
Message-ID: <20220607155324.118102-12-aidanmacdonald.0x0@gmail.com> (raw)
In-Reply-To: <20220607155324.118102-1-aidanmacdonald.0x0@gmail.com>

Add an axp20x_id variant field to the axp_data struct and use it
to consolidate the adc_raw functions, reducing code duplication.
Variant IDs are chosen to match the OF compatible strings.

Signed-off-by: Aidan MacDonald <aidanmacdonald.0x0@gmail.com>
---
 drivers/iio/adc/axp20x_adc.c | 83 +++++++++++++++---------------------
 1 file changed, 34 insertions(+), 49 deletions(-)

diff --git a/drivers/iio/adc/axp20x_adc.c b/drivers/iio/adc/axp20x_adc.c
index 9d5b1de24908..0260433782d8 100644
--- a/drivers/iio/adc/axp20x_adc.c
+++ b/drivers/iio/adc/axp20x_adc.c
@@ -71,6 +71,18 @@ struct axp20x_adc_iio {
 	const struct axp_data	*data;
 };
 
+struct axp_data {
+	const struct iio_info		*iio_info;
+	int				num_channels;
+	struct iio_chan_spec const	*channels;
+	unsigned long			adc_en1_mask;
+	unsigned long			adc_en2_mask;
+	int				(*adc_rate)(struct axp20x_adc_iio *info,
+						    int rate);
+	struct iio_map			*maps;
+	enum axp20x_variants		axp20x_id;
+};
+
 enum axp20x_adc_channel_v {
 	AXP20X_ACIN_V = 0,
 	AXP20X_VBUS_V,
@@ -237,15 +249,24 @@ static int axp20x_adc_raw(struct iio_dev *indio_dev,
 	struct axp20x_adc_iio *info = iio_priv(indio_dev);
 	int ret, size;
 
-	/*
-	 * N.B.:  Unlike the Chinese datasheets tell, the charging current is
-	 * stored on 12 bits, not 13 bits. Only discharging current is on 13
-	 * bits.
-	 */
-	if (chan->type == IIO_CURRENT && chan->channel == AXP20X_BATT_DISCHRG_I)
-		size = 13;
-	else
+	switch (info->data->axp20x_id) {
+	case AXP202_ID:
+	case AXP209_ID:
+		/*
+		 * N.B.:  Unlike the Chinese datasheets tell, the charging current is
+		 * stored on 12 bits, not 13 bits. Only discharging current is on 13
+		 * bits.
+		 */
+		if (chan->type == IIO_CURRENT && chan->channel == AXP20X_BATT_DISCHRG_I)
+			size = 13;
+		else
+			size = 12;
+		break;
+
+	default:
 		size = 12;
+		break;
+	}
 
 	ret = axp20x_read_variable_width(info->regmap, chan->address, size);
 	if (ret < 0)
@@ -255,34 +276,6 @@ static int axp20x_adc_raw(struct iio_dev *indio_dev,
 	return IIO_VAL_INT;
 }
 
-static int axp22x_adc_raw(struct iio_dev *indio_dev,
-			  struct iio_chan_spec const *chan, int *val)
-{
-	struct axp20x_adc_iio *info = iio_priv(indio_dev);
-	int ret;
-
-	ret = axp20x_read_variable_width(info->regmap, chan->address, 12);
-	if (ret < 0)
-		return ret;
-
-	*val = ret;
-	return IIO_VAL_INT;
-}
-
-static int axp813_adc_raw(struct iio_dev *indio_dev,
-			  struct iio_chan_spec const *chan, int *val)
-{
-	struct axp20x_adc_iio *info = iio_priv(indio_dev);
-	int ret;
-
-	ret = axp20x_read_variable_width(info->regmap, chan->address, 12);
-	if (ret < 0)
-		return ret;
-
-	*val = ret;
-	return IIO_VAL_INT;
-}
-
 static int axp20x_adc_scale_voltage(int channel, int *val, int *val2)
 {
 	switch (channel) {
@@ -522,7 +515,7 @@ static int axp22x_read_raw(struct iio_dev *indio_dev,
 		return axp22x_adc_scale(chan, val, val2);
 
 	case IIO_CHAN_INFO_RAW:
-		return axp22x_adc_raw(indio_dev, chan, val);
+		return axp20x_adc_raw(indio_dev, chan, val);
 
 	default:
 		return -EINVAL;
@@ -542,7 +535,7 @@ static int axp813_read_raw(struct iio_dev *indio_dev,
 		return axp813_adc_scale(chan, val, val2);
 
 	case IIO_CHAN_INFO_RAW:
-		return axp813_adc_raw(indio_dev, chan, val);
+		return axp20x_adc_raw(indio_dev, chan, val);
 
 	default:
 		return -EINVAL;
@@ -620,17 +613,6 @@ static int axp813_adc_rate(struct axp20x_adc_iio *info, int rate)
 				 AXP813_ADC_RATE_HZ(rate));
 }
 
-struct axp_data {
-	const struct iio_info		*iio_info;
-	int				num_channels;
-	struct iio_chan_spec const	*channels;
-	unsigned long			adc_en1_mask;
-	int				(*adc_rate)(struct axp20x_adc_iio *info,
-						    int rate);
-	bool				adc_en2;
-	struct iio_map			*maps;
-};
-
 static const struct axp_data axp20x_data = {
 	.iio_info = &axp20x_adc_iio_info,
 	.num_channels = ARRAY_SIZE(axp20x_adc_channels),
@@ -639,6 +621,7 @@ static const struct axp_data axp20x_data = {
 	.adc_rate = axp20x_adc_rate,
 	.adc_en2 = true,
 	.maps = axp20x_maps,
+	.axp20x_id = AXP209_ID,
 };
 
 static const struct axp_data axp22x_data = {
@@ -649,6 +632,7 @@ static const struct axp_data axp22x_data = {
 	.adc_rate = axp22x_adc_rate,
 	.adc_en2 = false,
 	.maps = axp22x_maps,
+	.axp20x_id = AXP221_ID,
 };
 
 static const struct axp_data axp813_data = {
@@ -659,6 +643,7 @@ static const struct axp_data axp813_data = {
 	.adc_rate = axp813_adc_rate,
 	.adc_en2 = false,
 	.maps = axp22x_maps,
+	.axp20x_id = AXP813_ID,
 };
 
 static const struct of_device_id axp20x_adc_of_match[] = {
-- 
2.35.1


  parent reply	other threads:[~2022-06-07 15:53 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-06-07 15:53 [PATCH v2 00/17] Add support for AXP192 PMIC Aidan MacDonald
2022-06-07 15:53 ` [PATCH v2 01/17] regmap-irq: Use sub_irq_reg() to calculate unmask register address Aidan MacDonald
2022-06-09 16:39   ` Guru Das Srinagesh
2022-06-11 14:32     ` Aidan MacDonald
2022-06-07 15:53 ` [PATCH v2 02/17] regmap-irq: Add get_irq_reg to support unusual register layouts Aidan MacDonald
2022-06-08 16:17   ` Mark Brown
2022-06-10 15:40     ` Aidan MacDonald
2022-06-10 16:47       ` Mark Brown
2022-06-11 14:22         ` Aidan MacDonald
2022-06-23  8:54       ` Matti Vaittinen
2022-06-23 20:35         ` Aidan MacDonald
2022-06-07 15:53 ` [PATCH v2 03/17] dt-bindings: mfd: add bindings for AXP192 MFD device Aidan MacDonald
2022-06-08 10:48   ` Krzysztof Kozlowski
2022-06-09 17:52     ` Aidan MacDonald
2022-06-07 15:53 ` [PATCH v2 04/17] dt-bindings: iio: adc: axp209: Add AXP192 compatible Aidan MacDonald
2022-06-08 10:49   ` Krzysztof Kozlowski
2022-06-07 15:53 ` [PATCH v2 05/17] dt-bindings: power: supply: axp20x: " Aidan MacDonald
2022-06-08 10:50   ` Krzysztof Kozlowski
2022-06-07 15:53 ` [PATCH v2 06/17] dt-bindings: gpio: Add AXP192 GPIO bindings Aidan MacDonald
2022-06-09 20:24   ` Rob Herring
2022-06-07 15:53 ` [PATCH v2 07/17] dt-bindings: power: axp20x-battery: Add AXP192 compatible Aidan MacDonald
2022-06-09 20:24   ` Rob Herring
2022-06-07 15:53 ` [PATCH v2 08/17] mfd: axp20x: Add support for AXP192 Aidan MacDonald
2022-06-07 15:53 ` [PATCH v2 09/17] regulator: " Aidan MacDonald
2022-06-07 15:53 ` [PATCH v2 10/17] iio: adc: axp20x_adc: Minor code cleanups Aidan MacDonald
2022-06-08 13:22   ` Jonathan Cameron
2022-06-08 22:58     ` Aidan MacDonald
2022-06-07 15:53 ` Aidan MacDonald [this message]
2022-06-08 13:28   ` [PATCH v2 11/17] iio: adc: axp20x_adc: Consolidate ADC raw read functions Jonathan Cameron
2022-06-08 23:13     ` Aidan MacDonald
2022-06-11 18:23       ` Jonathan Cameron
2022-06-08 13:30   ` Jonathan Cameron
2022-06-07 15:53 ` [PATCH v2 12/17] iio: adc: axp20x_adc: Add support for AXP192 Aidan MacDonald
2022-06-08 13:35   ` Jonathan Cameron
2022-06-07 15:53 ` [PATCH v2 13/17] power: supply: axp20x_usb_power: " Aidan MacDonald
2022-06-09 20:53   ` Sebastian Reichel
2022-06-07 15:53 ` [PATCH v2 14/17] pinctrl: Add AXP192 pin control driver Aidan MacDonald
2022-06-07 15:53 ` [PATCH v2 15/17] power: axp20x_battery: Add constant charge current table Aidan MacDonald
2022-06-09 21:11   ` Sebastian Reichel
2022-06-10 15:40     ` Aidan MacDonald
2022-06-07 15:53 ` [PATCH v2 16/17] power: axp20x_battery: Support battery status without fuel gauge Aidan MacDonald
2022-06-09 21:11   ` Sebastian Reichel
2022-06-07 15:53 ` [PATCH v2 17/17] power: axp20x_battery: Add support for AXP192 Aidan MacDonald
2022-06-09 21:12   ` Sebastian Reichel

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=20220607155324.118102-12-aidanmacdonald.0x0@gmail.com \
    --to=aidanmacdonald.0x0@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=quic_gurus@quicinc.com \
    --cc=rafael@kernel.org \
    --cc=robh+dt@kernel.org \
    --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.