All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCHv2 1/2] Add AD7949 ADC driver family
@ 2018-10-17 20:39 Charles-Antoine Couret
  2018-10-17 20:39 ` [PATCHv2 2/2] Add AD7949 device tree bindings in documentation Charles-Antoine Couret
                   ` (3 more replies)
  0 siblings, 4 replies; 6+ messages in thread
From: Charles-Antoine Couret @ 2018-10-17 20:39 UTC (permalink / raw)
  To: linux-iio; +Cc: Charles-Antoine Couret

Add AD7949 ADC driver family

Compatible with AD7682 and AD7689 chips.
It is a Analog Devices ADC driver 14/16 bits 4/8 channels
with SPI protocol

Datasheet of the device:
http://www.analog.com/media/en/technical-documentation/data-sheets/AD7949.pdf

Signed-off-by: Charles-Antoine Couret <charles-antoine.couret@essensium.com>
---
 drivers/iio/adc/Kconfig  |  10 ++
 drivers/iio/adc/Makefile |   1 +
 drivers/iio/adc/ad7949.c | 352 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 363 insertions(+)
 create mode 100644 drivers/iio/adc/ad7949.c

diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig
index 4a754921fb6f..42e66efff6c0 100644
--- a/drivers/iio/adc/Kconfig
+++ b/drivers/iio/adc/Kconfig
@@ -116,6 +116,16 @@ config AD7923
 	  To compile this driver as a module, choose M here: the
 	  module will be called ad7923.
 
+config AD7949
+	tristate "Analog Devices AD7949 and similar ADCs driver"
+	depends on SPI
+	help
+	  Say yes here to build support for Analog Devices
+	  AD7949, AD7682, AD7689 8 Channel ADCs.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called ad7949.
+
 config AD799X
 	tristate "Analog Devices AD799x ADC driver"
 	depends on I2C
diff --git a/drivers/iio/adc/Makefile b/drivers/iio/adc/Makefile
index 03db7b578f9c..88804c867aa9 100644
--- a/drivers/iio/adc/Makefile
+++ b/drivers/iio/adc/Makefile
@@ -14,6 +14,7 @@ obj-$(CONFIG_AD7766) += ad7766.o
 obj-$(CONFIG_AD7791) += ad7791.o
 obj-$(CONFIG_AD7793) += ad7793.o
 obj-$(CONFIG_AD7887) += ad7887.o
+obj-$(CONFIG_AD7949) += ad7949.o
 obj-$(CONFIG_AD799X) += ad799x.o
 obj-$(CONFIG_ASPEED_ADC) += aspeed_adc.o
 obj-$(CONFIG_AT91_ADC) += at91_adc.o
diff --git a/drivers/iio/adc/ad7949.c b/drivers/iio/adc/ad7949.c
new file mode 100644
index 000000000000..da5082e80317
--- /dev/null
+++ b/drivers/iio/adc/ad7949.c
@@ -0,0 +1,352 @@
+// SPDX-License-Identifier: GPL-2.0
+/* ad7949.c - Analog Devices ADC driver 14/16 bits 4/8 channels
+ *
+ * Copyright (C) 2018 CMC NV
+ *
+ * http://www.analog.com/media/en/technical-documentation/data-sheets/AD7949.pdf
+ */
+
+#include <linux/delay.h>
+#include <linux/iio/iio.h>
+#include <linux/module.h>
+#include <linux/regulator/consumer.h>
+#include <linux/spi/spi.h>
+
+#define AD7949_MASK_CHANNEL_SEL		GENMASK(9, 7)
+#define AD7949_MASK_TOTAL		GENMASK(13, 0)
+#define AD7949_OFFSET_CHANNEL_SEL	7
+#define AD7949_CFG_READ_BACK		0x1
+#define AD7949_CFG_REG_SIZE_BITS	14
+
+enum {
+	ID_AD7949 = 0,
+	ID_AD7682,
+	ID_AD7689,
+};
+
+struct ad7949_adc_spec {
+	u8 num_channels;
+	u8 resolution;
+};
+
+static const struct ad7949_adc_spec ad7949_adc_spec[] = {
+	[ID_AD7949]  = { .num_channels = 8, .resolution = 14 },
+	[ID_AD7682] = { .num_channels = 4, .resolution = 16 },
+	[ID_AD7689] = { .num_channels = 8, .resolution = 16 },
+};
+
+/**
+ * struct ad7949_adc_chip - AD ADC chip
+ * @lock: protects write sequences
+ * @vref: regulator generating Vref
+ * @iio_dev: reference to iio structure
+ * @spi: reference to spi structure
+ * @resolution: resolution of the chip
+ * @cfg: copy of the configuration register
+ * @current_channel: current channel in use
+ * @buffer: buffer to send / receive data to / from device
+ */
+struct ad7949_adc_chip {
+	struct mutex lock;
+	struct regulator *vref;
+	struct iio_dev *indio_dev;
+	struct spi_device *spi;
+	u8 resolution;
+	u16 cfg;
+	unsigned int current_channel;
+	u32 buffer ____cacheline_aligned;
+};
+
+static bool ad7949_spi_cfg_is_read_back(struct ad7949_adc_chip *ad7949_adc)
+{
+	if (!(ad7949_adc->cfg & AD7949_CFG_READ_BACK))
+		return true;
+
+	return false;
+}
+
+static int ad7949_spi_bits_per_word(struct ad7949_adc_chip *ad7949_adc)
+{
+	int ret = ad7949_adc->resolution;
+
+	if (ad7949_spi_cfg_is_read_back(ad7949_adc))
+		ret += AD7949_CFG_REG_SIZE_BITS;
+
+	return ret;
+}
+
+static int ad7949_spi_write_cfg(struct ad7949_adc_chip *ad7949_adc, u16 val,
+				u16 mask)
+{
+	int ret;
+	int bits_per_word = ad7949_spi_bits_per_word(ad7949_adc);
+	int shift = bits_per_word - AD7949_CFG_REG_SIZE_BITS;
+	struct spi_message msg;
+	struct spi_transfer tx[] = {
+		{
+			.tx_buf = &ad7949_adc->buffer,
+			.len = 4,
+			.bits_per_word = bits_per_word,
+		},
+	};
+
+	ad7949_adc->cfg = (val & mask) | (ad7949_adc->cfg & ~mask);
+	ad7949_adc->buffer = ad7949_adc->cfg << shift;
+	spi_message_init(&msg);
+	spi_message_add_tail(&tx[0], &msg);
+	ret = spi_sync(ad7949_adc->spi, &msg);
+
+	/* This delay is to avoid a new request before the required time to
+	 * send a new command to the device
+	 */ 
+	udelay(2);
+	return ret;
+}
+
+static int ad7949_spi_read_channel(struct ad7949_adc_chip *ad7949_adc, int *val,
+				   unsigned int channel)
+{
+	int ret;
+	int bits_per_word = ad7949_spi_bits_per_word(ad7949_adc);
+	int mask = GENMASK(ad7949_adc->resolution, 0);
+	struct spi_message msg;
+	struct spi_transfer tx[] = {
+		{
+			.rx_buf = &ad7949_adc->buffer,
+			.len = 4,
+			.bits_per_word = bits_per_word,
+		},
+	};
+
+	ret = ad7949_spi_write_cfg(ad7949_adc,
+				   channel << AD7949_OFFSET_CHANNEL_SEL,
+				   AD7949_MASK_CHANNEL_SEL);
+	if (ret)
+		return ret;
+
+	ad7949_adc->buffer = 0;
+	spi_message_init(&msg);
+	spi_message_add_tail(&tx[0], &msg);
+	ret = spi_sync(ad7949_adc->spi, &msg);
+	if (ret)
+		return ret;
+
+	/* This delay is to avoid a new request before the required time to
+	 * send a new command to the device
+	 */ 
+	udelay(2);
+
+	ad7949_adc->current_channel = channel;
+
+	if (ad7949_spi_cfg_is_read_back(ad7949_adc))
+		*val = (ad7949_adc->buffer >> AD7949_CFG_REG_SIZE_BITS) & mask;
+	else
+		*val = ad7949_adc->buffer & mask;
+
+	return 0;
+}
+
+#define AD7949_ADC_CHANNEL(chan) {				\
+	.type = IIO_VOLTAGE,					\
+	.indexed = 1,						\
+	.channel = (chan),					\
+	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),		\
+	.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),	\
+}
+
+static const struct iio_chan_spec ad7949_adc_channels[] = {
+	AD7949_ADC_CHANNEL(0),
+	AD7949_ADC_CHANNEL(1),
+	AD7949_ADC_CHANNEL(2),
+	AD7949_ADC_CHANNEL(3),
+	AD7949_ADC_CHANNEL(4),
+	AD7949_ADC_CHANNEL(5),
+	AD7949_ADC_CHANNEL(6),
+	AD7949_ADC_CHANNEL(7),
+};
+
+static int ad7949_spi_read_raw(struct iio_dev *indio_dev,
+			   struct iio_chan_spec const *chan,
+			   int *val, int *val2, long mask)
+{
+	struct ad7949_adc_chip *ad7949_adc = iio_priv(indio_dev);
+	int ret;
+
+	if (!val)
+		return -EINVAL;
+
+	switch (mask) {
+	case IIO_CHAN_INFO_RAW:
+		mutex_lock(&ad7949_adc->lock);
+		ret = ad7949_spi_read_channel(ad7949_adc, val, chan->channel);
+		mutex_unlock(&ad7949_adc->lock);
+
+		if (ret < 0)
+			return ret;
+
+		return IIO_VAL_INT;
+
+	case IIO_CHAN_INFO_SCALE:
+		ret = regulator_get_voltage(ad7949_adc->vref);
+		if (ret < 0)
+			return ret;
+
+		*val = ret / 5000;
+		return IIO_VAL_INT;
+	}
+
+	return -EINVAL;
+}
+
+static int ad7949_spi_reg_access(struct iio_dev *indio_dev,
+			unsigned int reg, unsigned int writeval,
+			unsigned int *readval)
+{
+	struct ad7949_adc_chip *ad7949_adc = iio_priv(indio_dev);
+	int ret = 0;
+
+	if (readval)
+		*readval = ad7949_adc->cfg;
+	else
+		ret = ad7949_spi_write_cfg(ad7949_adc,
+			writeval & AD7949_MASK_TOTAL, AD7949_MASK_TOTAL);
+
+	return ret;
+}
+
+static const struct iio_info ad7949_spi_info = {
+	.read_raw = ad7949_spi_read_raw,
+	.debugfs_reg_access = ad7949_spi_reg_access,
+};
+
+static int ad7949_spi_init(struct ad7949_adc_chip *ad7949_adc)
+{
+	int ret;
+	int val;
+
+	/* Sequencer disabled, CFG readback disabled, IN0 as default channel */
+	ad7949_adc->current_channel = 0;
+	ret = ad7949_spi_write_cfg(ad7949_adc, 0x3C79, AD7949_MASK_TOTAL);
+
+	/* Do two dummy conversions to apply the first configuration setting.
+	 * Required only after the start up of the device.
+	 */
+	ad7949_spi_read_channel(ad7949_adc, &val, ad7949_adc->current_channel);
+	ad7949_spi_read_channel(ad7949_adc, &val, ad7949_adc->current_channel);
+	return ret;
+}
+
+static int ad7949_spi_probe(struct spi_device *spi)
+{
+	struct device *dev = &spi->dev;
+	const struct ad7949_adc_spec *spec;
+	struct ad7949_adc_chip *ad7949_adc;
+	struct iio_dev *indio_dev;
+	int ret;
+
+	indio_dev = devm_iio_device_alloc(dev, sizeof(*ad7949_adc));
+	if (!indio_dev) {
+		dev_err(dev, "can not allocate iio device\n");
+		return -ENOMEM;
+	}
+
+	spi->max_speed_hz = 33000000;
+	spi->mode = SPI_MODE_0;
+	spi->bits_per_word = 8;
+	spi_setup(spi);
+
+	indio_dev->dev.parent = dev;
+	indio_dev->dev.of_node = dev->of_node;
+	indio_dev->info = &ad7949_spi_info;
+	indio_dev->name = spi_get_device_id(spi)->name;
+	indio_dev->modes = INDIO_DIRECT_MODE;
+	indio_dev->channels = ad7949_adc_channels;
+	spi_set_drvdata(spi, indio_dev);
+
+	ad7949_adc = iio_priv(indio_dev);
+	ad7949_adc->indio_dev = indio_dev;
+	ad7949_adc->spi = spi;
+
+	spec = &ad7949_adc_spec[spi_get_device_id(spi)->driver_data];
+	indio_dev->num_channels = spec->num_channels;
+	ad7949_adc->resolution = spec->resolution;
+
+	ad7949_adc->vref = devm_regulator_get(dev, "vref");
+	if (IS_ERR(ad7949_adc->vref)) {
+		dev_err(dev, "fail to request regulator\n");
+		return PTR_ERR(ad7949_adc->vref);
+	}
+
+	ret = regulator_enable(ad7949_adc->vref);
+	if (ret < 0) {
+		dev_err(dev, "fail to enable regulator\n");
+		goto err_regulator;
+	}
+
+	mutex_init(&ad7949_adc->lock);
+
+	ret = ad7949_spi_init(ad7949_adc);
+	if (ret) {
+		dev_err(dev, "enable to init this device: %d\n", ret);
+		goto err;
+	}
+
+	ret = iio_device_register(indio_dev);
+	if (ret) {
+		dev_err(dev, "fail to register iio device: %d\n", ret);
+		goto err;
+	}
+
+	return 0;
+
+err:
+	mutex_destroy(&ad7949_adc->lock);
+	regulator_disable(ad7949_adc->vref);
+err_regulator:
+	return ret;
+}
+
+static int ad7949_spi_remove(struct spi_device *spi)
+{
+	struct iio_dev *indio_dev = spi_get_drvdata(spi);
+	struct ad7949_adc_chip *ad7949_adc = iio_priv(indio_dev);
+
+	iio_device_unregister(indio_dev);
+	mutex_destroy(&ad7949_adc->lock);
+	regulator_disable(ad7949_adc->vref);
+
+	return 0;
+}
+
+#ifdef CONFIG_OF
+static const struct of_device_id ad7949_spi_of_id[] = {
+	{ .compatible = "ad7949" },
+	{ .compatible = "ad7682" },
+	{ .compatible = "ad7689" },
+	{ }
+};
+MODULE_DEVICE_TABLE(of, ad7949_spi_of_id);
+#endif
+
+static const struct spi_device_id ad7949_spi_id[] = {
+	{ "ad7949", ID_AD7949  },
+	{ "ad7682", ID_AD7682 },
+	{ "ad7689", ID_AD7689 },
+	{ }
+};
+MODULE_DEVICE_TABLE(spi, ad7949_spi_id);
+
+static struct spi_driver ad7949_spi_driver = {
+	.driver = {
+		.name		= "ad7949",
+		.of_match_table	= of_match_ptr(ad7949_spi_of_id),
+	},
+	.probe	  = ad7949_spi_probe,
+	.remove   = ad7949_spi_remove,
+	.id_table = ad7949_spi_id,
+};
+module_spi_driver(ad7949_spi_driver);
+
+MODULE_AUTHOR("Charles-Antoine Couret <charles-antoine.couret@essensium.com>");
+MODULE_DESCRIPTION("Analog Devices 14/16-bit 8-channel ADC driver");
+MODULE_LICENSE("GPL v2");
-- 
2.17.2

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

