* [PATCH 1/2] dt-bindings: iio: adc: Add binding for current-from-voltage
[not found] <20200516022619.30779-1-xc-racer2@live.ca>
@ 2020-05-16 2:26 ` Jonathan Bakker
2020-05-28 20:13 ` Rob Herring
2020-05-16 2:26 ` [PATCH 2/2] iio: adc: Add current-from-voltage driver Jonathan Bakker
1 sibling, 1 reply; 4+ messages in thread
From: Jonathan Bakker @ 2020-05-16 2:26 UTC (permalink / raw)
To: jic23, knaack.h, lars, pmeerw, robh+dt, linux-iio, linux-kernel,
devicetree
Cc: linus.walleij, Jonathan Bakker
Some devices may require a current adc, but only have a voltage
ADC onboard. In order to read the current, they have a resistor
connected to the ADC. Add bindings for this possibility.
Signed-off-by: Jonathan Bakker <xc-racer2@live.ca>
---
.../iio/adc/linux,current-from-voltage.yaml | 47 +++++++++++++++++++
1 file changed, 47 insertions(+)
create mode 100644 Documentation/devicetree/bindings/iio/adc/linux,current-from-voltage.yaml
diff --git a/Documentation/devicetree/bindings/iio/adc/linux,current-from-voltage.yaml b/Documentation/devicetree/bindings/iio/adc/linux,current-from-voltage.yaml
new file mode 100644
index 000000000000..385d317607c3
--- /dev/null
+++ b/Documentation/devicetree/bindings/iio/adc/linux,current-from-voltage.yaml
@@ -0,0 +1,47 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/iio/adc/linux,current-from-voltage.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Current ADC from voltage ADC and resistor
+
+maintainers:
+ - Jonathan Bakker <xc-racer2@live.ca>
+
+properties:
+ compatible:
+ const: linux,current-from-voltage
+
+ io-channel-names:
+ const: adc
+
+ io-channels:
+ maxItems: 1
+ description: Voltage ADC channel
+
+ linux,resistor-ohms:
+ description: Strength of resistor connected to voltage ADC
+
+ "#io-channel-cells":
+ const: 0
+
+required:
+ - compatible
+ - io-channel-names
+ - io-channels
+ - linux,resistor-ohms
+ - "#io-channel-cells"
+
+examples:
+ - |
+ current-from-voltage {
+ compatible = "linux,current-from-voltage";
+ io-channel-names = "adc";
+ io-channels = <&adc 9>;
+ linux,resistor-ohms = <47>;
+ #io-channel-cells = <0>;
+ io-channel-ranges;
+ };
+
+...
--
2.20.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 2/2] iio: adc: Add current-from-voltage driver
[not found] <20200516022619.30779-1-xc-racer2@live.ca>
2020-05-16 2:26 ` [PATCH 1/2] dt-bindings: iio: adc: Add binding for current-from-voltage Jonathan Bakker
@ 2020-05-16 2:26 ` Jonathan Bakker
1 sibling, 0 replies; 4+ messages in thread
From: Jonathan Bakker @ 2020-05-16 2:26 UTC (permalink / raw)
To: jic23, knaack.h, lars, pmeerw, robh+dt, linux-iio, linux-kernel,
devicetree
Cc: linus.walleij, Jonathan Bakker
Some devices may require a current adc, but only have a voltage
ADC onboard. In order to read the current, they have a resistor
connected to the ADC.
Suggested-by: Jonathan Cameron <jic23@kernel.org>
Signed-off-by: Jonathan Bakker <xc-racer2@live.ca>
---
MAINTAINERS | 8 ++
drivers/iio/adc/Kconfig | 9 ++
drivers/iio/adc/Makefile | 1 +
drivers/iio/adc/current-from-voltage.c | 123 +++++++++++++++++++++++++
4 files changed, 141 insertions(+)
create mode 100644 drivers/iio/adc/current-from-voltage.c
diff --git a/MAINTAINERS b/MAINTAINERS
index 2926327e4976..094cf512b403 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -4503,6 +4503,14 @@ T: git git://linuxtv.org/media_tree.git
F: Documentation/devicetree/bindings/media/allwinner,sun6i-a31-csi.yaml
F: drivers/media/platform/sunxi/sun6i-csi/
+CURRENT ADC FROM VOLTAGE ADC DRIVER
+M: Jonathan Bakker <xc-racer2@live.ca>
+L: linux-iio@vger.kernel.org
+S: Maintained
+T: git git://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio.git
+F: Documentation/devicetree/bindings/iio/adc/linux,current-from-voltage.yaml
+F: drivers/iio/adc/current-from-voltage.c
+
CW1200 WLAN driver
M: Solomon Peachy <pizza@shaftnet.org>
S: Maintained
diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig
index 12bb8b7ca1ff..84e6ccb36024 100644
--- a/drivers/iio/adc/Kconfig
+++ b/drivers/iio/adc/Kconfig
@@ -344,6 +344,15 @@ config CPCAP_ADC
This driver can also be built as a module. If so, the module will be
called cpcap-adc.
+config CURRENT_FROM_VOLTAGE
+ tristate "Current from voltage shim driver"
+ help
+ Say yes here to build support for a shim driver converting a voltage
+ ADC coupled with a resistor to a current ADC.
+
+ To compile this driver as a module, choose M here: the module will be
+ called current-from-voltage.
+
config DA9150_GPADC
tristate "Dialog DA9150 GPADC driver support"
depends on MFD_DA9150
diff --git a/drivers/iio/adc/Makefile b/drivers/iio/adc/Makefile
index 637807861112..d293184fc32a 100644
--- a/drivers/iio/adc/Makefile
+++ b/drivers/iio/adc/Makefile
@@ -35,6 +35,7 @@ obj-$(CONFIG_BCM_IPROC_ADC) += bcm_iproc_adc.o
obj-$(CONFIG_BERLIN2_ADC) += berlin2-adc.o
obj-$(CONFIG_CC10001_ADC) += cc10001_adc.o
obj-$(CONFIG_CPCAP_ADC) += cpcap-adc.o
+obj-$(CONFIG_CURRENT_FROM_VOLTAGE) += current-from-voltage.o
obj-$(CONFIG_DA9150_GPADC) += da9150-gpadc.o
obj-$(CONFIG_DLN2_ADC) += dln2-adc.o
obj-$(CONFIG_ENVELOPE_DETECTOR) += envelope-detector.o
diff --git a/drivers/iio/adc/current-from-voltage.c b/drivers/iio/adc/current-from-voltage.c
new file mode 100644
index 000000000000..69cb18e0995b
--- /dev/null
+++ b/drivers/iio/adc/current-from-voltage.c
@@ -0,0 +1,123 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Driver for converting a resistor and a voltage ADC to a current ADC
+ *
+ * Copyright (C) 2020 Jonathan Bakker <xc-racer2@live.ca>
+ */
+
+#include <linux/device.h>
+#include <linux/err.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/iio/consumer.h>
+#include <linux/iio/iio.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+
+struct shim {
+ struct iio_channel *adc;
+ u32 resistor_value;
+};
+
+static int shim_read_raw(struct iio_dev *indio_dev,
+ struct iio_chan_spec const *chan,
+ int *val, int *val2, long mask)
+{
+ struct shim *shim = iio_priv(indio_dev);
+ int ret;
+
+ switch (mask) {
+ case IIO_CHAN_INFO_RAW:
+ ret = iio_read_channel_processed(shim->adc, val);
+ if (ret < 0) {
+ dev_err(&indio_dev->dev, "fail reading voltage ADC\n");
+ return ret;
+ }
+
+ return IIO_VAL_INT;
+ case IIO_CHAN_INFO_SCALE:
+ *val = 1;
+ *val2 = shim->resistor_value;
+
+ return IIO_VAL_FRACTIONAL;
+ }
+
+ return -EINVAL;
+}
+
+static const struct iio_chan_spec shim_iio_channel = {
+ .type = IIO_CURRENT,
+ .info_mask_separate = BIT(IIO_CHAN_INFO_RAW)
+ | BIT(IIO_CHAN_INFO_SCALE),
+};
+
+static const struct iio_info shim_info = {
+ .read_raw = &shim_read_raw,
+};
+
+static int shim_probe(struct platform_device *pdev)
+{
+ struct device *dev = &pdev->dev;
+ struct iio_dev *indio_dev;
+ struct shim *shim;
+ enum iio_chan_type type;
+ int ret;
+
+ indio_dev = devm_iio_device_alloc(dev, sizeof(*shim));
+ if (!indio_dev)
+ return -ENOMEM;
+
+ platform_set_drvdata(pdev, indio_dev);
+ shim = iio_priv(indio_dev);
+
+ indio_dev->name = dev_name(dev);
+ indio_dev->dev.parent = dev;
+ indio_dev->dev.of_node = dev->of_node;
+ indio_dev->info = &shim_info;
+ indio_dev->channels = &shim_iio_channel;
+ indio_dev->num_channels = 1;
+
+ shim->adc = devm_iio_channel_get(dev, "adc");
+ if (IS_ERR(shim->adc)) {
+ if (PTR_ERR(shim->adc) != -EPROBE_DEFER)
+ dev_err(dev, "failed to get adc input channel\n");
+ return PTR_ERR(shim->adc);
+ }
+
+ ret = iio_get_channel_type(shim->adc, &type);
+ if (ret < 0)
+ return ret;
+
+ if (type != IIO_VOLTAGE) {
+ dev_err(dev, "ADC is of the wrong type\n");
+ return -EINVAL;
+ }
+
+ ret = device_property_read_u32(dev, "linux,resistor-ohms",
+ &shim->resistor_value);
+ if (ret < 0) {
+ dev_err(dev, "no resistor value found\n");
+ return ret;
+ }
+
+ return devm_iio_device_register(dev, indio_dev);
+}
+
+static const struct of_device_id shim_match[] = {
+ { .compatible = "linux,current-from-voltage", },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, shim_match);
+
+static struct platform_driver shim_driver = {
+ .probe = shim_probe,
+ .driver = {
+ .name = "current-from-voltage",
+ .of_match_table = shim_match,
+ },
+};
+module_platform_driver(shim_driver);
+
+MODULE_DESCRIPTION("Current ADC from voltage ADC and resistor");
+MODULE_AUTHOR("Jonathan Bakker <xc-racer2@live.ca>");
+MODULE_LICENSE("GPL v2");
--
2.20.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 1/2] dt-bindings: iio: adc: Add binding for current-from-voltage
2020-05-16 2:26 ` [PATCH 1/2] dt-bindings: iio: adc: Add binding for current-from-voltage Jonathan Bakker
@ 2020-05-28 20:13 ` Rob Herring
2020-05-28 20:16 ` Jonathan Bakker
0 siblings, 1 reply; 4+ messages in thread
From: Rob Herring @ 2020-05-28 20:13 UTC (permalink / raw)
To: Jonathan Bakker
Cc: jic23, knaack.h, lars, pmeerw, linux-iio, linux-kernel,
devicetree, linus.walleij
On Fri, May 15, 2020 at 07:26:18PM -0700, Jonathan Bakker wrote:
> Some devices may require a current adc, but only have a voltage
> ADC onboard. In order to read the current, they have a resistor
> connected to the ADC. Add bindings for this possibility.
>
> Signed-off-by: Jonathan Bakker <xc-racer2@live.ca>
> ---
> .../iio/adc/linux,current-from-voltage.yaml | 47 +++++++++++++++++++
> 1 file changed, 47 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/iio/adc/linux,current-from-voltage.yaml
>
> diff --git a/Documentation/devicetree/bindings/iio/adc/linux,current-from-voltage.yaml b/Documentation/devicetree/bindings/iio/adc/linux,current-from-voltage.yaml
> new file mode 100644
> index 000000000000..385d317607c3
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/iio/adc/linux,current-from-voltage.yaml
> @@ -0,0 +1,47 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/iio/adc/linux,current-from-voltage.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Current ADC from voltage ADC and resistor
> +
> +maintainers:
> + - Jonathan Bakker <xc-racer2@live.ca>
> +
> +properties:
> + compatible:
> + const: linux,current-from-voltage
How is an ADC with a resistor attached a Linux thing? So you don't need
'linux', but then 'current-from-voltage' isn't the best naming. I don't
have a suggestion ATM.
> +
> + io-channel-names:
> + const: adc
> +
> + io-channels:
> + maxItems: 1
> + description: Voltage ADC channel
> +
> + linux,resistor-ohms:
> + description: Strength of resistor connected to voltage ADC
Wouldn't you need this to be micro-ohms? Otherwise, there'd be too much
voltage drop?
Rob
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 1/2] dt-bindings: iio: adc: Add binding for current-from-voltage
2020-05-28 20:13 ` Rob Herring
@ 2020-05-28 20:16 ` Jonathan Bakker
0 siblings, 0 replies; 4+ messages in thread
From: Jonathan Bakker @ 2020-05-28 20:16 UTC (permalink / raw)
To: Rob Herring
Cc: jic23, knaack.h, lars, pmeerw, linux-iio, linux-kernel,
devicetree, linus.walleij
Hi Rob,
On 2020-05-28 1:13 p.m., Rob Herring wrote:
> On Fri, May 15, 2020 at 07:26:18PM -0700, Jonathan Bakker wrote:
>> Some devices may require a current adc, but only have a voltage
>> ADC onboard. In order to read the current, they have a resistor
>> connected to the ADC. Add bindings for this possibility.
>>
>> Signed-off-by: Jonathan Bakker <xc-racer2@live.ca>
>> ---
>> .../iio/adc/linux,current-from-voltage.yaml | 47 +++++++++++++++++++
>> 1 file changed, 47 insertions(+)
>> create mode 100644 Documentation/devicetree/bindings/iio/adc/linux,current-from-voltage.yaml
>>
>> diff --git a/Documentation/devicetree/bindings/iio/adc/linux,current-from-voltage.yaml b/Documentation/devicetree/bindings/iio/adc/linux,current-from-voltage.yaml
>> new file mode 100644
>> index 000000000000..385d317607c3
>> --- /dev/null
>> +++ b/Documentation/devicetree/bindings/iio/adc/linux,current-from-voltage.yaml
>> @@ -0,0 +1,47 @@
>> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
>> +%YAML 1.2
>> +---
>> +$id: http://devicetree.org/schemas/iio/adc/linux,current-from-voltage.yaml#
>> +$schema: http://devicetree.org/meta-schemas/core.yaml#
>> +
>> +title: Current ADC from voltage ADC and resistor
>> +
>> +maintainers:
>> + - Jonathan Bakker <xc-racer2@live.ca>
>> +
>> +properties:
>> + compatible:
>> + const: linux,current-from-voltage
>
> How is an ADC with a resistor attached a Linux thing? So you don't need
> 'linux', but then 'current-from-voltage' isn't the best naming. I don't
> have a suggestion ATM.
>
The good/bad news is that I was re-implementing an existing driver under a new name :)
The compatible is current-sense-shunt for this exact same purpose.
Thanks,
Jonathan
>> +
>> + io-channel-names:
>> + const: adc
>> +
>> + io-channels:
>> + maxItems: 1
>> + description: Voltage ADC channel
>> +
>> + linux,resistor-ohms:
>> + description: Strength of resistor connected to voltage ADC
>
> Wouldn't you need this to be micro-ohms? Otherwise, there'd be too much
> voltage drop?
>
> Rob
>
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2020-05-28 20:16 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20200516022619.30779-1-xc-racer2@live.ca>
2020-05-16 2:26 ` [PATCH 1/2] dt-bindings: iio: adc: Add binding for current-from-voltage Jonathan Bakker
2020-05-28 20:13 ` Rob Herring
2020-05-28 20:16 ` Jonathan Bakker
2020-05-16 2:26 ` [PATCH 2/2] iio: adc: Add current-from-voltage driver Jonathan Bakker
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.