Changes v2:
- Use regular voltag binding
Changes v3:
--nothing--
No progress or feed back so try to get this upstream again.
Florian Eckert (2):
hwmon: (adcxx) add devictree bindings documentation
hwmon: (adcxx) Add device tree support
Documentation/devicetree/bindings/hwmon/adcxx.txt | 24 +++++++++
drivers/hwmon/adcxx.c | 62 ++++++++++++++++++++---
2 files changed, 79 insertions(+), 7 deletions(-)
create mode 100644 Documentation/devicetree/bindings/hwmon/adcxx.txt
--
2.11.0
Add device tree supoort for this driver.
Set reference voltage of ADC with the regulator device tree property.
If not set use default 3300000uV (3.3V).
- vref-supply
Signed-off-by: Florian Eckert <[email protected]>
---
drivers/hwmon/adcxx.c | 62 +++++++++++++++++++++++++++++++++++++++++++++------
1 file changed, 55 insertions(+), 7 deletions(-)
diff --git a/drivers/hwmon/adcxx.c b/drivers/hwmon/adcxx.c
index 69e0bb97e597..6f3e7d65b5b8 100644
--- a/drivers/hwmon/adcxx.c
+++ b/drivers/hwmon/adcxx.c
@@ -4,6 +4,7 @@
* The adcxx4s is an AD converter family from National Semiconductor (NS).
*
* Copyright (c) 2008 Marc Pignat <[email protected]>
+ * Copyright (c) 2017 Florian Eckert <[email protected]>
*
* The adcxx4s communicates with a host processor via an SPI/Microwire Bus
* interface. This driver supports the whole family of devices with name
@@ -46,9 +47,16 @@
#include <linux/mutex.h>
#include <linux/mod_devicetable.h>
#include <linux/spi/spi.h>
+#include <linux/of_device.h>
+#include <linux/regulator/consumer.h>
#define DRVNAME "adcxx"
+#define ADCXX1S 1
+#define ADCXX2S 2
+#define ADCXX4S 4
+#define ADCXX8S 8
+
struct adcxx {
struct device *hwmon_dev;
struct mutex lock;
@@ -159,21 +167,60 @@ static struct sensor_device_attribute ad_input[] = {
SENSOR_ATTR(in7_input, S_IRUGO, adcxx_read, NULL, 7),
};
+#ifdef CONFIG_OF
+static const struct of_device_id adcxx_of_ids[] = {
+ {
+ .compatible = "national,adcxx1s",
+ .data = (void *) ADCXX1S,
+ },
+ {
+ .compatible = "national,adcxx2s",
+ .data = (void *) ADCXX2S,
+ },
+ {
+ .compatible = "national,adcxx4s",
+ .data = (void *) ADCXX4S,
+ },
+ {
+ .compatible = "national,adcxx8s",
+ . data = (void *) ADCXX8S,
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, adcxx_of_ids);
+#endif
+
/*----------------------------------------------------------------------*/
static int adcxx_probe(struct spi_device *spi)
{
- int channels = spi_get_device_id(spi)->driver_data;
+ const struct of_device_id *match;
+ struct regulator *vref;
+ int vref_uv;
+ int channels;
struct adcxx *adc;
int status;
int i;
+ match = of_match_device(adcxx_of_ids, &spi->dev);
+ if (match)
+ channels = (int)(uintptr_t)match->data;
+ else
+ channels = spi_get_device_id(spi)->driver_data;
+
adc = devm_kzalloc(&spi->dev, sizeof(*adc), GFP_KERNEL);
if (!adc)
return -ENOMEM;
- /* set a default value for the reference */
- adc->reference = 3300;
+ vref = devm_regulator_get_optional(&spi->dev, "vref");
+ if (!IS_ERR(vref)) {
+ vref_uv = regulator_get_voltage(vref);
+ adc->reference = DIV_ROUND_CLOSEST(vref_uv, 1000);
+ }
+ if (!adc->reference)
+ adc->reference = 3300;
+ dev_dbg(&spi->dev, "Reference voltage set to %dmV\n", adc->reference);
+
adc->channels = channels;
mutex_init(&adc->lock);
@@ -223,10 +270,10 @@ static int adcxx_remove(struct spi_device *spi)
}
static const struct spi_device_id adcxx_ids[] = {
- { "adcxx1s", 1 },
- { "adcxx2s", 2 },
- { "adcxx4s", 4 },
- { "adcxx8s", 8 },
+ { "adcxx1s", ADCXX1S },
+ { "adcxx2s", ADCXX2S },
+ { "adcxx4s", ADCXX4S },
+ { "adcxx8s", ADCXX8S },
{ },
};
MODULE_DEVICE_TABLE(spi, adcxx_ids);
@@ -234,6 +281,7 @@ MODULE_DEVICE_TABLE(spi, adcxx_ids);
static struct spi_driver adcxx_driver = {
.driver = {
.name = "adcxx",
+ .of_match_table = of_match_ptr(adcxx_of_ids),
},
.id_table = adcxx_ids,
.probe = adcxx_probe,
--
2.11.0
Document the devicetree bindings for the adcxx.
Signed-off-by: Florian Eckert <[email protected]>
---
Documentation/devicetree/bindings/hwmon/adcxx.txt | 24 +++++++++++++++++++++++
1 file changed, 24 insertions(+)
create mode 100644 Documentation/devicetree/bindings/hwmon/adcxx.txt
diff --git a/Documentation/devicetree/bindings/hwmon/adcxx.txt b/Documentation/devicetree/bindings/hwmon/adcxx.txt
new file mode 100644
index 000000000000..a94a5fe21b6d
--- /dev/null
+++ b/Documentation/devicetree/bindings/hwmon/adcxx.txt
@@ -0,0 +1,24 @@
+adcxx properties
+
+Required properties:
+- compatible: Must be one of the following:
+ - "national,adcxx1s" for adcxx1s
+ - "national,adcxx2s" for adcxx2s
+ - "national,adcxx4s" for adcxx4s
+ - "national,adcxx8s" for adcxx8s
+- reg: SPI address for chip
+
+Optional properties:
+
+- vref-supply
+ The external reference in microvolt for this device is set to this value.
+ If it does not exists the reference will be set to 3300000uV (3.3V).
+
+Example:
+
+adc@6 {
+ compatible = "national,adcxx2s";
+ reg = <6 0>;
+ spi-max-frequency = <1000000>;
+ vref-supply = <&vref>;
+};
--
2.11.0
On Thu, Nov 15, 2018 at 02:50:12PM +0100, Florian Eckert wrote:
> Document the devicetree bindings for the adcxx.
>
> Signed-off-by: Florian Eckert <[email protected]>
> ---
> Documentation/devicetree/bindings/hwmon/adcxx.txt | 24 +++++++++++++++++++++++
> 1 file changed, 24 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/hwmon/adcxx.txt
>
> diff --git a/Documentation/devicetree/bindings/hwmon/adcxx.txt b/Documentation/devicetree/bindings/hwmon/adcxx.txt
> new file mode 100644
> index 000000000000..a94a5fe21b6d
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/hwmon/adcxx.txt
> @@ -0,0 +1,24 @@
> +adcxx properties
Needs a better description of what this h/w is.
ADCs go in iio/adc/
> +
> +Required properties:
> +- compatible: Must be one of the following:
> + - "national,adcxx1s" for adcxx1s
> + - "national,adcxx2s" for adcxx2s
> + - "national,adcxx4s" for adcxx4s
> + - "national,adcxx8s" for adcxx8s
Don't use wildcards in compatible strings.
> +- reg: SPI address for chip
> +
> +Optional properties:
> +
> +- vref-supply
> + The external reference in microvolt for this device is set to this value.
> + If it does not exists the reference will be set to 3300000uV (3.3V).
> +
> +Example:
> +
> +adc@6 {
> + compatible = "national,adcxx2s";
> + reg = <6 0>;
? SPI addresses are a single cell.
> + spi-max-frequency = <1000000>;
> + vref-supply = <&vref>;
> +};
> --
> 2.11.0
>
On Sat, Nov 17, 2018 at 08:40:41AM -0600, Rob Herring wrote:
> On Thu, Nov 15, 2018 at 02:50:12PM +0100, Florian Eckert wrote:
> > Document the devicetree bindings for the adcxx.
> >
> > Signed-off-by: Florian Eckert <[email protected]>
> > ---
> > Documentation/devicetree/bindings/hwmon/adcxx.txt | 24 +++++++++++++++++++++++
> > 1 file changed, 24 insertions(+)
> > create mode 100644 Documentation/devicetree/bindings/hwmon/adcxx.txt
> >
> > diff --git a/Documentation/devicetree/bindings/hwmon/adcxx.txt b/Documentation/devicetree/bindings/hwmon/adcxx.txt
> > new file mode 100644
> > index 000000000000..a94a5fe21b6d
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/hwmon/adcxx.txt
> > @@ -0,0 +1,24 @@
> > +adcxx properties
>
> Needs a better description of what this h/w is.
>
> ADCs go in iio/adc/
>
FWIW, the hwmon driver for this chip series would be a perfect candidate
for a conversion to an iio driver. The driver predates the existence of
iio.
Florian, any interest doing that ? It is quite likely that the chip isn't
used for hardware monitoring.
> > +
> > +Required properties:
> > +- compatible: Must be one of the following:
> > + - "national,adcxx1s" for adcxx1s
> > + - "national,adcxx2s" for adcxx2s
> > + - "national,adcxx4s" for adcxx4s
> > + - "national,adcxx8s" for adcxx8s
>
> Don't use wildcards in compatible strings.
>
Should we list all of them ?
ADC121S021 ADC121S051 ADC121S101
ADC101S021 ADC101S051 ADC101S101
ADC081S021 ADC081S051 ADC081S101
ADC121S625 ADC121S655 ADC121S705
ADC122S021 ADC122S051 ADC122S101
ADC102S021 ADC102S051 ADC102S101
ADC082S021 ADC082S051 ADC082S101
ADC122S625 ADC122S655 ADC122S706
ADC124S021 ADC124S051 ADC124S101
ADC104S021 ADC104S051 ADC104S101
ADC084S021 ADC084S051 ADC084S101
ADC128S022 ADC128S052 ADC128S102
I hope I didn't miss any.
Guenter
> > +- reg: SPI address for chip
> > +
> > +Optional properties:
> > +
> > +- vref-supply
> > + The external reference in microvolt for this device is set to this value.
> > + If it does not exists the reference will be set to 3300000uV (3.3V).
> > +
> > +Example:
> > +
> > +adc@6 {
> > + compatible = "national,adcxx2s";
> > + reg = <6 0>;
>
> ? SPI addresses are a single cell.
>
> > + spi-max-frequency = <1000000>;
> > + vref-supply = <&vref>;
> > +};
> > --
> > 2.11.0
> >
Hello Guenter,
>>
>> Needs a better description of what this h/w is.
>>
>> ADCs go in iio/adc/
>>
> FWIW, the hwmon driver for this chip series would be a perfect
> candidate
> for a conversion to an iio driver. The driver predates the existence of
> iio.
>
> Florian, any interest doing that ? It is quite likely that the chip
> isn't
> used for hardware monitoring.
I will have a look on the next week about your suggestion to port this
device
to iio/adc.
- Florian