* [PATCHv2 2/2] Add AD7949 device tree bindings in documentation
  2018-10-17 20:39 [PATCHv2 1/2] Add AD7949 ADC driver family Charles-Antoine Couret
@ 2018-10-17 20:39 ` Charles-Antoine Couret
  2018-10-21 16:46   ` Jonathan Cameron
  2018-10-18  7:02 ` [PATCHv2 1/2] Add AD7949 ADC driver family Ardelean, Alexandru
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 6+ messages in thread
From: Charles-Antoine Couret @ 2018-10-17 20:39 UTC (permalink / raw)
  To: linux-iio; +Cc: Charles-Antoine Couret

Add AD7949 device tree bindings in documentation

Signed-off-by: Charles-Antoine Couret <charles-antoine.couret@essensium.com>
---
 .../devicetree/bindings/iio/adc/ad7949.txt     | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/iio/adc/ad7949.txt

diff --git a/Documentation/devicetree/bindings/iio/adc/ad7949.txt b/Documentation/devicetree/bindings/iio/adc/ad7949.txt
new file mode 100644
index 000000000000..9ecb84188d83
--- /dev/null
+++ b/Documentation/devicetree/bindings/iio/adc/ad7949.txt
@@ -0,0 +1,18 @@
+* Analog Devices AD7949/AD7682/AD7689
+
+Required properties:
+ - compatible: Should be one of
+	* "ad7949"
+	* "ad7682"
+	* "ad7689"
+ - reg: spi chip select number for the device
+ - vref-supply: The regulator supply for ADC reference voltage
+ - spi-max-frequency: Max SPI frequency to use (< 33000000)
+
+Example:
+adc@0 {
+	compatible = "ad7949";
+	reg = <0>;
+	vref-supply = <&vdd_supply>;
+	spi-max-frequency = <200000>;
+};
-- 
2.17.2

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

* Re: [PATCHv2 1/2] Add AD7949 ADC driver family
  2018-10-17 20:39 [PATCHv2 1/2] Add AD7949 ADC driver family Charles-Antoine Couret
  2018-10-17 20:39 ` [PATCHv2 2/2] Add AD7949 device tree bindings in documentation Charles-Antoine Couret
