devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v6 1/3] dt-bindings: iio: adc: ti,tsc2046: add vref-supply property
@ 2022-09-04 10:02 Oleksij Rempel
  2022-09-04 10:02 ` [PATCH v6 2/3] iio: adc: tsc2046: add vref support Oleksij Rempel
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Oleksij Rempel @ 2022-09-04 10:02 UTC (permalink / raw)
  To: Jonathan Cameron, Lars-Peter Clausen, Rob Herring,
	Krzysztof Kozlowski
  Cc: Oleksij Rempel, Krzysztof Kozlowski, kernel, linux-kernel,
	linux-iio, devicetree, Andy Shevchenko

Add property for the voltage reference supply.

Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
---
 Documentation/devicetree/bindings/iio/adc/ti,tsc2046.yaml | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/Documentation/devicetree/bindings/iio/adc/ti,tsc2046.yaml b/Documentation/devicetree/bindings/iio/adc/ti,tsc2046.yaml
index 601d69971d84a..7faf12b1598b9 100644
--- a/Documentation/devicetree/bindings/iio/adc/ti,tsc2046.yaml
+++ b/Documentation/devicetree/bindings/iio/adc/ti,tsc2046.yaml
@@ -25,6 +25,9 @@ properties:
 
   spi-max-frequency: true
 
+  vref-supply:
+    description: Optional supply of the reference voltage
+
   "#io-channel-cells":
     const: 1
 
-- 
2.30.2


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

* [PATCH v6 2/3] iio: adc: tsc2046: add vref support
  2022-09-04 10:02 [PATCH v6 1/3] dt-bindings: iio: adc: ti,tsc2046: add vref-supply property Oleksij Rempel
@ 2022-09-04 10:02 ` Oleksij Rempel
  2022-09-04 10:02 ` [PATCH v6 3/3] iio: adc: tsc2046: silent spi_device_id warning Oleksij Rempel
  2022-09-04 13:58 ` [PATCH v6 1/3] dt-bindings: iio: adc: ti,tsc2046: add vref-supply property Jonathan Cameron
  2 siblings, 0 replies; 4+ messages in thread
From: Oleksij Rempel @ 2022-09-04 10:02 UTC (permalink / raw)
  To: Jonathan Cameron, Lars-Peter Clausen, Rob Herring,
	Krzysztof Kozlowski
  Cc: Oleksij Rempel, Andy Shevchenko, kernel, linux-kernel, linux-iio,
	devicetree

If VREF pin is attached, we should use external VREF source instead of
the internal. Otherwise we will get wrong measurements on some of the channel
types.

Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
---
changes v6:
- optimize struct padding and reduce size from 480 to 472 bytes.
changes v5:
- add "the" before channel
- refactor error handling on regulator registration
- use MILLI instead of 1000
changes v4:
- use vref_reg pointer instead of bool use_internal_vref
- move regulator registration to a separate function
- rework error handling
- add devm_add_action_or_reset
---
 drivers/iio/adc/ti-tsc2046.c | 57 ++++++++++++++++++++++++++++++++++--
 1 file changed, 55 insertions(+), 2 deletions(-)

diff --git a/drivers/iio/adc/ti-tsc2046.c b/drivers/iio/adc/ti-tsc2046.c
index 0d9436a69cbfb..8d6559303172f 100644
--- a/drivers/iio/adc/ti-tsc2046.c
+++ b/drivers/iio/adc/ti-tsc2046.c
@@ -8,7 +8,9 @@
 #include <linux/bitfield.h>
 #include <linux/delay.h>
 #include <linux/module.h>
+#include <linux/regulator/consumer.h>
 #include <linux/spi/spi.h>
+#include <linux/units.h>
 
 #include <asm/unaligned.h>
 
