devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 00/16] add support for AXP813 ADC and battery power supply
@ 2018-01-15 10:33 Quentin Schulz
       [not found] ` <cover.2e5329bf5475a5160e613a4eb1e1377c662ce56e.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
  2018-01-23 15:55 ` [PATCH v3 00/16] add support for AXP813 ADC and battery power supply Chen-Yu Tsai
  0 siblings, 2 replies; 38+ messages in thread
From: Quentin Schulz @ 2018-01-15 10:33 UTC (permalink / raw)
  To: jic23-DgEjT+Ai2ygdnm+yROfE0A, knaack.h-Mmb7MZpHnFY,
	lars-Qo5EllUWu/uELgA04lAiVw, pmeerw-jW+XmwGofnusTnJN9+BGXg,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8,
	wens-jdAy2FN1RRM, sre-DgEjT+Ai2ygdnm+yROfE0A,
	linux-I+IVW8TIWO2tmTQ+vhA3Yw,
	maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	lee.jones-QSEj5FYQhm4dnm+yROfE0A
  Cc: linux-iio-u79uwXL29TY76Z2rM5mHXA,
	linux-pm-u79uwXL29TY76Z2rM5mHXA,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	thomas.petazzoni-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	linux-sunxi-/JYPxA39Uh5TLH3MbocFFw,
	julian.calaby-Re5JQEeQqe8AvxtiuMwx3w, Quentin Schulz

The AXP813 PMIC is relatively close to the already supported AXP20X and
AXP22X. It provides three different power outputs: battery, AC and USB, and
measures a few different things: temperature, power supply status, current
current and voltage supplied, maximum current limit, battery capacity, min
and max voltage limits.

One of its two GPIOs can be used as an ADC.

There are a few differences with AXP20X/AXP22X PMICs though:
  - a different constant charge current formula,
  - battery temperature, GPIO0 and battery voltages are the only voltages
  measurable,
  - all data are stored on 12 bits (AXP20X/AXP22X had one type of data that
  was stored on 13 bits),
  - different scales and offsets,
  - a different ADC rate formula and register,

This patch series adds support for the PMIC's ADC and battery power supply
in the existing drivers.

Make the axp20x MFD automatically probe the ADC driver, add the battery
power supply node in axp81x node and enable it for the TBS A711 since it
has a soldered battery.

I suggest patches:
  - 4,5,8,14,15,16 go through Maxime and Chen-Yu's tree,
  - 1,2,3,7 go through Jonathan's tree,
  - 6,9,13 go through Lee's tree,
  - 10,11,12 go through Sebastian's tree,

v3:
  - merging dt-bindings patches for axp_adc as requested by Rob,
  - re-ordered constant in IIO driver as requested by Julian,
  - compatibles for ADC are now named after the first design that
  introduced the IP instead of wildcard as requested by Maxime,
  - renamed DT node name from axp-adc to adc as requested by Rob,
  - replaced enumeration of supported PMICs in battery power supply DT
  bindings documentation by "supported devices" as requested by Jonathan,
  - added a new patch for removing "axp-" from axp81x's pinctrl DT node,

v2:
  - introduce data structure instead of ID for variant specific code in
  battery driver,
  - add DT binding for ADC driver,
  - make mfd probe the ADC driver via DT as well so that its IIO channels
  can be consumed by other drivers via DT mapping,

Thanks,
Quentin

Quentin Schulz (16):
  iio: adc: axp20x_adc: put ADC rate setting in a per-variant function
  dt-bindings: iio: adc: add binding for X-Powers AXP PMICs ADC
  iio: adc: axp20x_adc: make it possible to probe from DT
  ARM: dtsi: axp209: add node for ADC
  ARM: dtsi: axp22x: add node for ADC
  mfd: axp20x: make AXP209/22x cells probe their ADC via DT
  iio: adc: axp20x_adc: add support for AXP813 ADC
  ARM: dtsi: axp81x: add node for ADC
  mfd: axp20x: probe axp20x_adc driver for AXP813
  power: supply: axp20x_battery: use data structure instead of ID for variant specific code
  dt-bindings: power: supply: axp20x: add AXP813 battery DT binding
  power: supply: axp20x_battery: add support for AXP813
  mfd: axp20x: add battery power supply cell for AXP813
  ARM: dtsi: axp81x: add battery power supply subnode
  ARM: dtsi: sun8i: a711: enable battery power supply subnode
  ARM: dtsi: axp81x: remove IP name from DT node name

 Documentation/devicetree/bindings/iio/adc/axp20x_adc.txt          |  48 ++++++++++++++++++++++-
 Documentation/devicetree/bindings/power/supply/axp20x_battery.txt |   8 ++--
 arch/arm/boot/dts/axp209.dtsi                                     |   5 ++-
 arch/arm/boot/dts/axp22x.dtsi                                     |   5 ++-
 arch/arm/boot/dts/axp81x.dtsi                                     |  12 ++++-
 arch/arm/boot/dts/sun8i-a83t-tbs-a711.dts                         |   4 ++-
 drivers/iio/adc/axp20x_adc.c                                      | 160 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
 drivers/mfd/axp20x.c                                              |  13 +++++-
 drivers/power/supply/axp20x_battery.c                             | 134 ++++++++++++++++++++++++++++++++++++++++++++++--------------
 include/linux/mfd/axp20x.h                                        |   2 +-
 10 files changed, 346 insertions(+), 45 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/iio/adc/axp20x_adc.txt

base-commit: b625c1ff82272e26c76570d3c7123419ec345b20
-- 
git-series 0.9.1

^ permalink raw reply	[flat|nested] 38+ messages in thread

* [PATCH v3 01/16] iio: adc: axp20x_adc: put ADC rate setting in a per-variant function
       [not found] ` <cover.2e5329bf5475a5160e613a4eb1e1377c662ce56e.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
@ 2018-01-15 10:33   ` Quentin Schulz
       [not found]     ` <9488159b43c4cc8418afa9d1562d972c4631cb02.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
  2018-01-15 10:33   ` [PATCH v3 02/16] dt-bindings: iio: adc: add binding for X-Powers AXP PMICs ADC Quentin Schulz
                     ` (14 subsequent siblings)
  15 siblings, 1 reply; 38+ messages in thread
From: Quentin Schulz @ 2018-01-15 10:33 UTC (permalink / raw)
  To: jic23-DgEjT+Ai2ygdnm+yROfE0A, knaack.h-Mmb7MZpHnFY,
	lars-Qo5EllUWu/uELgA04lAiVw, pmeerw-jW+XmwGofnusTnJN9+BGXg,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8,
	wens-jdAy2FN1RRM, sre-DgEjT+Ai2ygdnm+yROfE0A,
	linux-I+IVW8TIWO2tmTQ+vhA3Yw,
	maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	lee.jones-QSEj5FYQhm4dnm+yROfE0A
  Cc: linux-iio-u79uwXL29TY76Z2rM5mHXA,
	linux-pm-u79uwXL29TY76Z2rM5mHXA,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	thomas.petazzoni-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	linux-sunxi-/JYPxA39Uh5TLH3MbocFFw,
	julian.calaby-Re5JQEeQqe8AvxtiuMwx3w, Quentin Schulz

To prepare for a new comer that set a different register with different
values, move rate setting in a function that is specific to each AXP
variant.

Signed-off-by: Quentin Schulz <quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
---
 drivers/iio/adc/axp20x_adc.c | 18 +++++++++++-------
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/drivers/iio/adc/axp20x_adc.c b/drivers/iio/adc/axp20x_adc.c
index a30a972..3fc1b06 100644
--- a/drivers/iio/adc/axp20x_adc.c
+++ b/drivers/iio/adc/axp20x_adc.c
@@ -470,14 +470,18 @@ static const struct iio_info axp22x_adc_iio_info = {
 	.read_raw = axp22x_read_raw,
 };
 
-static int axp20x_adc_rate(int rate)
+static int axp20x_adc_rate(struct axp20x_adc_iio *info, int rate)
 {
-	return AXP20X_ADC_RATE_HZ(rate);
+	return regmap_update_bits(info->regmap, AXP20X_ADC_RATE,
+				  AXP20X_ADC_RATE_MASK,
+				  AXP20X_ADC_RATE_HZ(rate));
 }
 
-static int axp22x_adc_rate(int rate)
+static int axp22x_adc_rate(struct axp20x_adc_iio *info, int rate)
 {
-	return AXP22X_ADC_RATE_HZ(rate);
+	return regmap_update_bits(info->regmap, AXP20X_ADC_RATE,
+				  AXP20X_ADC_RATE_MASK,
+				  AXP22X_ADC_RATE_HZ(rate));
 }
 
 struct axp_data {
@@ -485,7 +489,8 @@ struct axp_data {
 	int				num_channels;
 	struct iio_chan_spec const	*channels;
 	unsigned long			adc_en1_mask;
-	int				(*adc_rate)(int rate);
+	int				(*adc_rate)(struct axp20x_adc_iio *info,
+						    int rate);
 	bool				adc_en2;
 	struct iio_map			*maps;
 };
@@ -554,8 +559,7 @@ static int axp20x_probe(struct platform_device *pdev)
 				   AXP20X_ADC_EN2_MASK, AXP20X_ADC_EN2_MASK);
 
 	/* Configure ADCs rate */
-	regmap_update_bits(info->regmap, AXP20X_ADC_RATE, AXP20X_ADC_RATE_MASK,
-			   info->data->adc_rate(100));
+	info->data->adc_rate(info, 100);
 
 	ret = iio_map_array_register(indio_dev, info->data->maps);
 	if (ret < 0) {
-- 
git-series 0.9.1
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 38+ messages in thread

* [PATCH v3 02/16] dt-bindings: iio: adc: add binding for X-Powers AXP PMICs ADC
       [not found] ` <cover.2e5329bf5475a5160e613a4eb1e1377c662ce56e.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
  2018-01-15 10:33   ` [PATCH v3 01/16] iio: adc: axp20x_adc: put ADC rate setting in a per-variant function Quentin Schulz
@ 2018-01-15 10:33   ` Quentin Schulz
  2018-01-21 12:18     ` Jonathan Cameron
  2018-01-15 10:33   ` [PATCH v3 03/16] iio: adc: axp20x_adc: make it possible to probe from DT Quentin Schulz
                     ` (13 subsequent siblings)
  15 siblings, 1 reply; 38+ messages in thread
From: Quentin Schulz @ 2018-01-15 10:33 UTC (permalink / raw)
  To: jic23-DgEjT+Ai2ygdnm+yROfE0A, knaack.h-Mmb7MZpHnFY,
	lars-Qo5EllUWu/uELgA04lAiVw, pmeerw-jW+XmwGofnusTnJN9+BGXg,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8,
	wens-jdAy2FN1RRM, sre-DgEjT+Ai2ygdnm+yROfE0A,
	linux-I+IVW8TIWO2tmTQ+vhA3Yw,
	maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	lee.jones-QSEj5FYQhm4dnm+yROfE0A
  Cc: linux-iio-u79uwXL29TY76Z2rM5mHXA,
	linux-pm-u79uwXL29TY76Z2rM5mHXA,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	thomas.petazzoni-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	linux-sunxi-/JYPxA39Uh5TLH3MbocFFw,
	julian.calaby-Re5JQEeQqe8AvxtiuMwx3w, Quentin Schulz

X-Powers PMICs have several ADC channels that can be used for different
purposes, e.g. PMIC internal temperature, battery voltage or AC current.

This is the documentation for AXP209, AXP221/223 and AXP813 ADC
bindings.

Signed-off-by: Quentin Schulz <quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
Reviewed-by: Rob Herring <robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
---
 Documentation/devicetree/bindings/iio/adc/axp20x_adc.txt | 48 +++++++++-
 1 file changed, 48 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/iio/adc/axp20x_adc.txt

diff --git a/Documentation/devicetree/bindings/iio/adc/axp20x_adc.txt b/Documentation/devicetree/bindings/iio/adc/axp20x_adc.txt
new file mode 100644
index 0000000..7a63139
--- /dev/null
+++ b/Documentation/devicetree/bindings/iio/adc/axp20x_adc.txt
@@ -0,0 +1,48 @@
+* X-Powers AXP ADC bindings
+
+Required properties:
+  - compatible: should be one of:
+    - "x-powers,axp209-adc",
+    - "x-powers,axp221-adc",
+    - "x-powers,axp813-adc",
+  - #io-channel-cells: should be 1,
+
+Example:
+
+&axp22x {
+	adc {
+		compatible = "x-powers,axp221-adc";
+		#io-channel-cells = <1>;
+	};
+};
+
+ADC channels and their indexes per variant:
+
+AXP209
+------
+ 0 | acin_v
+ 1 | acin_i
+ 2 | vbus_v
+ 3 | vbus_i
+ 4 | pmic_temp
+ 5 | gpio0_v
+ 6 | gpio1_v
+ 7 | ipsout_v
+ 8 | batt_v
+ 9 | batt_chrg_i
+10 | batt_dischrg_i
+
+AXP22x
+------
+ 0 | pmic_temp
+ 1 | batt_v
+ 2 | batt_chrg_i
+ 3 | batt_dischrg_i
+
+AXP813
+------
+ 0 | pmic_temp
+ 1 | gpio0_v
+ 2 | batt_v
+ 3 | batt_chrg_i
+ 4 | batt_dischrg_i
-- 
git-series 0.9.1

^ permalink raw reply	[flat|nested] 38+ messages in thread

* [PATCH v3 03/16] iio: adc: axp20x_adc: make it possible to probe from DT
       [not found] ` <cover.2e5329bf5475a5160e613a4eb1e1377c662ce56e.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
  2018-01-15 10:33   ` [PATCH v3 01/16] iio: adc: axp20x_adc: put ADC rate setting in a per-variant function Quentin Schulz
  2018-01-15 10:33   ` [PATCH v3 02/16] dt-bindings: iio: adc: add binding for X-Powers AXP PMICs ADC Quentin Schulz
@ 2018-01-15 10:33   ` Quentin Schulz
  2018-01-21 12:22     ` Jonathan Cameron
  2018-01-15 10:33   ` [PATCH v3 04/16] ARM: dtsi: axp209: add node for ADC Quentin Schulz
                     ` (12 subsequent siblings)
  15 siblings, 1 reply; 38+ messages in thread
From: Quentin Schulz @ 2018-01-15 10:33 UTC (permalink / raw)
  To: jic23-DgEjT+Ai2ygdnm+yROfE0A, knaack.h-Mmb7MZpHnFY,
	lars-Qo5EllUWu/uELgA04lAiVw, pmeerw-jW+XmwGofnusTnJN9+BGXg,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8,
	wens-jdAy2FN1RRM, sre-DgEjT+Ai2ygdnm+yROfE0A,
	linux-I+IVW8TIWO2tmTQ+vhA3Yw,
	maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	lee.jones-QSEj5FYQhm4dnm+yROfE0A
  Cc: linux-iio-u79uwXL29TY76Z2rM5mHXA,
	linux-pm-u79uwXL29TY76Z2rM5mHXA,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	thomas.petazzoni-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	linux-sunxi-/JYPxA39Uh5TLH3MbocFFw,
	julian.calaby-Re5JQEeQqe8AvxtiuMwx3w, Quentin Schulz

To prepare for a future patch that will add a DT node for the ADC, make
axp20x_adc able to probe from DT and get the per-variant data from
of_device_id.data since platform_device_id.driver_data won't be set when
probing by DT.

Leave the ability to probe via platform for driver compatibility with
old DTs.

Signed-off-by: Quentin Schulz <quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
---
 drivers/iio/adc/axp20x_adc.c | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/drivers/iio/adc/axp20x_adc.c b/drivers/iio/adc/axp20x_adc.c
index 3fc1b06..3968053 100644
--- a/drivers/iio/adc/axp20x_adc.c
+++ b/drivers/iio/adc/axp20x_adc.c
@@ -515,6 +515,13 @@ static const struct axp_data axp22x_data = {
 	.maps = axp22x_maps,
 };
 