@ 2018-10-18  7:02 ` Ardelean, Alexandru
  2018-10-18  7:06 ` Ardelean, Alexandru
  2018-10-21 16:58 ` Jonathan Cameron
  3 siblings, 0 replies; 6+ messages in thread
From: Ardelean, Alexandru @ 2018-10-18  7:02 UTC (permalink / raw)
  To: linux-iio, charles-antoine.couret

T24gV2VkLCAyMDE4LTEwLTE3IGF0IDIyOjM5ICswMjAwLCBDaGFybGVzLUFudG9pbmUgQ291cmV0
IHdyb3RlOg0KPiBBZGQgQUQ3OTQ5IEFEQyBkcml2ZXIgZmFtaWx5DQo+IA0KPiBDb21wYXRpYmxl
IHdpdGggQUQ3NjgyIGFuZCBBRDc2ODkgY2hpcHMuDQo+IEl0IGlzIGEgQW5hbG9nIERldmljZXMg
QURDIGRyaXZlciAxNC8xNiBiaXRzIDQvOCBjaGFubmVscw0KPiB3aXRoIFNQSSBwcm90b2NvbA0K
PiANCj4gRGF0YXNoZWV0IG9mIHRoZSBkZXZpY2U6DQo+IA0KaHR0cDovL3d3dy5hbmFsb2cuY29t
L21lZGlhL2VuL3RlY2huaWNhbC1kb2N1bWVudGF0aW9uL2RhdGEtc2hlZXRzL0FENzk0OS5wZGYN
Cj4gDQo+IFNpZ25lZC1vZmYtYnk6IENoYXJsZXMtQW50b2luZSBDb3VyZXQgPA0KPiBjaGFybGVz
LWFudG9pbmUuY291cmV0QGVzc2Vuc2l1bS5jb20+DQo+IC0tLQ0KPiAgZHJpdmVycy9paW8vYWRj
L0tjb25maWcgIHwgIDEwICsrDQo+ICBkcml2ZXJzL2lpby9hZGMvTWFrZWZpbGUgfCAgIDEgKw0K
PiAgZHJpdmVycy9paW8vYWRjL2FkNzk0OS5jIHwgMzUyICsrKysrKysrKysrKysrKysrKysrKysr
KysrKysrKysrKysrKysrKw0KPiAgMyBmaWxlcyBjaGFuZ2VkLCAzNjMgaW5zZXJ0aW9ucygrKQ0K
PiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvaWlvL2FkYy9hZDc5NDkuYw0KPiANCj4gZGlm
ZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FkYy9LY29uZmlnIGIvZHJpdmVycy9paW8vYWRjL0tjb25m
aWcNCj4gaW5kZXggNGE3NTQ5MjFmYjZmLi40MmU2NmVmZmY2YzAgMTAwNjQ0DQo+IC0tLSBhL2Ry
aXZlcnMvaWlvL2FkYy9LY29uZmlnDQo+ICsrKyBiL2RyaXZlcnMvaWlvL2FkYy9LY29uZmlnDQo+
IEBAIC0xMTYsNiArMTE2LDE2IEBAIGNvbmZpZyBBRDc5MjMNCj4gIAkgIFRvIGNvbXBpbGUgdGhp
cyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQ0KPiAgCSAgbW9kdWxlIHdp
bGwgYmUgY2FsbGVkIGFkNzkyMy4NCj4gIA0KPiArY29uZmlnIEFENzk0OQ0KPiArCXRyaXN0YXRl
ICJBbmFsb2cgRGV2aWNlcyBBRDc5NDkgYW5kIHNpbWlsYXIgQURDcyBkcml2ZXIiDQo+ICsJZGVw
ZW5kcyBvbiBTUEkNCj4gKwloZWxwDQo+ICsJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9y
dCBmb3IgQW5hbG9nIERldmljZXMNCj4gKwkgIEFENzk0OSwgQUQ3NjgyLCBBRDc2ODkgOCBDaGFu
bmVsIEFEQ3MuDQo+ICsNCj4gKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUs
IGNob29zZSBNIGhlcmU6IHRoZQ0KPiArCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFkNzk0OS4N
Cj4gKw0KPiAgY29uZmlnIEFENzk5WA0KPiAgCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRDc5
OXggQURDIGRyaXZlciINCj4gIAlkZXBlbmRzIG9uIEkyQw0KPiBkaWZmIC0tZ2l0IGEvZHJpdmVy
cy9paW8vYWRjL01ha2VmaWxlIGIvZHJpdmVycy9paW8vYWRjL01ha2VmaWxlDQo+IGluZGV4IDAz
ZGI3YjU3OGY5Yy4uODg4MDRjODY3YWE5IDEwMDY0NA0KPiAtLS0gYS9kcml2ZXJzL2lpby9hZGMv
TWFrZWZpbGUNCj4gKysrIGIvZHJpdmVycy9paW8vYWRjL01ha2VmaWxlDQo+IEBAIC0xNCw2ICsx
NCw3IEBAIG9iai0kKENPTkZJR19BRDc3NjYpICs9IGFkNzc2Ni5vDQo+ICBvYmotJChDT05GSUdf
QUQ3NzkxKSArPSBhZDc3OTEubw0KPiAgb2JqLSQoQ09ORklHX0FENzc5MykgKz0gYWQ3NzkzLm8N
Cj4gIG9iai0kKENPTkZJR19BRDc4ODcpICs9IGFkNzg4Ny5vDQo+ICtvYmotJChDT05GSUdfQUQ3
OTQ5KSArPSBhZDc5NDkubw0KPiAgb2JqLSQoQ09ORklHX0FENzk5WCkgKz0gYWQ3OTl4Lm8NCj4g
IG9iai0kKENPTkZJR19BU1BFRURfQURDKSArPSBhc3BlZWRfYWRjLm8NCj4gIG9iai0kKENPTkZJ
R19BVDkxX0FEQykgKz0gYXQ5MV9hZGMubw0KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRj
L2FkNzk0OS5jIGIvZHJpdmVycy9paW8vYWRjL2FkNzk0OS5jDQo+IG5ldyBmaWxlIG1vZGUgMTAw
NjQ0DQo+IGluZGV4IDAwMDAwMDAwMDAwMC4uZGE1MDgyZTgwMzE3DQo+IC0tLSAvZGV2L251bGwN
Cj4gKysrIGIvZHJpdmVycy9paW8vYWRjL2FkNzk0OS5jDQo+IEBAIC0wLDAgKzEsMzUyIEBADQo+
ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMA0KPiArLyogYWQ3OTQ5LmMgLSBB
bmFsb2cgRGV2aWNlcyBBREMgZHJpdmVyIDE0LzE2IGJpdHMgNC84IGNoYW5uZWxzDQo+ICsgKg0K
PiArICogQ29weXJpZ2h0IChDKSAyMDE4IENNQyBOVg0KPiArICoNCj4gKyAqIA0KPiBodHRwOi8v
d3d3LmFuYWxvZy5jb20vbWVkaWEvZW4vdGVjaG5pY2FsLWRvY3VtZW50YXRpb24vZGF0YS1zaGVl
dHMvQUQ3OTQ5LnBkZg0KPiArICovDQo+ICsNCj4gKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPg0K
PiArI2luY2x1ZGUgPGxpbnV4L2lpby9paW8uaD4NCj4gKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUu
aD4NCj4gKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4NCj4gKyNpbmNsdWRl
IDxsaW51eC9zcGkvc3BpLmg+DQo+ICsNCj4gKyNkZWZpbmUgQUQ3OTQ5X01BU0tfQ0hBTk5FTF9T
RUwJCUdFTk1BU0soOSwgNykNCj4gKyNkZWZpbmUgQUQ3OTQ5X01BU0tfVE9UQUwJCUdFTk1BU0so
MTMsIDApDQo+ICsjZGVmaW5lIEFENzk0OV9PRkZTRVRfQ0hBTk5FTF9TRUwJNw0KPiArI2RlZmlu
ZSBBRDc5NDlfQ0ZHX1JFQURfQkFDSwkJMHgxDQo+ICsjZGVmaW5lIEFENzk0OV9DRkdfUkVHX1NJ
WkVfQklUUwkxNA0KPiArDQo+ICtlbnVtIHsNCj4gKwlJRF9BRDc5NDkgPSAwLA0KPiArCUlEX0FE
NzY4MiwNCj4gKwlJRF9BRDc2ODksDQo+ICt9Ow0KPiArDQo+ICtzdHJ1Y3QgYWQ3OTQ5X2FkY19z
cGVjIHsNCj4gKwl1OCBudW1fY2hhbm5lbHM7DQo+ICsJdTggcmVzb2x1dGlvbjsNCj4gK307DQo+
ICsNCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWQ3OTQ5X2FkY19zcGVjIGFkNzk0OV9hZGNfc3Bl
Y1tdID0gew0KPiArCVtJRF9BRDc5NDldICA9IHsgLm51bV9jaGFubmVscyA9IDgsIC5yZXNvbHV0
aW9uID0gMTQgfSwNCj4gKwlbSURfQUQ3NjgyXSA9IHsgLm51bV9jaGFubmVscyA9IDQsIC5yZXNv
bHV0aW9uID0gMTYgfSwNCj4gKwlbSURfQUQ3Njg5XSA9IHsgLm51bV9jaGFubmVscyA9IDgsIC5y
ZXNvbHV0aW9uID0gMTYgfSwNCj4gK307DQo+ICsNCj4gKy8qKg0KPiArICogc3RydWN0IGFkNzk0
OV9hZGNfY2hpcCAtIEFEIEFEQyBjaGlwDQo+ICsgKiBAbG9jazogcHJvdGVjdHMgd3JpdGUgc2Vx
dWVuY2VzDQo+ICsgKiBAdnJlZjogcmVndWxhdG9yIGdlbmVyYXRpbmcgVnJlZg0KPiArICogQGlp
b19kZXY6IHJlZmVyZW5jZSB0byBpaW8gc3RydWN0dXJlDQo+ICsgKiBAc3BpOiByZWZlcmVuY2Ug
dG8gc3BpIHN0cnVjdHVyZQ0KPiArICogQHJlc29sdXRpb246IHJlc29sdXRpb24gb2YgdGhlIGNo
aXANCj4gKyAqIEBjZmc6IGNvcHkgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXINCj4gKyAq
IEBjdXJyZW50X2NoYW5uZWw6IGN1cnJlbnQgY2hhbm5lbCBpbiB1c2UNCj4gKyAqIEBidWZmZXI6
IGJ1ZmZlciB0byBzZW5kIC8gcmVjZWl2ZSBkYXRhIHRvIC8gZnJvbSBkZXZpY2UNCj4gKyAqLw0K
PiArc3RydWN0IGFkNzk0OV9hZGNfY2hpcCB7DQo+ICsJc3RydWN0IG11dGV4IGxvY2s7DQo+ICsJ
c3RydWN0IHJlZ3VsYXRvciAqdnJlZjsNCj4gKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2Ow0K
PiArCXN0cnVjdCBzcGlfZGV2aWNlICpzcGk7DQo+ICsJdTggcmVzb2x1dGlvbjsNCj4gKwl1MTYg
Y2ZnOw0KPiArCXVuc2lnbmVkIGludCBjdXJyZW50X2NoYW5uZWw7DQo+ICsJdTMyIGJ1ZmZlciBf
X19fY2FjaGVsaW5lX2FsaWduZWQ7DQo+ICt9Ow0KPiArDQo+ICtzdGF0aWMgYm9vbCBhZDc5NDlf
c3BpX2NmZ19pc19yZWFkX2JhY2soc3RydWN0IGFkNzk0OV9hZGNfY2hpcA0KPiAqYWQ3OTQ5X2Fk
YykNCj4gK3sNCj4gKwlpZiAoIShhZDc5NDlfYWRjLT5jZmcgJiBBRDc5NDlfQ0ZHX1JFQURfQkFD
SykpDQo+ICsJCXJldHVybiB0cnVlOw0KPiArDQo+ICsJcmV0dXJuIGZhbHNlOw0KPiArfQ0KPiAr
DQo+ICtzdGF0aWMgaW50IGFkNzk0OV9zcGlfYml0c19wZXJfd29yZChzdHJ1Y3QgYWQ3OTQ5X2Fk
Y19jaGlwICphZDc5NDlfYWRjKQ0KPiArew0KPiArCWludCByZXQgPSBhZDc5NDlfYWRjLT5yZXNv
bHV0aW9uOw0KPiArDQo+ICsJaWYgKGFkNzk0OV9zcGlfY2ZnX2lzX3JlYWRfYmFjayhhZDc5NDlf
YWRjKSkNCj4gKwkJcmV0ICs9IEFENzk0OV9DRkdfUkVHX1NJWkVfQklUUzsNCj4gKw0KPiArCXJl
dHVybiByZXQ7DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyBpbnQgYWQ3OTQ5X3NwaV93cml0ZV9jZmco
c3RydWN0IGFkNzk0OV9hZGNfY2hpcCAqYWQ3OTQ5X2FkYywgdTE2DQo+IHZhbCwNCj4gKwkJCQl1
MTYgbWFzaykNCj4gK3sNCj4gKwlpbnQgcmV0Ow0KPiArCWludCBiaXRzX3Blcl93b3JkID0gYWQ3
OTQ5X3NwaV9iaXRzX3Blcl93b3JkKGFkNzk0OV9hZGMpOw0KPiArCWludCBzaGlmdCA9IGJpdHNf
cGVyX3dvcmQgLSBBRDc5NDlfQ0ZHX1JFR19TSVpFX0JJVFM7DQo+ICsJc3RydWN0IHNwaV9tZXNz
YWdlIG1zZzsNCj4gKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHR4W10gPSB7DQo+ICsJCXsNCj4gKwkJ
CS50eF9idWYgPSAmYWQ3OTQ5X2FkYy0+YnVmZmVyLA0KPiArCQkJLmxlbiA9IDQsDQo+ICsJCQku
Yml0c19wZXJfd29yZCA9IGJpdHNfcGVyX3dvcmQsDQo+ICsJCX0sDQo+ICsJfTsNCj4gKw0KPiAr
CWFkNzk0OV9hZGMtPmNmZyA9ICh2YWwgJiBtYXNrKSB8IChhZDc5NDlfYWRjLT5jZmcgJiB+bWFz
ayk7DQo+ICsJYWQ3OTQ5X2FkYy0+YnVmZmVyID0gYWQ3OTQ5X2FkYy0+Y2ZnIDw8IHNoaWZ0Ow0K
PiArCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7DQo+ICsJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnR4
WzBdLCAmbXNnKTsNCj4gKwlyZXQgPSBzcGlfc3luYyhhZDc5NDlfYWRjLT5zcGksICZtc2cpOw0K
PiArDQo+ICsJLyogVGhpcyBkZWxheSBpcyB0byBhdm9pZCBhIG5ldyByZXF1ZXN0IGJlZm9yZSB0
aGUgcmVxdWlyZWQgdGltZSB0bw0KPiArCSAqIHNlbmQgYSBuZXcgY29tbWFuZCB0byB0aGUgZGV2
aWNlDQo+ICsJICovIA0KPiArCXVkZWxheSgyKTsNCj4gKwlyZXR1cm4gcmV0Ow0KPiArfQ0KPiAr
DQo+ICtzdGF0aWMgaW50IGFkNzk0OV9zcGlfcmVhZF9jaGFubmVsKHN0cnVjdCBhZDc5NDlfYWRj
X2NoaXAgKmFkNzk0OV9hZGMsDQo+IGludCAqdmFsLA0KPiArCQkJCSAgIHVuc2lnbmVkIGludCBj
aGFubmVsKQ0KPiArew0KPiArCWludCByZXQ7DQo+ICsJaW50IGJpdHNfcGVyX3dvcmQgPSBhZDc5
NDlfc3BpX2JpdHNfcGVyX3dvcmQoYWQ3OTQ5X2FkYyk7DQo+ICsJaW50IG1hc2sgPSBHRU5NQVNL
KGFkNzk0OV9hZGMtPnJlc29sdXRpb24sIDApOw0KPiArCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7
DQo+ICsJc3RydWN0IHNwaV90cmFuc2ZlciB0eFtdID0gew0KPiArCQl7DQo+ICsJCQkucnhfYnVm
ID0gJmFkNzk0OV9hZGMtPmJ1ZmZlciwNCj4gKwkJCS5sZW4gPSA0LA0KPiArCQkJLmJpdHNfcGVy
X3dvcmQgPSBiaXRzX3Blcl93b3JkLA0KPiArCQl9LA0KPiArCX07DQo+ICsNCj4gKwlyZXQgPSBh
ZDc5NDlfc3BpX3dyaXRlX2NmZyhhZDc5NDlfYWRjLA0KPiArCQkJCSAgIGNoYW5uZWwgPDwgQUQ3
OTQ5X09GRlNFVF9DSEFOTkVMX1NFTCwNCj4gKwkJCQkgICBBRDc5NDlfTUFTS19DSEFOTkVMX1NF
TCk7DQo+ICsJaWYgKHJldCkNCj4gKwkJcmV0dXJuIHJldDsNCj4gKw0KPiArCWFkNzk0OV9hZGMt
PmJ1ZmZlciA9IDA7DQo+ICsJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsNCj4gKwlzcGlfbWVzc2Fn
ZV9hZGRfdGFpbCgmdHhbMF0sICZtc2cpOw0KPiArCXJldCA9IHNwaV9zeW5jKGFkNzk0OV9hZGMt
PnNwaSwgJm1zZyk7DQo+ICsJaWYgKHJldCkNCj4gKwkJcmV0dXJuIHJldDsNCj4gKw0KPiArCS8q
IFRoaXMgZGVsYXkgaXMgdG8gYXZvaWQgYSBuZXcgcmVxdWVzdCBiZWZvcmUgdGhlIHJlcXVpcmVk
IHRpbWUgdG8NCj4gKwkgKiBzZW5kIGEgbmV3IGNvbW1hbmQgdG8gdGhlIGRldmljZQ0KPiArCSAq
LyANCj4gKwl1ZGVsYXkoMik7DQo+ICsNCj4gKwlhZDc5NDlfYWRjLT5jdXJyZW50X2NoYW5uZWwg
PSBjaGFubmVsOw0KPiArDQo+ICsJaWYgKGFkNzk0OV9zcGlfY2ZnX2lzX3JlYWRfYmFjayhhZDc5
NDlfYWRjKSkNCj4gKwkJKnZhbCA9IChhZDc5NDlfYWRjLT5idWZmZXIgPj4gQUQ3OTQ5X0NGR19S
RUdfU0laRV9CSVRTKSAmDQo+IG1hc2s7DQo+ICsJZWxzZQ0KPiArCQkqdmFsID0gYWQ3OTQ5X2Fk
Yy0+YnVmZmVyICYgbWFzazsNCj4gKw0KPiArCXJldHVybiAwOw0KPiArfQ0KPiArDQo+ICsjZGVm
aW5lIEFENzk0OV9BRENfQ0hBTk5FTChjaGFuKSB7CQkJCVwNCj4gKwkudHlwZSA9IElJT19WT0xU
QUdFLAkJCQkJXA0KPiArCS5pbmRleGVkID0gMSwJCQkJCQlcDQo+ICsJLmNoYW5uZWwgPSAoY2hh
biksCQkJCQlcDQo+ICsJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JB
VyksCQlcDQo+ICsJLmluZm9fbWFza19zaGFyZWRfYnlfdHlwZSA9IEJJVChJSU9fQ0hBTl9JTkZP
X1NDQUxFKSwJXA0KPiArfQ0KPiArDQo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3Nw
ZWMgYWQ3OTQ5X2FkY19jaGFubmVsc1tdID0gew0KPiArCUFENzk0OV9BRENfQ0hBTk5FTCgwKSwN
Cj4gKwlBRDc5NDlfQURDX0NIQU5ORUwoMSksDQo+ICsJQUQ3OTQ5X0FEQ19DSEFOTkVMKDIpLA0K
PiArCUFENzk0OV9BRENfQ0hBTk5FTCgzKSwNCj4gKwlBRDc5NDlfQURDX0NIQU5ORUwoNCksDQo+
ICsJQUQ3OTQ5X0FEQ19DSEFOTkVMKDUpLA0KPiArCUFENzk0OV9BRENfQ0hBTk5FTCg2KSwNCj4g
KwlBRDc5NDlfQURDX0NIQU5ORUwoNyksDQo+ICt9Ow0KPiArDQo+ICtzdGF0aWMgaW50IGFkNzk0
OV9zcGlfcmVhZF9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwNCj4gKwkJCSAgIHN0cnVj
dCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLA0KPiArCQkJICAgaW50ICp2YWwsIGludCAqdmFs
MiwgbG9uZyBtYXNrKQ0KPiArew0KPiArCXN0cnVjdCBhZDc5NDlfYWRjX2NoaXAgKmFkNzk0OV9h
ZGMgPSBpaW9fcHJpdihpbmRpb19kZXYpOw0KPiArCWludCByZXQ7DQo+ICsNCj4gKwlpZiAoIXZh
bCkNCj4gKwkJcmV0dXJuIC1FSU5WQUw7DQo+ICsNCj4gKwlzd2l0Y2ggKG1hc2spIHsNCj4gKwlj
YXNlIElJT19DSEFOX0lORk9fUkFXOg0KPiArCQltdXRleF9sb2NrKCZhZDc5NDlfYWRjLT5sb2Nr
KTsNCj4gKwkJcmV0ID0gYWQ3OTQ5X3NwaV9yZWFkX2NoYW5uZWwoYWQ3OTQ5X2FkYywgdmFsLCBj
aGFuLQ0KPiA+Y2hhbm5lbCk7DQo+ICsJCW11dGV4X3VubG9jaygmYWQ3OTQ5X2FkYy0+bG9jayk7
DQo+ICsNCj4gKwkJaWYgKHJldCA8IDApDQo+ICsJCQlyZXR1cm4gcmV0Ow0KPiArDQo+ICsJCXJl
dHVybiBJSU9fVkFMX0lOVDsNCj4gKw0KPiArCWNhc2UgSUlPX0NIQU5fSU5GT19TQ0FMRToNCj4g
KwkJcmV0ID0gcmVndWxhdG9yX2dldF92b2x0YWdlKGFkNzk0OV9hZGMtPnZyZWYpOw0KPiArCQlp
ZiAocmV0IDwgMCkNCj4gKwkJCXJldHVybiByZXQ7DQo+ICsNCj4gKwkJKnZhbCA9IHJldCAvIDUw
MDA7DQo+ICsJCXJldHVybiBJSU9fVkFMX0lOVDsNCj4gKwl9DQo+ICsNCj4gKwlyZXR1cm4gLUVJ
TlZBTDsNCj4gK30NCj4gKw0KPiArc3RhdGljIGludCBhZDc5NDlfc3BpX3JlZ19hY2Nlc3Moc3Ry
dWN0IGlpb19kZXYgKmluZGlvX2RldiwNCj4gKwkJCXVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVk
IGludCB3cml0ZXZhbCwNCj4gKwkJCXVuc2lnbmVkIGludCAqcmVhZHZhbCkNCj4gK3sNCj4gKwlz
dHJ1Y3QgYWQ3OTQ5X2FkY19jaGlwICphZDc5NDlfYWRjID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsN
Cj4gKwlpbnQgcmV0ID0gMDsNCj4gKw0KPiArCWlmIChyZWFkdmFsKQ0KPiArCQkqcmVhZHZhbCA9
IGFkNzk0OV9hZGMtPmNmZzsNCj4gKwllbHNlDQo+ICsJCXJldCA9IGFkNzk0OV9zcGlfd3JpdGVf
Y2ZnKGFkNzk0OV9hZGMsDQo+ICsJCQl3cml0ZXZhbCAmIEFENzk0OV9NQVNLX1RPVEFMLCBBRDc5
NDlfTUFTS19UT1RBTCk7DQo+ICsNCj4gKwlyZXR1cm4gcmV0Ow0KPiArfQ0KPiArDQo+ICtzdGF0
aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGFkNzk0OV9zcGlfaW5mbyA9IHsNCj4gKwkucmVhZF9y
YXcgPSBhZDc5NDlfc3BpX3JlYWRfcmF3LA0KPiArCS5kZWJ1Z2ZzX3JlZ19hY2Nlc3MgPSBhZDc5
NDlfc3BpX3JlZ19hY2Nlc3MsDQo+ICt9Ow0KPiArDQo+ICtzdGF0aWMgaW50IGFkNzk0OV9zcGlf
aW5pdChzdHJ1Y3QgYWQ3OTQ5X2FkY19jaGlwICphZDc5NDlfYWRjKQ0KPiArew0KPiArCWludCBy
ZXQ7DQo+ICsJaW50IHZhbDsNCj4gKw0KPiArCS8qIFNlcXVlbmNlciBkaXNhYmxlZCwgQ0ZHIHJl
YWRiYWNrIGRpc2FibGVkLCBJTjAgYXMgZGVmYXVsdA0KPiBjaGFubmVsICovDQo+ICsJYWQ3OTQ5
X2FkYy0+Y3VycmVudF9jaGFubmVsID0gMDsNCj4gKwlyZXQgPSBhZDc5NDlfc3BpX3dyaXRlX2Nm
ZyhhZDc5NDlfYWRjLCAweDNDNzksIEFENzk0OV9NQVNLX1RPVEFMKTsNCj4gKw0KPiArCS8qIERv
IHR3byBkdW1teSBjb252ZXJzaW9ucyB0byBhcHBseSB0aGUgZmlyc3QgY29uZmlndXJhdGlvbg0K
PiBzZXR0aW5nLg0KPiArCSAqIFJlcXVpcmVkIG9ubHkgYWZ0ZXIgdGhlIHN0YXJ0IHVwIG9mIHRo
ZSBkZXZpY2UuDQo+ICsJICovDQo+ICsJYWQ3OTQ5X3NwaV9yZWFkX2NoYW5uZWwoYWQ3OTQ5X2Fk
YywgJnZhbCwgYWQ3OTQ5X2FkYy0NCj4gPmN1cnJlbnRfY2hhbm5lbCk7DQo+ICsJYWQ3OTQ5X3Nw
aV9yZWFkX2NoYW5uZWwoYWQ3OTQ5X2FkYywgJnZhbCwgYWQ3OTQ5X2FkYy0NCj4gPmN1cnJlbnRf
Y2hhbm5lbCk7DQo+ICsJcmV0dXJuIHJldDsNCj4gK30NCj4gKw0KPiArc3RhdGljIGludCBhZDc5
NDlfc3BpX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpDQo+ICt7DQo+ICsJc3RydWN0IGRl
dmljZSAqZGV2ID0gJnNwaS0+ZGV2Ow0KPiArCWNvbnN0IHN0cnVjdCBhZDc5NDlfYWRjX3NwZWMg
KnNwZWM7DQo+ICsJc3RydWN0IGFkNzk0OV9hZGNfY2hpcCAqYWQ3OTQ5X2FkYzsNCj4gKwlzdHJ1
Y3QgaWlvX2RldiAqaW5kaW9fZGV2Ow0KPiArCWludCByZXQ7DQo+ICsNCj4gKwlpbmRpb19kZXYg
PSBkZXZtX2lpb19kZXZpY2VfYWxsb2MoZGV2LCBzaXplb2YoKmFkNzk0OV9hZGMpKTsNCj4gKwlp
ZiAoIWluZGlvX2Rldikgew0KPiArCQlkZXZfZXJyKGRldiwgImNhbiBub3QgYWxsb2NhdGUgaWlv
IGRldmljZVxuIik7DQo+ICsJCXJldHVybiAtRU5PTUVNOw0KPiArCX0NCj4gKw0KPiArCXNwaS0+
bWF4X3NwZWVkX2h6ID0gMzMwMDAwMDA7DQo+ICsJc3BpLT5tb2RlID0gU1BJX01PREVfMDsNCj4g
KwlzcGktPmJpdHNfcGVyX3dvcmQgPSA4Ow0KPiArCXNwaV9zZXR1cChzcGkpOw0KDQpJIHRoaW5r
IHRoaXMgU1BJIGNvZGUgc2hvdWxkIGJlIHJlbW92ZWQuDQpBbGwgb2YgdGhpcyBjYW4gW2FuZCBz
aG91bGRdIGJlIHNwZWNpZmllZCB2aWEgZGV2aWNlLXRyZWVzLg0KDQo+ICsNCj4gKwlpbmRpb19k
ZXYtPmRldi5wYXJlbnQgPSBkZXY7DQo+ICsJaW5kaW9fZGV2LT5kZXYub2Zfbm9kZSA9IGRldi0+
b2Zfbm9kZTsNCj4gKwlpbmRpb19kZXYtPmluZm8gPSAmYWQ3OTQ5X3NwaV9pbmZvOw0KPiArCWlu
ZGlvX2Rldi0+bmFtZSA9IHNwaV9nZXRfZGV2aWNlX2lkKHNwaSktPm5hbWU7DQo+ICsJaW5kaW9f
ZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOw0KPiArCWluZGlvX2Rldi0+Y2hhbm5lbHMg
PSBhZDc5NDlfYWRjX2NoYW5uZWxzOw0KPiArCXNwaV9zZXRfZHJ2ZGF0YShzcGksIGluZGlvX2Rl
dik7DQo+ICsNCj4gKwlhZDc5NDlfYWRjID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsNCj4gKwlhZDc5
NDlfYWRjLT5pbmRpb19kZXYgPSBpbmRpb19kZXY7DQo+ICsJYWQ3OTQ5X2FkYy0+c3BpID0gc3Bp
Ow0KPiArDQo+ICsJc3BlYyA9ICZhZDc5NDlfYWRjX3NwZWNbc3BpX2dldF9kZXZpY2VfaWQoc3Bp
KS0+ZHJpdmVyX2RhdGFdOw0KPiArCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gc3BlYy0+bnVt
X2NoYW5uZWxzOw0KPiArCWFkNzk0OV9hZGMtPnJlc29sdXRpb24gPSBzcGVjLT5yZXNvbHV0aW9u
Ow0KPiArDQo+ICsJYWQ3OTQ5X2FkYy0+dnJlZiA9IGRldm1fcmVndWxhdG9yX2dldChkZXYsICJ2
cmVmIik7DQo+ICsJaWYgKElTX0VSUihhZDc5NDlfYWRjLT52cmVmKSkgew0KPiArCQlkZXZfZXJy
KGRldiwgImZhaWwgdG8gcmVxdWVzdCByZWd1bGF0b3JcbiIpOw0KPiArCQlyZXR1cm4gUFRSX0VS
UihhZDc5NDlfYWRjLT52cmVmKTsNCj4gKwl9DQo+ICsNCj4gKwlyZXQgPSByZWd1bGF0b3JfZW5h
YmxlKGFkNzk0OV9hZGMtPnZyZWYpOw0KPiArCWlmIChyZXQgPCAwKSB7DQo+ICsJCWRldl9lcnIo
ZGV2LCAiZmFpbCB0byBlbmFibGUgcmVndWxhdG9yXG4iKTsNCj4gKwkJZ290byBlcnJfcmVndWxh
dG9yOw0KPiArCX0NCj4gKw0KPiArCW11dGV4X2luaXQoJmFkNzk0OV9hZGMtPmxvY2spOw0KPiAr
DQo+ICsJcmV0ID0gYWQ3OTQ5X3NwaV9pbml0KGFkNzk0OV9hZGMpOw0KPiArCWlmIChyZXQpIHsN
Cj4gKwkJZGV2X2VycihkZXYsICJlbmFibGUgdG8gaW5pdCB0aGlzIGRldmljZTogJWRcbiIsIHJl
dCk7DQo+ICsJCWdvdG8gZXJyOw0KPiArCX0NCj4gKw0KPiArCXJldCA9IGlpb19kZXZpY2VfcmVn
aXN0ZXIoaW5kaW9fZGV2KTsNCj4gKwlpZiAocmV0KSB7DQo+ICsJCWRldl9lcnIoZGV2LCAiZmFp
bCB0byByZWdpc3RlciBpaW8gZGV2aWNlOiAlZFxuIiwgcmV0KTsNCj4gKwkJZ290byBlcnI7DQo+
ICsJfQ0KPiArDQo+ICsJcmV0dXJuIDA7DQo+ICsNCj4gK2VycjoNCj4gKwltdXRleF9kZXN0cm95
KCZhZDc5NDlfYWRjLT5sb2NrKTsNCj4gKwlyZWd1bGF0b3JfZGlzYWJsZShhZDc5NDlfYWRjLT52
cmVmKTsNCj4gK2Vycl9yZWd1bGF0b3I6DQo+ICsJcmV0dXJuIHJldDsNCj4gK30NCj4gKw0KPiAr
c3RhdGljIGludCBhZDc5NDlfc3BpX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQ0KPiAr
ew0KPiArCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsN
Cj4gKwlzdHJ1Y3QgYWQ3OTQ5X2FkY19jaGlwICphZDc5NDlfYWRjID0gaWlvX3ByaXYoaW5kaW9f
ZGV2KTsNCj4gKw0KPiArCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOw0KPiArCW11
dGV4X2Rlc3Ryb3koJmFkNzk0OV9hZGMtPmxvY2spOw0KPiArCXJlZ3VsYXRvcl9kaXNhYmxlKGFk
Nzk0OV9hZGMtPnZyZWYpOw0KPiArDQo+ICsJcmV0dXJuIDA7DQo+ICt9DQo+ICsNCj4gKyNpZmRl
ZiBDT05GSUdfT0YNCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFkNzk0OV9z
cGlfb2ZfaWRbXSA9IHsNCj4gKwl7IC5jb21wYXRpYmxlID0gImFkNzk0OSIgfSwNCj4gKwl7IC5j
b21wYXRpYmxlID0gImFkNzY4MiIgfSwNCj4gKwl7IC5jb21wYXRpYmxlID0gImFkNzY4OSIgfSwN
Cj4gKwl7IH0NCj4gK307DQo+ICtNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBhZDc5NDlfc3BpX29m
X2lkKTsNCj4gKyNlbmRpZg0KPiArDQo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9kZXZpY2Vf
aWQgYWQ3OTQ5X3NwaV9pZFtdID0gew0KPiArCXsgImFkNzk0OSIsIElEX0FENzk0OSAgfSwNCj4g
Kwl7ICJhZDc2ODIiLCBJRF9BRDc2ODIgfSwNCj4gKwl7ICJhZDc2ODkiLCBJRF9BRDc2ODkgfSwN
Cj4gKwl7IH0NCj4gK307DQo+ICtNT0RVTEVfREVWSUNFX1RBQkxFKHNwaSwgYWQ3OTQ5X3NwaV9p
ZCk7DQo+ICsNCj4gK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZDc5NDlfc3BpX2RyaXZlciA9
IHsNCj4gKwkuZHJpdmVyID0gew0KPiArCQkubmFtZQkJPSAiYWQ3OTQ5IiwNCj4gKwkJLm9mX21h
dGNoX3RhYmxlCT0gb2ZfbWF0Y2hfcHRyKGFkNzk0OV9zcGlfb2ZfaWQpLA0KPiArCX0sDQo+ICsJ
LnByb2JlCSAgPSBhZDc5NDlfc3BpX3Byb2JlLA0KPiArCS5yZW1vdmUgICA9IGFkNzk0OV9zcGlf
cmVtb3ZlLA0KPiArCS5pZF90YWJsZSA9IGFkNzk0OV9zcGlfaWQsDQo+ICt9Ow0KPiArbW9kdWxl
X3NwaV9kcml2ZXIoYWQ3OTQ5X3NwaV9kcml2ZXIpOw0KPiArDQo+ICtNT0RVTEVfQVVUSE9SKCJD
aGFybGVzLUFudG9pbmUgQ291cmV0IDwNCj4gY2hhcmxlcy1hbnRvaW5lLmNvdXJldEBlc3NlbnNp
dW0uY29tPiIpOw0KPiArTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyAxNC8xNi1i
aXQgOC1jaGFubmVsIEFEQyBkcml2ZXIiKTsNCj4gK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsN
Cg==

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

* Re: [PATCHv2 1/2] Add AD7949 ADC driver family
  2018-10-17 20:39 [PATCHv2 1/2] Add AD7949 ADC driver family Charles-Antoine Couret
  2018-10-17 20:39 ` [PATCHv2 2/2] Add AD7949 device tree bindings in documentation Charles-Antoine Couret
  2018-10-18  7:02 ` [PATCHv2 1/2] Add AD7949 ADC driver family Ardelean, Alexandru
@ 2018-10-18  7:06 ` Ardelean, Alexandru
  2018-10-21 16:58 ` Jonathan Cameron
  3 siblings, 0 replies; 6+ messages in thread
From: Ardelean, Alexandru @ 2018-10-18  7:06 UTC (permalink / raw)
  To: linux-iio, charles-antoine.couret

T24gV2VkLCAyMDE4LTEwLTE3IGF0IDIyOjM5ICswMjAwLCBDaGFybGVzLUFudG9pbmUgQ291cmV0
IHdyb3RlOg0KPiBBZGQgQUQ3OTQ5IEFEQyBkcml2ZXIgZmFtaWx5DQo+IA0KPiBDb21wYXRpYmxl
IHdpdGggQUQ3NjgyIGFuZCBBRDc2ODkgY2hpcHMuDQo+IEl0IGlzIGEgQW5hbG9nIERldmljZXMg
QURDIGRyaXZlciAxNC8xNiBiaXRzIDQvOCBjaGFubmVscw0KPiB3aXRoIFNQSSBwcm90b2NvbA0K
PiANCj4gRGF0YXNoZWV0IG9mIHRoZSBkZXZpY2U6DQo+IA0KaHR0cDovL3d3dy5hbmFsb2cuY29t
L21lZGlhL2VuL3RlY2huaWNhbC1kb2N1bWVudGF0aW9uL2RhdGEtc2hlZXRzL0FENzk0OS5wZGYN
Cj4gDQo+IFNpZ25lZC1vZmYtYnk6IENoYXJsZXMtQW50b2luZSBDb3VyZXQgPA0KPiBjaGFybGVz
LWFudG9pbmUuY291cmV0QGVzc2Vuc2l1bS5jb20+DQo+IC0tLQ0KPiAgZHJpdmVycy9paW8vYWRj
L0tjb25maWcgIHwgIDEwICsrDQo+ICBkcml2ZXJzL2lpby9hZGMvTWFrZWZpbGUgfCAgIDEgKw0K
PiAgZHJpdmVycy9paW8vYWRjL2FkNzk0OS5jIHwgMzUyICsrKysrKysrKysrKysrKysrKysrKysr
KysrKysrKysrKysrKysrKw0KPiAgMyBmaWxlcyBjaGFuZ2VkLCAzNjMgaW5zZXJ0aW9ucygrKQ0K
PiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvaWlvL2FkYy9hZDc5NDkuYw0KPiANCj4gZGlm
ZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FkYy9LY29uZmlnIGIvZHJpdmVycy9paW8vYWRjL0tjb25m
aWcNCj4gaW5kZXggNGE3NTQ5MjFmYjZmLi40MmU2NmVmZmY2YzAgMTAwNjQ0DQo+IC0tLSBhL2Ry
aXZlcnMvaWlvL2FkYy9LY29uZmlnDQo+ICsrKyBiL2RyaXZlcnMvaWlvL2FkYy9LY29uZmlnDQo+
IEBAIC0xMTYsNiArMTE2LDE2IEBAIGNvbmZpZyBBRDc5MjMNCj4gIAkgIFRvIGNvbXBpbGUgdGhp
cyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQ0KPiAgCSAgbW9kdWxlIHdp
bGwgYmUgY2FsbGVkIGFkNzkyMy4NCj4gIA0KPiArY29uZmlnIEFENzk0OQ0KPiArCXRyaXN0YXRl
ICJBbmFsb2cgRGV2aWNlcyBBRDc5NDkgYW5kIHNpbWlsYXIgQURDcyBkcml2ZXIiDQo+ICsJZGVw
ZW5kcyBvbiBTUEkNCj4gKwloZWxwDQo+ICsJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9y
dCBmb3IgQW5hbG9nIERldmljZXMNCj4gKwkgIEFENzk0OSwgQUQ3NjgyLCBBRDc2ODkgOCBDaGFu
bmVsIEFEQ3MuDQo+ICsNCj4gKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUs
IGNob29zZSBNIGhlcmU6IHRoZQ0KPiArCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFkNzk0OS4N
Cj4gKw0KPiAgY29uZmlnIEFENzk5WA0KPiAgCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRDc5
OXggQURDIGRyaXZlciINCj4gIAlkZXBlbmRzIG9uIEkyQw0KPiBkaWZmIC0tZ2l0IGEvZHJpdmVy
cy9paW8vYWRjL01ha2VmaWxlIGIvZHJpdmVycy9paW8vYWRjL01ha2VmaWxlDQo+IGluZGV4IDAz
ZGI3YjU3OGY5Yy4uODg4MDRjODY3YWE5IDEwMDY0NA0KPiAtLS0gYS9kcml2ZXJzL2lpby9hZGMv
TWFrZWZpbGUNCj4gKysrIGIvZHJpdmVycy9paW8vYWRjL01ha2VmaWxlDQo+IEBAIC0xNCw2ICsx
NCw3IEBAIG9iai0kKENPTkZJR19BRDc3NjYpICs9IGFkNzc2Ni5vDQo+ICBvYmotJChDT05GSUdf
QUQ3NzkxKSArPSBhZDc3OTEubw0KPiAgb2JqLSQoQ09ORklHX0FENzc5MykgKz0gYWQ3NzkzLm8N
Cj4gIG9iai0kKENPTkZJR19BRDc4ODcpICs9IGFkNzg4Ny5vDQo+ICtvYmotJChDT05GSUdfQUQ3
OTQ5KSArPSBhZDc5NDkubw0KPiAgb2JqLSQoQ09ORklHX0FENzk5WCkgKz0gYWQ3OTl4Lm8NCj4g
IG9iai0kKENPTkZJR19BU1BFRURfQURDKSArPSBhc3BlZWRfYWRjLm8NCj4gIG9iai0kKENPTkZJ
R19BVDkxX0FEQykgKz0gYXQ5MV9hZGMubw0KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRj
L2FkNzk0OS5jIGIvZHJpdmVycy9paW8vYWRjL2FkNzk0OS5jDQo+IG5ldyBmaWxlIG1vZGUgMTAw
NjQ0DQo+IGluZGV4IDAwMDAwMDAwMDAwMC4uZGE1MDgyZTgwMzE3DQo+IC0tLSAvZGV2L251bGwN
Cj4gKysrIGIvZHJpdmVycy9paW8vYWRjL2FkNzk0OS5jDQo+IEBAIC0wLDAgKzEsMzUyIEBADQo+
ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMA0KPiArLyogYWQ3OTQ5LmMgLSBB
bmFsb2cgRGV2aWNlcyBBREMgZHJpdmVyIDE0LzE2IGJpdHMgNC84IGNoYW5uZWxzDQo+ICsgKg0K
PiArICogQ29weXJpZ2h0IChDKSAyMDE4IENNQyBOVg0KPiArICoNCj4gKyAqIA0KPiBodHRwOi8v
d3d3LmFuYWxvZy5jb20vbWVkaWEvZW4vdGVjaG5pY2FsLWRvY3VtZW50YXRpb24vZGF0YS1zaGVl
dHMvQUQ3OTQ5LnBkZg0KPiArICovDQo+ICsNCj4gKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPg0K
PiArI2luY2x1ZGUgPGxpbnV4L2lpby9paW8uaD4NCj4gKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUu
aD4NCj4gKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4NCj4gKyNpbmNsdWRl
IDxsaW51eC9zcGkvc3BpLmg+DQo+ICsNCj4gKyNkZWZpbmUgQUQ3OTQ5X01BU0tfQ0hBTk5FTF9T
RUwJCUdFTk1BU0soOSwgNykNCj4gKyNkZWZpbmUgQUQ3OTQ5X01BU0tfVE9UQUwJCUdFTk1BU0so
MTMsIDApDQo+ICsjZGVmaW5lIEFENzk0OV9PRkZTRVRfQ0hBTk5FTF9TRUwJNw0KPiArI2RlZmlu
ZSBBRDc5NDlfQ0ZHX1JFQURfQkFDSwkJMHgxDQo+ICsjZGVmaW5lIEFENzk0OV9DRkdfUkVHX1NJ
WkVfQklUUwkxNA0KPiArDQo+ICtlbnVtIHsNCj4gKwlJRF9BRDc5NDkgPSAwLA0KPiArCUlEX0FE
NzY4MiwNCj4gKwlJRF9BRDc2ODksDQo+ICt9Ow0KPiArDQo+ICtzdHJ1Y3QgYWQ3OTQ5X2FkY19z
cGVjIHsNCj4gKwl1OCBudW1fY2hhbm5lbHM7DQo+ICsJdTggcmVzb2x1dGlvbjsNCj4gK307DQo+
ICsNCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWQ3OTQ5X2FkY19zcGVjIGFkNzk0OV9hZGNfc3Bl
Y1tdID0gew0KPiArCVtJRF9BRDc5NDldICA9IHsgLm51bV9jaGFubmVscyA9IDgsIC5yZXNvbHV0
aW9uID0gMTQgfSwNCj4gKwlbSURfQUQ3NjgyXSA9IHsgLm51bV9jaGFubmVscyA9IDQsIC5yZXNv
bHV0aW9uID0gMTYgfSwNCj4gKwlbSURfQUQ3Njg5XSA9IHsgLm51bV9jaGFubmVscyA9IDgsIC5y
ZXNvbHV0aW9uID0gMTYgfSwNCj4gK307DQo+ICsNCj4gKy8qKg0KPiArICogc3RydWN0IGFkNzk0
OV9hZGNfY2hpcCAtIEFEIEFEQyBjaGlwDQo+ICsgKiBAbG9jazogcHJvdGVjdHMgd3JpdGUgc2Vx
dWVuY2VzDQo+ICsgKiBAdnJlZjogcmVndWxhdG9yIGdlbmVyYXRpbmcgVnJlZg0KPiArICogQGlp
b19kZXY6IHJlZmVyZW5jZSB0byBpaW8gc3RydWN0dXJlDQo+ICsgKiBAc3BpOiByZWZlcmVuY2Ug
dG8gc3BpIHN0cnVjdHVyZQ0KPiArICogQHJlc29sdXRpb246IHJlc29sdXRpb24gb2YgdGhlIGNo
aXANCj4gKyAqIEBjZmc6IGNvcHkgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXINCj4gKyAq
IEBjdXJyZW50X2NoYW5uZWw6IGN1cnJlbnQgY2hhbm5lbCBpbiB1c2UNCj4gKyAqIEBidWZmZXI6
IGJ1ZmZlciB0byBzZW5kIC8gcmVjZWl2ZSBkYXRhIHRvIC8gZnJvbSBkZXZpY2UNCj4gKyAqLw0K
PiArc3RydWN0IGFkNzk0OV9hZGNfY2hpcCB7DQo+ICsJc3RydWN0IG11dGV4IGxvY2s7DQo+ICsJ
c3RydWN0IHJlZ3VsYXRvciAqdnJlZjsNCj4gKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2Ow0K
PiArCXN0cnVjdCBzcGlfZGV2aWNlICpzcGk7DQo+ICsJdTggcmVzb2x1dGlvbjsNCj4gKwl1MTYg
Y2ZnOw0KPiArCXVuc2lnbmVkIGludCBjdXJyZW50X2NoYW5uZWw7DQo+ICsJdTMyIGJ1ZmZlciBf
X19fY2FjaGVsaW5lX2FsaWduZWQ7DQo+ICt9Ow0KPiArDQo+ICtzdGF0aWMgYm9vbCBhZDc5NDlf
c3BpX2NmZ19pc19yZWFkX2JhY2soc3RydWN0IGFkNzk0OV9hZGNfY2hpcA0KPiAqYWQ3OTQ5X2Fk
YykNCj4gK3sNCj4gKwlpZiAoIShhZDc5NDlfYWRjLT5jZmcgJiBBRDc5NDlfQ0ZHX1JFQURfQkFD
SykpDQo+ICsJCXJldHVybiB0cnVlOw0KPiArDQo+ICsJcmV0dXJuIGZhbHNlOw0KPiArfQ0KPiAr
DQo+ICtzdGF0aWMgaW50IGFkNzk0OV9zcGlfYml0c19wZXJfd29yZChzdHJ1Y3QgYWQ3OTQ5X2Fk
Y19jaGlwICphZDc5NDlfYWRjKQ0KPiArew0KPiArCWludCByZXQgPSBhZDc5NDlfYWRjLT5yZXNv
bHV0aW9uOw0KPiArDQo+ICsJaWYgKGFkNzk0OV9zcGlfY2ZnX2lzX3JlYWRfYmFjayhhZDc5NDlf
YWRjKSkNCj4gKwkJcmV0ICs9IEFENzk0OV9DRkdfUkVHX1NJWkVfQklUUzsNCj4gKw0KPiArCXJl
dHVybiByZXQ7DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyBpbnQgYWQ3OTQ5X3NwaV93cml0ZV9jZmco
c3RydWN0IGFkNzk0OV9hZGNfY2hpcCAqYWQ3OTQ5X2FkYywgdTE2DQo+IHZhbCwNCj4gKwkJCQl1
MTYgbWFzaykNCj4gK3sNCj4gKwlpbnQgcmV0Ow0KPiArCWludCBiaXRzX3Blcl93b3JkID0gYWQ3
OTQ5X3NwaV9iaXRzX3Blcl93b3JkKGFkNzk0OV9hZGMpOw0KPiArCWludCBzaGlmdCA9IGJpdHNf
cGVyX3dvcmQgLSBBRDc5NDlfQ0ZHX1JFR19TSVpFX0JJVFM7DQo+ICsJc3RydWN0IHNwaV9tZXNz
YWdlIG1zZzsNCj4gKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHR4W10gPSB7DQo+ICsJCXsNCj4gKwkJ
CS50eF9idWYgPSAmYWQ3OTQ5X2FkYy0+YnVmZmVyLA0KPiArCQkJLmxlbiA9IDQsDQo+ICsJCQku
Yml0c19wZXJfd29yZCA9IGJpdHNfcGVyX3dvcmQsDQo+ICsJCX0sDQo+ICsJfTsNCj4gKw0KPiAr
CWFkNzk0OV9hZGMtPmNmZyA9ICh2YWwgJiBtYXNrKSB8IChhZDc5NDlfYWRjLT5jZmcgJiB+bWFz
ayk7DQo+ICsJYWQ3OTQ5X2FkYy0+YnVmZmVyID0gYWQ3OTQ5X2FkYy0+Y2ZnIDw8IHNoaWZ0Ow0K
PiArCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7DQo+ICsJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnR4
WzBdLCAmbXNnKTsNCj4gKwlyZXQgPSBzcGlfc3luYyhhZDc5NDlfYWRjLT5zcGksICZtc2cpOw0K
PiArDQo+ICsJLyogVGhpcyBkZWxheSBpcyB0byBhdm9pZCBhIG5ldyByZXF1ZXN0IGJlZm9yZSB0
aGUgcmVxdWlyZWQgdGltZSB0bw0KPiArCSAqIHNlbmQgYSBuZXcgY29tbWFuZCB0byB0aGUgZGV2
aWNlDQo+ICsJICovIA0KPiArCXVkZWxheSgyKTsNCj4gKwlyZXR1cm4gcmV0Ow0KPiArfQ0KPiAr
DQo+ICtzdGF0aWMgaW50IGFkNzk0OV9zcGlfcmVhZF9jaGFubmVsKHN0cnVjdCBhZDc5NDlfYWRj
X2NoaXAgKmFkNzk0OV9hZGMsDQo+IGludCAqdmFsLA0KPiArCQkJCSAgIHVuc2lnbmVkIGludCBj
aGFubmVsKQ0KPiArew0KPiArCWludCByZXQ7DQo+ICsJaW50IGJpdHNfcGVyX3dvcmQgPSBhZDc5
NDlfc3BpX2JpdHNfcGVyX3dvcmQoYWQ3OTQ5X2FkYyk7DQo+ICsJaW50IG1hc2sgPSBHRU5NQVNL
KGFkNzk0OV9hZGMtPnJlc29sdXRpb24sIDApOw0KPiArCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7
DQo+ICsJc3RydWN0IHNwaV90cmFuc2ZlciB0eFtdID0gew0KPiArCQl7DQo+ICsJCQkucnhfYnVm
ID0gJmFkNzk0OV9hZGMtPmJ1ZmZlciwNCj4gKwkJCS5sZW4gPSA0LA0KPiArCQkJLmJpdHNfcGVy
X3dvcmQgPSBiaXRzX3Blcl93b3JkLA0KPiArCQl9LA0KPiArCX07DQo+ICsNCj4gKwlyZXQgPSBh
ZDc5NDlfc3BpX3dyaXRlX2NmZyhhZDc5NDlfYWRjLA0KPiArCQkJCSAgIGNoYW5uZWwgPDwgQUQ3
OTQ5X09GRlNFVF9DSEFOTkVMX1NFTCwNCj4gKwkJCQkgICBBRDc5NDlfTUFTS19DSEFOTkVMX1NF
TCk7DQo+ICsJaWYgKHJldCkNCj4gKwkJcmV0dXJuIHJldDsNCj4gKw0KPiArCWFkNzk0OV9hZGMt
PmJ1ZmZlciA9IDA7DQo+ICsJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsNCj4gKwlzcGlfbWVzc2Fn
ZV9hZGRfdGFpbCgmdHhbMF0sICZtc2cpOw0KPiArCXJldCA9IHNwaV9zeW5jKGFkNzk0OV9hZGMt
PnNwaSwgJm1zZyk7DQo+ICsJaWYgKHJldCkNCj4gKwkJcmV0dXJuIHJldDsNCj4gKw0KPiArCS8q
IFRoaXMgZGVsYXkgaXMgdG8gYXZvaWQgYSBuZXcgcmVxdWVzdCBiZWZvcmUgdGhlIHJlcXVpcmVk
IHRpbWUgdG8NCj4gKwkgKiBzZW5kIGEgbmV3IGNvbW1hbmQgdG8gdGhlIGRldmljZQ0KPiArCSAq
LyANCj4gKwl1ZGVsYXkoMik7DQo+ICsNCj4gKwlhZDc5NDlfYWRjLT5jdXJyZW50X2NoYW5uZWwg
PSBjaGFubmVsOw0KPiArDQo+ICsJaWYgKGFkNzk0OV9zcGlfY2ZnX2lzX3JlYWRfYmFjayhhZDc5
NDlfYWRjKSkNCj4gKwkJKnZhbCA9IChhZDc5NDlfYWRjLT5idWZmZXIgPj4gQUQ3OTQ5X0NGR19S
RUdfU0laRV9CSVRTKSAmDQo+IG1hc2s7DQo+ICsJZWxzZQ0KPiArCQkqdmFsID0gYWQ3OTQ5X2Fk
Yy0+YnVmZmVyICYgbWFzazsNCj4gKw0KPiArCXJldHVybiAwOw0KPiArfQ0KPiArDQo+ICsjZGVm
aW5lIEFENzk0OV9BRENfQ0hBTk5FTChjaGFuKSB7CQkJCVwNCj4gKwkudHlwZSA9IElJT19WT0xU
QUdFLAkJCQkJXA0KPiArCS5pbmRleGVkID0gMSwJCQkJCQlcDQo+ICsJLmNoYW5uZWwgPSAoY2hh
biksCQkJCQlcDQo+ICsJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JB
VyksCQlcDQo+ICsJLmluZm9fbWFza19zaGFyZWRfYnlfdHlwZSA9IEJJVChJSU9fQ0hBTl9JTkZP
X1NDQUxFKSwJXA0KPiArfQ0KPiArDQo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3Nw
ZWMgYWQ3OTQ5X2FkY19jaGFubmVsc1tdID0gew0KPiArCUFENzk0OV9BRENfQ0hBTk5FTCgwKSwN
Cj4gKwlBRDc5NDlfQURDX0NIQU5ORUwoMSksDQo+ICsJQUQ3OTQ5X0FEQ19DSEFOTkVMKDIpLA0K
PiArCUFENzk0OV9BRENfQ0hBTk5FTCgzKSwNCj4gKwlBRDc5NDlfQURDX0NIQU5ORUwoNCksDQo+
ICsJQUQ3OTQ5X0FEQ19DSEFOTkVMKDUpLA0KPiArCUFENzk0OV9BRENfQ0hBTk5FTCg2KSwNCj4g
KwlBRDc5NDlfQURDX0NIQU5ORUwoNyksDQo+ICt9Ow0KPiArDQo+ICtzdGF0aWMgaW50IGFkNzk0
OV9zcGlfcmVhZF9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwNCj4gKwkJCSAgIHN0cnVj
dCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLA0KPiArCQkJICAgaW50ICp2YWwsIGludCAqdmFs
MiwgbG9uZyBtYXNrKQ0KPiArew0KPiArCXN0cnVjdCBhZDc5NDlfYWRjX2NoaXAgKmFkNzk0OV9h
ZGMgPSBpaW9fcHJpdihpbmRpb19kZXYpOw0KPiArCWludCByZXQ7DQo+ICsNCj4gKwlpZiAoIXZh
bCkNCj4gKwkJcmV0dXJuIC1FSU5WQUw7DQo+ICsNCj4gKwlzd2l0Y2ggKG1hc2spIHsNCj4gKwlj
YXNlIElJT19DSEFOX0lORk9fUkFXOg0KPiArCQltdXRleF9sb2NrKCZhZDc5NDlfYWRjLT5sb2Nr
KTsNCj4gKwkJcmV0ID0gYWQ3OTQ5X3NwaV9yZWFkX2NoYW5uZWwoYWQ3OTQ5X2FkYywgdmFsLCBj
aGFuLQ0KPiA+Y2hhbm5lbCk7DQo+ICsJCW11dGV4X3VubG9jaygmYWQ3OTQ5X2FkYy0+bG9jayk7
DQo+ICsNCj4gKwkJaWYgKHJldCA8IDApDQo+ICsJCQlyZXR1cm4gcmV0Ow0KPiArDQo+ICsJCXJl
dHVybiBJSU9fVkFMX0lOVDsNCj4gKw0KPiArCWNhc2UgSUlPX0NIQU5fSU5GT19TQ0FMRToNCj4g
KwkJcmV0ID0gcmVndWxhdG9yX2dldF92b2x0YWdlKGFkNzk0OV9hZGMtPnZyZWYpOw0KPiArCQlp
ZiAocmV0IDwgMCkNCj4gKwkJCXJldHVybiByZXQ7DQo+ICsNCj4gKwkJKnZhbCA9IHJldCAvIDUw
MDA7DQo+ICsJCXJldHVybiBJSU9fVkFMX0lOVDsNCj4gKwl9DQo+ICsNCj4gKwlyZXR1cm4gLUVJ
TlZBTDsNCj4gK30NCj4gKw0KPiArc3RhdGljIGludCBhZDc5NDlfc3BpX3JlZ19hY2Nlc3Moc3Ry
dWN0IGlpb19kZXYgKmluZGlvX2RldiwNCj4gKwkJCXVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVk
IGludCB3cml0ZXZhbCwNCj4gKwkJCXVuc2lnbmVkIGludCAqcmVhZHZhbCkNCj4gK3sNCj4gKwlz
dHJ1Y3QgYWQ3OTQ5X2FkY19jaGlwICphZDc5NDlfYWRjID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsN
Cj4gKwlpbnQgcmV0ID0gMDsNCj4gKw0KPiArCWlmIChyZWFkdmFsKQ0KPiArCQkqcmVhZHZhbCA9
IGFkNzk0OV9hZGMtPmNmZzsNCj4gKwllbHNlDQo+ICsJCXJldCA9IGFkNzk0OV9zcGlfd3JpdGVf
Y2ZnKGFkNzk0OV9hZGMsDQo+ICsJCQl3cml0ZXZhbCAmIEFENzk0OV9NQVNLX1RPVEFMLCBBRDc5
NDlfTUFTS19UT1RBTCk7DQo+ICsNCj4gKwlyZXR1cm4gcmV0Ow0KPiArfQ0KPiArDQo+ICtzdGF0
aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGFkNzk0OV9zcGlfaW5mbyA9IHsNCj4gKwkucmVhZF9y
YXcgPSBhZDc5NDlfc3BpX3JlYWRfcmF3LA0KPiArCS5kZWJ1Z2ZzX3JlZ19hY2Nlc3MgPSBhZDc5
NDlfc3BpX3JlZ19hY2Nlc3MsDQo+ICt9Ow0KPiArDQo+ICtzdGF0aWMgaW50IGFkNzk0OV9zcGlf
aW5pdChzdHJ1Y3QgYWQ3OTQ5X2FkY19jaGlwICphZDc5NDlfYWRjKQ0KPiArew0KPiArCWludCBy
ZXQ7DQo+ICsJaW50IHZhbDsNCj4gKw0KPiArCS8qIFNlcXVlbmNlciBkaXNhYmxlZCwgQ0ZHIHJl
YWRiYWNrIGRpc2FibGVkLCBJTjAgYXMgZGVmYXVsdA0KPiBjaGFubmVsICovDQo+ICsJYWQ3OTQ5
X2FkYy0+Y3VycmVudF9jaGFubmVsID0gMDsNCj4gKwlyZXQgPSBhZDc5NDlfc3BpX3dyaXRlX2Nm
ZyhhZDc5NDlfYWRjLCAweDNDNzksIEFENzk0OV9NQVNLX1RPVEFMKTsNCj4gKw0KPiArCS8qIERv
IHR3byBkdW1teSBjb252ZXJzaW9ucyB0byBhcHBseSB0aGUgZmlyc3QgY29uZmlndXJhdGlvbg0K
PiBzZXR0aW5nLg0KPiArCSAqIFJlcXVpcmVkIG9ubHkgYWZ0ZXIgdGhlIHN0YXJ0IHVwIG9mIHRo
ZSBkZXZpY2UuDQo+ICsJICovDQo+ICsJYWQ3OTQ5X3NwaV9yZWFkX2NoYW5uZWwoYWQ3OTQ5X2Fk
YywgJnZhbCwgYWQ3OTQ5X2FkYy0NCj4gPmN1cnJlbnRfY2hhbm5lbCk7DQo+ICsJYWQ3OTQ5X3Nw
aV9yZWFkX2NoYW5uZWwoYWQ3OTQ5X2FkYywgJnZhbCwgYWQ3OTQ5X2FkYy0NCj4gPmN1cnJlbnRf
Y2hhbm5lbCk7DQo+ICsJcmV0dXJuIHJldDsNCj4gK30NCj4gKw0KPiArc3RhdGljIGludCBhZDc5
NDlfc3BpX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpDQo+ICt7DQo+ICsJc3RydWN0IGRl
dmljZSAqZGV2ID0gJnNwaS0+ZGV2Ow0KPiArCWNvbnN0IHN0cnVjdCBhZDc5NDlfYWRjX3NwZWMg
KnNwZWM7DQo+ICsJc3RydWN0IGFkNzk0OV9hZGNfY2hpcCAqYWQ3OTQ5X2FkYzsNCj4gKwlzdHJ1
Y3QgaWlvX2RldiAqaW5kaW9fZGV2Ow0KPiArCWludCByZXQ7DQo+ICsNCj4gKwlpbmRpb19kZXYg
PSBkZXZtX2lpb19kZXZpY2VfYWxsb2MoZGV2LCBzaXplb2YoKmFkNzk0OV9hZGMpKTsNCj4gKwlp
ZiAoIWluZGlvX2Rldikgew0KPiArCQlkZXZfZXJyKGRldiwgImNhbiBub3QgYWxsb2NhdGUgaWlv
IGRldmljZVxuIik7DQo+ICsJCXJldHVybiAtRU5PTUVNOw0KPiArCX0NCj4gKw0KPiArCXNwaS0+
bWF4X3NwZWVkX2h6ID0gMzMwMDAwMDA7DQo+ICsJc3BpLT5tb2RlID0gU1BJX01PREVfMDsNCj4g
KwlzcGktPmJpdHNfcGVyX3dvcmQgPSA4Ow0KPiArCXNwaV9zZXR1cChzcGkpOw0KPiArDQo+ICsJ
aW5kaW9fZGV2LT5kZXYucGFyZW50ID0gZGV2Ow0KPiArCWluZGlvX2Rldi0+ZGV2Lm9mX25vZGUg
PSBkZXYtPm9mX25vZGU7DQo+ICsJaW5kaW9fZGV2LT5pbmZvID0gJmFkNzk0OV9zcGlfaW5mbzsN
Cj4gKwlpbmRpb19kZXYtPm5hbWUgPSBzcGlfZ2V0X2RldmljZV9pZChzcGkpLT5uYW1lOw0KPiAr
CWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsNCj4gKwlpbmRpb19kZXYtPmNo
YW5uZWxzID0gYWQ3OTQ5X2FkY19jaGFubmVsczsNCj4gKwlzcGlfc2V0X2RydmRhdGEoc3BpLCBp
bmRpb19kZXYpOw0KPiArDQo+ICsJYWQ3OTQ5X2FkYyA9IGlpb19wcml2KGluZGlvX2Rldik7DQo+
ICsJYWQ3OTQ5X2FkYy0+aW5kaW9fZGV2ID0gaW5kaW9fZGV2Ow0KPiArCWFkNzk0OV9hZGMtPnNw
aSA9IHNwaTsNCj4gKw0KPiArCXNwZWMgPSAmYWQ3OTQ5X2FkY19zcGVjW3NwaV9nZXRfZGV2aWNl
X2lkKHNwaSktPmRyaXZlcl9kYXRhXTsNCj4gKwlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IHNw
ZWMtPm51bV9jaGFubmVsczsNCj4gKwlhZDc5NDlfYWRjLT5yZXNvbHV0aW9uID0gc3BlYy0+cmVz
b2x1dGlvbjsNCj4gKw0KPiArCWFkNzk0OV9hZGMtPnZyZWYgPSBkZXZtX3JlZ3VsYXRvcl9nZXQo
ZGV2LCAidnJlZiIpOw0KPiArCWlmIChJU19FUlIoYWQ3OTQ5X2FkYy0+dnJlZikpIHsNCj4gKwkJ
ZGV2X2VycihkZXYsICJmYWlsIHRvIHJlcXVlc3QgcmVndWxhdG9yXG4iKTsNCj4gKwkJcmV0dXJu
IFBUUl9FUlIoYWQ3OTQ5X2FkYy0+dnJlZik7DQo+ICsJfQ0KPiArDQo+ICsJcmV0ID0gcmVndWxh
dG9yX2VuYWJsZShhZDc5NDlfYWRjLT52cmVmKTsNCj4gKwlpZiAocmV0IDwgMCkgew0KPiArCQlk
ZXZfZXJyKGRldiwgImZhaWwgdG8gZW5hYmxlIHJlZ3VsYXRvclxuIik7DQo+ICsJCWdvdG8gZXJy
X3JlZ3VsYXRvcjsNCj4gKwl9DQo+ICsNCj4gKwltdXRleF9pbml0KCZhZDc5NDlfYWRjLT5sb2Nr
KTsNCj4gKw0KPiArCXJldCA9IGFkNzk0OV9zcGlfaW5pdChhZDc5NDlfYWRjKTsNCj4gKwlpZiAo
cmV0KSB7DQo+ICsJCWRldl9lcnIoZGV2LCAiZW5hYmxlIHRvIGluaXQgdGhpcyBkZXZpY2U6ICVk
XG4iLCByZXQpOw0KPiArCQlnb3RvIGVycjsNCj4gKwl9DQo+ICsNCj4gKwlyZXQgPSBpaW9fZGV2
aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7DQo+ICsJaWYgKHJldCkgew0KPiArCQlkZXZfZXJyKGRl
diwgImZhaWwgdG8gcmVnaXN0ZXIgaWlvIGRldmljZTogJWRcbiIsIHJldCk7DQo+ICsJCWdvdG8g
ZXJyOw0KPiArCX0NCj4gKw0KPiArCXJldHVybiAwOw0KPiArDQo+ICtlcnI6DQo+ICsJbXV0ZXhf
ZGVzdHJveSgmYWQ3OTQ5X2FkYy0+bG9jayk7DQo+ICsJcmVndWxhdG9yX2Rpc2FibGUoYWQ3OTQ5
X2FkYy0+dnJlZik7DQo+ICtlcnJfcmVndWxhdG9yOg0KPiArCXJldHVybiByZXQ7DQo+ICt9DQo+
ICsNCj4gK3N0YXRpYyBpbnQgYWQ3OTQ5X3NwaV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNw
aSkNCj4gK3sNCj4gKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gc3BpX2dldF9kcnZkYXRh
KHNwaSk7DQo+ICsJc3RydWN0IGFkNzk0OV9hZGNfY2hpcCAqYWQ3OTQ5X2FkYyA9IGlpb19wcml2
KGluZGlvX2Rldik7DQo+ICsNCj4gKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsN
Cj4gKwltdXRleF9kZXN0cm95KCZhZDc5NDlfYWRjLT5sb2NrKTsNCj4gKwlyZWd1bGF0b3JfZGlz
YWJsZShhZDc5NDlfYWRjLT52cmVmKTsNCj4gKw0KPiArCXJldHVybiAwOw0KPiArfQ0KPiArDQo+
ICsjaWZkZWYgQ09ORklHX09GDQo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBh
ZDc5NDlfc3BpX29mX2lkW10gPSB7DQo+ICsJeyAuY29tcGF0aWJsZSA9ICJhZDc5NDkiIH0sDQo+
ICsJeyAuY29tcGF0aWJsZSA9ICJhZDc2ODIiIH0sDQo+ICsJeyAuY29tcGF0aWJsZSA9ICJhZDc2
ODkiIH0sDQoNClR5cGljYWxseSwgZm9yIGRldmljZSBuYW1lcyBpbiBkZXZpY2UtdHJlZXMgd2Ug
cHJlZml4IHRoZW0gd2l0aCBgYWRpLGAuDQpTbywgImFkaSxhZDc5NDkiIGFuZCBzbyBvbi4gVGhl
IHJlYXNvbiBpcyB0byBwcmV2ZW50IGFueSBwb3RlbnRpYWwgbmFtZQ0KY29sbGlzaW9ucyBmb3Ig
YW55IGZ1dHVyZSBkZXZpY2VzIGZyb20gb3RoZXIgY29tcGFuaWVzLg0KDQo+ICsJeyB9DQo+ICt9
Ow0KPiArTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgYWQ3OTQ5X3NwaV9vZl9pZCk7DQo+ICsjZW5k
aWYNCj4gKw0KPiArc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIGFkNzk0OV9zcGlf
aWRbXSA9IHsNCj4gKwl7ICJhZDc5NDkiLCBJRF9BRDc5NDkgIH0sDQo+ICsJeyAiYWQ3NjgyIiwg
SURfQUQ3NjgyIH0sDQo+ICsJeyAiYWQ3Njg5IiwgSURfQUQ3Njg5IH0sDQo+ICsJeyB9DQo+ICt9
Ow0KPiArTU9EVUxFX0RFVklDRV9UQUJMRShzcGksIGFkNzk0OV9zcGlfaWQpOw0KPiArDQo+ICtz
dGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWQ3OTQ5X3NwaV9kcml2ZXIgPSB7DQo+ICsJLmRyaXZl
ciA9IHsNCj4gKwkJLm5hbWUJCT0gImFkNzk0OSIsDQo+ICsJCS5vZl9tYXRjaF90YWJsZQk9IG9m
X21hdGNoX3B0cihhZDc5NDlfc3BpX29mX2lkKSwNCj4gKwl9LA0KPiArCS5wcm9iZQkgID0gYWQ3
OTQ5X3NwaV9wcm9iZSwNCj4gKwkucmVtb3ZlICAgPSBhZDc5NDlfc3BpX3JlbW92ZSwNCj4gKwku
aWRfdGFibGUgPSBhZDc5NDlfc3BpX2lkLA0KPiArfTsNCj4gK21vZHVsZV9zcGlfZHJpdmVyKGFk
Nzk0OV9zcGlfZHJpdmVyKTsNCj4gKw0KPiArTU9EVUxFX0FVVEhPUigiQ2hhcmxlcy1BbnRvaW5l
IENvdXJldCA8DQo+IGNoYXJsZXMtYW50b2luZS5jb3VyZXRAZXNzZW5zaXVtLmNvbT4iKTsNCj4g
K01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgMTQvMTYtYml0IDgtY2hhbm5lbCBB
REMgZHJpdmVyIik7DQo+ICtNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7DQo=

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

* Re: [PATCHv2 2/2] Add AD7949 device tree bindings in documentation
  2018-10-17 20:39 ` [PATCHv2 2/2] Add AD7949 device tree bindings in documentation Charles-Antoine Couret