@@ -139,6 +141,7 @@ enum tsc2046_state {
 struct tsc2046_adc_priv {
 	struct spi_device *spi;
 	const struct tsc2046_adc_dcfg *dcfg;
+	struct regulator *vref_reg;
 
 	struct iio_trigger *trig;
 	struct hrtimer trig_timer;
@@ -173,6 +176,7 @@ struct tsc2046_adc_priv {
 	u32 scan_interval_us;
 	u32 time_per_scan_us;
 	u32 time_per_bit_ns;
+	unsigned int vref_mv;
 
 	struct tsc2046_adc_ch_cfg ch_cfg[TI_TSC2046_MAX_CHAN];
 };
@@ -252,7 +256,9 @@ static u8 tsc2046_adc_get_cmd(struct tsc2046_adc_priv *priv, int ch_idx,
 	case TI_TSC2046_ADDR_AUX:
 	case TI_TSC2046_ADDR_VBAT:
 	case TI_TSC2046_ADDR_TEMP0:
-		pd |= TI_TSC2046_SER | TI_TSC2046_PD1_VREF_ON;
+		pd |= TI_TSC2046_SER;
+		if (!priv->vref_reg)
+			pd |= TI_TSC2046_PD1_VREF_ON;
 	}
 
 	return TI_TSC2046_START | FIELD_PREP(TI_TSC2046_ADDR, ch_idx) | pd;
@@ -468,7 +474,7 @@ static int tsc2046_adc_read_raw(struct iio_dev *indio_dev,
 		 * So, it is better to use external voltage-divider driver
 		 * instead, which is calculating complete chain.
 		 */
-		*val = TI_TSC2046_INT_VREF;
+		*val = priv->vref_mv;
 		*val2 = chan->scan_type.realbits;
 		return IIO_VAL_FRACTIONAL_LOG2;
 	}
@@ -740,6 +746,49 @@ static void tsc2046_adc_parse_fwnode(struct tsc2046_adc_priv *priv)
 	}
 }
 
