* [PATCH v1 1/3] dt-bindings: iio: adc: ti,tsc2046: add vref-supply property
@ 2022-08-30 11:07 Oleksij Rempel
2022-08-30 11:07 ` [PATCH v1 2/3] iio: adc: tsc2046: add vref support Oleksij Rempel
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Oleksij Rempel @ 2022-08-30 11:07 UTC (permalink / raw)
To: Jonathan Cameron, Lars-Peter Clausen, Rob Herring,
Krzysztof Kozlowski
Cc: Oleksij Rempel, kernel, linux-kernel, linux-iio, devicetree
Add property for the voltage reference supply.
Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
---
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] 7+ messages in thread* [PATCH v1 2/3] iio: adc: tsc2046: add vref support 2022-08-30 11:07 [PATCH v1 1/3] dt-bindings: iio: adc: ti,tsc2046: add vref-supply property Oleksij Rempel @ 2022-08-30 11:07 ` Oleksij Rempel 2022-08-30 11:07 ` [PATCH v1 3/3] iio: adc: tsc2046: silent spi_device_id warning Oleksij Rempel 2022-08-30 14:31 ` [PATCH v1 1/3] dt-bindings: iio: adc: ti,tsc2046: add vref-supply property Krzysztof Kozlowski 2 siblings, 0 replies; 7+ messages in thread From: Oleksij Rempel @ 2022-08-30 11:07 UTC (permalink / raw) To: Jonathan Cameron, Lars-Peter Clausen, Rob Herring, Krzysztof Kozlowski Cc: Oleksij Rempel, 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 channel types. Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de> --- drivers/iio/adc/ti-tsc2046.c | 64 +++++++++++++++++++++++++++++++----- 1 file changed, 55 insertions(+), 9 deletions(-) diff --git a/drivers/iio/adc/ti-tsc2046.c b/drivers/iio/adc/ti-tsc2046.c index 0d9436a69cbfb..bbc8b4137b0b1 100644 --- a/drivers/iio/adc/ti-tsc2046.c +++ b/drivers/iio/adc/ti-tsc2046.c @@ -8,6 +8,7 @@ #include <linux/bitfield.h> #include <linux/delay.h> #include <linux/module.h> +#include <linux/regulator/consumer.h> #include <linux/spi/spi.h> #include <asm/unaligned.h> @@ -175,6 +176,9 @@ struct tsc2046_adc_priv { u32 time_per_bit_ns; struct tsc2046_adc_ch_cfg ch_cfg[TI_TSC2046_MAX_CHAN]; + bool use_internal_vref; + unsigned int vref_mv; + struct regulator *vref_reg; }; #define TI_TSC2046_V_CHAN(index, bits, name) \ @@ -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->use_internal_vref) + 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; } @@ -781,22 +787,42 @@ static int tsc2046_adc_probe(struct spi_device *spi) indio_dev->num_channels = dcfg->num_channels; indio_dev->info = &tsc2046_adc_info; + priv->vref_reg = devm_regulator_get_optional(&spi->dev, "vref"); + if (!IS_ERR(priv->vref_reg)) { + ret = regulator_enable(priv->vref_reg); + if (ret) + return ret; + + ret = regulator_get_voltage(priv->vref_reg); + if (ret < 0) + goto err_regulator_disable; + + priv->vref_mv = ret / 1000; + priv->use_internal_vref = false; + } else { + /* Use internal reference */ + priv->vref_mv = TI_TSC2046_INT_VREF; + priv->use_internal_vref = true; + } + tsc2046_adc_parse_fwnode(priv); ret = tsc2046_adc_setup_spi_msg(priv); if (ret) - return ret; + goto err_regulator_disable; mutex_init(&priv->slock); ret = devm_request_irq(dev, spi->irq, &tsc2046_adc_irq, IRQF_NO_AUTOEN, indio_dev->name, indio_dev); if (ret) - return ret; + goto err_regulator_disable; trig = devm_iio_trigger_alloc(dev, "touchscreen-%s", indio_dev->name); - if (!trig) - return -ENOMEM; + if (!trig) { + ret = -ENOMEM; + goto err_regulator_disable; + } priv->trig = trig; iio_trigger_set_drvdata(trig, indio_dev); @@ -811,20 +837,39 @@ static int tsc2046_adc_probe(struct spi_device *spi) ret = devm_iio_trigger_register(dev, trig); if (ret) { dev_err(dev, "failed to register trigger\n"); - return ret; + goto err_regulator_disable; } ret = devm_iio_triggered_buffer_setup(dev, indio_dev, NULL, &tsc2046_adc_trigger_handler, NULL); if (ret) { dev_err(dev, "Failed to setup triggered buffer\n"); - return ret; + goto err_regulator_disable; } /* set default trigger */ indio_dev->trig = iio_trigger_get(priv->trig); - return devm_iio_device_register(dev, indio_dev); + ret = devm_iio_device_register(dev, indio_dev); + if (ret) + goto err_regulator_disable; + + return 0; + +err_regulator_disable: + if (!IS_ERR(priv->vref_reg)) + regulator_disable(priv->vref_reg); + + return ret; +} + +static void tsc2046_adc_remove(struct spi_device *spi) +{ + struct iio_dev *indio_dev = spi_get_drvdata(spi); + struct tsc2046_adc_priv *priv = iio_priv(indio_dev); + + if (!IS_ERR(priv->vref_reg)) + regulator_disable(priv->vref_reg); } static const struct of_device_id ads7950_of_table[] = { @@ -839,6 +884,7 @@ static struct spi_driver tsc2046_adc_driver = { .of_match_table = ads7950_of_table, }, .probe = tsc2046_adc_probe, + .remove = tsc2046_adc_remove, }; module_spi_driver(tsc2046_adc_driver); -- 2.30.2 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v1 3/3] iio: adc: tsc2046: silent spi_device_id warning 2022-08-30 11:07 [PATCH v1 1/3] dt-bindings: iio: adc: ti,tsc2046: add vref-supply property Oleksij Rempel 2022-08-30 11:07 ` [PATCH v1 2/3] iio: adc: tsc2046: add vref support Oleksij Rempel @ 2022-08-30 11:07 ` Oleksij Rempel 2022-08-30 13:02 ` Jonathan Cameron 2022-08-30 20:02 ` Andy Shevchenko 2022-08-30 14:31 ` [PATCH v1 1/3] dt-bindings: iio: adc: ti,tsc2046: add vref-supply property Krzysztof Kozlowski 2 siblings, 2 replies; 7+ messages in thread From: Oleksij Rempel @ 2022-08-30 11:07 UTC (permalink / raw) To: Jonathan Cameron, Lars-Peter Clausen, Rob Herring, Krzysztof Kozlowski Cc: Oleksij Rempel, kernel, linux-kernel, linux-iio, devicetree Add spi_device_id to silent following warning: SPI driver tsc2046 has no spi_device_id for ti,tsc2046e-adc Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de> --- drivers/iio/adc/ti-tsc2046.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/drivers/iio/adc/ti-tsc2046.c b/drivers/iio/adc/ti-tsc2046.c index bbc8b4137b0b1..b9a1fac659d46 100644 --- a/drivers/iio/adc/ti-tsc2046.c +++ b/drivers/iio/adc/ti-tsc2046.c @@ -761,7 +761,15 @@ static int tsc2046_adc_probe(struct spi_device *spi) return -EINVAL; } - dcfg = device_get_match_data(dev); + if (!dev_fwnode(dev)) { + const struct spi_device_id *id; + + id = spi_get_device_id(spi); + dcfg = (const struct tsc2046_adc_dcfg *)id->driver_data; + } else { + dcfg = device_get_match_data(dev); + } + if (!dcfg) return -EINVAL; @@ -878,11 +886,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" }, + { } +}; +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, .remove = tsc2046_adc_remove, }; -- 2.30.2 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v1 3/3] iio: adc: tsc2046: silent spi_device_id warning 2022-08-30 11:07 ` [PATCH v1 3/3] iio: adc: tsc2046: silent spi_device_id warning Oleksij Rempel @ 2022-08-30 13:02 ` Jonathan Cameron 2022-08-30 16:07 ` Oleksij Rempel 2022-08-30 20:02 ` Andy Shevchenko 1 sibling, 1 reply; 7+ messages in thread From: Jonathan Cameron @ 2022-08-30 13:02 UTC (permalink / raw) To: Oleksij Rempel Cc: Jonathan Cameron, Lars-Peter Clausen, Rob Herring, Krzysztof Kozlowski, kernel, linux-kernel, linux-iio, devicetree On Tue, 30 Aug 2022 13:07:09 +0200 Oleksij Rempel <o.rempel@pengutronix.de> wrote: > Add spi_device_id to silent following warning: > SPI driver tsc2046 has no spi_device_id for ti,tsc2046e-adc > > Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de> > --- > drivers/iio/adc/ti-tsc2046.c | 17 ++++++++++++++++- > 1 file changed, 16 insertions(+), 1 deletion(-) > > diff --git a/drivers/iio/adc/ti-tsc2046.c b/drivers/iio/adc/ti-tsc2046.c > index bbc8b4137b0b1..b9a1fac659d46 100644 > --- a/drivers/iio/adc/ti-tsc2046.c > +++ b/drivers/iio/adc/ti-tsc2046.c > @@ -761,7 +761,15 @@ static int tsc2046_adc_probe(struct spi_device *spi) > return -EINVAL; > } > > - dcfg = device_get_match_data(dev); > + if (!dev_fwnode(dev)) { > + const struct spi_device_id *id; > + > + id = spi_get_device_id(spi); > + dcfg = (const struct tsc2046_adc_dcfg *)id->driver_data; Driver data not set below. Otherwise this looks good to me. An alternative more common form (I think...) is call device_get_match_data() unconditionally and if that is null follow the driver_data path. Either way is fine though. Could you add to the patch description where the warning is coming from? Build time / runtime etc and what tool? Thanks, Jonathan > + } else { > + dcfg = device_get_match_data(dev); > + } > + > if (!dcfg) > return -EINVAL; > > @@ -878,11 +886,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" }, > + { } > +}; > +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, > .remove = tsc2046_adc_remove, > }; ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v1 3/3] iio: adc: tsc2046: silent spi_device_id warning 2022-08-30 13:02 ` Jonathan Cameron @ 2022-08-30 16:07 ` Oleksij Rempel 0 siblings, 0 replies; 7+ messages in thread From: Oleksij Rempel @ 2022-08-30 16:07 UTC (permalink / raw) To: Jonathan Cameron Cc: devicetree, Lars-Peter Clausen, Krzysztof Kozlowski, linux-iio, linux-kernel, Rob Herring, kernel, Jonathan Cameron On Tue, Aug 30, 2022 at 02:02:28PM +0100, Jonathan Cameron wrote: > On Tue, 30 Aug 2022 13:07:09 +0200 > Oleksij Rempel <o.rempel@pengutronix.de> wrote: > > > Add spi_device_id to silent following warning: > > SPI driver tsc2046 has no spi_device_id for ti,tsc2046e-adc > > > > Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de> > > --- > > drivers/iio/adc/ti-tsc2046.c | 17 ++++++++++++++++- > > 1 file changed, 16 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/iio/adc/ti-tsc2046.c b/drivers/iio/adc/ti-tsc2046.c > > index bbc8b4137b0b1..b9a1fac659d46 100644 > > --- a/drivers/iio/adc/ti-tsc2046.c > > +++ b/drivers/iio/adc/ti-tsc2046.c > > @@ -761,7 +761,15 @@ static int tsc2046_adc_probe(struct spi_device *spi) > > return -EINVAL; > > } > > > > - dcfg = device_get_match_data(dev); > > + if (!dev_fwnode(dev)) { > > + const struct spi_device_id *id; > > + > > + id = spi_get_device_id(spi); > > + dcfg = (const struct tsc2046_adc_dcfg *)id->driver_data; > > Driver data not set below. ..facepalm.. > Otherwise this looks good to me. An alternative more common form (I think...) > is call device_get_match_data() unconditionally and if that is null follow > the driver_data path. Either way is fine though. > > Could you add to the patch description where > the warning is coming from? Build time / runtime etc and what tool? ack. It is runtime warning in the kernel log. Regards, Oleksij -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v1 3/3] iio: adc: tsc2046: silent spi_device_id warning 2022-08-30 11:07 ` [PATCH v1 3/3] iio: adc: tsc2046: silent spi_device_id warning Oleksij Rempel 2022-08-30 13:02 ` Jonathan Cameron @ 2022-08-30 20:02 ` Andy Shevchenko 1 sibling, 0 replies; 7+ messages in thread From: Andy Shevchenko @ 2022-08-30 20:02 UTC (permalink / raw) To: Oleksij Rempel Cc: Jonathan Cameron, Lars-Peter Clausen, Rob Herring, Krzysztof Kozlowski, Sascha Hauer, Linux Kernel Mailing List, linux-iio, devicetree On Tue, Aug 30, 2022 at 2:19 PM Oleksij Rempel <o.rempel@pengutronix.de> wrote: > > Add spi_device_id to silent following warning: > SPI driver tsc2046 has no spi_device_id for ti,tsc2046e-adc Missed period. ... > - dcfg = device_get_match_data(dev); Why remove this and duplicate the check below with the inverted conditional? > + if (!dev_fwnode(dev)) { > + const struct spi_device_id *id; > + > + id = spi_get_device_id(spi); > + dcfg = (const struct tsc2046_adc_dcfg *)id->driver_data; > + } else { > + dcfg = device_get_match_data(dev); > + } if (!dcfg) { ...try SPI ID... } if (!dfg) return -E... -- With Best Regards, Andy Shevchenko ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v1 1/3] dt-bindings: iio: adc: ti,tsc2046: add vref-supply property 2022-08-30 11:07 [PATCH v1 1/3] dt-bindings: iio: adc: ti,tsc2046: add vref-supply property Oleksij Rempel 2022-08-30 11:07 ` [PATCH v1 2/3] iio: adc: tsc2046: add vref support Oleksij Rempel 2022-08-30 11:07 ` [PATCH v1 3/3] iio: adc: tsc2046: silent spi_device_id warning Oleksij Rempel @ 2022-08-30 14:31 ` Krzysztof Kozlowski 2 siblings, 0 replies; 7+ messages in thread From: Krzysztof Kozlowski @ 2022-08-30 14:31 UTC (permalink / raw) To: Oleksij Rempel, Jonathan Cameron, Lars-Peter Clausen, Rob Herring, Krzysztof Kozlowski Cc: kernel, linux-kernel, linux-iio, devicetree On 30/08/2022 14:07, Oleksij Rempel 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> Best regards, Krzysztof ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2022-08-30 20:04 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-08-30 11:07 [PATCH v1 1/3] dt-bindings: iio: adc: ti,tsc2046: add vref-supply property Oleksij Rempel 2022-08-30 11:07 ` [PATCH v1 2/3] iio: adc: tsc2046: add vref support Oleksij Rempel 2022-08-30 11:07 ` [PATCH v1 3/3] iio: adc: tsc2046: silent spi_device_id warning Oleksij Rempel 2022-08-30 13:02 ` Jonathan Cameron 2022-08-30 16:07 ` Oleksij Rempel 2022-08-30 20:02 ` Andy Shevchenko 2022-08-30 14:31 ` [PATCH v1 1/3] dt-bindings: iio: adc: ti,tsc2046: add vref-supply property Krzysztof Kozlowski
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).