@ 2018-10-21 16:46   ` Jonathan Cameron
  0 siblings, 0 replies; 6+ messages in thread
From: Jonathan Cameron @ 2018-10-21 16:46 UTC (permalink / raw)
  To: Charles-Antoine Couret; +Cc: linux-iio, Rob Herring, Mark Rutland

On Wed, 17 Oct 2018 22:39:54 +0200
Charles-Antoine Couret <charles-antoine.couret@essensium.com> wrote:

+CC device tree list list and maintainers.

> Add AD7949 device tree bindings in documentation
> 
> Signed-off-by: Charles-Antoine Couret <charles-antoine.couret@essensium.com>
> ---
>  .../devicetree/bindings/iio/adc/ad7949.txt     | 18 ++++++++++++++++++
>  1 file changed, 18 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/iio/adc/ad7949.txt
> 
> diff --git a/Documentation/devicetree/bindings/iio/adc/ad7949.txt b/Documentation/devicetree/bindings/iio/adc/ad7949.txt
> new file mode 100644
> index 000000000000..9ecb84188d83
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/iio/adc/ad7949.txt
> @@ -0,0 +1,18 @@
> +* Analog Devices AD7949/AD7682/AD7689
> +
> +Required properties:
> + - compatible: Should be one of
> +	* "ad7949"
> +	* "ad7682"
> +	* "ad7689"
As Alex pointed out, adi,ad7949 etc

> + - reg: spi chip select number for the device
> + - vref-supply: The regulator supply for ADC reference voltage
> + - spi-max-frequency: Max SPI frequency to use (< 33000000)
> +
> +Example:
> +adc@0 {
> +	compatible = "ad7949";
> +	reg = <0>;
> +	vref-supply = <&vdd_supply>;
> +	spi-max-frequency = <200000>;
> +};

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

* Re: [PATCHv2 1/2] Add AD7949 ADC driver family
  2018-10-17 20:39 [PATCHv2 1/2] Add AD7949 ADC driver family Charles-Antoine Couret
                   ` (2 preceding siblings ...)
  2018-10-18  7:06 ` Ardelean, Alexandru
@ 2018-10-21 16:58 ` Jonathan Cameron
  3 siblings, 0 replies; 6+ messages in thread
