Skip to contentSkip to conversation

hwmon: Add device tree support for adcxx

PATCH In review Florian Eckert 3 participants 6 messages Nov 15, 2018 – Nov 20, 2018

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

v3 cover hwmon: Add device tree support for adcxx

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
Signature · 1 line
2.11.0
#1 lore raw

PATCH v3 1/2 hwmon: (adcxx) add devictree bindings documentation

Document the devicetree bindings for the adcxx.

---
 Documentation/devicetree/bindings/hwmon/adcxx.txt | 24 +++++++++++++++++++++++
 1 file changed, 24 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/hwmon/adcxx.txt
Documentation/devicetree/bindings/hwmon/adcxx.txt new file +24 -0
new file mode 100644
index 000000000000..a94a5fe21b6d
@@ -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>;
+};
Signature · 1 line
2.11.0
maintainer
#2 lore raw

Re: [PATCH v3 1/2] hwmon: (adcxx) add devictree bindings documentation

Quoted 14 lines · Florian Eckert

Document the devicetree bindings for the adcxx.

---
 Documentation/devicetree/bindings/hwmon/adcxx.txt | 24 +++++++++++++++++++++++
 1 file changed, 24 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/hwmon/adcxx.txt
Documentation/devicetree/bindings/hwmon/adcxx.txt new file +0 -0
new file mode 100644
index 000000000000..a94a5fe21b6d

Documentation/devicetree/bindings/hwmon/adcxx.txt line 1

Quoted 1 line
Documentation/devicetree/bindings/hwmon/adcxx.txt new file +1 -0
@@ -0,0 +1,24 @@
+adcxx properties

Needs a better description of what this h/w is.

ADCs go in iio/adc/

Documentation/devicetree/bindings/hwmon/adcxx.txt line 8

Quoted 7 lines
Documentation/devicetree/bindings/hwmon/adcxx.txt new file +7 -0
+
+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.

Documentation/devicetree/bindings/hwmon/adcxx.txt line 21

Quoted 13 lines
Documentation/devicetree/bindings/hwmon/adcxx.txt new file +13 -0
+- 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.

Quoted 6 lines
Documentation/devicetree/bindings/hwmon/adcxx.txt new file +3 -0
+	spi-max-frequency = <1000000>;
+	vref-supply = <&vref>;
+};
Signature · 1 line
2.11.0
maintainer
#3 lore raw

Re: [PATCH v3 1/2] hwmon: (adcxx) add devictree bindings documentation

Quoted 19 lines · Rob Herring
Quoted 14 lines · Florian Eckert

Document the devicetree bindings for the adcxx.

---
 Documentation/devicetree/bindings/hwmon/adcxx.txt | 24 +++++++++++++++++++++++
 1 file changed, 24 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/hwmon/adcxx.txt
Documentation/devicetree/bindings/hwmon/adcxx.txt new file +0 -0
new file mode 100644
index 000000000000..a94a5fe21b6d

Documentation/devicetree/bindings/hwmon/adcxx.txt line 1

Quoted 1 line
Documentation/devicetree/bindings/hwmon/adcxx.txt new file +1 -0
@@ -0,0 +1,24 @@
+adcxx properties

Needs a better description of what this h/w is.

Quoted 2 lines

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.

Quoted 10 lines

Documentation/devicetree/bindings/hwmon/adcxx.txt line 8

Quoted 7 lines
Documentation/devicetree/bindings/hwmon/adcxx.txt new file +7 -0
+
+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

Quoted 22 lines

Documentation/devicetree/bindings/hwmon/adcxx.txt line 21

Quoted 13 lines
Documentation/devicetree/bindings/hwmon/adcxx.txt new file +13 -0
+- 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.

Quoted 6 lines
Documentation/devicetree/bindings/hwmon/adcxx.txt new file +3 -0
+	spi-max-frequency = <1000000>;
+	vref-supply = <&vref>;
+};
Signature · 1 line
2.11.0
#4 lore raw

Re: [PATCH v3 1/2] hwmon: (adcxx) add devictree bindings documentation

Hello Guenter,

Quoted 11 lines
Quoted 5 lines

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

#5 lore raw

PATCH v3 2/2 hwmon: (adcxx) Add device tree support

In reply to Florian Eckert

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

---
 drivers/hwmon/adcxx.c | 62 +++++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 55 insertions(+), 7 deletions(-)
drivers/hwmon/adcxx.c +55 -7
index 69e0bb97e597..6f3e7d65b5b8 100644
@@ -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,
Signature · 1 line
2.11.0