+static void tsc2046_adc_regulator_disable(void *data)
+{
+	struct tsc2046_adc_priv *priv = data;
+
+	regulator_disable(priv->vref_reg);
+}
+
+static int tsc2046_adc_configure_regulator(struct tsc2046_adc_priv *priv)
+{
+	struct device *dev = &priv->spi->dev;
+	int ret;
+
+	priv->vref_reg = devm_regulator_get_optional(dev, "vref");
+	if (IS_ERR(priv->vref_reg)) {
+		/* If regulator exists but can't be get, return an error */
+		if (PTR_ERR(priv->vref_reg) != -ENODEV)
+			return PTR_ERR(priv->vref_reg);
+		priv->vref_reg = NULL;
+	}
+	if (!priv->vref_reg) {
+		/* Use internal reference */
+		priv->vref_mv = TI_TSC2046_INT_VREF;
+		return 0;
+	}
+
+	ret = regulator_enable(priv->vref_reg);
+	if (ret)
+		return ret;
+
+	ret = devm_add_action_or_reset(dev, tsc2046_adc_regulator_disable,
+				       priv);
+	if (ret)
+		return ret;
+
+	ret = regulator_get_voltage(priv->vref_reg);
+	if (ret < 0)
+		return ret;
+
+	priv->vref_mv = ret / MILLI;
+
+	return 0;
+}
+
 static int tsc2046_adc_probe(struct spi_device *spi)
 {
 	const struct tsc2046_adc_dcfg *dcfg;
@@ -781,6 +830,10 @@ static int tsc2046_adc_probe(struct spi_device *spi)
 	indio_dev->num_channels = dcfg->num_channels;
 	indio_dev->info = &tsc2046_adc_info;
 
+	ret = tsc2046_adc_configure_regulator(priv);
+	if (ret)
+		return ret;
+
 	tsc2046_adc_parse_fwnode(priv);
 
 	ret = tsc2046_adc_setup_spi_msg(priv);
-- 
2.30.2


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

* [PATCH v6 3/3] iio: adc: tsc2046: silent spi_device_id warning
  2022-09-04 10:02 [PATCH v6 1/3] dt-bindings: iio: adc: ti,tsc2046: add vref-supply property Oleksij Rempel
  2022-09-04 10:02 ` [PATCH v6 2/3] iio: adc: tsc2046: add vref support Oleksij Rempel
@ 2022-09-04 10:02 ` Oleksij Rempel
  2022-09-04 13:58 ` [PATCH v6 1/3] dt-bindings: iio: adc: ti,tsc2046: add vref-supply property Jonathan Cameron
  2 siblings, 0 replies; 4+ messages in thread
From: Oleksij Rempel @ 2022-09-04 10:02 UTC (permalink / raw)
  To: Jonathan Cameron, Lars-Peter Clausen, Rob Herring,
	Krzysztof Kozlowski
  Cc: Oleksij Rempel, Andy Shevchenko, kernel, linux-kernel, linux-iio,
	devicetree

Add spi_device_id to silent following kernel runtime warning:
"SPI driver tsc2046 has no spi_device_id for ti,tsc2046e-adc".

Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
---
changes v4:
- add Reviewed-by: Andy Shevchenko
changes v3:
- add missing point
- remove unneeded blank line
- assignment id at the definition line
changes v2:
- attach actual driver_data
- use spi_get_device_id fallback
---
 drivers/iio/adc/ti-tsc2046.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/drivers/iio/adc/ti-tsc2046.c b/drivers/iio/adc/ti-tsc2046.c
index 8d6559303172f..1bbb51a6683c9 100644
--- a/drivers/iio/adc/ti-tsc2046.c
+++ b/drivers/iio/adc/ti-tsc2046.c
@@ -805,6 +805,11 @@ static int tsc2046_adc_probe(struct spi_device *spi)
 	}
 
 	dcfg = device_get_match_data(dev);
+	if (!dcfg) {
+		const struct spi_device_id *id = spi_get_device_id(spi);
+
+		dcfg = (const struct tsc2046_adc_dcfg *)id->driver_data;
+	}
 	if (!dcfg)
 		return -EINVAL;
 
@@ -886,11 +891,18 @@ static const struct of_device_id ads7950_of_table[] = {
 };
 MODULE_DEVICE_TABLE(of, ads7950_of_table);
 
+static const struct spi_device_id tsc2046_adc_spi_ids[] = {
+	{ "tsc2046e-adc", (unsigned long)&tsc2046_adc_dcfg_tsc2046e },
+	{ }
+};
+MODULE_DEVICE_TABLE(spi, tsc2046_adc_spi_ids);
+
 static struct spi_driver tsc2046_adc_driver = {
 	.driver = {
 		.name = "tsc2046",
 		.of_match_table = ads7950_of_table,
 	},
+	.id_table = tsc2046_adc_spi_ids,
 	.probe = tsc2046_adc_probe,
 };
 module_spi_driver(tsc2046_adc_driver);
-- 
2.30.2


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

* Re: [PATCH v6 1/3] dt-bindings: iio: adc: ti,tsc2046: add vref-supply property
  2022-09-04 10:02 [PATCH v6 1/3] dt-bindings: iio: adc: ti,tsc2046: add vref-supply property Oleksij Rempel
  2022-09-04 10:02 ` [PATCH v6 2/3] iio: adc: tsc2046: add vref support Oleksij Rempel
  2022-09-04 10:02 ` [PATCH v6 3/3] iio: adc: tsc2046: silent spi_device_id warning Oleksij Rempel
@ 2022-09-04 13:58 ` Jonathan Cameron
  2 siblings, 0 replies; 4+ messages in thread
From: Jonathan Cameron @ 2022-09-04 13:58 UTC (permalink / raw)
  To: Oleksij Rempel
  Cc: Lars-Peter Clausen, Rob Herring, Krzysztof Kozlowski,
	Krzysztof Kozlowski, kernel, linux-kernel, linux-iio, devicetree,
	Andy Shevchenko

On Sun,  4 Sep 2022 12:02:01 +0200
Oleksij Rempel <o.rempel@pengutronix.de> wrote:

> Add property for the voltage reference supply.
> 
> Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
> Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>

Series applied to the togreg branch of iio.git and pushed out as testing for the
autobuilders to see if they can find anything we missed.

I'm not generally keen on seeing quite so many versions in such a short period of
time. Not too bad in this particular case as the patches were small, but it doesn't
provide time for others to respond and can lead to reviewer fatigue!

Anyhow, it worked out this time so not a big problem.

Thanks,

Jonathan

> ---
>  Documentation/devicetree/bindings/iio/adc/ti,tsc2046.yaml | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/Documentation/devicetree/bindings/iio/adc/ti,tsc2046.yaml b/Documentation/devicetree/bindings/iio/adc/ti,tsc2046.yaml
> index 601d69971d84a..7faf12b1598b9 100644
> --- a/Documentation/devicetree/bindings/iio/adc/ti,tsc2046.yaml
> +++ b/Documentation/devicetree/bindings/iio/adc/ti,tsc2046.yaml
> @@ -25,6 +25,9 @@ properties:
>  
>    spi-max-frequency: true
>  
> +  vref-supply:
> +    description: Optional supply of the reference voltage
> +
>    "#io-channel-cells":
>      const: 1
>  


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

end of thread, other threads:[~2022-09-04 14:32 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-09-04 10:02 [PATCH v6 1/3] dt-bindings: iio: adc: ti,tsc2046: add vref-supply property Oleksij Rempel
2022-09-04 10:02 ` [PATCH v6 2/3] iio: adc: tsc2046: add vref support Oleksij Rempel
2022-09-04 10:02 ` [PATCH v6 3/3] iio: adc: tsc2046: silent spi_device_id warning Oleksij Rempel
2022-09-04 13:58 ` [PATCH v6 1/3] dt-bindings: iio: adc: ti,tsc2046: add vref-supply property Jonathan Cameron

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).