From: Jonathan Cameron @ 2018-10-21 16:58 UTC (permalink / raw)
  To: Charles-Antoine Couret; +Cc: linux-iio

On Wed, 17 Oct 2018 22:39:53 +0200
Charles-Antoine Couret <charles-antoine.couret@essensium.com> wrote:

> Add AD7949 ADC driver family
> 
> Compatible with AD7682 and AD7689 chips.
> It is a Analog Devices ADC driver 14/16 bits 4/8 channels
> with SPI protocol
> 
> Datasheet of the device:
> http://www.analog.com/media/en/technical-documentation/data-sheets/AD7949.pdf
> 
> Signed-off-by: Charles-Antoine Couret <charles-antoine.couret@essensium.com>
Hi Charles-Antoine

Please a prefix to the patch description to describe roughly where in the
kernel a patch applies.  The precise convention varies rather more than
it probably should, but in iio we usually use.

iio:adc:ad7949: Add AD79759 ADC driver family.

A few minor bits and pieces inline to add to Alex's comments.
I missed some of these on V1, so sorry about that!

Thanks,

Jonathan

> ---
>  drivers/iio/adc/Kconfig  |  10 ++
>  drivers/iio/adc/Makefile |   1 +
>  drivers/iio/adc/ad7949.c | 352 +++++++++++++++++++++++++++++++++++++++
>  3 files changed, 363 insertions(+)
>  create mode 100644 drivers/iio/adc/ad7949.c
> 
> diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig
> index 4a754921fb6f..42e66efff6c0 100644
> --- a/drivers/iio/adc/Kconfig
> +++ b/drivers/iio/adc/Kconfig
> @@ -116,6 +116,16 @@ config AD7923
>  	  To compile this driver as a module, choose M here: the
>  	  module will be called ad7923.
>  
> +config AD7949
> +	tristate "Analog Devices AD7949 and similar ADCs driver"
> +	depends on SPI
> +	help
> +	  Say yes here to build support for Analog Devices
> +	  AD7949, AD7682, AD7689 8 Channel ADCs.
> +
> +	  To compile this driver as a module, choose M here: the
> +	  module will be called ad7949.
> +
>  config AD799X
>  	tristate "Analog Devices AD799x ADC driver"
>  	depends on I2C
> diff --git a/drivers/iio/adc/Makefile b/drivers/iio/adc/Makefile
> index 03db7b578f9c..88804c867aa9 100644
> --- a/drivers/iio/adc/Makefile
> +++ b/drivers/iio/adc/Makefile
> @@ -14,6 +14,7 @@ obj-$(CONFIG_AD7766) += ad7766.o
>  obj-$(CONFIG_AD7791) += ad7791.o
>  obj-$(CONFIG_AD7793) += ad7793.o
>  obj-$(CONFIG_AD7887) += ad7887.o
> +obj-$(CONFIG_AD7949) += ad7949.o
>  obj-$(CONFIG_AD799X) += ad799x.o
>  obj-$(CONFIG_ASPEED_ADC) += aspeed_adc.o
>  obj-$(CONFIG_AT91_ADC) += at91_adc.o
> diff --git a/drivers/iio/adc/ad7949.c b/drivers/iio/adc/ad7949.c
> new file mode 100644
> index 000000000000..da5082e80317
> --- /dev/null
> +++ b/drivers/iio/adc/ad7949.c
> @@ -0,0 +1,352 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/* ad7949.c - Analog Devices ADC driver 14/16 bits 4/8 channels
> + *
> + * Copyright (C) 2018 CMC NV
> + *
> + * http://www.analog.com/media/en/technical-documentation/data-sheets/AD7949.pdf
> + */
> +
> +#include <linux/delay.h>
> +#include <linux/iio/iio.h>
> +#include <linux/module.h>
> +#include <linux/regulator/consumer.h>
> +#include <linux/spi/spi.h>
> +
> +#define AD7949_MASK_CHANNEL_SEL		GENMASK(9, 7)
> +#define AD7949_MASK_TOTAL		GENMASK(13, 0)
> +#define AD7949_OFFSET_CHANNEL_SEL	7
> +#define AD7949_CFG_READ_BACK		0x1
> +#define AD7949_CFG_REG_SIZE_BITS	14
> +
> +enum {
> +	ID_AD7949 = 0,
> +	ID_AD7682,
> +	ID_AD7689,
> +};
> +
> +struct ad7949_adc_spec {
> +	u8 num_channels;
> +	u8 resolution;
> +};
> +
> +static const struct ad7949_adc_spec ad7949_adc_spec[] = {
> +	[ID_AD7949]  = { .num_channels = 8, .resolution = 14 },
> +	[ID_AD7682] = { .num_channels = 4, .resolution = 16 },
> +	[ID_AD7689] = { .num_channels = 8, .resolution = 16 },
> +};
> +
> +/**
> + * struct ad7949_adc_chip - AD ADC chip
> + * @lock: protects write sequences
> + * @vref: regulator generating Vref
> + * @iio_dev: reference to iio structure
> + * @spi: reference to spi structure
> + * @resolution: resolution of the chip
> + * @cfg: copy of the configuration register
> + * @current_channel: current channel in use
> + * @buffer: buffer to send / receive data to / from device
> + */
> +struct ad7949_adc_chip {
> +	struct mutex lock;
> +	struct regulator *vref;
> +	struct iio_dev *indio_dev;
> +	struct spi_device *spi;
> +	u8 resolution;
> +	u16 cfg;
> +	unsigned int current_channel;
> +	u32 buffer ____cacheline_aligned;
> +};
> +
> +static bool ad7949_spi_cfg_is_read_back(struct ad7949_adc_chip *ad7949_adc)
> +{
> +	if (!(ad7949_adc->cfg & AD7949_CFG_READ_BACK))
> +		return true;
return !(ad7949_adc->cfg & AD7949_CFG_READ_BACK);
> +
> +	return false;
> +}
> +
> +static int ad7949_spi_bits_per_word(struct ad7949_adc_chip *ad7949_adc)
> +{
> +	int ret = ad7949_adc->resolution;
> +
> +	if (ad7949_spi_cfg_is_read_back(ad7949_adc))
> +		ret += AD7949_CFG_REG_SIZE_BITS;
> +
> +	return ret;
> +}
> +
> +static int ad7949_spi_write_cfg(struct ad7949_adc_chip *ad7949_adc, u16 val,
> +				u16 mask)
> +{
> +	int ret;
> +	int bits_per_word = ad7949_spi_bits_per_word(ad7949_adc);
> +	int shift = bits_per_word - AD7949_CFG_REG_SIZE_BITS;
> +	struct spi_message msg;
> +	struct spi_transfer tx[] = {
> +		{
> +			.tx_buf = &ad7949_adc->buffer,
> +			.len = 4,
> +			.bits_per_word = bits_per_word,
> +		},
> +	};
> +
> +	ad7949_adc->cfg = (val & mask) | (ad7949_adc->cfg & ~mask);
> +	ad7949_adc->buffer = ad7949_adc->cfg << shift;
> +	spi_message_init(&msg);
> +	spi_message_add_tail(&tx[0], &msg);

spi_message_init_with_transfers (saves a line ;)

> +	ret = spi_sync(ad7949_adc->spi, &msg);
> +
> +	/* This delay is to avoid a new request before the required time to
Multiline comment style (see below).
> +	 * send a new command to the device
> +	 */ 
> +	udelay(2);
> +	return ret;
> +}
> +
> +static int ad7949_spi_read_channel(struct ad7949_adc_chip *ad7949_adc, int *val,
> +				   unsigned int channel)
> +{
> +	int ret;
> +	int bits_per_word = ad7949_spi_bits_per_word(ad7949_adc);
> +	int mask = GENMASK(ad7949_adc->resolution, 0);
> +	struct spi_message msg;
> +	struct spi_transfer tx[] = {
> +		{
> +			.rx_buf = &ad7949_adc->buffer,
> +			.len = 4,
> +			.bits_per_word = bits_per_word,
> +		},
> +	};
> +
> +	ret = ad7949_spi_write_cfg(ad7949_adc,
> +				   channel << AD7949_OFFSET_CHANNEL_SEL,
> +				   AD7949_MASK_CHANNEL_SEL);
> +	if (ret)
> +		return ret;
> +
> +	ad7949_adc->buffer = 0;
> +	spi_message_init(&msg);
> +	spi_message_add_tail(&tx[0], &msg);

spi_message_init_with_transfers. 

> +	ret = spi_sync(ad7949_adc->spi, &msg);
> +	if (ret)
> +		return ret;
> +
> +	/* This delay is to avoid a new request before the required time to
Multiline comment style.
/*
 * This
 * ...
 */
> +	 * send a new command to the device
> +	 */ 
> +	udelay(2);
> +
> +	ad7949_adc->current_channel = channel;
> +
> +	if (ad7949_spi_cfg_is_read_back(ad7949_adc))
> +		*val = (ad7949_adc->buffer >> AD7949_CFG_REG_SIZE_BITS) & mask;
> +	else
> +		*val = ad7949_adc->buffer & mask;
> +
> +	return 0;
> +}
> +
> +#define AD7949_ADC_CHANNEL(chan) {				\
> +	.type = IIO_VOLTAGE,					\
> +	.indexed = 1,						\
> +	.channel = (chan),					\
> +	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),		\
> +	.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),	\
> +}
> +
> +static const struct iio_chan_spec ad7949_adc_channels[] = {
> +	AD7949_ADC_CHANNEL(0),
> +	AD7949_ADC_CHANNEL(1),
> +	AD7949_ADC_CHANNEL(2),
> +	AD7949_ADC_CHANNEL(3),
> +	AD7949_ADC_CHANNEL(4),
> +	AD7949_ADC_CHANNEL(5),
> +	AD7949_ADC_CHANNEL(6),
> +	AD7949_ADC_CHANNEL(7),
> +};
> +
> +static int ad7949_spi_read_raw(struct iio_dev *indio_dev,
> +			   struct iio_chan_spec const *chan,
> +			   int *val, int *val2, long mask)
> +{
> +	struct ad7949_adc_chip *ad7949_adc = iio_priv(indio_dev);
> +	int ret;
> +
> +	if (!val)
> +		return -EINVAL;
> +
> +	switch (mask) {
> +	case IIO_CHAN_INFO_RAW:
> +		mutex_lock(&ad7949_adc->lock);
> +		ret = ad7949_spi_read_channel(ad7949_adc, val, chan->channel);
> +		mutex_unlock(&ad7949_adc->lock);
> +
> +		if (ret < 0)
> +			return ret;
> +
> +		return IIO_VAL_INT;
> +
> +	case IIO_CHAN_INFO_SCALE:
> +		ret = regulator_get_voltage(ad7949_adc->vref);
> +		if (ret < 0)
> +			return ret;
> +
> +		*val = ret / 5000;
> +		return IIO_VAL_INT;
> +	}
> +
> +	return -EINVAL;
> +}
> +
> +static int ad7949_spi_reg_access(struct iio_dev *indio_dev,
> +			unsigned int reg, unsigned int writeval,
> +			unsigned int *readval)
> +{
> +	struct ad7949_adc_chip *ad7949_adc = iio_priv(indio_dev);
> +	int ret = 0;
> +
> +	if (readval)
> +		*readval = ad7949_adc->cfg;
> +	else
> +		ret = ad7949_spi_write_cfg(ad7949_adc,
> +			writeval & AD7949_MASK_TOTAL, AD7949_MASK_TOTAL);
> +
> +	return ret;
> +}
> +
> +static const struct iio_info ad7949_spi_info = {
> +	.read_raw = ad7949_spi_read_raw,
> +	.debugfs_reg_access = ad7949_spi_reg_access,
> +};
> +
> +static int ad7949_spi_init(struct ad7949_adc_chip *ad7949_adc)
> +{
> +	int ret;
> +	int val;
> +
> +	/* Sequencer disabled, CFG readback disabled, IN0 as default channel */
> +	ad7949_adc->current_channel = 0;
> +	ret = ad7949_spi_write_cfg(ad7949_adc, 0x3C79, AD7949_MASK_TOTAL);
> +
> +	/* Do two dummy conversions to apply the first configuration setting.
IIO uses the most common kernel multiline comment style.

/*
 * Do two..
 */
> +	 * Required only after the start up of the device.
> +	 */
> +	ad7949_spi_read_channel(ad7949_adc, &val, ad7949_adc->current_channel);
> +	ad7949_spi_read_channel(ad7949_adc, &val, ad7949_adc->current_channel);
A blank line here would help readability (a very small amount!)
> +	return ret;
> +}
> +
> +static int ad7949_spi_probe(struct spi_device *spi)
> +{
> +	struct device *dev = &spi->dev;
> +	const struct ad7949_adc_spec *spec;
> +	struct ad7949_adc_chip *ad7949_adc;
> +	struct iio_dev *indio_dev;
> +	int ret;
> +
> +	indio_dev = devm_iio_device_alloc(dev, sizeof(*ad7949_adc));
> +	if (!indio_dev) {
> +		dev_err(dev, "can not allocate iio device\n");
> +		return -ENOMEM;
> +	}
> +
> +	spi->max_speed_hz = 33000000;
This one would actually override what you already have in the DT 
binding.

> +	spi->mode = SPI_MODE_0;
This one is the default (I think....)

> +	spi->bits_per_word = 8;
This is the default so doesn't need to be set.

> +	spi_setup(spi);
> +
> +	indio_dev->dev.parent = dev;
> +	indio_dev->dev.of_node = dev->of_node;
> +	indio_dev->info = &ad7949_spi_info;
> +	indio_dev->name = spi_get_device_id(spi)->name;
> +	indio_dev->modes = INDIO_DIRECT_MODE;
> +	indio_dev->channels = ad7949_adc_channels;
> +	spi_set_drvdata(spi, indio_dev);
> +
> +	ad7949_adc = iio_priv(indio_dev);
> +	ad7949_adc->indio_dev = indio_dev;
> +	ad7949_adc->spi = spi;
> +
> +	spec = &ad7949_adc_spec[spi_get_device_id(spi)->driver_data];
> +	indio_dev->num_channels = spec->num_channels;
> +	ad7949_adc->resolution = spec->resolution;
> +
> +	ad7949_adc->vref = devm_regulator_get(dev, "vref");
> +	if (IS_ERR(ad7949_adc->vref)) {
> +		dev_err(dev, "fail to request regulator\n");
> +		return PTR_ERR(ad7949_adc->vref);
> +	}
> +
> +	ret = regulator_enable(ad7949_adc->vref);
> +	if (ret < 0) {
> +		dev_err(dev, "fail to enable regulator\n");
> +		goto err_regulator;
> +	}
> +
> +	mutex_init(&ad7949_adc->lock);
> +
> +	ret = ad7949_spi_init(ad7949_adc);
> +	if (ret) {
> +		dev_err(dev, "enable to init this device: %d\n", ret);
> +		goto err;
> +	}
> +
> +	ret = iio_device_register(indio_dev);
> +	if (ret) {
> +		dev_err(dev, "fail to register iio device: %d\n", ret);
> +		goto err;
> +	}
> +
> +	return 0;
> +
> +err:
> +	mutex_destroy(&ad7949_adc->lock);
> +	regulator_disable(ad7949_adc->vref);
> +err_regulator:
> +	return ret;
> +}
> +
> +static int ad7949_spi_remove(struct spi_device *spi)
> +{
> +	struct iio_dev *indio_dev = spi_get_drvdata(spi);
> +	struct ad7949_adc_chip *ad7949_adc = iio_priv(indio_dev);
> +
> +	iio_device_unregister(indio_dev);
> +	mutex_destroy(&ad7949_adc->lock);
> +	regulator_disable(ad7949_adc->vref);
> +
> +	return 0;
> +}
> +
> +#ifdef CONFIG_OF
> +static const struct of_device_id ad7949_spi_of_id[] = {
> +	{ .compatible = "ad7949" },
> +	{ .compatible = "ad7682" },
> +	{ .compatible = "ad7689" },
> +	{ }
> +};
> +MODULE_DEVICE_TABLE(of, ad7949_spi_of_id);
> +#endif
> +
> +static const struct spi_device_id ad7949_spi_id[] = {
> +	{ "ad7949", ID_AD7949  },
> +	{ "ad7682", ID_AD7682 },
> +	{ "ad7689", ID_AD7689 },
> +	{ }
> +};
> +MODULE_DEVICE_TABLE(spi, ad7949_spi_id);
> +
> +static struct spi_driver ad7949_spi_driver = {
> +	.driver = {
> +		.name		= "ad7949",
> +		.of_match_table	= of_match_ptr(ad7949_spi_of_id),
> +	},
> +	.probe	  = ad7949_spi_probe,
> +	.remove   = ad7949_spi_remove,
> +	.id_table = ad7949_spi_id,
> +};
> +module_spi_driver(ad7949_spi_driver);
> +
> +MODULE_AUTHOR("Charles-Antoine Couret <charles-antoine.couret@essensium.com>");
> +MODULE_DESCRIPTION("Analog Devices 14/16-bit 8-channel ADC driver");
> +MODULE_LICENSE("GPL v2");

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

end of thread, other threads:[~2018-10-22  1:13 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-10-17 20:39 [PATCHv2 1/2] Add AD7949 ADC driver family Charles-Antoine Couret
2018-10-17 20:39 ` [PATCHv2 2/2] Add AD7949 device tree bindings in documentation Charles-Antoine Couret
2018-10-21 16:46   ` Jonathan Cameron
2018-10-18  7:02 ` [PATCHv2 1/2] Add AD7949 ADC driver family Ardelean, Alexandru
2018-10-18  7:06 ` Ardelean, Alexandru
2018-10-21 16:58 ` Jonathan Cameron

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.