+static const struct of_device_id axp20x_adc_of_match[] = {
+	{ .compatible = "x-powers,axp209-adc", .data = (void *)&axp20x_data, },
+	{ .compatible = "x-powers,axp221-adc", .data = (void *)&axp22x_data, },
+	{ /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, axp20x_adc_of_match);
+
 static const struct platform_device_id axp20x_adc_id_match[] = {
 	{ .name = "axp20x-adc", .driver_data = (kernel_ulong_t)&axp20x_data, },
 	{ .name = "axp22x-adc", .driver_data = (kernel_ulong_t)&axp22x_data, },
@@ -543,7 +550,16 @@ static int axp20x_probe(struct platform_device *pdev)
 	indio_dev->dev.of_node = pdev->dev.of_node;
 	indio_dev->modes = INDIO_DIRECT_MODE;
 
-	info->data = (struct axp_data *)platform_get_device_id(pdev)->driver_data;
+	if (!pdev->dev.of_node) {
+		const struct platform_device_id *id;
+
+		id = platform_get_device_id(pdev);
+		info->data = (struct axp_data *)id->driver_data;
+	} else {
+		struct device *dev = &pdev->dev;
+
+		info->data = (struct axp_data *)of_device_get_match_data(dev);
+	}
 
 	indio_dev->name = platform_get_device_id(pdev)->name;
 	indio_dev->info = info->data->iio_info;
@@ -606,6 +622,7 @@ static int axp20x_remove(struct platform_device *pdev)
 static struct platform_driver axp20x_adc_driver = {
 	.driver = {
 		.name = "axp20x-adc",
+		.of_match_table = of_match_ptr(axp20x_adc_of_match),
 	},
 	.id_table = axp20x_adc_id_match,
 	.probe = axp20x_probe,
-- 
git-series 0.9.1

^ permalink raw reply	[flat|nested] 38+ messages in thread

* [PATCH v3 04/16] ARM: dtsi: axp209: add node for ADC
       [not found] ` <cover.2e5329bf5475a5160e613a4eb1e1377c662ce56e.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
                     ` (2 preceding siblings ...)
  2018-01-15 10:33   ` [PATCH v3 03/16] iio: adc: axp20x_adc: make it possible to probe from DT Quentin Schulz
@ 2018-01-15 10:33   ` Quentin Schulz
       [not found]     ` <ea299dca30bb3d0413d35717522643b5a00e731c.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
  2018-01-15 10:33   ` [PATCH v3 05/16] ARM: dtsi: axp22x: " Quentin Schulz
                     ` (11 subsequent siblings)
  15 siblings, 1 reply; 38+ messages in thread
From: Quentin Schulz @ 2018-01-15 10:33 UTC (permalink / raw)
  To: jic23-DgEjT+Ai2ygdnm+yROfE0A, knaack.h-Mmb7MZpHnFY,
	lars-Qo5EllUWu/uELgA04lAiVw, pmeerw-jW+XmwGofnusTnJN9+BGXg,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8,
	wens-jdAy2FN1RRM, sre-DgEjT+Ai2ygdnm+yROfE0A,
	linux-I+IVW8TIWO2tmTQ+vhA3Yw,
	maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	lee.jones-QSEj5FYQhm4dnm+yROfE0A
  Cc: linux-iio-u79uwXL29TY76Z2rM5mHXA,
	linux-pm-u79uwXL29TY76Z2rM5mHXA,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	thomas.petazzoni-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	linux-sunxi-/JYPxA39Uh5TLH3MbocFFw,
	julian.calaby-Re5JQEeQqe8AvxtiuMwx3w, Quentin Schulz

This adds a DT node for the ADC of the PMIC so that there can be
consumers of its IIO channels declaring their consumptions via DT.

Signed-off-by: Quentin Schulz <quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
---
 arch/arm/boot/dts/axp209.dtsi | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/arch/arm/boot/dts/axp209.dtsi b/arch/arm/boot/dts/axp209.dtsi
index 897103e..0d9ff12 100644
--- a/arch/arm/boot/dts/axp209.dtsi
+++ b/arch/arm/boot/dts/axp209.dtsi
@@ -58,6 +58,11 @@
 		status = "disabled";
 	};
 
+	axp_adc: adc {
+		compatible = "x-powers,axp209-adc";
+		#io-channel-cells = <1>;
+	};
+
 	axp_gpio: gpio {
 		compatible = "x-powers,axp209-gpio";
 		gpio-controller;
-- 
git-series 0.9.1

^ permalink raw reply	[flat|nested] 38+ messages in thread

* [PATCH v3 05/16] ARM: dtsi: axp22x: add node for ADC
       [not found] ` <cover.2e5329bf5475a5160e613a4eb1e1377c662ce56e.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
                     ` (3 preceding siblings ...)
  2018-01-15 10:33   ` [PATCH v3 04/16] ARM: dtsi: axp209: add node for ADC Quentin Schulz
@ 2018-01-15 10:33   ` Quentin Schulz
       [not found]     ` <c73ef705e9feacde577de66355a2033b419ca004.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
  2018-01-15 10:33   ` [PATCH v3 06/16] mfd: axp20x: make AXP209/22x cells probe their ADC via DT Quentin Schulz
                     ` (10 subsequent siblings)
  15 siblings, 1 reply; 38+ messages in thread
From: Quentin Schulz @ 2018-01-15 10:33 UTC (permalink / raw)
  To: jic23-DgEjT+Ai2ygdnm+yROfE0A, knaack.h-Mmb7MZpHnFY,
	lars-Qo5EllUWu/uELgA04lAiVw, pmeerw-jW+XmwGofnusTnJN9+BGXg,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8,
	wens-jdAy2FN1RRM, sre-DgEjT+Ai2ygdnm+yROfE0A,
	linux-I+IVW8TIWO2tmTQ+vhA3Yw,
	maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	lee.jones-QSEj5FYQhm4dnm+yROfE0A
  Cc: linux-iio-u79uwXL29TY76Z2rM5mHXA,
	linux-pm-u79uwXL29TY76Z2rM5mHXA,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	thomas.petazzoni-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	linux-sunxi-/JYPxA39Uh5TLH3MbocFFw,
	julian.calaby-Re5JQEeQqe8AvxtiuMwx3w, Quentin Schulz

This adds a DT node for the ADC of the PMIC so that there can be
consumers of its IIO channels declaring their consumptions via DT.

Signed-off-by: Quentin Schulz <quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
---
 arch/arm/boot/dts/axp22x.dtsi | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/arch/arm/boot/dts/axp22x.dtsi b/arch/arm/boot/dts/axp22x.dtsi
index 87fb08e..65a07a6 100644
--- a/arch/arm/boot/dts/axp22x.dtsi
+++ b/arch/arm/boot/dts/axp22x.dtsi
@@ -57,6 +57,11 @@
 		status = "disabled";
 	};
 
+	axp_adc: adc {
+		compatible = "x-powers,axp221-adc";
+		#io-channel-cells = <1>;
+	};
+
 	battery_power_supply: battery-power-supply {
 		compatible = "x-powers,axp221-battery-power-supply";
 		status = "disabled";
-- 
git-series 0.9.1

^ permalink raw reply	[flat|nested] 38+ messages in thread

* [PATCH v3 06/16] mfd: axp20x: make AXP209/22x cells probe their ADC via DT
       [not found] ` <cover.2e5329bf5475a5160e613a4eb1e1377c662ce56e.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
                     ` (4 preceding siblings ...)
  2018-01-15 10:33   ` [PATCH v3 05/16] ARM: dtsi: axp22x: " Quentin Schulz
@ 2018-01-15 10:33   ` Quentin Schulz
       [not found]     ` <8901f920fb8d84f8bf0cb2832f560c78bffc0392.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
  2018-01-15 10:33   ` [PATCH v3 07/16] iio: adc: axp20x_adc: add support for AXP813 ADC Quentin Schulz
                     ` (9 subsequent siblings)
  15 siblings, 1 reply; 38+ messages in thread
From: Quentin Schulz @ 2018-01-15 10:33 UTC (permalink / raw)
  To: jic23-DgEjT+Ai2ygdnm+yROfE0A, knaack.h-Mmb7MZpHnFY,
	lars-Qo5EllUWu/uELgA04lAiVw, pmeerw-jW+XmwGofnusTnJN9+BGXg,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8,
	wens-jdAy2FN1RRM, sre-DgEjT+Ai2ygdnm+yROfE0A,
	linux-I+IVW8TIWO2tmTQ+vhA3Yw,
	maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	lee.jones-QSEj5FYQhm4dnm+yROfE0A
  Cc: linux-iio-u79uwXL29TY76Z2rM5mHXA,
	linux-pm-u79uwXL29TY76Z2rM5mHXA,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	thomas.petazzoni-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	linux-sunxi-/JYPxA39Uh5TLH3MbocFFw,
	julian.calaby-Re5JQEeQqe8AvxtiuMwx3w, Quentin Schulz

This makes AXP209 and AXP22x ADCs probe first via DT and then by
fallback via platform.

Signed-off-by: Quentin Schulz <quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
---
 drivers/mfd/axp20x.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
index e94c72c..1977a03 100644
--- a/drivers/mfd/axp20x.c
+++ b/drivers/mfd/axp20x.c
@@ -660,6 +660,7 @@ static struct mfd_cell axp20x_cells[] = {
 		.name		= "axp20x-regulator",
 	}, {
 		.name		= "axp20x-adc",
+		.of_compatible	= "x-powers,axp209-adc",
 	}, {
 		.name		= "axp20x-battery-power-supply",
 		.of_compatible	= "x-powers,axp209-battery-power-supply",
@@ -684,7 +685,8 @@ static struct mfd_cell axp221_cells[] = {
 	}, {
 		.name		= "axp20x-regulator",
 	}, {
-		.name		= "axp22x-adc"
+		.name		= "axp22x-adc",
+		.of_compatible	= "x-powers,axp221-adc",
 	}, {
 		.name		= "axp20x-ac-power-supply",
 		.of_compatible	= "x-powers,axp221-ac-power-supply",
@@ -708,6 +710,7 @@ static struct mfd_cell axp223_cells[] = {
 		.resources		= axp22x_pek_resources,
 	}, {
 		.name		= "axp22x-adc",
+		.of_compatible	= "x-powers,axp221-adc",
 	}, {
 		.name		= "axp20x-battery-power-supply",
 		.of_compatible	= "x-powers,axp221-battery-power-supply",
-- 
git-series 0.9.1

^ permalink raw reply	[flat|nested] 38+ messages in thread

* [PATCH v3 07/16] iio: adc: axp20x_adc: add support for AXP813 ADC
       [not found] ` <cover.2e5329bf5475a5160e613a4eb1e1377c662ce56e.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
                     ` (5 preceding siblings ...)
  2018-01-15 10:33   ` [PATCH v3 06/16] mfd: axp20x: make AXP209/22x cells probe their ADC via DT Quentin Schulz
@ 2018-01-15 10:33   ` Quentin Schulz
  2018-01-21 12:26     ` Jonathan Cameron
  2018-01-15 10:33   ` [PATCH v3 08/16] ARM: dtsi: axp81x: add node for ADC Quentin Schulz
                     ` (8 subsequent siblings)
  15 siblings, 1 reply; 38+ messages in thread
From: Quentin Schulz @ 2018-01-15 10:33 UTC (permalink / raw)
  To: jic23-DgEjT+Ai2ygdnm+yROfE0A, knaack.h-Mmb7MZpHnFY,
	lars-Qo5EllUWu/uELgA04lAiVw, pmeerw-jW+XmwGofnusTnJN9+BGXg,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8,
	wens-jdAy2FN1RRM, sre-DgEjT+Ai2ygdnm+yROfE0A,
	linux-I+IVW8TIWO2tmTQ+vhA3Yw,
	maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	lee.jones-QSEj5FYQhm4dnm+yROfE0A
  Cc: linux-iio-u79uwXL29TY76Z2rM5mHXA,
	linux-pm-u79uwXL29TY76Z2rM5mHXA,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	thomas.petazzoni-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	linux-sunxi-/JYPxA39Uh5TLH3MbocFFw,
	julian.calaby-Re5JQEeQqe8AvxtiuMwx3w, Quentin Schulz

The X-Powers AXP813 PMIC is really close to what is already done for
AXP20X/AXP22X.

There are two pairs of bits to set the rate (one for Voltage and Current
measurements and one for TS/GPIO0 voltage measurements) instead of one.

The register to set the ADC rates is different from the one for
AXP20X/AXP22X.

GPIO0 can be used as an ADC (measuring Volts) unlike for AXP22X.

The scales to apply to the different inputs are unlike the ones from
AXP20X and AXP22X.

Signed-off-by: Quentin Schulz <quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
Acked-by: Jonathan Cameron <Jonathan.Cameron-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
---
 drivers/iio/adc/axp20x_adc.c | 123 ++++++++++++++++++++++++++++++++++++-
 include/linux/mfd/axp20x.h   |   2 +-
 2 files changed, 125 insertions(+)

diff --git a/drivers/iio/adc/axp20x_adc.c b/drivers/iio/adc/axp20x_adc.c
index 3968053..7cdb8bc 100644
--- a/drivers/iio/adc/axp20x_adc.c
+++ b/drivers/iio/adc/axp20x_adc.c
@@ -35,8 +35,13 @@
 #define AXP20X_GPIO10_IN_RANGE_GPIO1_VAL(x)	(((x) & BIT(0)) << 1)
 
 #define AXP20X_ADC_RATE_MASK			GENMASK(7, 6)
+#define AXP813_V_I_ADC_RATE_MASK		GENMASK(5, 4)
+#define AXP813_ADC_RATE_MASK			(AXP20X_ADC_RATE_MASK | AXP813_V_I_ADC_RATE_MASK)
 #define AXP20X_ADC_RATE_HZ(x)			((ilog2((x) / 25) << 6) & AXP20X_ADC_RATE_MASK)
 #define AXP22X_ADC_RATE_HZ(x)			((ilog2((x) / 100) << 6) & AXP20X_ADC_RATE_MASK)
+#define AXP813_TS_GPIO0_ADC_RATE_HZ(x)		AXP20X_ADC_RATE_HZ(x)
+#define AXP813_V_I_ADC_RATE_HZ(x)		((ilog2((x) / 100) << 4) & AXP813_V_I_ADC_RATE_MASK)
+#define AXP813_ADC_RATE_HZ(x)			(AXP20X_ADC_RATE_HZ(x) | AXP813_V_I_ADC_RATE_HZ(x))
 
 #define AXP20X_ADC_CHANNEL(_channel, _name, _type, _reg)	\
 	{							\
@@ -95,6 +100,12 @@ enum axp22x_adc_channel_i {
 	AXP22X_BATT_DISCHRG_I,
 };
 
+enum axp813_adc_channel_v {
+	AXP813_TS_IN = 0,
+	AXP813_GPIO0_V,
+	AXP813_BATT_V,
+};
+
 static struct iio_map axp20x_maps[] = {
 	{
 		.consumer_dev_name = "axp20x-usb-power-supply",
@@ -197,6 +208,25 @@ static const struct iio_chan_spec axp22x_adc_channels[] = {
 			   AXP20X_BATT_DISCHRG_I_H),
 };
 
+static const struct iio_chan_spec axp813_adc_channels[] = {
+	{
+		.type = IIO_TEMP,
+		.address = AXP22X_PMIC_TEMP_H,
+		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
+				      BIT(IIO_CHAN_INFO_SCALE) |
+				      BIT(IIO_CHAN_INFO_OFFSET),
+		.datasheet_name = "pmic_temp",
+	},
+	AXP20X_ADC_CHANNEL(AXP813_GPIO0_V, "gpio0_v", IIO_VOLTAGE,
+			   AXP288_GP_ADC_H),
+	AXP20X_ADC_CHANNEL(AXP813_BATT_V, "batt_v", IIO_VOLTAGE,
+			   AXP20X_BATT_V_H),
+	AXP20X_ADC_CHANNEL(AXP22X_BATT_CHRG_I, "batt_chrg_i", IIO_CURRENT,
+			   AXP20X_BATT_CHRG_I_H),
+	AXP20X_ADC_CHANNEL(AXP22X_BATT_DISCHRG_I, "batt_dischrg_i", IIO_CURRENT,
+			   AXP20X_BATT_DISCHRG_I_H),
+};
+
 static int axp20x_adc_raw(struct iio_dev *indio_dev,
 			  struct iio_chan_spec const *chan, int *val)
 {
@@ -243,6 +273,18 @@ static int axp22x_adc_raw(struct iio_dev *indio_dev,
 	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);
+
+	*val = axp20x_read_variable_width(info->regmap, chan->address, 12);
+	if (*val < 0)
+		return *val;
+
+	return IIO_VAL_INT;
+}
+
 static int axp20x_adc_scale_voltage(int channel, int *val, int *val2)
 {
 	switch (channel) {
@@ -273,6 +315,24 @@ static int axp20x_adc_scale_voltage(int channel, int *val, int *val2)
 	}
 }
 
+static int axp813_adc_scale_voltage(int channel, int *val, int *val2)
+{
+	switch (channel) {
+	case AXP813_GPIO0_V:
+		*val = 0;
+		*val2 = 800000;
+		return IIO_VAL_INT_PLUS_MICRO;
+
+	case AXP813_BATT_V:
+		*val = 1;
+		*val2 = 100000;
+		return IIO_VAL_INT_PLUS_MICRO;
+
+	default:
+		return -EINVAL;
+	}
+}
+
 static int axp20x_adc_scale_current(int channel, int *val, int *val2)
 {
 	switch (channel) {
@@ -342,6 +402,26 @@ static int axp22x_adc_scale(struct iio_chan_spec const *chan, int *val,
 	}
 }
 
+static int axp813_adc_scale(struct iio_chan_spec const *chan, int *val,
+			    int *val2)
+{
+	switch (chan->type) {
+	case IIO_VOLTAGE:
+		return axp813_adc_scale_voltage(chan->channel, val, val2);
+
+	case IIO_CURRENT:
+		*val = 1;
+		return IIO_VAL_INT;
+
+	case IIO_TEMP:
+		*val = 100;
+		return IIO_VAL_INT;
+
+	default:
+		return -EINVAL;
+	}
+}
+
 static int axp20x_adc_offset_voltage(struct iio_dev *indio_dev, int channel,
 				     int *val)
 {
@@ -425,6 +505,26 @@ static int axp22x_read_raw(struct iio_dev *indio_dev,
 	}
 }
 
+static int axp813_read_raw(struct iio_dev *indio_dev,
+			   struct iio_chan_spec const *chan, int *val,
+			   int *val2, long mask)
+{
+	switch (mask) {
+	case IIO_CHAN_INFO_OFFSET:
+		*val = -2667;
+		return IIO_VAL_INT;
+
+	case IIO_CHAN_INFO_SCALE:
+		return axp813_adc_scale(chan, val, val2);
+
+	case IIO_CHAN_INFO_RAW:
+		return axp813_adc_raw(indio_dev, chan, val);
+
+	default:
+		return -EINVAL;
+	}
+}
+
 static int axp20x_write_raw(struct iio_dev *indio_dev,
 			    struct iio_chan_spec const *chan, int val, int val2,
 			    long mask)
@@ -470,6 +570,10 @@ static const struct iio_info axp22x_adc_iio_info = {
 	.read_raw = axp22x_read_raw,
 };
 
+static const struct iio_info axp813_adc_iio_info = {
+	.read_raw = axp813_read_raw,
+};
+
 static int axp20x_adc_rate(struct axp20x_adc_iio *info, int rate)
 {
 	return regmap_update_bits(info->regmap, AXP20X_ADC_RATE,
@@ -484,6 +588,13 @@ static int axp22x_adc_rate(struct axp20x_adc_iio *info, int rate)
 				  AXP22X_ADC_RATE_HZ(rate));
 }
 
+static int axp813_adc_rate(struct axp20x_adc_iio *info, int rate)
+{
+	return regmap_update_bits(info->regmap, AXP813_ADC_RATE,
+				 AXP813_ADC_RATE_MASK,
+				 AXP813_ADC_RATE_HZ(rate));
+}
+
 struct axp_data {
 	const struct iio_info		*iio_info;
 	int				num_channels;
@@ -515,9 +626,20 @@ static const struct axp_data axp22x_data = {
 	.maps = axp22x_maps,
 };
 
+static const struct axp_data axp813_data = {
+	.iio_info = &axp813_adc_iio_info,
+	.num_channels = ARRAY_SIZE(axp813_adc_channels),
+	.channels = axp813_adc_channels,
+	.adc_en1_mask = AXP22X_ADC_EN1_MASK,
+	.adc_rate = axp813_adc_rate,
+	.adc_en2 = false,
+	.maps = axp22x_maps,
+};
+
 static const struct of_device_id axp20x_adc_of_match[] = {
 	{ .compatible = "x-powers,axp209-adc", .data = (void *)&axp20x_data, },
 	{ .compatible = "x-powers,axp221-adc", .data = (void *)&axp22x_data, },
+	{ .compatible = "x-powers,axp813-adc", .data = (void *)&axp813_data, },
 	{ /* sentinel */ }
 };
 MODULE_DEVICE_TABLE(of, axp20x_adc_of_match);
@@ -525,6 +647,7 @@ MODULE_DEVICE_TABLE(of, axp20x_adc_of_match);
 static const struct platform_device_id axp20x_adc_id_match[] = {
 	{ .name = "axp20x-adc", .driver_data = (kernel_ulong_t)&axp20x_data, },
 	{ .name = "axp22x-adc", .driver_data = (kernel_ulong_t)&axp22x_data, },
+	{ .name = "axp813-adc", .driver_data = (kernel_ulong_t)&axp813_data, },
 	{ /* sentinel */ },
 };
 MODULE_DEVICE_TABLE(platform, axp20x_adc_id_match);
diff --git a/include/linux/mfd/axp20x.h b/include/linux/mfd/axp20x.h
index 080798f..82bf774 100644
--- a/include/linux/mfd/axp20x.h
+++ b/include/linux/mfd/axp20x.h
@@ -266,6 +266,8 @@ enum axp20x_variants {
 #define AXP288_RT_BATT_V_H		0xa0
 #define AXP288_RT_BATT_V_L		0xa1
 
+#define AXP813_ADC_RATE			0x85
+
 /* Fuel Gauge */
 #define AXP288_FG_RDC1_REG          0xba
 #define AXP288_FG_RDC0_REG          0xbb
-- 
git-series 0.9.1

^ permalink raw reply	[flat|nested] 38+ messages in thread

* [PATCH v3 08/16] ARM: dtsi: axp81x: add node for ADC
       [not found] ` <cover.2e5329bf5475a5160e613a4eb1e1377c662ce56e.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
                     ` (6 preceding siblings ...)
  2018-01-15 10:33   ` [PATCH v3 07/16] iio: adc: axp20x_adc: add support for AXP813 ADC Quentin Schulz
@ 2018-01-15 10:33   ` Quentin Schulz
       [not found]     ` <eb8f23f57dc9d7d7c87c5eea2f85e90470e27c83.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
  2018-01-15 10:33   ` [PATCH v3 09/16] mfd: axp20x: probe axp20x_adc driver for AXP813 Quentin Schulz
                     ` (7 subsequent siblings)
  15 siblings, 1 reply; 38+ messages in thread
From: Quentin Schulz @ 2018-01-15 10:33 UTC (permalink / raw)
  To: jic23-DgEjT+Ai2ygdnm+yROfE0A, knaack.h-Mmb7MZpHnFY,
	lars-Qo5EllUWu/uELgA04lAiVw, pmeerw-jW+XmwGofnusTnJN9+BGXg,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8,
	wens-jdAy2FN1RRM, sre-DgEjT+Ai2ygdnm+yROfE0A,
	linux-I+IVW8TIWO2tmTQ+vhA3Yw,
	maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	lee.jones-QSEj5FYQhm4dnm+yROfE0A
  Cc: linux-iio-u79uwXL29TY76Z2rM5mHXA,
	linux-pm-u79uwXL29TY76Z2rM5mHXA,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	thomas.petazzoni-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	linux-sunxi-/JYPxA39Uh5TLH3MbocFFw,
	julian.calaby-Re5JQEeQqe8AvxtiuMwx3w, Quentin Schulz

This adds a DT node for the ADC of the PMIC so that there can be
consumers of its IIO channels declaring their consumptions via DT.

Signed-off-by: Quentin Schulz <quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
---
 arch/arm/boot/dts/axp81x.dtsi | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/arch/arm/boot/dts/axp81x.dtsi b/arch/arm/boot/dts/axp81x.dtsi
index fd55b89..6b5e7bc 100644
--- a/arch/arm/boot/dts/axp81x.dtsi
+++ b/arch/arm/boot/dts/axp81x.dtsi
@@ -48,6 +48,11 @@
 	interrupt-controller;
 	#interrupt-cells = <1>;
 
+	axp_adc: adc {
+		compatible = "x-powers,axp813-adc";
+		#io-channel-cells = <1>;
+	};
+
 	axp_gpio: axp-gpio {
 		compatible = "x-powers,axp813-gpio";
 		gpio-controller;
-- 
git-series 0.9.1
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 38+ messages in thread

* [PATCH v3 09/16] mfd: axp20x: probe axp20x_adc driver for AXP813
       [not found] ` <cover.2e5329bf5475a5160e613a4eb1e1377c662ce56e.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
                     ` (7 preceding siblings ...)
  2018-01-15 10:33   ` [PATCH v3 08/16] ARM: dtsi: axp81x: add node for ADC Quentin Schulz
@ 2018-01-15 10:33   ` Quentin Schulz
       [not found]     ` <d5792ed6e1e989dde3c9ecdd018286109dfc101d.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
  2018-01-15 10:33   ` [PATCH v3 10/16] power: supply: axp20x_battery: use data structure instead of ID for Quentin Schulz
                     ` (6 subsequent siblings)
  15 siblings, 1 reply; 38+ messages in thread
From: Quentin Schulz @ 2018-01-15 10:33 UTC (permalink / raw)
  To: jic23-DgEjT+Ai2ygdnm+yROfE0A, knaack.h-Mmb7MZpHnFY,
	lars-Qo5EllUWu/uELgA04lAiVw, pmeerw-jW+XmwGofnusTnJN9+BGXg,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8,
	wens-jdAy2FN1RRM, sre-DgEjT+Ai2ygdnm+yROfE0A,
	linux-I+IVW8TIWO2tmTQ+vhA3Yw,
	maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	lee.jones-QSEj5FYQhm4dnm+yROfE0A
  Cc: linux-iio-u79uwXL29TY76Z2rM5mHXA,
	linux-pm-u79uwXL29TY76Z2rM5mHXA,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	thomas.petazzoni-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	linux-sunxi-/JYPxA39Uh5TLH3MbocFFw,
	julian.calaby-Re5JQEeQqe8AvxtiuMwx3w, Quentin Schulz

This makes the axp20x_adc driver probe with platform device id
"axp813-adc".

Signed-off-by: Quentin Schulz <quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
---
 drivers/mfd/axp20x.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
index 1977a03..e5516aa 100644
--- a/drivers/mfd/axp20x.c
+++ b/drivers/mfd/axp20x.c
@@ -885,7 +885,10 @@ static struct mfd_cell axp813_cells[] = {
 	}, {
 		.name			= "axp20x-gpio",
 		.of_compatible		= "x-powers,axp813-gpio",
-	}
+	}, {
+		.name			= "axp813-adc",
+		.of_compatible		= "x-powers,axp813-adc",
+	},
 };
 
 static struct axp20x_dev *axp20x_pm_power_off;
-- 
git-series 0.9.1

^ permalink raw reply	[flat|nested] 38+ messages in thread

* [PATCH v3 10/16] power: supply: axp20x_battery: use data structure instead of ID for
       [not found] ` <cover.2e5329bf5475a5160e613a4eb1e1377c662ce56e.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
                     ` (8 preceding siblings ...)
  2018-01-15 10:33   ` [PATCH v3 09/16] mfd: axp20x: probe axp20x_adc driver for AXP813 Quentin Schulz
@ 2018-01-15 10:33   ` Quentin Schulz
       [not found]     ` <c4129842e1254289ebb3ad1755879a3722bac1cf.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
  2018-01-15 10:33   ` [PATCH v3 11/16] dt-bindings: power: supply: axp20x: add AXP813 battery DT binding Quentin Schulz
                     ` (5 subsequent siblings)
  15 siblings, 1 reply; 38+ messages in thread
From: Quentin Schulz @ 2018-01-15 10:33 UTC (permalink / raw)
  To: jic23-DgEjT+Ai2ygdnm+yROfE0A, knaack.h-Mmb7MZpHnFY,
	lars-Qo5EllUWu/uELgA04lAiVw, pmeerw-jW+XmwGofnusTnJN9+BGXg,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8,
	wens-jdAy2FN1RRM, sre-DgEjT+Ai2ygdnm+yROfE0A,
	linux-I+IVW8TIWO2tmTQ+vhA3Yw,
	maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	lee.jones-QSEj5FYQhm4dnm+yROfE0A
  Cc: linux-iio-u79uwXL29TY76Z2rM5mHXA,
	linux-pm-u79uwXL29TY76Z2rM5mHXA,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	thomas.petazzoni-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	linux-sunxi-/JYPxA39Uh5TLH3MbocFFw,
	julian.calaby-Re5JQEeQqe8AvxtiuMwx3w, Quentin Schulz

variant specific code

We used to use IDs to select a function or a feature depending on the
variant. It's easier to maintain the code by adding data structure
storing the few differences between variants so that we don't add a pile
of if conditions.

Let's use this data structure and update the code to use it.

Signed-off-by: Quentin Schulz <quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
---
 drivers/power/supply/axp20x_battery.c | 100 +++++++++++++++++----------
 1 file changed, 66 insertions(+), 34 deletions(-)

diff --git a/drivers/power/supply/axp20x_battery.c b/drivers/power/supply/axp20x_battery.c
index 7494f0f..d73c78f 100644
--- a/drivers/power/supply/axp20x_battery.c
+++ b/drivers/power/supply/axp20x_battery.c
@@ -53,6 +53,16 @@
 
 #define AXP20X_V_OFF_MASK		GENMASK(2, 0)
 
+struct axp20x_batt_ps;
+
+struct axp_data {
+	int	ccc_scale;
+	int	ccc_offset;
+	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);
+};
+
 struct axp20x_batt_ps {
 	struct regmap *regmap;
 	struct power_supply *batt;
@@ -62,7 +72,7 @@ struct axp20x_batt_ps {
 	struct iio_channel *batt_v;
 	/* Maximum constant charge current */
 	unsigned int max_ccc;
-	u8 axp_id;
+	struct axp_data	*data;
 };
 
 static int axp20x_battery_get_max_voltage(struct axp20x_batt_ps *axp20x_batt,
@@ -123,22 +133,6 @@ static int axp22x_battery_get_max_voltage(struct axp20x_batt_ps *axp20x_batt,
 	return 0;
 }
 
-static void raw_to_constant_charge_current(struct axp20x_batt_ps *axp, int *val)
-{
-	if (axp->axp_id == AXP209_ID)
-		*val = *val * 100000 + 300000;
-	else
-		*val = *val * 150000 + 300000;
-}
-
-static void constant_charge_current_to_raw(struct axp20x_batt_ps *axp, int *val)
-{
-	if (axp->axp_id == AXP209_ID)
-		*val = (*val - 300000) / 100000;
-	else
-		*val = (*val - 300000) / 150000;
-}
-
 static int axp20x_get_constant_charge_current(struct axp20x_batt_ps *axp,
 					      int *val)
 {
@@ -150,7 +144,7 @@ static int axp20x_get_constant_charge_current(struct axp20x_batt_ps *axp,
 
 	*val &= AXP20X_CHRG_CTRL1_TGT_CURR;
 
-	raw_to_constant_charge_current(axp, val);
+	*val = *val * axp->data->ccc_scale + axp->data->ccc_offset;
 
 	return 0;
 }
@@ -269,8 +263,7 @@ static int axp20x_battery_get_prop(struct power_supply *psy,
 		if (ret)
 			return ret;
 
-		if (axp20x_batt->axp_id == AXP221_ID &&
-		    !(reg & AXP22X_FG_VALID))
+		if (axp20x_batt->data->has_fg_valid && !(reg & AXP22X_FG_VALID))
 			return -EINVAL;
 
 		/*
@@ -281,11 +274,8 @@ static int axp20x_battery_get_prop(struct power_supply *psy,
 		break;
 
 	case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
-		if (axp20x_batt->axp_id == AXP209_ID)
-			return axp20x_battery_get_max_voltage(axp20x_batt,
-							      &val->intval);
-		return axp22x_battery_get_max_voltage(axp20x_batt,
-						      &val->intval);
+		return axp20x_batt->data->get_max_voltage(axp20x_batt,
+							  &val->intval);
 
 	case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
 		ret = regmap_read(axp20x_batt->regmap, AXP20X_V_OFF, &reg);
@@ -312,6 +302,32 @@ static int axp20x_battery_get_prop(struct power_supply *psy,
 	return 0;
 }
 
+static int axp22x_battery_set_max_voltage(struct axp20x_batt_ps *axp20x_batt,
+					  int val)
+{
+	switch (val) {
+	case 4100000:
+		val = AXP20X_CHRG_CTRL1_TGT_4_1V;
+		break;
+
+	case 4200000:
+		val = AXP20X_CHRG_CTRL1_TGT_4_2V;
+		break;
+
+	default:
+		/*
+		 * AXP20x max voltage can be set to 4.36V and AXP22X max voltage
+		 * can be set to 4.22V and 4.24V, but these voltages are too
+		 * high for Lithium based batteries (AXP PMICs are supposed to
+		 * be used with these kinds of battery).
+		 */
+		return -EINVAL;
+	}
+
+	return regmap_update_bits(axp20x_batt->regmap, AXP20X_CHRG_CTRL1,
+				  AXP20X_CHRG_CTRL1_TGT_VOLT, val);
+}
+
 static int axp20x_battery_set_max_voltage(struct axp20x_batt_ps *axp20x_batt,
 					  int val)
 {
@@ -321,9 +337,6 @@ static int axp20x_battery_set_max_voltage(struct axp20x_batt_ps *axp20x_batt,
 		break;
 
 	case 4150000:
-		if (axp20x_batt->axp_id == AXP221_ID)
-			return -EINVAL;
-
 		val = AXP20X_CHRG_CTRL1_TGT_4_15V;
 		break;
 
@@ -351,7 +364,8 @@ static int axp20x_set_constant_charge_current(struct axp20x_batt_ps *axp_batt,
 	if (charge_current > axp_batt->max_ccc)
 		return -EINVAL;
 
-	constant_charge_current_to_raw(axp_batt, &charge_current);
+	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)
 		return -EINVAL;
@@ -365,12 +379,14 @@ static int axp20x_set_max_constant_charge_current(struct axp20x_batt_ps *axp,
 {
 	bool lower_max = false;
 
-	constant_charge_current_to_raw(axp, &charge_current);
+	charge_current = (charge_current - axp->data->ccc_offset) /
+		axp->data->ccc_scale;
 
 	if (charge_current > AXP20X_CHRG_CTRL1_TGT_CURR || charge_current < 0)
 		return -EINVAL;
 
-	raw_to_constant_charge_current(axp, &charge_current);
+	charge_current = charge_current * axp->data->ccc_scale +
+		axp->data->ccc_offset;
 
 	if (charge_current > axp->max_ccc)
 		dev_warn(axp->dev,
@@ -460,13 +476,28 @@ static const struct power_supply_desc axp20x_batt_ps_desc = {
 	.set_property = axp20x_battery_set_prop,
 };
 
+struct axp_data axp209_data = {
+	.ccc_scale = 100000,
+	.ccc_offset = 300000,
+	.get_max_voltage = axp20x_battery_get_max_voltage,
+	.set_max_voltage = axp20x_battery_set_max_voltage,
+};
+
+struct axp_data axp221_data = {
+	.ccc_scale = 150000,
+	.ccc_offset = 300000,
+	.has_fg_valid = true,
+	.get_max_voltage = axp22x_battery_get_max_voltage,
+	.set_max_voltage = axp22x_battery_set_max_voltage,
+};
+
 static const struct of_device_id axp20x_battery_ps_id[] = {
 	{
 		.compatible = "x-powers,axp209-battery-power-supply",
-		.data = (void *)AXP209_ID,
+		.data = (void *)&axp209_data,
 	}, {
 		.compatible = "x-powers,axp221-battery-power-supply",
-		.data = (void *)AXP221_ID,
+		.data = (void *)&axp221_data,
 	}, { /* sentinel */ },
 };
 MODULE_DEVICE_TABLE(of, axp20x_battery_ps_id);
@@ -476,6 +507,7 @@ static int axp20x_power_probe(struct platform_device *pdev)
 	struct axp20x_batt_ps *axp20x_batt;
 	struct power_supply_config psy_cfg = {};
 	struct power_supply_battery_info info;
+	struct device *dev = &pdev->dev;
 
 	if (!of_device_is_available(pdev->dev.of_node))
 		return -ENODEV;
@@ -516,7 +548,7 @@ static int axp20x_power_probe(struct platform_device *pdev)
 	psy_cfg.drv_data = axp20x_batt;
 	psy_cfg.of_node = pdev->dev.of_node;
 
-	axp20x_batt->axp_id = (uintptr_t)of_device_get_match_data(&pdev->dev);
+	axp20x_batt->data = (struct axp_data *)of_device_get_match_data(dev);
 
 	axp20x_batt->batt = devm_power_supply_register(&pdev->dev,
 						       &axp20x_batt_ps_desc,
-- 
git-series 0.9.1

^ permalink raw reply	[flat|nested] 38+ messages in thread

* [PATCH v3 11/16] dt-bindings: power: supply: axp20x: add AXP813 battery DT binding
       [not found] ` <cover.2e5329bf5475a5160e613a4eb1e1377c662ce56e.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
                     ` (9 preceding siblings ...)
  2018-01-15 10:33   ` [PATCH v3 10/16] power: supply: axp20x_battery: use data structure instead of ID for Quentin Schulz
@ 2018-01-15 10:33   ` Quentin Schulz
       [not found]     ` <7b53727c33207f4b7ae36218c99abfb86876e716.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
  2018-01-15 10:33   ` [PATCH v3 12/16] power: supply: axp20x_battery: add support for AXP813 Quentin Schulz
                     ` (4 subsequent siblings)
  15 siblings, 1 reply; 38+ messages in thread
From: Quentin Schulz @ 2018-01-15 10:33 UTC (permalink / raw)
  To: jic23-DgEjT+Ai2ygdnm+yROfE0A, knaack.h-Mmb7MZpHnFY,
	lars-Qo5EllUWu/uELgA04lAiVw, pmeerw-jW+XmwGofnusTnJN9+BGXg,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8,
	wens-jdAy2FN1RRM, sre-DgEjT+Ai2ygdnm+yROfE0A,
	linux-I+IVW8TIWO2tmTQ+vhA3Yw,
	maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	lee.jones-QSEj5FYQhm4dnm+yROfE0A
  Cc: linux-iio-u79uwXL29TY76Z2rM5mHXA,
	linux-pm-u79uwXL29TY76Z2rM5mHXA,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	thomas.petazzoni-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	linux-sunxi-/JYPxA39Uh5TLH3MbocFFw,
	julian.calaby-Re5JQEeQqe8AvxtiuMwx3w, Quentin Schulz

The AXP813 can have a battery as power supply, so let's add it to the
list of compatibles.

Signed-off-by: Quentin Schulz <quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
Reviewed-by: Rob Herring <robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
---
 Documentation/devicetree/bindings/power/supply/axp20x_battery.txt | 8 +++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/Documentation/devicetree/bindings/power/supply/axp20x_battery.txt b/Documentation/devicetree/bindings/power/supply/axp20x_battery.txt
index c248866..41916f6 100644
--- a/Documentation/devicetree/bindings/power/supply/axp20x_battery.txt
+++ b/Documentation/devicetree/bindings/power/supply/axp20x_battery.txt
@@ -4,12 +4,12 @@ Required Properties:
  - compatible, one of:
 			"x-powers,axp209-battery-power-supply"
 			"x-powers,axp221-battery-power-supply"
+			"x-powers,axp813-battery-power-supply"
 
-This node is a subnode of the axp20x/axp22x PMIC.
+This node is a subnode of its respective PMIC DT node.
 
-The AXP20X and AXP22X can read the battery voltage, charge and discharge
-currents of the battery by reading ADC channels from the AXP20X/AXP22X
-ADC.
+The supported devices can read the battery voltage, charge and discharge
+currents of the battery by reading ADC channels from the ADC.
 
 Example:
 
-- 
git-series 0.9.1

^ permalink raw reply	[flat|nested] 38+ messages in thread

* [PATCH v3 12/16] power: supply: axp20x_battery: add support for AXP813
       [not found] ` <cover.2e5329bf5475a5160e613a4eb1e1377c662ce56e.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
                     ` (10 preceding siblings ...)
  2018-01-15 10:33   ` [PATCH v3 11/16] dt-bindings: power: supply: axp20x: add AXP813 battery DT binding Quentin Schulz
@ 2018-01-15 10:33   ` Quentin Schulz
       [not found]     ` <42b2e555083abbab43e48362175dc9c2eeeedf3c.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
  2018-01-15 10:33   ` [PATCH v3 13/16] mfd: axp20x: add battery power supply cell " Quentin Schulz
                     ` (3 subsequent siblings)
  15 siblings, 1 reply; 38+ messages in thread
From: Quentin Schulz @ 2018-01-15 10:33 UTC (permalink / raw)
  To: jic23-DgEjT+Ai2ygdnm+yROfE0A, knaack.h-Mmb7MZpHnFY,
	lars-Qo5EllUWu/uELgA04lAiVw, pmeerw-jW+XmwGofnusTnJN9+BGXg,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8,
	wens-jdAy2FN1RRM, sre-DgEjT+Ai2ygdnm+yROfE0A,
	linux-I+IVW8TIWO2tmTQ+vhA3Yw,
	maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	lee.jones-QSEj5FYQhm4dnm+yROfE0A
  Cc: linux-iio-u79uwXL29TY76Z2rM5mHXA,
	linux-pm-u79uwXL29TY76Z2rM5mHXA,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	thomas.petazzoni-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	linux-sunxi-/JYPxA39Uh5TLH3MbocFFw,
	julian.calaby-Re5JQEeQqe8AvxtiuMwx3w, Quentin Schulz

The X-Powers AXP813 PMIC has got some slight differences from
AXP20X/AXP22X PMICs:
 - the maximum voltage supplied by the PMIC is 4.35 instead of 4.36/4.24
 for AXP20X/AXP22X,
 - the constant charge current formula is different,

It also has a bit to tell whether the battery percentage returned by the
PMIC is valid.

Signed-off-by: Quentin Schulz <quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
---
 drivers/power/supply/axp20x_battery.c | 42 ++++++++++++++++++++++++++++-
 1 file changed, 42 insertions(+)

diff --git a/drivers/power/supply/axp20x_battery.c b/drivers/power/supply/axp20x_battery.c
index d73c78f..e75fa90 100644
--- a/drivers/power/supply/axp20x_battery.c
+++ b/drivers/power/supply/axp20x_battery.c
@@ -49,6 +49,8 @@
 #define AXP22X_CHRG_CTRL1_TGT_4_22V	(1 << 5)
 #define AXP22X_CHRG_CTRL1_TGT_4_24V	(3 << 5)
 
+#define AXP813_CHRG_CTRL1_TGT_4_35V	(3 << 5)
+
 #define AXP20X_CHRG_CTRL1_TGT_CURR	GENMASK(3, 0)
 
 #define AXP20X_V_OFF_MASK		GENMASK(2, 0)
@@ -133,6 +135,35 @@ static int axp22x_battery_get_max_voltage(struct axp20x_batt_ps *axp20x_batt,
 	return 0;
 }
 
+static int axp813_battery_get_max_voltage(struct axp20x_batt_ps *axp20x_batt,
+					  int *val)
+{
+	int ret, reg;
+
+	ret = regmap_read(axp20x_batt->regmap, AXP20X_CHRG_CTRL1, &reg);
+	if (ret)
+		return ret;
+
+	switch (reg & AXP20X_CHRG_CTRL1_TGT_VOLT) {
+	case AXP20X_CHRG_CTRL1_TGT_4_1V:
+		*val = 4100000;
+		break;
+	case AXP20X_CHRG_CTRL1_TGT_4_15V:
+		*val = 4150000;
+		break;
+	case AXP20X_CHRG_CTRL1_TGT_4_2V:
+		*val = 4200000;
+		break;
+	case AXP813_CHRG_CTRL1_TGT_4_35V:
+		*val = 4350000;
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
 static int axp20x_get_constant_charge_current(struct axp20x_batt_ps *axp,
 					      int *val)
 {
@@ -491,6 +522,14 @@ struct axp_data axp221_data = {
 	.set_max_voltage = axp22x_battery_set_max_voltage,
 };
 
+struct axp_data axp813_data = {
+	.ccc_scale = 200000,
+	.ccc_offset = 200000,
+	.has_fg_valid = true,
+	.get_max_voltage = axp813_battery_get_max_voltage,
+	.set_max_voltage = axp20x_battery_set_max_voltage,
+};
+
 static const struct of_device_id axp20x_battery_ps_id[] = {
 	{
 		.compatible = "x-powers,axp209-battery-power-supply",
@@ -498,6 +537,9 @@ static const struct of_device_id axp20x_battery_ps_id[] = {
 	}, {
 		.compatible = "x-powers,axp221-battery-power-supply",
 		.data = (void *)&axp221_data,
+	}, {
+		.compatible = "x-powers,axp813-battery-power-supply",
+		.data = (void *)&axp813_data,
 	}, { /* sentinel */ },
 };
 MODULE_DEVICE_TABLE(of, axp20x_battery_ps_id);
-- 
git-series 0.9.1

^ permalink raw reply	[flat|nested] 38+ messages in thread

* [PATCH v3 13/16] mfd: axp20x: add battery power supply cell for AXP813
       [not found] ` <cover.2e5329bf5475a5160e613a4eb1e1377c662ce56e.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
                     ` (11 preceding siblings ...)
  2018-01-15 10:33   ` [PATCH v3 12/16] power: supply: axp20x_battery: add support for AXP813 Quentin Schulz
@ 2018-01-15 10:33   ` Quentin Schulz
       [not found]     ` <76855b0d3b9eb75e00eb6a058db5b4a33b0558c6.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
  2018-01-15 10:33   ` [PATCH v3 14/16] ARM: dtsi: axp81x: add battery power supply subnode Quentin Schulz
                     ` (2 subsequent siblings)
  15 siblings, 1 reply; 38+ messages in thread
From: Quentin Schulz @ 2018-01-15 10:33 UTC (permalink / raw)
  To: jic23-DgEjT+Ai2ygdnm+yROfE0A, knaack.h-Mmb7MZpHnFY,
	lars-Qo5EllUWu/uELgA04lAiVw, pmeerw-jW+XmwGofnusTnJN9+BGXg,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8,
	wens-jdAy2FN1RRM, sre-DgEjT+Ai2ygdnm+yROfE0A,
	linux-I+IVW8TIWO2tmTQ+vhA3Yw,
	maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	lee.jones-QSEj5FYQhm4dnm+yROfE0A
  Cc: linux-iio-u79uwXL29TY76Z2rM5mHXA,
	linux-pm-u79uwXL29TY76Z2rM5mHXA,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	thomas.petazzoni-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	linux-sunxi-/JYPxA39Uh5TLH3MbocFFw,
	julian.calaby-Re5JQEeQqe8AvxtiuMwx3w, Quentin Schulz

As axp20x-battery-power-supply now supports AXP813, add a cell for it.

Signed-off-by: Quentin Schulz <quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
Acked-for-MFD-by: Lee Jones <lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
---
 drivers/mfd/axp20x.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
index e5516aa..aaf2acb 100644
--- a/drivers/mfd/axp20x.c
+++ b/drivers/mfd/axp20x.c
@@ -888,6 +888,9 @@ static struct mfd_cell axp813_cells[] = {
 	}, {
 		.name			= "axp813-adc",
 		.of_compatible		= "x-powers,axp813-adc",
+	}, {
+		.name		= "axp20x-battery-power-supply",
+		.of_compatible	= "x-powers,axp813-battery-power-supply",
 	},
 };
 
-- 
git-series 0.9.1

^ permalink raw reply	[flat|nested] 38+ messages in thread

* [PATCH v3 14/16] ARM: dtsi: axp81x: add battery power supply subnode
       [not found] ` <cover.2e5329bf5475a5160e613a4eb1e1377c662ce56e.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
                     ` (12 preceding siblings ...)
  2018-01-15 10:33   ` [PATCH v3 13/16] mfd: axp20x: add battery power supply cell " Quentin Schulz
@ 2018-01-15 10:33   ` Quentin Schulz
       [not found]     ` <9c045de8dcee9a71803978855762e272efdc41d3.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
  2018-01-15 10:33   ` [PATCH v3 15/16] ARM: dtsi: sun8i: a711: enable " Quentin Schulz
  2018-01-15 10:33   ` [PATCH v3 16/16] ARM: dtsi: axp81x: remove IP name from DT node name Quentin Schulz
  15 siblings, 1 reply; 38+ messages in thread
From: Quentin Schulz @ 2018-01-15 10:33 UTC (permalink / raw)
  To: jic23-DgEjT+Ai2ygdnm+yROfE0A, knaack.h-Mmb7MZpHnFY,
	lars-Qo5EllUWu/uELgA04lAiVw, pmeerw-jW+XmwGofnusTnJN9+BGXg,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8,
	wens-jdAy2FN1RRM, sre-DgEjT+Ai2ygdnm+yROfE0A,
	linux-I+IVW8TIWO2tmTQ+vhA3Yw,
	maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	lee.jones-QSEj5FYQhm4dnm+yROfE0A
  Cc: linux-iio-u79uwXL29TY76Z2rM5mHXA,
	linux-pm-u79uwXL29TY76Z2rM5mHXA,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	thomas.petazzoni-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	linux-sunxi-/JYPxA39Uh5TLH3MbocFFw,
	julian.calaby-Re5JQEeQqe8AvxtiuMwx3w, Quentin Schulz

The X-Powers AXP81X PMIC exposes battery supply various data such as
the battery status (charging, discharging, full, dead), current max
limit, current current, battery capacity (in percentage), voltage max
and min limits, current voltage, and battery capacity (in Ah).

This adds the battery power supply subnode for AXP81X PMIC.

Signed-off-by: Quentin Schulz <quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
---
 arch/arm/boot/dts/axp81x.dtsi | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/arch/arm/boot/dts/axp81x.dtsi b/arch/arm/boot/dts/axp81x.dtsi
index 6b5e7bc..1b05c7f 100644
--- a/arch/arm/boot/dts/axp81x.dtsi
+++ b/arch/arm/boot/dts/axp81x.dtsi
@@ -69,6 +69,11 @@
 		};
 	};
 
+	battery_power_supply: battery-power-supply {
+		compatible = "x-powers,axp813-battery-power-supply";
+		status = "disabled";
+	};
+
 	regulators {
 		/* Default work frequency for buck regulators */
 		x-powers,dcdc-freq = <3000>;
-- 
git-series 0.9.1

^ permalink raw reply	[flat|nested] 38+ messages in thread

* [PATCH v3 15/16] ARM: dtsi: sun8i: a711: enable battery power supply subnode
       [not found] ` <cover.2e5329bf5475a5160e613a4eb1e1377c662ce56e.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
                     ` (13 preceding siblings ...)
  2018-01-15 10:33   ` [PATCH v3 14/16] ARM: dtsi: axp81x: add battery power supply subnode Quentin Schulz
@ 2018-01-15 10:33   ` Quentin Schulz
  2018-01-23 15:51     ` [linux-sunxi] " Chen-Yu Tsai
  2018-01-15 10:33   ` [PATCH v3 16/16] ARM: dtsi: axp81x: remove IP name from DT node name Quentin Schulz
  15 siblings, 1 reply; 38+ messages in thread
From: Quentin Schulz @ 2018-01-15 10:33 UTC (permalink / raw)
  To: jic23-DgEjT+Ai2ygdnm+yROfE0A, knaack.h-Mmb7MZpHnFY,
	lars-Qo5EllUWu/uELgA04lAiVw, pmeerw-jW+XmwGofnusTnJN9+BGXg,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8,
	wens-jdAy2FN1RRM, sre-DgEjT+Ai2ygdnm+yROfE0A,
	linux-I+IVW8TIWO2tmTQ+vhA3Yw,
	maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	lee.jones-QSEj5FYQhm4dnm+yROfE0A
  Cc: linux-iio-u79uwXL29TY76Z2rM5mHXA,
	linux-pm-u79uwXL29TY76Z2rM5mHXA,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	thomas.petazzoni-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	linux-sunxi-/JYPxA39Uh5TLH3MbocFFw,
	julian.calaby-Re5JQEeQqe8AvxtiuMwx3w, Quentin Schulz

The TBS A711 has an AXP813 PMIC and a soldered battery, thus, we enable
the battery power supply subnode in its Device Tree.

Signed-off-by: Quentin Schulz <quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
---
 arch/arm/boot/dts/sun8i-a83t-tbs-a711.dts | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/arch/arm/boot/dts/sun8i-a83t-tbs-a711.dts b/arch/arm/boot/dts/sun8i-a83t-tbs-a711.dts
index 511fca4..1de362f 100644
--- a/arch/arm/boot/dts/sun8i-a83t-tbs-a711.dts
+++ b/arch/arm/boot/dts/sun8i-a83t-tbs-a711.dts
@@ -231,6 +231,10 @@
 
 #include "axp81x.dtsi"
 
+&battery_power_supply {
+	status = "okay";
+};
+
 &reg_aldo1 {
 	regulator-min-microvolt = <1800000>;
 	regulator-max-microvolt = <1800000>;
-- 
git-series 0.9.1

^ permalink raw reply	[flat|nested] 38+ messages in thread

* [PATCH v3 16/16] ARM: dtsi: axp81x: remove IP name from DT node name
       [not found] ` <cover.2e5329bf5475a5160e613a4eb1e1377c662ce56e.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
                     ` (14 preceding siblings ...)
  2018-01-15 10:33   ` [PATCH v3 15/16] ARM: dtsi: sun8i: a711: enable " Quentin Schulz
@ 2018-01-15 10:33   ` Quentin Schulz
       [not found]     ` <6e881951c43b8829cd509c3db06fa5520f71e779.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
  15 siblings, 1 reply; 38+ messages in thread
From: Quentin Schulz @ 2018-01-15 10:33 UTC (permalink / raw)
  To: jic23-DgEjT+Ai2ygdnm+yROfE0A, knaack.h-Mmb7MZpHnFY,
	lars-Qo5EllUWu/uELgA04lAiVw, pmeerw-jW+XmwGofnusTnJN9+BGXg,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8,
	wens-jdAy2FN1RRM, sre-DgEjT+Ai2ygdnm+yROfE0A,
	linux-I+IVW8TIWO2tmTQ+vhA3Yw,
	maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	lee.jones-QSEj5FYQhm4dnm+yROfE0A
  Cc: linux-iio-u79uwXL29TY76Z2rM5mHXA,
	linux-pm-u79uwXL29TY76Z2rM5mHXA,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	thomas.petazzoni-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	linux-sunxi-/JYPxA39Uh5TLH3MbocFFw,
	julian.calaby-Re5JQEeQqe8AvxtiuMwx3w, Quentin Schulz

The DT node should be named after its functionality and not after the
IP it's defining.

Signed-off-by: Quentin Schulz <quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
---
 arch/arm/boot/dts/axp81x.dtsi | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/arm/boot/dts/axp81x.dtsi b/arch/arm/boot/dts/axp81x.dtsi
index 1b05c7f..043c717 100644
--- a/arch/arm/boot/dts/axp81x.dtsi
+++ b/arch/arm/boot/dts/axp81x.dtsi
@@ -53,7 +53,7 @@
 		#io-channel-cells = <1>;
 	};
 
-	axp_gpio: axp-gpio {
+	axp_gpio: gpio {
 		compatible = "x-powers,axp813-gpio";
 		gpio-controller;
 		#gpio-cells = <2>;
-- 
git-series 0.9.1

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v3 01/16] iio: adc: axp20x_adc: put ADC rate setting in a per-variant function
       [not found]     ` <9488159b43c4cc8418afa9d1562d972c4631cb02.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
@ 2018-01-21 12:13       ` Jonathan Cameron
  0 siblings, 0 replies; 38+ messages in thread
From: Jonathan Cameron @ 2018-01-21 12:13 UTC (permalink / raw)
  To: Quentin Schulz
  Cc: knaack.h-Mmb7MZpHnFY, lars-Qo5EllUWu/uELgA04lAiVw,
	pmeerw-jW+XmwGofnusTnJN9+BGXg, robh+dt-DgEjT+Ai2ygdnm+yROfE0A,
	mark.rutland-5wv7dgnIgG8, wens-jdAy2FN1RRM,
	sre-DgEjT+Ai2ygdnm+yROfE0A, linux-I+IVW8TIWO2tmTQ+vhA3Yw,
	maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	lee.jones-QSEj5FYQhm4dnm+yROfE0A,
	linux-iio-u79uwXL29TY76Z2rM5mHXA,
	linux-pm-u79uwXL29TY76Z2rM5mHXA,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	thomas.petazzoni-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	linux-sunxi-/JYPxA39Uh5TLH3MbocFFw,
	julian.calaby-Re5JQEeQqe8AvxtiuMwx3w

On Mon, 15 Jan 2018 11:33:35 +0100
Quentin Schulz <quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org> wrote:

> To prepare for a new comer that set a different register with different
> values, move rate setting in a function that is specific to each AXP
> variant.
> 
> Signed-off-by: Quentin Schulz <quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
Applied to the togreg branch of iio.git and pushed out as testing.

Thanks,

Jonathan

> ---
>  drivers/iio/adc/axp20x_adc.c | 18 +++++++++++-------
>  1 file changed, 11 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/iio/adc/axp20x_adc.c b/drivers/iio/adc/axp20x_adc.c
> index a30a972..3fc1b06 100644
> --- a/drivers/iio/adc/axp20x_adc.c
> +++ b/drivers/iio/adc/axp20x_adc.c
> @@ -470,14 +470,18 @@ static const struct iio_info axp22x_adc_iio_info = {
>  	.read_raw = axp22x_read_raw,
>  };
>  
> -static int axp20x_adc_rate(int rate)
> +static int axp20x_adc_rate(struct axp20x_adc_iio *info, int rate)
>  {
> -	return AXP20X_ADC_RATE_HZ(rate);
> +	return regmap_update_bits(info->regmap, AXP20X_ADC_RATE,
> +				  AXP20X_ADC_RATE_MASK,
> +				  AXP20X_ADC_RATE_HZ(rate));
>  }
>  
> -static int axp22x_adc_rate(int rate)
> +static int axp22x_adc_rate(struct axp20x_adc_iio *info, int rate)
>  {
> -	return AXP22X_ADC_RATE_HZ(rate);
> +	return regmap_update_bits(info->regmap, AXP20X_ADC_RATE,
> +				  AXP20X_ADC_RATE_MASK,
> +				  AXP22X_ADC_RATE_HZ(rate));
>  }
>  
>  struct axp_data {
> @@ -485,7 +489,8 @@ struct axp_data {
>  	int				num_channels;
>  	struct iio_chan_spec const	*channels;
>  	unsigned long			adc_en1_mask;
> -	int				(*adc_rate)(int rate);
> +	int				(*adc_rate)(struct axp20x_adc_iio *info,
> +						    int rate);
>  	bool				adc_en2;
>  	struct iio_map			*maps;
>  };
> @@ -554,8 +559,7 @@ static int axp20x_probe(struct platform_device *pdev)
>  				   AXP20X_ADC_EN2_MASK, AXP20X_ADC_EN2_MASK);
>  
>  	/* Configure ADCs rate */
> -	regmap_update_bits(info->regmap, AXP20X_ADC_RATE, AXP20X_ADC_RATE_MASK,
> -			   info->data->adc_rate(100));
> +	info->data->adc_rate(info, 100);
>  
>  	ret = iio_map_array_register(indio_dev, info->data->maps);
>  	if (ret < 0) {

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v3 02/16] dt-bindings: iio: adc: add binding for X-Powers AXP PMICs ADC
  2018-01-15 10:33   ` [PATCH v3 02/16] dt-bindings: iio: adc: add binding for X-Powers AXP PMICs ADC Quentin Schulz
@ 2018-01-21 12:18     ` Jonathan Cameron
  0 siblings, 0 replies; 38+ messages in thread
From: Jonathan Cameron @ 2018-01-21 12:18 UTC (permalink / raw)
  To: Quentin Schulz
  Cc: knaack.h, lars, pmeerw, robh+dt, mark.rutland, wens, sre, linux,
	maxime.ripard, lee.jones, linux-iio, linux-pm, devicetree,
	linux-kernel, linux-arm-kernel, thomas.petazzoni, linux-sunxi,
	julian.calaby

On Mon, 15 Jan 2018 11:33:36 +0100
Quentin Schulz <quentin.schulz@free-electrons.com> wrote:

> X-Powers PMICs have several ADC channels that can be used for different
> purposes, e.g. PMIC internal temperature, battery voltage or AC current.
> 
> This is the documentation for AXP209, AXP221/223 and AXP813 ADC
> bindings.
> 
> Signed-off-by: Quentin Schulz <quentin.schulz@free-electrons.com>
> Reviewed-by: Rob Herring <robh@kernel.org>
Applied to the togreg branch of iio.git and pushed out as testing.

Thanks,

Jonathan

> ---
>  Documentation/devicetree/bindings/iio/adc/axp20x_adc.txt | 48 +++++++++-
>  1 file changed, 48 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/iio/adc/axp20x_adc.txt
> 
> diff --git a/Documentation/devicetree/bindings/iio/adc/axp20x_adc.txt b/Documentation/devicetree/bindings/iio/adc/axp20x_adc.txt
> new file mode 100644
> index 0000000..7a63139
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/iio/adc/axp20x_adc.txt
> @@ -0,0 +1,48 @@
> +* X-Powers AXP ADC bindings
> +
> +Required properties:
> +  - compatible: should be one of:
> +    - "x-powers,axp209-adc",
> +    - "x-powers,axp221-adc",
> +    - "x-powers,axp813-adc",
> +  - #io-channel-cells: should be 1,
> +
> +Example:
> +
> +&axp22x {
> +	adc {
> +		compatible = "x-powers,axp221-adc";
> +		#io-channel-cells = <1>;
> +	};
> +};
> +
> +ADC channels and their indexes per variant:
> +
> +AXP209
> +------
> + 0 | acin_v
> + 1 | acin_i
> + 2 | vbus_v
> + 3 | vbus_i
> + 4 | pmic_temp
> + 5 | gpio0_v
> + 6 | gpio1_v
> + 7 | ipsout_v
> + 8 | batt_v
> + 9 | batt_chrg_i
> +10 | batt_dischrg_i
> +
> +AXP22x
> +------
> + 0 | pmic_temp
> + 1 | batt_v
> + 2 | batt_chrg_i
> + 3 | batt_dischrg_i
> +
> +AXP813
> +------
> + 0 | pmic_temp
> + 1 | gpio0_v
> + 2 | batt_v
> + 3 | batt_chrg_i
> + 4 | batt_dischrg_i

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v3 03/16] iio: adc: axp20x_adc: make it possible to probe from DT
  2018-01-15 10:33   ` [PATCH v3 03/16] iio: adc: axp20x_adc: make it possible to probe from DT Quentin Schulz
@ 2018-01-21 12:22     ` Jonathan Cameron
  0 siblings, 0 replies; 38+ messages in thread
From: Jonathan Cameron @ 2018-01-21 12:22 UTC (permalink / raw)
  To: Quentin Schulz
  Cc: knaack.h, lars, pmeerw, robh+dt, mark.rutland, wens, sre, linux,
	maxime.ripard, lee.jones, linux-iio, linux-pm, devicetree,
	linux-kernel, linux-arm-kernel, thomas.petazzoni, linux-sunxi,
	julian.calaby

On Mon, 15 Jan 2018 11:33:37 +0100
Quentin Schulz <quentin.schulz@free-electrons.com> wrote:

> To prepare for a future patch that will add a DT node for the ADC, make
> axp20x_adc able to probe from DT and get the per-variant data from
> of_device_id.data since platform_device_id.driver_data won't be set when
> probing by DT.
> 
> Leave the ability to probe via platform for driver compatibility with
> old DTs.
> 
> Signed-off-by: Quentin Schulz <quentin.schulz@free-electrons.com>
Looks good to me. 

Applied to the togreg branch of iio.git and pushed out as testing for
the autobuilders to play with it.

If anyone wants to comment I won't be pushing out in a non rebasing form
until at least next weekend.

Thanks,

Jonathan

> ---
>  drivers/iio/adc/axp20x_adc.c | 19 ++++++++++++++++++-
>  1 file changed, 18 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/iio/adc/axp20x_adc.c b/drivers/iio/adc/axp20x_adc.c
> index 3fc1b06..3968053 100644
> --- a/drivers/iio/adc/axp20x_adc.c
> +++ b/drivers/iio/adc/axp20x_adc.c
> @@ -515,6 +515,13 @@ static const struct axp_data axp22x_data = {
>  	.maps = axp22x_maps,
>  };
>  
> +static const struct of_device_id axp20x_adc_of_match[] = {
> +	{ .compatible = "x-powers,axp209-adc", .data = (void *)&axp20x_data, },
> +	{ .compatible = "x-powers,axp221-adc", .data = (void *)&axp22x_data, },
> +	{ /* sentinel */ }
> +};
> +MODULE_DEVICE_TABLE(of, axp20x_adc_of_match);
> +
>  static const struct platform_device_id axp20x_adc_id_match[] = {
>  	{ .name = "axp20x-adc", .driver_data = (kernel_ulong_t)&axp20x_data, },
>  	{ .name = "axp22x-adc", .driver_data = (kernel_ulong_t)&axp22x_data, },
> @@ -543,7 +550,16 @@ static int axp20x_probe(struct platform_device *pdev)
>  	indio_dev->dev.of_node = pdev->dev.of_node;
>  	indio_dev->modes = INDIO_DIRECT_MODE;
>  
> -	info->data = (struct axp_data *)platform_get_device_id(pdev)->driver_data;
> +	if (!pdev->dev.of_node) {
> +		const struct platform_device_id *id;
> +
> +		id = platform_get_device_id(pdev);
> +		info->data = (struct axp_data *)id->driver_data;
> +	} else {
> +		struct device *dev = &pdev->dev;
> +
> +		info->data = (struct axp_data *)of_device_get_match_data(dev);
> +	}
>  
>  	indio_dev->name = platform_get_device_id(pdev)->name;
>  	indio_dev->info = info->data->iio_info;
> @@ -606,6 +622,7 @@ static int axp20x_remove(struct platform_device *pdev)
>  static struct platform_driver axp20x_adc_driver = {
>  	.driver = {
>  		.name = "axp20x-adc",
> +		.of_match_table = of_match_ptr(axp20x_adc_of_match),
>  	},
>  	.id_table = axp20x_adc_id_match,
>  	.probe = axp20x_probe,

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v3 07/16] iio: adc: axp20x_adc: add support for AXP813 ADC
  2018-01-15 10:33   ` [PATCH v3 07/16] iio: adc: axp20x_adc: add support for AXP813 ADC Quentin Schulz
@ 2018-01-21 12:26     ` Jonathan Cameron
  2018-01-22  8:22       ` Quentin Schulz
  0 siblings, 1 reply; 38+ messages in thread
From: Jonathan Cameron @ 2018-01-21 12:26 UTC (permalink / raw)
  To: Quentin Schulz
  Cc: knaack.h, lars, pmeerw, robh+dt, mark.rutland, wens, sre, linux,
	maxime.ripard, lee.jones, linux-iio, linux-pm, devicetree,
	linux-kernel, linux-arm-kernel, thomas.petazzoni, linux-sunxi,
	julian.calaby

On Mon, 15 Jan 2018 11:33:41 +0100
Quentin Schulz <quentin.schulz@free-electrons.com> wrote:

> The X-Powers AXP813 PMIC is really close to what is already done for
> AXP20X/AXP22X.
> 
> There are two pairs of bits to set the rate (one for Voltage and Current
> measurements and one for TS/GPIO0 voltage measurements) instead of one.
> 
> The register to set the ADC rates is different from the one for
> AXP20X/AXP22X.
> 
> GPIO0 can be used as an ADC (measuring Volts) unlike for AXP22X.
> 
> The scales to apply to the different inputs are unlike the ones from
> AXP20X and AXP22X.
> 
> Signed-off-by: Quentin Schulz <quentin.schulz@free-electrons.com>
> Acked-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Applied to the togreg branch of iio.git and pushed out as testing
for the autobuilders to play with it.

One thing that might be nice to tidy up in this driver though.

CHECK   drivers/iio/adc/axp20x_adc.c
drivers/iio/adc/axp20x_adc.c:548:26: warning: dubious: !x & y
drivers/iio/adc/axp20x_adc.c:553:26: warning: dubious: !x & y

Those are 'interesting' code constructions.  It may be worth being
a little more verbose to keep sparse happy and suppress the
warning.

Thanks,

Jonathan

> ---
>  drivers/iio/adc/axp20x_adc.c | 123 ++++++++++++++++++++++++++++++++++++-
>  include/linux/mfd/axp20x.h   |   2 +-
>  2 files changed, 125 insertions(+)
> 
> diff --git a/drivers/iio/adc/axp20x_adc.c b/drivers/iio/adc/axp20x_adc.c
> index 3968053..7cdb8bc 100644
> --- a/drivers/iio/adc/axp20x_adc.c
> +++ b/drivers/iio/adc/axp20x_adc.c
> @@ -35,8 +35,13 @@
>  #define AXP20X_GPIO10_IN_RANGE_GPIO1_VAL(x)	(((x) & BIT(0)) << 1)
>  
>  #define AXP20X_ADC_RATE_MASK			GENMASK(7, 6)
> +#define AXP813_V_I_ADC_RATE_MASK		GENMASK(5, 4)
> +#define AXP813_ADC_RATE_MASK			(AXP20X_ADC_RATE_MASK | AXP813_V_I_ADC_RATE_MASK)
>  #define AXP20X_ADC_RATE_HZ(x)			((ilog2((x) / 25) << 6) & AXP20X_ADC_RATE_MASK)
>  #define AXP22X_ADC_RATE_HZ(x)			((ilog2((x) / 100) << 6) & AXP20X_ADC_RATE_MASK)
> +#define AXP813_TS_GPIO0_ADC_RATE_HZ(x)		AXP20X_ADC_RATE_HZ(x)
> +#define AXP813_V_I_ADC_RATE_HZ(x)		((ilog2((x) / 100) << 4) & AXP813_V_I_ADC_RATE_MASK)
> +#define AXP813_ADC_RATE_HZ(x)			(AXP20X_ADC_RATE_HZ(x) | AXP813_V_I_ADC_RATE_HZ(x))
>  
>  #define AXP20X_ADC_CHANNEL(_channel, _name, _type, _reg)	\
>  	{							\
> @@ -95,6 +100,12 @@ enum axp22x_adc_channel_i {
>  	AXP22X_BATT_DISCHRG_I,
>  };
>  
> +enum axp813_adc_channel_v {
> +	AXP813_TS_IN = 0,
> +	AXP813_GPIO0_V,
> +	AXP813_BATT_V,
> +};
> +
>  static struct iio_map axp20x_maps[] = {
>  	{
>  		.consumer_dev_name = "axp20x-usb-power-supply",
> @@ -197,6 +208,25 @@ static const struct iio_chan_spec axp22x_adc_channels[] = {
>  			   AXP20X_BATT_DISCHRG_I_H),
>  };
>  
> +static const struct iio_chan_spec axp813_adc_channels[] = {
> +	{
> +		.type = IIO_TEMP,
> +		.address = AXP22X_PMIC_TEMP_H,
> +		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
> +				      BIT(IIO_CHAN_INFO_SCALE) |
> +				      BIT(IIO_CHAN_INFO_OFFSET),
> +		.datasheet_name = "pmic_temp",
> +	},
> +	AXP20X_ADC_CHANNEL(AXP813_GPIO0_V, "gpio0_v", IIO_VOLTAGE,
> +			   AXP288_GP_ADC_H),
> +	AXP20X_ADC_CHANNEL(AXP813_BATT_V, "batt_v", IIO_VOLTAGE,
> +			   AXP20X_BATT_V_H),
> +	AXP20X_ADC_CHANNEL(AXP22X_BATT_CHRG_I, "batt_chrg_i", IIO_CURRENT,
> +			   AXP20X_BATT_CHRG_I_H),
> +	AXP20X_ADC_CHANNEL(AXP22X_BATT_DISCHRG_I, "batt_dischrg_i", IIO_CURRENT,
> +			   AXP20X_BATT_DISCHRG_I_H),
> +};
> +
>  static int axp20x_adc_raw(struct iio_dev *indio_dev,
>  			  struct iio_chan_spec const *chan, int *val)
>  {
> @@ -243,6 +273,18 @@ static int axp22x_adc_raw(struct iio_dev *indio_dev,
>  	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);
> +
> +	*val = axp20x_read_variable_width(info->regmap, chan->address, 12);
> +	if (*val < 0)
> +		return *val;
> +
> +	return IIO_VAL_INT;
> +}
> +
>  static int axp20x_adc_scale_voltage(int channel, int *val, int *val2)
>  {
>  	switch (channel) {
> @@ -273,6 +315,24 @@ static int axp20x_adc_scale_voltage(int channel, int *val, int *val2)
>  	}
>  }
>  
> +static int axp813_adc_scale_voltage(int channel, int *val, int *val2)
> +{
> +	switch (channel) {
> +	case AXP813_GPIO0_V:
> +		*val = 0;
> +		*val2 = 800000;
> +		return IIO_VAL_INT_PLUS_MICRO;
> +
> +	case AXP813_BATT_V:
> +		*val = 1;
> +		*val2 = 100000;
> +		return IIO_VAL_INT_PLUS_MICRO;
> +
> +	default:
> +		return -EINVAL;
> +	}
> +}
> +
>  static int axp20x_adc_scale_current(int channel, int *val, int *val2)
>  {
>  	switch (channel) {
> @@ -342,6 +402,26 @@ static int axp22x_adc_scale(struct iio_chan_spec const *chan, int *val,
>  	}
>  }
>  
> +static int axp813_adc_scale(struct iio_chan_spec const *chan, int *val,
> +			    int *val2)
> +{
> +	switch (chan->type) {
> +	case IIO_VOLTAGE:
> +		return axp813_adc_scale_voltage(chan->channel, val, val2);
> +
> +	case IIO_CURRENT:
> +		*val = 1;
> +		return IIO_VAL_INT;
> +
> +	case IIO_TEMP:
> +		*val = 100;
> +		return IIO_VAL_INT;
> +
> +	default:
> +		return -EINVAL;
> +	}
> +}
> +
>  static int axp20x_adc_offset_voltage(struct iio_dev *indio_dev, int channel,
>  				     int *val)
>  {
> @@ -425,6 +505,26 @@ static int axp22x_read_raw(struct iio_dev *indio_dev,
>  	}
>  }
>  
> +static int axp813_read_raw(struct iio_dev *indio_dev,
> +			   struct iio_chan_spec const *chan, int *val,
> +			   int *val2, long mask)
> +{
> +	switch (mask) {
> +	case IIO_CHAN_INFO_OFFSET:
> +		*val = -2667;
> +		return IIO_VAL_INT;
> +
> +	case IIO_CHAN_INFO_SCALE:
> +		return axp813_adc_scale(chan, val, val2);
> +
> +	case IIO_CHAN_INFO_RAW:
> +		return axp813_adc_raw(indio_dev, chan, val);
> +
> +	default:
> +		return -EINVAL;
> +	}
> +}
> +
>  static int axp20x_write_raw(struct iio_dev *indio_dev,
>  			    struct iio_chan_spec const *chan, int val, int val2,
>  			    long mask)
> @@ -470,6 +570,10 @@ static const struct iio_info axp22x_adc_iio_info = {
>  	.read_raw = axp22x_read_raw,
>  };
>  
> +static const struct iio_info axp813_adc_iio_info = {
> +	.read_raw = axp813_read_raw,
> +};
> +
>  static int axp20x_adc_rate(struct axp20x_adc_iio *info, int rate)
>  {
>  	return regmap_update_bits(info->regmap, AXP20X_ADC_RATE,
> @@ -484,6 +588,13 @@ static int axp22x_adc_rate(struct axp20x_adc_iio *info, int rate)
>  				  AXP22X_ADC_RATE_HZ(rate));
>  }
>  
> +static int axp813_adc_rate(struct axp20x_adc_iio *info, int rate)
> +{
> +	return regmap_update_bits(info->regmap, AXP813_ADC_RATE,
> +				 AXP813_ADC_RATE_MASK,
> +				 AXP813_ADC_RATE_HZ(rate));
> +}
> +
>  struct axp_data {
>  	const struct iio_info		*iio_info;
>  	int				num_channels;
> @@ -515,9 +626,20 @@ static const struct axp_data axp22x_data = {
>  	.maps = axp22x_maps,
>  };
>  
> +static const struct axp_data axp813_data = {
> +	.iio_info = &axp813_adc_iio_info,
> +	.num_channels = ARRAY_SIZE(axp813_adc_channels),
> +	.channels = axp813_adc_channels,
> +	.adc_en1_mask = AXP22X_ADC_EN1_MASK,
> +	.adc_rate = axp813_adc_rate,
> +	.adc_en2 = false,
> +	.maps = axp22x_maps,
> +};
> +
>  static const struct of_device_id axp20x_adc_of_match[] = {
>  	{ .compatible = "x-powers,axp209-adc", .data = (void *)&axp20x_data, },
>  	{ .compatible = "x-powers,axp221-adc", .data = (void *)&axp22x_data, },
> +	{ .compatible = "x-powers,axp813-adc", .data = (void *)&axp813_data, },
>  	{ /* sentinel */ }
>  };
>  MODULE_DEVICE_TABLE(of, axp20x_adc_of_match);
> @@ -525,6 +647,7 @@ MODULE_DEVICE_TABLE(of, axp20x_adc_of_match);
>  static const struct platform_device_id axp20x_adc_id_match[] = {
>  	{ .name = "axp20x-adc", .driver_data = (kernel_ulong_t)&axp20x_data, },
>  	{ .name = "axp22x-adc", .driver_data = (kernel_ulong_t)&axp22x_data, },
> +	{ .name = "axp813-adc", .driver_data = (kernel_ulong_t)&axp813_data, },
>  	{ /* sentinel */ },
>  };
>  MODULE_DEVICE_TABLE(platform, axp20x_adc_id_match);
> diff --git a/include/linux/mfd/axp20x.h b/include/linux/mfd/axp20x.h
> index 080798f..82bf774 100644
> --- a/include/linux/mfd/axp20x.h
> +++ b/include/linux/mfd/axp20x.h
> @@ -266,6 +266,8 @@ enum axp20x_variants {
>  #define AXP288_RT_BATT_V_H		0xa0
>  #define AXP288_RT_BATT_V_L		0xa1
>  
> +#define AXP813_ADC_RATE			0x85
> +
>  /* Fuel Gauge */
>  #define AXP288_FG_RDC1_REG          0xba
>  #define AXP288_FG_RDC0_REG          0xbb

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v3 07/16] iio: adc: axp20x_adc: add support for AXP813 ADC
  2018-01-21 12:26     ` Jonathan Cameron
@ 2018-01-22  8:22       ` Quentin Schulz
  2018-01-28  8:12         ` Jonathan Cameron
  0 siblings, 1 reply; 38+ messages in thread
From: Quentin Schulz @ 2018-01-22  8:22 UTC (permalink / raw)
  To: Jonathan Cameron
  Cc: knaack.h-Mmb7MZpHnFY, lars-Qo5EllUWu/uELgA04lAiVw,
	pmeerw-jW+XmwGofnusTnJN9+BGXg, robh+dt-DgEjT+Ai2ygdnm+yROfE0A,
	mark.rutland-5wv7dgnIgG8, wens-jdAy2FN1RRM,
	sre-DgEjT+Ai2ygdnm+yROfE0A, linux-I+IVW8TIWO2tmTQ+vhA3Yw,
	maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	lee.jones-QSEj5FYQhm4dnm+yROfE0A,
	linux-iio-u79uwXL29TY76Z2rM5mHXA,
	linux-pm-u79uwXL29TY76Z2rM5mHXA,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	thomas.petazzoni-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	linux-sunxi-/JYPxA39Uh5TLH3MbocFFw,
	julian.calaby-Re5JQEeQqe8AvxtiuMwx3w

[-- Attachment #1: Type: text/plain, Size: 9241 bytes --]

Hi Jonathan,

On Sun, Jan 21, 2018 at 12:26:55PM +0000, Jonathan Cameron wrote:
> On Mon, 15 Jan 2018 11:33:41 +0100
> Quentin Schulz <quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org> wrote:
> 
> > The X-Powers AXP813 PMIC is really close to what is already done for
> > AXP20X/AXP22X.
> > 
> > There are two pairs of bits to set the rate (one for Voltage and Current
> > measurements and one for TS/GPIO0 voltage measurements) instead of one.
> > 
> > The register to set the ADC rates is different from the one for
> > AXP20X/AXP22X.
> > 
> > GPIO0 can be used as an ADC (measuring Volts) unlike for AXP22X.
> > 
> > The scales to apply to the different inputs are unlike the ones from
> > AXP20X and AXP22X.
> > 
> > Signed-off-by: Quentin Schulz <quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
> > Acked-by: Jonathan Cameron <Jonathan.Cameron-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
> Applied to the togreg branch of iio.git and pushed out as testing
> for the autobuilders to play with it.
> 
> One thing that might be nice to tidy up in this driver though.
> 
> CHECK   drivers/iio/adc/axp20x_adc.c
> drivers/iio/adc/axp20x_adc.c:548:26: warning: dubious: !x & y
> drivers/iio/adc/axp20x_adc.c:553:26: warning: dubious: !x & y
> 
> Those are 'interesting' code constructions.  It may be worth being
> a little more verbose to keep sparse happy and suppress the
> warning.
> 

Would adding a val = !!val; before the call to the macro be "verbose"
enough for you?

Sparse does not complain anymore after that.

Thanks,
Quentin

> Thanks,
> 
> Jonathan
> 
> > ---
> >  drivers/iio/adc/axp20x_adc.c | 123 ++++++++++++++++++++++++++++++++++++-
> >  include/linux/mfd/axp20x.h   |   2 +-
> >  2 files changed, 125 insertions(+)
> > 
> > diff --git a/drivers/iio/adc/axp20x_adc.c b/drivers/iio/adc/axp20x_adc.c
> > index 3968053..7cdb8bc 100644
> > --- a/drivers/iio/adc/axp20x_adc.c
> > +++ b/drivers/iio/adc/axp20x_adc.c
> > @@ -35,8 +35,13 @@
> >  #define AXP20X_GPIO10_IN_RANGE_GPIO1_VAL(x)	(((x) & BIT(0)) << 1)
> >  
> >  #define AXP20X_ADC_RATE_MASK			GENMASK(7, 6)
> > +#define AXP813_V_I_ADC_RATE_MASK		GENMASK(5, 4)
> > +#define AXP813_ADC_RATE_MASK			(AXP20X_ADC_RATE_MASK | AXP813_V_I_ADC_RATE_MASK)
> >  #define AXP20X_ADC_RATE_HZ(x)			((ilog2((x) / 25) << 6) & AXP20X_ADC_RATE_MASK)
> >  #define AXP22X_ADC_RATE_HZ(x)			((ilog2((x) / 100) << 6) & AXP20X_ADC_RATE_MASK)
> > +#define AXP813_TS_GPIO0_ADC_RATE_HZ(x)		AXP20X_ADC_RATE_HZ(x)
> > +#define AXP813_V_I_ADC_RATE_HZ(x)		((ilog2((x) / 100) << 4) & AXP813_V_I_ADC_RATE_MASK)
> > +#define AXP813_ADC_RATE_HZ(x)			(AXP20X_ADC_RATE_HZ(x) | AXP813_V_I_ADC_RATE_HZ(x))
> >  
> >  #define AXP20X_ADC_CHANNEL(_channel, _name, _type, _reg)	\
> >  	{							\
> > @@ -95,6 +100,12 @@ enum axp22x_adc_channel_i {
> >  	AXP22X_BATT_DISCHRG_I,
> >  };
> >  
> > +enum axp813_adc_channel_v {
> > +	AXP813_TS_IN = 0,
> > +	AXP813_GPIO0_V,
> > +	AXP813_BATT_V,
> > +};
> > +
> >  static struct iio_map axp20x_maps[] = {
> >  	{
> >  		.consumer_dev_name = "axp20x-usb-power-supply",
> > @@ -197,6 +208,25 @@ static const struct iio_chan_spec axp22x_adc_channels[] = {
> >  			   AXP20X_BATT_DISCHRG_I_H),
> >  };
> >  
> > +static const struct iio_chan_spec axp813_adc_channels[] = {
> > +	{
> > +		.type = IIO_TEMP,
> > +		.address = AXP22X_PMIC_TEMP_H,
> > +		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
> > +				      BIT(IIO_CHAN_INFO_SCALE) |
> > +				      BIT(IIO_CHAN_INFO_OFFSET),
> > +		.datasheet_name = "pmic_temp",
> > +	},
> > +	AXP20X_ADC_CHANNEL(AXP813_GPIO0_V, "gpio0_v", IIO_VOLTAGE,
> > +			   AXP288_GP_ADC_H),
> > +	AXP20X_ADC_CHANNEL(AXP813_BATT_V, "batt_v", IIO_VOLTAGE,
> > +			   AXP20X_BATT_V_H),
> > +	AXP20X_ADC_CHANNEL(AXP22X_BATT_CHRG_I, "batt_chrg_i", IIO_CURRENT,
> > +			   AXP20X_BATT_CHRG_I_H),
> > +	AXP20X_ADC_CHANNEL(AXP22X_BATT_DISCHRG_I, "batt_dischrg_i", IIO_CURRENT,
> > +			   AXP20X_BATT_DISCHRG_I_H),
> > +};
> > +
> >  static int axp20x_adc_raw(struct iio_dev *indio_dev,
> >  			  struct iio_chan_spec const *chan, int *val)
> >  {
> > @@ -243,6 +273,18 @@ static int axp22x_adc_raw(struct iio_dev *indio_dev,
> >  	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);
> > +
> > +	*val = axp20x_read_variable_width(info->regmap, chan->address, 12);
> > +	if (*val < 0)
> > +		return *val;
> > +
> > +	return IIO_VAL_INT;
> > +}
> > +
> >  static int axp20x_adc_scale_voltage(int channel, int *val, int *val2)
> >  {
> >  	switch (channel) {
> > @@ -273,6 +315,24 @@ static int axp20x_adc_scale_voltage(int channel, int *val, int *val2)
> >  	}
> >  }
> >  
> > +static int axp813_adc_scale_voltage(int channel, int *val, int *val2)
> > +{
> > +	switch (channel) {
> > +	case AXP813_GPIO0_V:
> > +		*val = 0;
> > +		*val2 = 800000;
> > +		return IIO_VAL_INT_PLUS_MICRO;
> > +
> > +	case AXP813_BATT_V:
> > +		*val = 1;
> > +		*val2 = 100000;
> > +		return IIO_VAL_INT_PLUS_MICRO;
> > +
> > +	default:
> > +		return -EINVAL;
> > +	}
> > +}
> > +
> >  static int axp20x_adc_scale_current(int channel, int *val, int *val2)
> >  {
> >  	switch (channel) {
> > @@ -342,6 +402,26 @@ static int axp22x_adc_scale(struct iio_chan_spec const *chan, int *val,
> >  	}
> >  }
> >  
> > +static int axp813_adc_scale(struct iio_chan_spec const *chan, int *val,
> > +			    int *val2)
> > +{
> > +	switch (chan->type) {
> > +	case IIO_VOLTAGE:
> > +		return axp813_adc_scale_voltage(chan->channel, val, val2);
> > +
> > +	case IIO_CURRENT:
> > +		*val = 1;
> > +		return IIO_VAL_INT;
> > +
> > +	case IIO_TEMP:
> > +		*val = 100;
> > +		return IIO_VAL_INT;
> > +
> > +	default:
> > +		return -EINVAL;
> > +	}
> > +}
> > +
> >  static int axp20x_adc_offset_voltage(struct iio_dev *indio_dev, int channel,
> >  				     int *val)
> >  {
> > @@ -425,6 +505,26 @@ static int axp22x_read_raw(struct iio_dev *indio_dev,
> >  	}
> >  }
> >  
> > +static int axp813_read_raw(struct iio_dev *indio_dev,
> > +			   struct iio_chan_spec const *chan, int *val,
> > +			   int *val2, long mask)
> > +{
> > +	switch (mask) {
> > +	case IIO_CHAN_INFO_OFFSET:
> > +		*val = -2667;
> > +		return IIO_VAL_INT;
> > +
> > +	case IIO_CHAN_INFO_SCALE:
> > +		return axp813_adc_scale(chan, val, val2);
> > +
> > +	case IIO_CHAN_INFO_RAW:
> > +		return axp813_adc_raw(indio_dev, chan, val);
> > +
> > +	default:
> > +		return -EINVAL;
> > +	}
> > +}
> > +
> >  static int axp20x_write_raw(struct iio_dev *indio_dev,
> >  			    struct iio_chan_spec const *chan, int val, int val2,
> >  			    long mask)
> > @@ -470,6 +570,10 @@ static const struct iio_info axp22x_adc_iio_info = {
> >  	.read_raw = axp22x_read_raw,
> >  };
> >  
> > +static const struct iio_info axp813_adc_iio_info = {
> > +	.read_raw = axp813_read_raw,
> > +};
> > +
> >  static int axp20x_adc_rate(struct axp20x_adc_iio *info, int rate)
> >  {
> >  	return regmap_update_bits(info->regmap, AXP20X_ADC_RATE,
> > @@ -484,6 +588,13 @@ static int axp22x_adc_rate(struct axp20x_adc_iio *info, int rate)
> >  				  AXP22X_ADC_RATE_HZ(rate));
> >  }
> >  
> > +static int axp813_adc_rate(struct axp20x_adc_iio *info, int rate)
> > +{
> > +	return regmap_update_bits(info->regmap, AXP813_ADC_RATE,
> > +				 AXP813_ADC_RATE_MASK,
> > +				 AXP813_ADC_RATE_HZ(rate));
> > +}
> > +
> >  struct axp_data {
> >  	const struct iio_info		*iio_info;
> >  	int				num_channels;
> > @@ -515,9 +626,20 @@ static const struct axp_data axp22x_data = {
> >  	.maps = axp22x_maps,
> >  };
> >  
> > +static const struct axp_data axp813_data = {
> > +	.iio_info = &axp813_adc_iio_info,
> > +	.num_channels = ARRAY_SIZE(axp813_adc_channels),
> > +	.channels = axp813_adc_channels,
> > +	.adc_en1_mask = AXP22X_ADC_EN1_MASK,
> > +	.adc_rate = axp813_adc_rate,
> > +	.adc_en2 = false,
> > +	.maps = axp22x_maps,
> > +};
> > +
> >  static const struct of_device_id axp20x_adc_of_match[] = {
> >  	{ .compatible = "x-powers,axp209-adc", .data = (void *)&axp20x_data, },
> >  	{ .compatible = "x-powers,axp221-adc", .data = (void *)&axp22x_data, },
> > +	{ .compatible = "x-powers,axp813-adc", .data = (void *)&axp813_data, },
> >  	{ /* sentinel */ }
> >  };
> >  MODULE_DEVICE_TABLE(of, axp20x_adc_of_match);
> > @@ -525,6 +647,7 @@ MODULE_DEVICE_TABLE(of, axp20x_adc_of_match);
> >  static const struct platform_device_id axp20x_adc_id_match[] = {
> >  	{ .name = "axp20x-adc", .driver_data = (kernel_ulong_t)&axp20x_data, },
> >  	{ .name = "axp22x-adc", .driver_data = (kernel_ulong_t)&axp22x_data, },
> > +	{ .name = "axp813-adc", .driver_data = (kernel_ulong_t)&axp813_data, },
> >  	{ /* sentinel */ },
> >  };
> >  MODULE_DEVICE_TABLE(platform, axp20x_adc_id_match);
> > diff --git a/include/linux/mfd/axp20x.h b/include/linux/mfd/axp20x.h
> > index 080798f..82bf774 100644
> > --- a/include/linux/mfd/axp20x.h
> > +++ b/include/linux/mfd/axp20x.h
> > @@ -266,6 +266,8 @@ enum axp20x_variants {
> >  #define AXP288_RT_BATT_V_H		0xa0
> >  #define AXP288_RT_BATT_V_L		0xa1
> >  
> > +#define AXP813_ADC_RATE			0x85
> > +
> >  /* Fuel Gauge */
> >  #define AXP288_FG_RDC1_REG          0xba
> >  #define AXP288_FG_RDC0_REG          0xbb
> 

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v3 09/16] mfd: axp20x: probe axp20x_adc driver for AXP813
       [not found]     ` <d5792ed6e1e989dde3c9ecdd018286109dfc101d.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
@ 2018-01-23  9:53       ` Lee Jones
  2018-01-23 15:32         ` Chen-Yu Tsai
  0 siblings, 1 reply; 38+ messages in thread
From: Lee Jones @ 2018-01-23  9:53 UTC (permalink / raw)
  To: Quentin Schulz
  Cc: jic23-DgEjT+Ai2ygdnm+yROfE0A, knaack.h-Mmb7MZpHnFY,
	lars-Qo5EllUWu/uELgA04lAiVw, pmeerw-jW+XmwGofnusTnJN9+BGXg,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8,
	wens-jdAy2FN1RRM, sre-DgEjT+Ai2ygdnm+yROfE0A,
	linux-I+IVW8TIWO2tmTQ+vhA3Yw,
	maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	linux-iio-u79uwXL29TY76Z2rM5mHXA,
	linux-pm-u79uwXL29TY76Z2rM5mHXA,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	thomas.petazzoni-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	linux-sunxi-/JYPxA39Uh5TLH3MbocFFw,
	julian.calaby-Re5JQEeQqe8AvxtiuMwx3w

On Mon, 15 Jan 2018, Quentin Schulz wrote:

> This makes the axp20x_adc driver probe with platform device id
> "axp813-adc".
> 
> Signed-off-by: Quentin Schulz <quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
> ---
>  drivers/mfd/axp20x.c | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)

For my own reference:
  Acked-for-MFD-by: Lee Jones <lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>

-- 
Lee Jones
Linaro Services Technical Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v3 06/16] mfd: axp20x: make AXP209/22x cells probe their ADC via DT
       [not found]     ` <8901f920fb8d84f8bf0cb2832f560c78bffc0392.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
@ 2018-01-23  9:54       ` Lee Jones
  2018-01-23 15:32         ` Chen-Yu Tsai
  0 siblings, 1 reply; 38+ messages in thread
From: Lee Jones @ 2018-01-23  9:54 UTC (permalink / raw)
  To: Quentin Schulz
  Cc: jic23-DgEjT+Ai2ygdnm+yROfE0A, knaack.h-Mmb7MZpHnFY,
	lars-Qo5EllUWu/uELgA04lAiVw, pmeerw-jW+XmwGofnusTnJN9+BGXg,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8,
	wens-jdAy2FN1RRM, sre-DgEjT+Ai2ygdnm+yROfE0A,
	linux-I+IVW8TIWO2tmTQ+vhA3Yw,
	maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	linux-iio-u79uwXL29TY76Z2rM5mHXA,
	linux-pm-u79uwXL29TY76Z2rM5mHXA,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	thomas.petazzoni-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	linux-sunxi-/JYPxA39Uh5TLH3MbocFFw,
	julian.calaby-Re5JQEeQqe8AvxtiuMwx3w

On Mon, 15 Jan 2018, Quentin Schulz wrote:

> This makes AXP209 and AXP22x ADCs probe first via DT and then by
> fallback via platform.
> 
> Signed-off-by: Quentin Schulz <quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
> ---
>  drivers/mfd/axp20x.c | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)

For my own reference:
  Acked-for-MFD-by: Lee Jones <lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>

-- 
Lee Jones
Linaro Services Technical Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v3 06/16] mfd: axp20x: make AXP209/22x cells probe their ADC via DT
  2018-01-23  9:54       ` Lee Jones
@ 2018-01-23 15:32         ` Chen-Yu Tsai
  0 siblings, 0 replies; 38+ messages in thread
From: Chen-Yu Tsai @ 2018-01-23 15:32 UTC (permalink / raw)
  To: Lee Jones
  Cc: Quentin Schulz, Jonathan Cameron, Hartmut Knaack,
	Lars-Peter Clausen, Peter Meerwald-Stadler, Rob Herring,
	Mark Rutland, Sebastian Reichel, Russell King, Maxime Ripard,
	linux-iio-u79uwXL29TY76Z2rM5mHXA, open list:THERMAL, devicetree,
	linux-kernel, linux-arm-kernel, Thomas Petazzoni, linux-sunxi,
	Julian Calaby

On Tue, Jan 23, 2018 at 5:54 PM, Lee Jones <lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> wrote:
> On Mon, 15 Jan 2018, Quentin Schulz wrote:
>
>> This makes AXP209 and AXP22x ADCs probe first via DT and then by
>> fallback via platform.
>>
>> Signed-off-by: Quentin Schulz <quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
>> ---
>>  drivers/mfd/axp20x.c | 5 ++++-
>>  1 file changed, 4 insertions(+), 1 deletion(-)
>
> For my own reference:
>   Acked-for-MFD-by: Lee Jones <lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>

Acked-by: Chen-Yu Tsai <wens-jdAy2FN1RRM@public.gmane.org>

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v3 09/16] mfd: axp20x: probe axp20x_adc driver for AXP813
  2018-01-23  9:53       ` Lee Jones
@ 2018-01-23 15:32         ` Chen-Yu Tsai
  0 siblings, 0 replies; 38+ messages in thread
From: Chen-Yu Tsai @ 2018-01-23 15:32 UTC (permalink / raw)
  To: Lee Jones
  Cc: Quentin Schulz, Jonathan Cameron, Hartmut Knaack,
	Lars-Peter Clausen, Peter Meerwald-Stadler, Rob Herring,
	Mark Rutland, Sebastian Reichel, Russell King, Maxime Ripard,
	linux-iio-u79uwXL29TY76Z2rM5mHXA, open list:THERMAL, devicetree,
	linux-kernel, linux-arm-kernel, Thomas Petazzoni, linux-sunxi,
	Julian Calaby

On Tue, Jan 23, 2018 at 5:53 PM, Lee Jones <lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> wrote:
> On Mon, 15 Jan 2018, Quentin Schulz wrote:
>
>> This makes the axp20x_adc driver probe with platform device id
>> "axp813-adc".
>>
>> Signed-off-by: Quentin Schulz <quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
>> ---
>>  drivers/mfd/axp20x.c | 5 ++++-
>>  1 file changed, 4 insertions(+), 1 deletion(-)
>
> For my own reference:
>   Acked-for-MFD-by: Lee Jones <lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>

Acked-by: Chen-Yu Tsai <wens-jdAy2FN1RRM@public.gmane.org>

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v3 04/16] ARM: dtsi: axp209: add node for ADC
       [not found]     ` <ea299dca30bb3d0413d35717522643b5a00e731c.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
@ 2018-01-23 15:33       ` Chen-Yu Tsai
  0 siblings, 0 replies; 38+ messages in thread
From: Chen-Yu Tsai @ 2018-01-23 15:33 UTC (permalink / raw)
  To: Quentin Schulz
  Cc: Jonathan Cameron, Hartmut Knaack, Lars-Peter Clausen,
	Peter Meerwald-Stadler, Rob Herring, Mark Rutland,
	Sebastian Reichel, Russell King, Maxime Ripard, Lee Jones,
	linux-iio-u79uwXL29TY76Z2rM5mHXA, open list:THERMAL, devicetree,
	linux-kernel, linux-arm-kernel, Thomas Petazzoni, linux-sunxi,
	Julian Calaby

On Mon, Jan 15, 2018 at 6:33 PM, Quentin Schulz
<quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org> wrote:
> This adds a DT node for the ADC of the PMIC so that there can be
> consumers of its IIO channels declaring their consumptions via DT.
>
> Signed-off-by: Quentin Schulz <quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>

Acked-by: Chen-Yu Tsai <wens-jdAy2FN1RRM@public.gmane.org>

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v3 05/16] ARM: dtsi: axp22x: add node for ADC
       [not found]     ` <c73ef705e9feacde577de66355a2033b419ca004.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
@ 2018-01-23 15:33       ` Chen-Yu Tsai
  0 siblings, 0 replies; 38+ messages in thread
From: Chen-Yu Tsai @ 2018-01-23 15:33 UTC (permalink / raw)
  To: Quentin Schulz
  Cc: Jonathan Cameron, Hartmut Knaack, Lars-Peter Clausen,
	Peter Meerwald-Stadler, Rob Herring, Mark Rutland,
	Sebastian Reichel, Russell King, Maxime Ripard, Lee Jones,
	linux-iio-u79uwXL29TY76Z2rM5mHXA, open list:THERMAL, devicetree,
	linux-kernel, linux-arm-kernel, Thomas Petazzoni, linux-sunxi,
	Julian Calaby

On Mon, Jan 15, 2018 at 6:33 PM, Quentin Schulz
<quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org> wrote:
> This adds a DT node for the ADC of the PMIC so that there can be
> consumers of its IIO channels declaring their consumptions via DT.
>
> Signed-off-by: Quentin Schulz <quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>

Acked-by: Chen-Yu Tsai <wens-jdAy2FN1RRM@public.gmane.org>

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v3 08/16] ARM: dtsi: axp81x: add node for ADC
       [not found]     ` <eb8f23f57dc9d7d7c87c5eea2f85e90470e27c83.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
@ 2018-01-23 15:33       ` Chen-Yu Tsai
  0 siblings, 0 replies; 38+ messages in thread
From: Chen-Yu Tsai @ 2018-01-23 15:33 UTC (permalink / raw)
  To: Quentin Schulz
  Cc: Jonathan Cameron, Hartmut Knaack, Lars-Peter Clausen,
	Peter Meerwald-Stadler, Rob Herring, Mark Rutland,
	Sebastian Reichel, Russell King, Maxime Ripard, Lee Jones,
	linux-iio-u79uwXL29TY76Z2rM5mHXA, open list:THERMAL, devicetree,
	linux-kernel, linux-arm-kernel, Thomas Petazzoni, linux-sunxi,
	Julian Calaby

On Mon, Jan 15, 2018 at 6:33 PM, Quentin Schulz
<quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org> wrote:
> This adds a DT node for the ADC of the PMIC so that there can be
> consumers of its IIO channels declaring their consumptions via DT.
>
> Signed-off-by: Quentin Schulz <quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>

Acked-by: Chen-Yu Tsai <wens-jdAy2FN1RRM@public.gmane.org>

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v3 10/16] power: supply: axp20x_battery: use data structure instead of ID for
       [not found]     ` <c4129842e1254289ebb3ad1755879a3722bac1cf.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
@ 2018-01-23 15:39       ` Chen-Yu Tsai
  0 siblings, 0 replies; 38+ messages in thread
From: Chen-Yu Tsai @ 2018-01-23 15:39 UTC (permalink / raw)
  To: Quentin Schulz
  Cc: Jonathan Cameron, Hartmut Knaack, Lars-Peter Clausen,
	Peter Meerwald-Stadler, Rob Herring, Mark Rutland,
	Sebastian Reichel, Russell King, Maxime Ripard, Lee Jones,
	linux-iio-u79uwXL29TY76Z2rM5mHXA, open list:THERMAL, devicetree,
	linux-kernel, linux-arm-kernel, Thomas Petazzoni, linux-sunxi,
	Julian Calaby

On Mon, Jan 15, 2018 at 6:33 PM, Quentin Schulz
<quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org> wrote:
> variant specific code

Your subject somehow got wrapped incorrectly.

>
> We used to use IDs to select a function or a feature depending on the
> variant. It's easier to maintain the code by adding data structure
> storing the few differences between variants so that we don't add a pile
> of if conditions.
>
> Let's use this data structure and update the code to use it.
>
> Signed-off-by: Quentin Schulz <quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
> ---
>  drivers/power/supply/axp20x_battery.c | 100 +++++++++++++++++----------
>  1 file changed, 66 insertions(+), 34 deletions(-)
>
> diff --git a/drivers/power/supply/axp20x_battery.c b/drivers/power/supply/axp20x_battery.c
> index 7494f0f..d73c78f 100644
> --- a/drivers/power/supply/axp20x_battery.c
> +++ b/drivers/power/supply/axp20x_battery.c
> @@ -53,6 +53,16 @@
>
>  #define AXP20X_V_OFF_MASK              GENMASK(2, 0)
>
> +struct axp20x_batt_ps;
> +
> +struct axp_data {
> +       int     ccc_scale;
> +       int     ccc_offset;
> +       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);
> +};
> +
>  struct axp20x_batt_ps {
>         struct regmap *regmap;
>         struct power_supply *batt;
> @@ -62,7 +72,7 @@ struct axp20x_batt_ps {
>         struct iio_channel *batt_v;
>         /* Maximum constant charge current */
>         unsigned int max_ccc;
> -       u8 axp_id;
> +       struct axp_data *data;

const.

>  };
>
>  static int axp20x_battery_get_max_voltage(struct axp20x_batt_ps *axp20x_batt,
> @@ -123,22 +133,6 @@ static int axp22x_battery_get_max_voltage(struct axp20x_batt_ps *axp20x_batt,
>         return 0;
>  }
>
> -static void raw_to_constant_charge_current(struct axp20x_batt_ps *axp, int *val)
> -{
> -       if (axp->axp_id == AXP209_ID)
> -               *val = *val * 100000 + 300000;
> -       else
> -               *val = *val * 150000 + 300000;
> -}
> -
> -static void constant_charge_current_to_raw(struct axp20x_batt_ps *axp, int *val)
> -{
> -       if (axp->axp_id == AXP209_ID)
> -               *val = (*val - 300000) / 100000;
> -       else
> -               *val = (*val - 300000) / 150000;
> -}
> -
>  static int axp20x_get_constant_charge_current(struct axp20x_batt_ps *axp,
>                                               int *val)
>  {
> @@ -150,7 +144,7 @@ static int axp20x_get_constant_charge_current(struct axp20x_batt_ps *axp,
>
>         *val &= AXP20X_CHRG_CTRL1_TGT_CURR;
>
> -       raw_to_constant_charge_current(axp, val);
> +       *val = *val * axp->data->ccc_scale + axp->data->ccc_offset;
>
>         return 0;
>  }
> @@ -269,8 +263,7 @@ static int axp20x_battery_get_prop(struct power_supply *psy,
>                 if (ret)
>                         return ret;
>
> -               if (axp20x_batt->axp_id == AXP221_ID &&
> -                   !(reg & AXP22X_FG_VALID))
> +               if (axp20x_batt->data->has_fg_valid && !(reg & AXP22X_FG_VALID))
>                         return -EINVAL;
>
>                 /*
> @@ -281,11 +274,8 @@ static int axp20x_battery_get_prop(struct power_supply *psy,
>                 break;
>
>         case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
> -               if (axp20x_batt->axp_id == AXP209_ID)
> -                       return axp20x_battery_get_max_voltage(axp20x_batt,
> -                                                             &val->intval);
> -               return axp22x_battery_get_max_voltage(axp20x_batt,
> -                                                     &val->intval);
> +               return axp20x_batt->data->get_max_voltage(axp20x_batt,
> +                                                         &val->intval);
>
>         case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
>                 ret = regmap_read(axp20x_batt->regmap, AXP20X_V_OFF, &reg);
> @@ -312,6 +302,32 @@ static int axp20x_battery_get_prop(struct power_supply *psy,
>         return 0;
>  }
>
> +static int axp22x_battery_set_max_voltage(struct axp20x_batt_ps *axp20x_batt,
> +                                         int val)
> +{
> +       switch (val) {
> +       case 4100000:
> +               val = AXP20X_CHRG_CTRL1_TGT_4_1V;
> +               break;
> +
> +       case 4200000:
> +               val = AXP20X_CHRG_CTRL1_TGT_4_2V;
> +               break;
> +
> +       default:
> +               /*
> +                * AXP20x max voltage can be set to 4.36V and AXP22X max voltage
> +                * can be set to 4.22V and 4.24V, but these voltages are too
> +                * high for Lithium based batteries (AXP PMICs are supposed to
> +                * be used with these kinds of battery).
> +                */
> +               return -EINVAL;
> +       }
> +
> +       return regmap_update_bits(axp20x_batt->regmap, AXP20X_CHRG_CTRL1,
> +                                 AXP20X_CHRG_CTRL1_TGT_VOLT, val);
> +}
> +
>  static int axp20x_battery_set_max_voltage(struct axp20x_batt_ps *axp20x_batt,
>                                           int val)
>  {
> @@ -321,9 +337,6 @@ static int axp20x_battery_set_max_voltage(struct axp20x_batt_ps *axp20x_batt,
>                 break;
>
>         case 4150000:
> -               if (axp20x_batt->axp_id == AXP221_ID)
> -                       return -EINVAL;
> -
>                 val = AXP20X_CHRG_CTRL1_TGT_4_15V;
>                 break;
>
> @@ -351,7 +364,8 @@ static int axp20x_set_constant_charge_current(struct axp20x_batt_ps *axp_batt,
>         if (charge_current > axp_batt->max_ccc)
>                 return -EINVAL;
>
> -       constant_charge_current_to_raw(axp_batt, &charge_current);
> +       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)
>                 return -EINVAL;
> @@ -365,12 +379,14 @@ static int axp20x_set_max_constant_charge_current(struct axp20x_batt_ps *axp,
>  {
>         bool lower_max = false;
>
> -       constant_charge_current_to_raw(axp, &charge_current);
> +       charge_current = (charge_current - axp->data->ccc_offset) /
> +               axp->data->ccc_scale;
>
>         if (charge_current > AXP20X_CHRG_CTRL1_TGT_CURR || charge_current < 0)
>                 return -EINVAL;
>
> -       raw_to_constant_charge_current(axp, &charge_current);
> +       charge_current = charge_current * axp->data->ccc_scale +
> +               axp->data->ccc_offset;
>
>         if (charge_current > axp->max_ccc)
>                 dev_warn(axp->dev,
> @@ -460,13 +476,28 @@ static const struct power_supply_desc axp20x_batt_ps_desc = {
>         .set_property = axp20x_battery_set_prop,
>  };
>
> +struct axp_data axp209_data = {

const.

> +       .ccc_scale = 100000,
> +       .ccc_offset = 300000,
> +       .get_max_voltage = axp20x_battery_get_max_voltage,
> +       .set_max_voltage = axp20x_battery_set_max_voltage,
> +};
> +
> +struct axp_data axp221_data = {

const.

> +       .ccc_scale = 150000,
> +       .ccc_offset = 300000,
> +       .has_fg_valid = true,
> +       .get_max_voltage = axp22x_battery_get_max_voltage,
> +       .set_max_voltage = axp22x_battery_set_max_voltage,
> +};
> +
>  static const struct of_device_id axp20x_battery_ps_id[] = {
>         {
>                 .compatible = "x-powers,axp209-battery-power-supply",
> -               .data = (void *)AXP209_ID,
> +               .data = (void *)&axp209_data,
>         }, {
>                 .compatible = "x-powers,axp221-battery-power-supply",
> -               .data = (void *)AXP221_ID,
> +               .data = (void *)&axp221_data,
>         }, { /* sentinel */ },
>  };
>  MODULE_DEVICE_TABLE(of, axp20x_battery_ps_id);
> @@ -476,6 +507,7 @@ static int axp20x_power_probe(struct platform_device *pdev)
>         struct axp20x_batt_ps *axp20x_batt;
>         struct power_supply_config psy_cfg = {};
>         struct power_supply_battery_info info;
> +       struct device *dev = &pdev->dev;
>
>         if (!of_device_is_available(pdev->dev.of_node))
>                 return -ENODEV;
> @@ -516,7 +548,7 @@ static int axp20x_power_probe(struct platform_device *pdev)
>         psy_cfg.drv_data = axp20x_batt;
>         psy_cfg.of_node = pdev->dev.of_node;
>
> -       axp20x_batt->axp_id = (uintptr_t)of_device_get_match_data(&pdev->dev);
> +       axp20x_batt->data = (struct axp_data *)of_device_get_match_data(dev);

const in the cast.

Otherwise,

Reviewed-by: Chen-Yu Tsai <wens-jdAy2FN1RRM@public.gmane.org>

>
>         axp20x_batt->batt = devm_power_supply_register(&pdev->dev,
>                                                        &axp20x_batt_ps_desc,
> --
> git-series 0.9.1

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v3 11/16] dt-bindings: power: supply: axp20x: add AXP813 battery DT binding
       [not found]     ` <7b53727c33207f4b7ae36218c99abfb86876e716.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
@ 2018-01-23 15:43       ` Chen-Yu Tsai
  0 siblings, 0 replies; 38+ messages in thread
From: Chen-Yu Tsai @ 2018-01-23 15:43 UTC (permalink / raw)
  To: Quentin Schulz
  Cc: Jonathan Cameron, Hartmut Knaack, Lars-Peter Clausen,
	Peter Meerwald-Stadler, Rob Herring, Mark Rutland,
	Sebastian Reichel, Russell King, Maxime Ripard, Lee Jones,
	linux-iio-u79uwXL29TY76Z2rM5mHXA, open list:THERMAL, devicetree,
	linux-kernel, linux-arm-kernel, Thomas Petazzoni, linux-sunxi,
	Julian Calaby

On Mon, Jan 15, 2018 at 6:33 PM, Quentin Schulz
<quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org> wrote:
> The AXP813 can have a battery as power supply, so let's add it to the
> list of compatibles.
>
> Signed-off-by: Quentin Schulz <quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
> Reviewed-by: Rob Herring <robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>

Acked-by: Chen-Yu Tsai <wens-jdAy2FN1RRM@public.gmane.org>

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v3 12/16] power: supply: axp20x_battery: add support for AXP813
       [not found]     ` <42b2e555083abbab43e48362175dc9c2eeeedf3c.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
@ 2018-01-23 15:47       ` Chen-Yu Tsai
  0 siblings, 0 replies; 38+ messages in thread
From: Chen-Yu Tsai @ 2018-01-23 15:47 UTC (permalink / raw)
  To: Quentin Schulz
  Cc: Jonathan Cameron, Hartmut Knaack, Lars-Peter Clausen,
	Peter Meerwald-Stadler, Rob Herring, Mark Rutland,
	Sebastian Reichel, Russell King, Maxime Ripard, Lee Jones,
	linux-iio-u79uwXL29TY76Z2rM5mHXA, open list:THERMAL, devicetree,
	linux-kernel, linux-arm-kernel, Thomas Petazzoni, linux-sunxi,
	Julian Calaby

On Mon, Jan 15, 2018 at 6:33 PM, Quentin Schulz
<quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org> wrote:
> The X-Powers AXP813 PMIC has got some slight differences from
> AXP20X/AXP22X PMICs:
>  - the maximum voltage supplied by the PMIC is 4.35 instead of 4.36/4.24
>  for AXP20X/AXP22X,
>  - the constant charge current formula is different,
>
> It also has a bit to tell whether the battery percentage returned by the
> PMIC is valid.
>
> Signed-off-by: Quentin Schulz <quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>

Reviewed-by: Chen-Yu Tsai <wens-jdAy2FN1RRM@public.gmane.org>

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v3 13/16] mfd: axp20x: add battery power supply cell for AXP813
       [not found]     ` <76855b0d3b9eb75e00eb6a058db5b4a33b0558c6.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
@ 2018-01-23 15:50       ` Chen-Yu Tsai
  0 siblings, 0 replies; 38+ messages in thread
From: Chen-Yu Tsai @ 2018-01-23 15:50 UTC (permalink / raw)
  To: Quentin Schulz
  Cc: Jonathan Cameron, Hartmut Knaack, Lars-Peter Clausen,
	Peter Meerwald-Stadler, Rob Herring, Mark Rutland,
	Sebastian Reichel, Russell King, Maxime Ripard, Lee Jones,
	linux-iio-u79uwXL29TY76Z2rM5mHXA, open list:THERMAL, devicetree,
	linux-kernel, linux-arm-kernel, Thomas Petazzoni, linux-sunxi,
	Julian Calaby

On Mon, Jan 15, 2018 at 6:33 PM, Quentin Schulz
<quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org> wrote:
> As axp20x-battery-power-supply now supports AXP813, add a cell for it.
>
> Signed-off-by: Quentin Schulz <quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
> Acked-for-MFD-by: Lee Jones <lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>

Acked-by: Chen-Yu Tsai <wens-jdAy2FN1RRM@public.gmane.org>

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v3 14/16] ARM: dtsi: axp81x: add battery power supply subnode
       [not found]     ` <9c045de8dcee9a71803978855762e272efdc41d3.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
@ 2018-01-23 15:50       ` Chen-Yu Tsai
  0 siblings, 0 replies; 38+ messages in thread
From: Chen-Yu Tsai @ 2018-01-23 15:50 UTC (permalink / raw)
  To: Quentin Schulz
  Cc: Jonathan Cameron, Hartmut Knaack, Lars-Peter Clausen,
	Peter Meerwald-Stadler, Rob Herring, Mark Rutland,
	Sebastian Reichel, Russell King, Maxime Ripard, Lee Jones,
	linux-iio-u79uwXL29TY76Z2rM5mHXA, open list:THERMAL, devicetree,
	linux-kernel, linux-arm-kernel, Thomas Petazzoni, linux-sunxi,
	Julian Calaby

On Mon, Jan 15, 2018 at 6:33 PM, Quentin Schulz
<quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org> wrote:
> The X-Powers AXP81X PMIC exposes battery supply various data such as
> the battery status (charging, discharging, full, dead), current max
> limit, current current, battery capacity (in percentage), voltage max
> and min limits, current voltage, and battery capacity (in Ah).
>
> This adds the battery power supply subnode for AXP81X PMIC.
>
> Signed-off-by: Quentin Schulz <quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>

Acked-by: Chen-Yu Tsai <wens-jdAy2FN1RRM@public.gmane.org>

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [linux-sunxi] [PATCH v3 15/16] ARM: dtsi: sun8i: a711: enable battery power supply subnode
  2018-01-15 10:33   ` [PATCH v3 15/16] ARM: dtsi: sun8i: a711: enable " Quentin Schulz
@ 2018-01-23 15:51     ` Chen-Yu Tsai
  0 siblings, 0 replies; 38+ messages in thread
From: Chen-Yu Tsai @ 2018-01-23 15:51 UTC (permalink / raw)
  To: Quentin Schulz
  Cc: Jonathan Cameron, Hartmut Knaack, Lars-Peter Clausen,
	Peter Meerwald-Stadler, Rob Herring, Mark Rutland,
	Sebastian Reichel, Russell King, Maxime Ripard, Lee Jones,
	linux-iio, open list:THERMAL, devicetree, linux-kernel,
	linux-arm-kernel, Thomas Petazzoni, linux-sunxi, Julian Calaby

On Mon, Jan 15, 2018 at 6:33 PM, Quentin Schulz
<quentin.schulz@free-electrons.com> wrote:
> The TBS A711 has an AXP813 PMIC and a soldered battery, thus, we enable
> the battery power supply subnode in its Device Tree.
>
> Signed-off-by: Quentin Schulz <quentin.schulz@free-electrons.com>

Acked-by: Chen-Yu Tsai <wens@csie.org>

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v3 16/16] ARM: dtsi: axp81x: remove IP name from DT node name
       [not found]     ` <6e881951c43b8829cd509c3db06fa5520f71e779.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
@ 2018-01-23 15:51       ` Chen-Yu Tsai
  0 siblings, 0 replies; 38+ messages in thread
From: Chen-Yu Tsai @ 2018-01-23 15:51 UTC (permalink / raw)
  To: Quentin Schulz
  Cc: Jonathan Cameron, Hartmut Knaack, Lars-Peter Clausen,
	Peter Meerwald-Stadler, Rob Herring, Mark Rutland,
	Sebastian Reichel, Russell King, Maxime Ripard, Lee Jones,
	linux-iio-u79uwXL29TY76Z2rM5mHXA, open list:THERMAL, devicetree,
	linux-kernel, linux-arm-kernel, Thomas Petazzoni, linux-sunxi,
	Julian Calaby

On Mon, Jan 15, 2018 at 6:33 PM, Quentin Schulz
<quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org> wrote:
> The DT node should be named after its functionality and not after the
> IP it's defining.
>
> Signed-off-by: Quentin Schulz <quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>

Acked-by: Chen-Yu Tsai <wens-jdAy2FN1RRM@public.gmane.org>

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v3 00/16] add support for AXP813 ADC and battery power supply
  2018-01-15 10:33 [PATCH v3 00/16] add support for AXP813 ADC and battery power supply Quentin Schulz
       [not found] ` <cover.2e5329bf5475a5160e613a4eb1e1377c662ce56e.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
@ 2018-01-23 15:55 ` Chen-Yu Tsai
  1 sibling, 0 replies; 38+ messages in thread
From: Chen-Yu Tsai @ 2018-01-23 15:55 UTC (permalink / raw)
  To: Quentin Schulz, Sebastian Reichel, Lee Jones, Maxime Ripard
  Cc: Hartmut Knaack, Lars-Peter Clausen, Peter Meerwald-Stadler,
	Rob Herring, Mark Rutland, Jonathan Cameron, Russell King,
	linux-iio, open list:THERMAL, devicetree, linux-kernel,
	linux-arm-kernel, Thomas Petazzoni, linux-sunxi, Julian Calaby

On Mon, Jan 15, 2018 at 6:33 PM, Quentin Schulz
<quentin.schulz@free-electrons.com> wrote:
> The AXP813 PMIC is relatively close to the already supported AXP20X and
> AXP22X. It provides three different power outputs: battery, AC and USB, and
> measures a few different things: temperature, power supply status, current
> current and voltage supplied, maximum current limit, battery capacity, min
> and max voltage limits.
>
> One of its two GPIOs can be used as an ADC.
>
> There are a few differences with AXP20X/AXP22X PMICs though:
>   - a different constant charge current formula,
>   - battery temperature, GPIO0 and battery voltages are the only voltages
>   measurable,
>   - all data are stored on 12 bits (AXP20X/AXP22X had one type of data that
>   was stored on 13 bits),
>   - different scales and offsets,
>   - a different ADC rate formula and register,
>
> This patch series adds support for the PMIC's ADC and battery power supply
> in the existing drivers.
>
> Make the axp20x MFD automatically probe the ADC driver, add the battery
> power supply node in axp81x node and enable it for the TBS A711 since it
> has a soldered battery.
>
> I suggest patches:
>   - 4,5,8,14,15,16 go through Maxime and Chen-Yu's tree,
>   - 1,2,3,7 go through Jonathan's tree,
>   - 6,9,13 go through Lee's tree,
>   - 10,11,12 go through Sebastian's tree,

I think I've reviewed or acked all the patches that haven't been merged.
The different drivers are bound together through the device tree, so the
various patches are safe to go through their respective trees, as Quentin
suggested.

Thanks!
ChenYu

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v3 07/16] iio: adc: axp20x_adc: add support for AXP813 ADC
  2018-01-22  8:22       ` Quentin Schulz
@ 2018-01-28  8:12         ` Jonathan Cameron
  0 siblings, 0 replies; 38+ messages in thread
From: Jonathan Cameron @ 2018-01-28  8:12 UTC (permalink / raw)
  To: Quentin Schulz
  Cc: knaack.h-Mmb7MZpHnFY, lars-Qo5EllUWu/uELgA04lAiVw,
	pmeerw-jW+XmwGofnusTnJN9+BGXg, robh+dt-DgEjT+Ai2ygdnm+yROfE0A,
	mark.rutland-5wv7dgnIgG8, wens-jdAy2FN1RRM,
	sre-DgEjT+Ai2ygdnm+yROfE0A, linux-I+IVW8TIWO2tmTQ+vhA3Yw,
	maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	lee.jones-QSEj5FYQhm4dnm+yROfE0A,
	linux-iio-u79uwXL29TY76Z2rM5mHXA,
	linux-pm-u79uwXL29TY76Z2rM5mHXA,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	thomas.petazzoni-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8,
	linux-sunxi-/JYPxA39Uh5TLH3MbocFFw,
	julian.calaby-Re5JQEeQqe8AvxtiuMwx3w

On Mon, 22 Jan 2018 09:22:25 +0100
Quentin Schulz <quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org> wrote:

> Hi Jonathan,
> 
> On Sun, Jan 21, 2018 at 12:26:55PM +0000, Jonathan Cameron wrote:
> > On Mon, 15 Jan 2018 11:33:41 +0100
> > Quentin Schulz <quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org> wrote:
> >   
> > > The X-Powers AXP813 PMIC is really close to what is already done for
> > > AXP20X/AXP22X.
> > > 
> > > There are two pairs of bits to set the rate (one for Voltage and Current
> > > measurements and one for TS/GPIO0 voltage measurements) instead of one.
> > > 
> > > The register to set the ADC rates is different from the one for
> > > AXP20X/AXP22X.
> > > 
> > > GPIO0 can be used as an ADC (measuring Volts) unlike for AXP22X.
> > > 
> > > The scales to apply to the different inputs are unlike the ones from
> > > AXP20X and AXP22X.
> > > 
> > > Signed-off-by: Quentin Schulz <quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
> > > Acked-by: Jonathan Cameron <Jonathan.Cameron-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>  
> > Applied to the togreg branch of iio.git and pushed out as testing
> > for the autobuilders to play with it.
> > 
> > One thing that might be nice to tidy up in this driver though.
> > 
> > CHECK   drivers/iio/adc/axp20x_adc.c
> > drivers/iio/adc/axp20x_adc.c:548:26: warning: dubious: !x & y
> > drivers/iio/adc/axp20x_adc.c:553:26: warning: dubious: !x & y
> > 
> > Those are 'interesting' code constructions.  It may be worth being
> > a little more verbose to keep sparse happy and suppress the
> > warning.
> >   
> 
> Would adding a val = !!val; before the call to the macro be "verbose"
> enough for you?
> 
> Sparse does not complain anymore after that.
I'd just use a good old fashioned if statement.  Few more lines of
code but clearer and will keep sparse happy.

Jonathan

> 
> Thanks,
> Quentin
> 
> > Thanks,
> > 
> > Jonathan
> >   
> > > ---
> > >  drivers/iio/adc/axp20x_adc.c | 123 ++++++++++++++++++++++++++++++++++++-
> > >  include/linux/mfd/axp20x.h   |   2 +-
> > >  2 files changed, 125 insertions(+)
> > > 
> > > diff --git a/drivers/iio/adc/axp20x_adc.c b/drivers/iio/adc/axp20x_adc.c
> > > index 3968053..7cdb8bc 100644
> > > --- a/drivers/iio/adc/axp20x_adc.c
> > > +++ b/drivers/iio/adc/axp20x_adc.c
> > > @@ -35,8 +35,13 @@
> > >  #define AXP20X_GPIO10_IN_RANGE_GPIO1_VAL(x)	(((x) & BIT(0)) << 1)
> > >  
> > >  #define AXP20X_ADC_RATE_MASK			GENMASK(7, 6)
> > > +#define AXP813_V_I_ADC_RATE_MASK		GENMASK(5, 4)
> > > +#define AXP813_ADC_RATE_MASK			(AXP20X_ADC_RATE_MASK | AXP813_V_I_ADC_RATE_MASK)
> > >  #define AXP20X_ADC_RATE_HZ(x)			((ilog2((x) / 25) << 6) & AXP20X_ADC_RATE_MASK)
> > >  #define AXP22X_ADC_RATE_HZ(x)			((ilog2((x) / 100) << 6) & AXP20X_ADC_RATE_MASK)
> > > +#define AXP813_TS_GPIO0_ADC_RATE_HZ(x)		AXP20X_ADC_RATE_HZ(x)
> > > +#define AXP813_V_I_ADC_RATE_HZ(x)		((ilog2((x) / 100) << 4) & AXP813_V_I_ADC_RATE_MASK)
> > > +#define AXP813_ADC_RATE_HZ(x)			(AXP20X_ADC_RATE_HZ(x) | AXP813_V_I_ADC_RATE_HZ(x))
> > >  
> > >  #define AXP20X_ADC_CHANNEL(_channel, _name, _type, _reg)	\
> > >  	{							\
> > > @@ -95,6 +100,12 @@ enum axp22x_adc_channel_i {
> > >  	AXP22X_BATT_DISCHRG_I,
> > >  };
> > >  
> > > +enum axp813_adc_channel_v {
> > > +	AXP813_TS_IN = 0,
> > > +	AXP813_GPIO0_V,
> > > +	AXP813_BATT_V,
> > > +};
> > > +
> > >  static struct iio_map axp20x_maps[] = {
> > >  	{
> > >  		.consumer_dev_name = "axp20x-usb-power-supply",
> > > @@ -197,6 +208,25 @@ static const struct iio_chan_spec axp22x_adc_channels[] = {
> > >  			   AXP20X_BATT_DISCHRG_I_H),
> > >  };
> > >  
> > > +static const struct iio_chan_spec axp813_adc_channels[] = {
> > > +	{
> > > +		.type = IIO_TEMP,
> > > +		.address = AXP22X_PMIC_TEMP_H,
> > > +		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
> > > +				      BIT(IIO_CHAN_INFO_SCALE) |
> > > +				      BIT(IIO_CHAN_INFO_OFFSET),
> > > +		.datasheet_name = "pmic_temp",
> > > +	},
> > > +	AXP20X_ADC_CHANNEL(AXP813_GPIO0_V, "gpio0_v", IIO_VOLTAGE,
> > > +			   AXP288_GP_ADC_H),
> > > +	AXP20X_ADC_CHANNEL(AXP813_BATT_V, "batt_v", IIO_VOLTAGE,
> > > +			   AXP20X_BATT_V_H),
> > > +	AXP20X_ADC_CHANNEL(AXP22X_BATT_CHRG_I, "batt_chrg_i", IIO_CURRENT,
> > > +			   AXP20X_BATT_CHRG_I_H),
> > > +	AXP20X_ADC_CHANNEL(AXP22X_BATT_DISCHRG_I, "batt_dischrg_i", IIO_CURRENT,
> > > +			   AXP20X_BATT_DISCHRG_I_H),
> > > +};
> > > +
> > >  static int axp20x_adc_raw(struct iio_dev *indio_dev,
> > >  			  struct iio_chan_spec const *chan, int *val)
> > >  {
> > > @@ -243,6 +273,18 @@ static int axp22x_adc_raw(struct iio_dev *indio_dev,
> > >  	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);
> > > +
> > > +	*val = axp20x_read_variable_width(info->regmap, chan->address, 12);
> > > +	if (*val < 0)
> > > +		return *val;
> > > +
> > > +	return IIO_VAL_INT;
> > > +}
> > > +
> > >  static int axp20x_adc_scale_voltage(int channel, int *val, int *val2)
> > >  {
> > >  	switch (channel) {
> > > @@ -273,6 +315,24 @@ static int axp20x_adc_scale_voltage(int channel, int *val, int *val2)
> > >  	}
> > >  }
> > >  
> > > +static int axp813_adc_scale_voltage(int channel, int *val, int *val2)
> > > +{
> > > +	switch (channel) {
> > > +	case AXP813_GPIO0_V:
> > > +		*val = 0;
> > > +		*val2 = 800000;
> > > +		return IIO_VAL_INT_PLUS_MICRO;
> > > +
> > > +	case AXP813_BATT_V:
> > > +		*val = 1;
> > > +		*val2 = 100000;
> > > +		return IIO_VAL_INT_PLUS_MICRO;
> > > +
> > > +	default:
> > > +		return -EINVAL;
> > > +	}
> > > +}
> > > +
> > >  static int axp20x_adc_scale_current(int channel, int *val, int *val2)
> > >  {
> > >  	switch (channel) {
> > > @@ -342,6 +402,26 @@ static int axp22x_adc_scale(struct iio_chan_spec const *chan, int *val,
> > >  	}
> > >  }
> > >  
> > > +static int axp813_adc_scale(struct iio_chan_spec const *chan, int *val,
> > > +			    int *val2)
> > > +{
> > > +	switch (chan->type) {
> > > +	case IIO_VOLTAGE:
> > > +		return axp813_adc_scale_voltage(chan->channel, val, val2);
> > > +
> > > +	case IIO_CURRENT:
> > > +		*val = 1;
> > > +		return IIO_VAL_INT;
> > > +
> > > +	case IIO_TEMP:
> > > +		*val = 100;
> > > +		return IIO_VAL_INT;
> > > +
> > > +	default:
> > > +		return -EINVAL;
> > > +	}
> > > +}
> > > +
> > >  static int axp20x_adc_offset_voltage(struct iio_dev *indio_dev, int channel,
> > >  				     int *val)
> > >  {
> > > @@ -425,6 +505,26 @@ static int axp22x_read_raw(struct iio_dev *indio_dev,
> > >  	}
> > >  }
> > >  
> > > +static int axp813_read_raw(struct iio_dev *indio_dev,
> > > +			   struct iio_chan_spec const *chan, int *val,
> > > +			   int *val2, long mask)
> > > +{
> > > +	switch (mask) {
> > > +	case IIO_CHAN_INFO_OFFSET:
> > > +		*val = -2667;
> > > +		return IIO_VAL_INT;
> > > +
> > > +	case IIO_CHAN_INFO_SCALE:
> > > +		return axp813_adc_scale(chan, val, val2);
> > > +
> > > +	case IIO_CHAN_INFO_RAW:
> > > +		return axp813_adc_raw(indio_dev, chan, val);
> > > +
> > > +	default:
> > > +		return -EINVAL;
> > > +	}
> > > +}
> > > +
> > >  static int axp20x_write_raw(struct iio_dev *indio_dev,
> > >  			    struct iio_chan_spec const *chan, int val, int val2,
> > >  			    long mask)
> > > @@ -470,6 +570,10 @@ static const struct iio_info axp22x_adc_iio_info = {
> > >  	.read_raw = axp22x_read_raw,
> > >  };
> > >  
> > > +static const struct iio_info axp813_adc_iio_info = {
> > > +	.read_raw = axp813_read_raw,
> > > +};
> > > +
> > >  static int axp20x_adc_rate(struct axp20x_adc_iio *info, int rate)
> > >  {
> > >  	return regmap_update_bits(info->regmap, AXP20X_ADC_RATE,
> > > @@ -484,6 +588,13 @@ static int axp22x_adc_rate(struct axp20x_adc_iio *info, int rate)
> > >  				  AXP22X_ADC_RATE_HZ(rate));
> > >  }
> > >  
> > > +static int axp813_adc_rate(struct axp20x_adc_iio *info, int rate)
> > > +{
> > > +	return regmap_update_bits(info->regmap, AXP813_ADC_RATE,
> > > +				 AXP813_ADC_RATE_MASK,
> > > +				 AXP813_ADC_RATE_HZ(rate));
> > > +}
> > > +
> > >  struct axp_data {
> > >  	const struct iio_info		*iio_info;
> > >  	int				num_channels;
> > > @@ -515,9 +626,20 @@ static const struct axp_data axp22x_data = {
> > >  	.maps = axp22x_maps,
> > >  };
> > >  
> > > +static const struct axp_data axp813_data = {
> > > +	.iio_info = &axp813_adc_iio_info,
> > > +	.num_channels = ARRAY_SIZE(axp813_adc_channels),
> > > +	.channels = axp813_adc_channels,
> > > +	.adc_en1_mask = AXP22X_ADC_EN1_MASK,
> > > +	.adc_rate = axp813_adc_rate,
> > > +	.adc_en2 = false,
> > > +	.maps = axp22x_maps,
> > > +};
> > > +
> > >  static const struct of_device_id axp20x_adc_of_match[] = {
> > >  	{ .compatible = "x-powers,axp209-adc", .data = (void *)&axp20x_data, },
> > >  	{ .compatible = "x-powers,axp221-adc", .data = (void *)&axp22x_data, },
> > > +	{ .compatible = "x-powers,axp813-adc", .data = (void *)&axp813_data, },
> > >  	{ /* sentinel */ }
> > >  };
> > >  MODULE_DEVICE_TABLE(of, axp20x_adc_of_match);
> > > @@ -525,6 +647,7 @@ MODULE_DEVICE_TABLE(of, axp20x_adc_of_match);
> > >  static const struct platform_device_id axp20x_adc_id_match[] = {
> > >  	{ .name = "axp20x-adc", .driver_data = (kernel_ulong_t)&axp20x_data, },
> > >  	{ .name = "axp22x-adc", .driver_data = (kernel_ulong_t)&axp22x_data, },
> > > +	{ .name = "axp813-adc", .driver_data = (kernel_ulong_t)&axp813_data, },
> > >  	{ /* sentinel */ },
> > >  };
> > >  MODULE_DEVICE_TABLE(platform, axp20x_adc_id_match);
> > > diff --git a/include/linux/mfd/axp20x.h b/include/linux/mfd/axp20x.h
> > > index 080798f..82bf774 100644
> > > --- a/include/linux/mfd/axp20x.h
> > > +++ b/include/linux/mfd/axp20x.h
> > > @@ -266,6 +266,8 @@ enum axp20x_variants {
> > >  #define AXP288_RT_BATT_V_H		0xa0
> > >  #define AXP288_RT_BATT_V_L		0xa1
> > >  
> > > +#define AXP813_ADC_RATE			0x85
> > > +
> > >  /* Fuel Gauge */
> > >  #define AXP288_FG_RDC1_REG          0xba
> > >  #define AXP288_FG_RDC0_REG          0xbb  
> >   

^ permalink raw reply	[flat|nested] 38+ messages in thread

end of thread, other threads:[~2018-01-28  8:12 UTC | newest]

Thread overview: 38+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-01-15 10:33 [PATCH v3 00/16] add support for AXP813 ADC and battery power supply Quentin Schulz
     [not found] ` <cover.2e5329bf5475a5160e613a4eb1e1377c662ce56e.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
2018-01-15 10:33   ` [PATCH v3 01/16] iio: adc: axp20x_adc: put ADC rate setting in a per-variant function Quentin Schulz
     [not found]     ` <9488159b43c4cc8418afa9d1562d972c4631cb02.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
2018-01-21 12:13       ` Jonathan Cameron
2018-01-15 10:33   ` [PATCH v3 02/16] dt-bindings: iio: adc: add binding for X-Powers AXP PMICs ADC Quentin Schulz
2018-01-21 12:18     ` Jonathan Cameron
2018-01-15 10:33   ` [PATCH v3 03/16] iio: adc: axp20x_adc: make it possible to probe from DT Quentin Schulz
2018-01-21 12:22     ` Jonathan Cameron
2018-01-15 10:33   ` [PATCH v3 04/16] ARM: dtsi: axp209: add node for ADC Quentin Schulz
     [not found]     ` <ea299dca30bb3d0413d35717522643b5a00e731c.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
2018-01-23 15:33       ` Chen-Yu Tsai
2018-01-15 10:33   ` [PATCH v3 05/16] ARM: dtsi: axp22x: " Quentin Schulz
     [not found]     ` <c73ef705e9feacde577de66355a2033b419ca004.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
2018-01-23 15:33       ` Chen-Yu Tsai
2018-01-15 10:33   ` [PATCH v3 06/16] mfd: axp20x: make AXP209/22x cells probe their ADC via DT Quentin Schulz
     [not found]     ` <8901f920fb8d84f8bf0cb2832f560c78bffc0392.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
2018-01-23  9:54       ` Lee Jones
2018-01-23 15:32         ` Chen-Yu Tsai
2018-01-15 10:33   ` [PATCH v3 07/16] iio: adc: axp20x_adc: add support for AXP813 ADC Quentin Schulz
2018-01-21 12:26     ` Jonathan Cameron
2018-01-22  8:22       ` Quentin Schulz
2018-01-28  8:12         ` Jonathan Cameron
2018-01-15 10:33   ` [PATCH v3 08/16] ARM: dtsi: axp81x: add node for ADC Quentin Schulz
     [not found]     ` <eb8f23f57dc9d7d7c87c5eea2f85e90470e27c83.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
2018-01-23 15:33       ` Chen-Yu Tsai
2018-01-15 10:33   ` [PATCH v3 09/16] mfd: axp20x: probe axp20x_adc driver for AXP813 Quentin Schulz
     [not found]     ` <d5792ed6e1e989dde3c9ecdd018286109dfc101d.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
2018-01-23  9:53       ` Lee Jones
2018-01-23 15:32         ` Chen-Yu Tsai
2018-01-15 10:33   ` [PATCH v3 10/16] power: supply: axp20x_battery: use data structure instead of ID for Quentin Schulz
     [not found]     ` <c4129842e1254289ebb3ad1755879a3722bac1cf.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
2018-01-23 15:39       ` Chen-Yu Tsai
2018-01-15 10:33   ` [PATCH v3 11/16] dt-bindings: power: supply: axp20x: add AXP813 battery DT binding Quentin Schulz
     [not found]     ` <7b53727c33207f4b7ae36218c99abfb86876e716.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
2018-01-23 15:43       ` Chen-Yu Tsai
2018-01-15 10:33   ` [PATCH v3 12/16] power: supply: axp20x_battery: add support for AXP813 Quentin Schulz
     [not found]     ` <42b2e555083abbab43e48362175dc9c2eeeedf3c.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
2018-01-23 15:47       ` Chen-Yu Tsai
2018-01-15 10:33   ` [PATCH v3 13/16] mfd: axp20x: add battery power supply cell " Quentin Schulz
     [not found]     ` <76855b0d3b9eb75e00eb6a058db5b4a33b0558c6.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
2018-01-23 15:50       ` Chen-Yu Tsai
2018-01-15 10:33   ` [PATCH v3 14/16] ARM: dtsi: axp81x: add battery power supply subnode Quentin Schulz
     [not found]     ` <9c045de8dcee9a71803978855762e272efdc41d3.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
2018-01-23 15:50       ` Chen-Yu Tsai
2018-01-15 10:33   ` [PATCH v3 15/16] ARM: dtsi: sun8i: a711: enable " Quentin Schulz
2018-01-23 15:51     ` [linux-sunxi] " Chen-Yu Tsai
2018-01-15 10:33   ` [PATCH v3 16/16] ARM: dtsi: axp81x: remove IP name from DT node name Quentin Schulz
     [not found]     ` <6e881951c43b8829cd509c3db06fa5520f71e779.1516012352.git-series.quentin.schulz-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
2018-01-23 15:51       ` Chen-Yu Tsai
2018-01-23 15:55 ` [PATCH v3 00/16] add support for AXP813 ADC and battery power supply Chen-Yu Tsai

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).