All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] iio: ti_am335x_adc: Add optional DT properties for tscadc
@ 2015-03-31 11:12 ` Vignesh R
  0 siblings, 0 replies; 16+ messages in thread
From: Vignesh R @ 2015-03-31 11:12 UTC (permalink / raw)
  To: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Jonathan Cameron
  Cc: Hartmut Knaack, Lars-Peter Clausen, Peter Meerwald,
	Dmitry Torokhov, Karol Wrona, Jan Kardell, devicetree,
	linux-kernel, linux-iio, fcooper, Vignesh R


Hi,

This patch adds optional DT properties for tscadc to set open delay,
sample delay and number of averages per sample for each adc channel.
Open delay, sample delay and averaging are some of the parameters that
affect the sampling rate and accuracy of the tscadc. Decreasing delays
and averaging helps to achieve higher sampling rates, while increasing
this parameters provides greater accuracy. Hence, this patch provides DT
properties to set the initial values for delays and number of averages
per sample. User space control via sysfs can be added later.


Vignesh R (2):
  iio: adc: ti_am335x_adc: refactor DT parsing into a function
  iio: adc: ti_am335x_adc: make sample delay, open delay, averaging DT
    parameters

 .../bindings/input/touchscreen/ti-tsc-adc.txt      | 24 +++++++
 drivers/iio/adc/ti_am335x_adc.c                    | 83 +++++++++++++++++-----
 2 files changed, 91 insertions(+), 16 deletions(-)

-- 
1.9.1


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

* [PATCH 0/2] iio: ti_am335x_adc: Add optional DT properties for tscadc
@ 2015-03-31 11:12 ` Vignesh R
  0 siblings, 0 replies; 16+ messages in thread
From: Vignesh R @ 2015-03-31 11:12 UTC (permalink / raw)
  To: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Jonathan Cameron
  Cc: Hartmut Knaack, Lars-Peter Clausen, Peter Meerwald,
	Dmitry Torokhov, Karol Wrona, Jan Kardell,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-iio-u79uwXL29TY76Z2rM5mHXA, fcooper-l0cyMroinI0, Vignesh R


Hi,

This patch adds optional DT properties for tscadc to set open delay,
sample delay and number of averages per sample for each adc channel.
Open delay, sample delay and averaging are some of the parameters that
affect the sampling rate and accuracy of the tscadc. Decreasing delays
and averaging helps to achieve higher sampling rates, while increasing
this parameters provides greater accuracy. Hence, this patch provides DT
properties to set the initial values for delays and number of averages
per sample. User space control via sysfs can be added later.


Vignesh R (2):
  iio: adc: ti_am335x_adc: refactor DT parsing into a function
  iio: adc: ti_am335x_adc: make sample delay, open delay, averaging DT
    parameters

 .../bindings/input/touchscreen/ti-tsc-adc.txt      | 24 +++++++
 drivers/iio/adc/ti_am335x_adc.c                    | 83 +++++++++++++++++-----
 2 files changed, 91 insertions(+), 16 deletions(-)

-- 
1.9.1

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

* [PATCH 1/2] iio: adc: ti_am335x_adc: refactor DT parsing into a function
  2015-03-31 11:12 ` Vignesh R
@ 2015-03-31 11:12   ` Vignesh R
  -1 siblings, 0 replies; 16+ messages in thread
From: Vignesh R @ 2015-03-31 11:12 UTC (permalink / raw)
  To: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Jonathan Cameron
  Cc: Hartmut Knaack, Lars-Peter Clausen, Peter Meerwald,
	Dmitry Torokhov, Karol Wrona, Jan Kardell, devicetree,
	linux-kernel, linux-iio, fcooper, Vignesh R

Refactor DT parsing into a separate function from probe() to
help addition of more DT parameters later.

No functional changes.

Signed-off-by: Vignesh R <vigneshr@ti.com>
---
 drivers/iio/adc/ti_am335x_adc.c | 29 +++++++++++++++++++----------
 1 file changed, 19 insertions(+), 10 deletions(-)

diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index 2e5cc4409f78..2f818405ffbe 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -396,16 +396,30 @@ static const struct iio_info tiadc_info = {
 	.driver_module = THIS_MODULE,
 };
 
+static int tiadc_parse_dt(struct platform_device *pdev,
+			  struct tiadc_device *adc_dev)
+{
+	struct device_node *node = pdev->dev.of_node;
+	struct property *prop;
+	const __be32 *cur;
+	int channels = 0;
+	u32 val;
+
+	of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
+		adc_dev->channel_line[channels] = val;
+		channels++;
+	}
+
+	adc_dev->channels = channels;
+	return 0;
+}
+
 static int tiadc_probe(struct platform_device *pdev)
 {
 	struct iio_dev		*indio_dev;
 	struct tiadc_device	*adc_dev;
 	struct device_node	*node = pdev->dev.of_node;
-	struct property		*prop;
-	const __be32		*cur;
 	int			err;
-	u32			val;
-	int			channels = 0;
 
 	if (!node) {
 		dev_err(&pdev->dev, "Could not find valid DT data.\n");
@@ -421,12 +435,7 @@ static int tiadc_probe(struct platform_device *pdev)
 	adc_dev = iio_priv(indio_dev);
 
 	adc_dev->mfd_tscadc = ti_tscadc_dev_get(pdev);
-
-	of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
-		adc_dev->channel_line[channels] = val;
-		channels++;
-	}
-	adc_dev->channels = channels;
+	tiadc_parse_dt(pdev, adc_dev);
 
 	indio_dev->dev.parent = &pdev->dev;
 	indio_dev->name = dev_name(&pdev->dev);
-- 
1.9.1


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

* [PATCH 1/2] iio: adc: ti_am335x_adc: refactor DT parsing into a function
@ 2015-03-31 11:12   ` Vignesh R
  0 siblings, 0 replies; 16+ messages in thread
From: Vignesh R @ 2015-03-31 11:12 UTC (permalink / raw)
  To: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Jonathan Cameron
  Cc: Hartmut Knaack, Lars-Peter Clausen, Peter Meerwald,
	Dmitry Torokhov, Karol Wrona, Jan Kardell, devicetree,
	linux-kernel, linux-iio, fcooper, Vignesh R

Refactor DT parsing into a separate function from probe() to
help addition of more DT parameters later.

No functional changes.

Signed-off-by: Vignesh R <vigneshr@ti.com>
---
 drivers/iio/adc/ti_am335x_adc.c | 29 +++++++++++++++++++----------
 1 file changed, 19 insertions(+), 10 deletions(-)

diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index 2e5cc4409f78..2f818405ffbe 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -396,16 +396,30 @@ static const struct iio_info tiadc_info = {
 	.driver_module = THIS_MODULE,
 };
 
+static int tiadc_parse_dt(struct platform_device *pdev,
+			  struct tiadc_device *adc_dev)
+{
+	struct device_node *node = pdev->dev.of_node;
+	struct property *prop;
+	const __be32 *cur;
+	int channels = 0;
+	u32 val;
+
+	of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
+		adc_dev->channel_line[channels] = val;
+		channels++;
+	}
+
+	adc_dev->channels = channels;
+	return 0;
+}
+
 static int tiadc_probe(struct platform_device *pdev)
 {
 	struct iio_dev		*indio_dev;
 	struct tiadc_device	*adc_dev;
 	struct device_node	*node = pdev->dev.of_node;
-	struct property		*prop;
-	const __be32		*cur;
 	int			err;
-	u32			val;
-	int			channels = 0;
 
 	if (!node) {
 		dev_err(&pdev->dev, "Could not find valid DT data.\n");
@@ -421,12 +435,7 @@ static int tiadc_probe(struct platform_device *pdev)
 	adc_dev = iio_priv(indio_dev);
 
 	adc_dev->mfd_tscadc = ti_tscadc_dev_get(pdev);
-
-	of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
-		adc_dev->channel_line[channels] = val;
-		channels++;
-	}
-	adc_dev->channels = channels;
+	tiadc_parse_dt(pdev, adc_dev);
 
 	indio_dev->dev.parent = &pdev->dev;
 	indio_dev->name = dev_name(&pdev->dev);
-- 
1.9.1

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

* [PATCH 2/2] iio: adc: ti_am335x_adc: make sample delay, open delay, averaging DT parameters
  2015-03-31 11:12 ` Vignesh R
@ 2015-03-31 11:12   ` Vignesh R
  -1 siblings, 0 replies; 16+ messages in thread
From: Vignesh R @ 2015-03-31 11:12 UTC (permalink / raw)
  To: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Jonathan Cameron
  Cc: Hartmut Knaack, Lars-Peter Clausen, Peter Meerwald,
	Dmitry Torokhov, Karol Wrona, Jan Kardell, devicetree,
	linux-kernel, linux-iio, fcooper, Vignesh R

Add optional DT properties to set open delay, sample delay and number
of averages per sample for each adc step. Open delay, sample delay
and averaging are some of the parameters that affect the sampling rate
and accuracy of the sample. Making these parameters configurable via
DT will help in balancing speed vs accuracy.

Signed-off-by: Vignesh R <vigneshr@ti.com>
---
 .../bindings/input/touchscreen/ti-tsc-adc.txt      | 24 ++++++++++
 drivers/iio/adc/ti_am335x_adc.c                    | 54 +++++++++++++++++++---
 2 files changed, 72 insertions(+), 6 deletions(-)

diff --git a/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt b/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt
index 6c4fb34823d3..8aafbe87f0eb 100644
--- a/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt
+++ b/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt
@@ -42,6 +42,27 @@ Optional properties:
 			 hardware knob for adjusting the amount of "settling
 			 time".
 
+- child "adc"
+	ti,chan-step-opendelay: List of open delays for each channel of
+				ADC in the order of ti,adc-channels. The
+				value corresponds to the number of ADC
+				clock cycles to wait after applying the
+				step configuration registers and before
+				sending the start of ADC conversion.
+				Maximum value is 0x3FFFF.
+       ti,chan-step-sampledelay: List of sample delays for each channel
+				  of ADC in the order of ti,adc-channels.
+				  The value corresponds to the number of
+				  ADC clock cycles to sample (to hold
+				  start of conversion high).
+				  Maximum value is 0xFF.
+       ti,chan-step-avg: Number of averages to be performed for each
+			  channel of ADC. If average is 16 then input
+			  is sampled 16 times and averaged to get more
+			  accurate value. This increases the time taken
+			  by ADC to generate a sample. Valid range is 0
+			  average to 16 averages. Maximum value is 16.
+
 Example:
 	tscadc: tscadc@44e0d000 {
 		compatible = "ti,am3359-tscadc";
@@ -55,5 +76,8 @@ Example:
 
 		adc {
 			ti,adc-channels = <4 5 6 7>;
+			ti,chan-step-opendelay = <0x098 0x3ffff 0x098 0x0>;
+			ti,chan-step-sampledelay = <0xff 0x0 0xf 0x0>;
+			ti,chan-step-avg = <16 2 4 8>;
 		};
 	}
diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index 2f818405ffbe..5ee597b4a1af 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -37,6 +37,7 @@ struct tiadc_device {
 	u8 channel_step[8];
 	int buffer_en_ch_steps;
 	u16 data[8];
+	u32 open_delay[8], sample_delay[8], step_avg[8];
 };
 
 static unsigned int tiadc_readl(struct tiadc_device *adc, unsigned int reg)
@@ -85,6 +86,7 @@ static u32 get_adc_step_bit(struct tiadc_device *adc_dev, int chan)
 static void tiadc_step_config(struct iio_dev *indio_dev)
 {
 	struct tiadc_device *adc_dev = iio_priv(indio_dev);
+	struct device *dev = adc_dev->mfd_tscadc->dev;
 	unsigned int stepconfig;
 	int i, steps = 0;
 
@@ -98,20 +100,47 @@ static void tiadc_step_config(struct iio_dev *indio_dev)
 	 * needs to be given to ADC to digitalize data.
 	 */
 
-	if (iio_buffer_enabled(indio_dev))
-		stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1
-					| STEPCONFIG_MODE_SWCNT;
-	else
-		stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1;
 
 	for (i = 0; i < adc_dev->channels; i++) {
 		int chan;
 
 		chan = adc_dev->channel_line[i];
+
+		if (adc_dev->step_avg[i] > STEPCONFIG_AVG_16) {
+			dev_warn(dev, "chan %d step_avg truncating to %d\n",
+				 chan, STEPCONFIG_AVG_16);
+			adc_dev->step_avg[i] = STEPCONFIG_AVG_16;
+		}
+
+		if (adc_dev->step_avg[i])
+			stepconfig =
+			STEPCONFIG_AVG(ffs(adc_dev->step_avg[i]) - 1) |
+			STEPCONFIG_FIFO1;
+		else
+			stepconfig = STEPCONFIG_FIFO1;
+
+		if (iio_buffer_enabled(indio_dev))
+			stepconfig |= STEPCONFIG_MODE_SWCNT;
+
 		tiadc_writel(adc_dev, REG_STEPCONFIG(steps),
 				stepconfig | STEPCONFIG_INP(chan));
+
+		if (adc_dev->open_delay[i] > STEPDELAY_OPEN_MASK) {
+			dev_warn(dev, "chan %d open delay truncating to 0x3FFFF\n",
+				 chan);
+			adc_dev->open_delay[i] = STEPDELAY_OPEN_MASK;
+		}
+
+		if (adc_dev->sample_delay[i] > 0xFF) {
+			dev_warn(dev, "chan %d sample delay truncating to 0xFF\n",
+				 chan);
+			adc_dev->sample_delay[i] = 0xFF;
+		}
+
 		tiadc_writel(adc_dev, REG_STEPDELAY(steps),
-				STEPCONFIG_OPENDLY);
+				STEPDELAY_OPEN(adc_dev->open_delay[i]) |
+				STEPDELAY_SAMPLE(adc_dev->sample_delay[i]));
+
 		adc_dev->channel_step[i] = steps;
 		steps++;
 	}
@@ -407,9 +436,22 @@ static int tiadc_parse_dt(struct platform_device *pdev,
 
 	of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
 		adc_dev->channel_line[channels] = val;
+
+		/* Set Default values for optional DT parameters */
+		adc_dev->open_delay[channels] = STEPCONFIG_OPENDLY;
+		adc_dev->sample_delay[channels] = STEPCONFIG_SAMPLEDLY;
+		adc_dev->step_avg[channels] = 16;
+
 		channels++;
 	}
 
+	of_property_read_u32_array(node, "ti,chan-step-avg",
+				   adc_dev->step_avg, channels);
+	of_property_read_u32_array(node, "ti,chan-step-opendelay",
+				   adc_dev->open_delay, channels);
+	of_property_read_u32_array(node, "ti,chan-step-sampledelay",
+				   adc_dev->sample_delay, channels);
+
 	adc_dev->channels = channels;
 	return 0;
 }
-- 
1.9.1


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

* [PATCH 2/2] iio: adc: ti_am335x_adc: make sample delay, open delay, averaging DT parameters
@ 2015-03-31 11:12   ` Vignesh R
  0 siblings, 0 replies; 16+ messages in thread
From: Vignesh R @ 2015-03-31 11:12 UTC (permalink / raw)
  To: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Jonathan Cameron
  Cc: Hartmut Knaack, Lars-Peter Clausen, Peter Meerwald,
	Dmitry Torokhov, Karol Wrona, Jan Kardell, devicetree,
	linux-kernel, linux-iio, fcooper, Vignesh R

Add optional DT properties to set open delay, sample delay and number
of averages per sample for each adc step. Open delay, sample delay
and averaging are some of the parameters that affect the sampling rate
and accuracy of the sample. Making these parameters configurable via
DT will help in balancing speed vs accuracy.

Signed-off-by: Vignesh R <vigneshr@ti.com>
---
 .../bindings/input/touchscreen/ti-tsc-adc.txt      | 24 ++++++++++
 drivers/iio/adc/ti_am335x_adc.c                    | 54 +++++++++++++++++++---
 2 files changed, 72 insertions(+), 6 deletions(-)

diff --git a/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt b/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt
index 6c4fb34823d3..8aafbe87f0eb 100644
--- a/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt
+++ b/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt
@@ -42,6 +42,27 @@ Optional properties:
 			 hardware knob for adjusting the amount of "settling
 			 time".
 
+- child "adc"
+	ti,chan-step-opendelay: List of open delays for each channel of
+				ADC in the order of ti,adc-channels. The
+				value corresponds to the number of ADC
+				clock cycles to wait after applying the
+				step configuration registers and before
+				sending the start of ADC conversion.
+				Maximum value is 0x3FFFF.
+       ti,chan-step-sampledelay: List of sample delays for each channel
+				  of ADC in the order of ti,adc-channels.
+				  The value corresponds to the number of
+				  ADC clock cycles to sample (to hold
+				  start of conversion high).
+				  Maximum value is 0xFF.
+       ti,chan-step-avg: Number of averages to be performed for each
+			  channel of ADC. If average is 16 then input
+			  is sampled 16 times and averaged to get more
+			  accurate value. This increases the time taken
+			  by ADC to generate a sample. Valid range is 0
+			  average to 16 averages. Maximum value is 16.
+
 Example:
 	tscadc: tscadc@44e0d000 {
 		compatible = "ti,am3359-tscadc";
@@ -55,5 +76,8 @@ Example:
 
 		adc {
 			ti,adc-channels = <4 5 6 7>;
+			ti,chan-step-opendelay = <0x098 0x3ffff 0x098 0x0>;
+			ti,chan-step-sampledelay = <0xff 0x0 0xf 0x0>;
+			ti,chan-step-avg = <16 2 4 8>;
 		};
 	}
diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index 2f818405ffbe..5ee597b4a1af 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -37,6 +37,7 @@ struct tiadc_device {
 	u8 channel_step[8];
 	int buffer_en_ch_steps;
 	u16 data[8];
+	u32 open_delay[8], sample_delay[8], step_avg[8];
 };
 
 static unsigned int tiadc_readl(struct tiadc_device *adc, unsigned int reg)
@@ -85,6 +86,7 @@ static u32 get_adc_step_bit(struct tiadc_device *adc_dev, int chan)
 static void tiadc_step_config(struct iio_dev *indio_dev)
 {
 	struct tiadc_device *adc_dev = iio_priv(indio_dev);
+	struct device *dev = adc_dev->mfd_tscadc->dev;
 	unsigned int stepconfig;
 	int i, steps = 0;
 
@@ -98,20 +100,47 @@ static void tiadc_step_config(struct iio_dev *indio_dev)
 	 * needs to be given to ADC to digitalize data.
 	 */
 
-	if (iio_buffer_enabled(indio_dev))
-		stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1
-					| STEPCONFIG_MODE_SWCNT;
-	else
-		stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1;
 
 	for (i = 0; i < adc_dev->channels; i++) {
 		int chan;
 
 		chan = adc_dev->channel_line[i];
+
+		if (adc_dev->step_avg[i] > STEPCONFIG_AVG_16) {
+			dev_warn(dev, "chan %d step_avg truncating to %d\n",
+				 chan, STEPCONFIG_AVG_16);
+			adc_dev->step_avg[i] = STEPCONFIG_AVG_16;
+		}
+
+		if (adc_dev->step_avg[i])
+			stepconfig =
+			STEPCONFIG_AVG(ffs(adc_dev->step_avg[i]) - 1) |
+			STEPCONFIG_FIFO1;
+		else
+			stepconfig = STEPCONFIG_FIFO1;
+
+		if (iio_buffer_enabled(indio_dev))
+			stepconfig |= STEPCONFIG_MODE_SWCNT;
+
 		tiadc_writel(adc_dev, REG_STEPCONFIG(steps),
 				stepconfig | STEPCONFIG_INP(chan));
+
+		if (adc_dev->open_delay[i] > STEPDELAY_OPEN_MASK) {
+			dev_warn(dev, "chan %d open delay truncating to 0x3FFFF\n",
+				 chan);
+			adc_dev->open_delay[i] = STEPDELAY_OPEN_MASK;
+		}
+
+		if (adc_dev->sample_delay[i] > 0xFF) {
+			dev_warn(dev, "chan %d sample delay truncating to 0xFF\n",
+				 chan);
+			adc_dev->sample_delay[i] = 0xFF;
+		}
+
 		tiadc_writel(adc_dev, REG_STEPDELAY(steps),
-				STEPCONFIG_OPENDLY);
+				STEPDELAY_OPEN(adc_dev->open_delay[i]) |
+				STEPDELAY_SAMPLE(adc_dev->sample_delay[i]));
+
 		adc_dev->channel_step[i] = steps;
 		steps++;
 	}
@@ -407,9 +436,22 @@ static int tiadc_parse_dt(struct platform_device *pdev,
 
 	of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
 		adc_dev->channel_line[channels] = val;
+
+		/* Set Default values for optional DT parameters */
+		adc_dev->open_delay[channels] = STEPCONFIG_OPENDLY;
+		adc_dev->sample_delay[channels] = STEPCONFIG_SAMPLEDLY;
+		adc_dev->step_avg[channels] = 16;
+
 		channels++;
 	}
 
+	of_property_read_u32_array(node, "ti,chan-step-avg",
+				   adc_dev->step_avg, channels);
+	of_property_read_u32_array(node, "ti,chan-step-opendelay",
+				   adc_dev->open_delay, channels);
+	of_property_read_u32_array(node, "ti,chan-step-sampledelay",
+				   adc_dev->sample_delay, channels);
+
 	adc_dev->channels = channels;
 	return 0;
 }
-- 
1.9.1

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

* Re: [PATCH 1/2] iio: adc: ti_am335x_adc: refactor DT parsing into a function
@ 2015-04-09 14:13     ` Jonathan Cameron
  0 siblings, 0 replies; 16+ messages in thread
From: Jonathan Cameron @ 2015-04-09 14:13 UTC (permalink / raw)
  To: Vignesh R, Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell,
	Kumar Gala
  Cc: Hartmut Knaack, Lars-Peter Clausen, Peter Meerwald,
	Dmitry Torokhov, Karol Wrona, Jan Kardell, devicetree,
	linux-kernel, linux-iio, fcooper

On 31/03/15 12:12, Vignesh R wrote:
> Refactor DT parsing into a separate function from probe() to
> help addition of more DT parameters later.
> 
> No functional changes.
> 
> Signed-off-by: Vignesh R <vigneshr@ti.com>
Clearly going to need this whatever the outcome of the second patch being
reviewed.

Applied to the togreg branch of iio.git - initially pushed out as testing
for the autobuilders to play with it.

Thanks,

Jonathan
> ---
>  drivers/iio/adc/ti_am335x_adc.c | 29 +++++++++++++++++++----------
>  1 file changed, 19 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
> index 2e5cc4409f78..2f818405ffbe 100644
> --- a/drivers/iio/adc/ti_am335x_adc.c
> +++ b/drivers/iio/adc/ti_am335x_adc.c
> @@ -396,16 +396,30 @@ static const struct iio_info tiadc_info = {
>  	.driver_module = THIS_MODULE,
>  };
>  
> +static int tiadc_parse_dt(struct platform_device *pdev,
> +			  struct tiadc_device *adc_dev)
> +{
> +	struct device_node *node = pdev->dev.of_node;
> +	struct property *prop;
> +	const __be32 *cur;
> +	int channels = 0;
> +	u32 val;
> +
> +	of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
> +		adc_dev->channel_line[channels] = val;
> +		channels++;
> +	}
> +
> +	adc_dev->channels = channels;
> +	return 0;
> +}
> +
>  static int tiadc_probe(struct platform_device *pdev)
>  {
>  	struct iio_dev		*indio_dev;
>  	struct tiadc_device	*adc_dev;
>  	struct device_node	*node = pdev->dev.of_node;
> -	struct property		*prop;
> -	const __be32		*cur;
>  	int			err;
> -	u32			val;
> -	int			channels = 0;
>  
>  	if (!node) {
>  		dev_err(&pdev->dev, "Could not find valid DT data.\n");
> @@ -421,12 +435,7 @@ static int tiadc_probe(struct platform_device *pdev)
>  	adc_dev = iio_priv(indio_dev);
>  
>  	adc_dev->mfd_tscadc = ti_tscadc_dev_get(pdev);
> -
> -	of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
> -		adc_dev->channel_line[channels] = val;
> -		channels++;
> -	}
> -	adc_dev->channels = channels;
> +	tiadc_parse_dt(pdev, adc_dev);
>  
>  	indio_dev->dev.parent = &pdev->dev;
>  	indio_dev->name = dev_name(&pdev->dev);
> 


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

* Re: [PATCH 1/2] iio: adc: ti_am335x_adc: refactor DT parsing into a function
@ 2015-04-09 14:13     ` Jonathan Cameron
  0 siblings, 0 replies; 16+ messages in thread
From: Jonathan Cameron @ 2015-04-09 14:13 UTC (permalink / raw)
  To: Vignesh R, Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell,
	Kumar Gala
  Cc: Hartmut Knaack, Lars-Peter Clausen, Peter Meerwald,
	Dmitry Torokhov, Karol Wrona, Jan Kardell,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-iio-u79uwXL29TY76Z2rM5mHXA, fcooper-l0cyMroinI0

On 31/03/15 12:12, Vignesh R wrote:
> Refactor DT parsing into a separate function from probe() to
> help addition of more DT parameters later.
> 
> No functional changes.
> 
> Signed-off-by: Vignesh R <vigneshr-l0cyMroinI0@public.gmane.org>
Clearly going to need this whatever the outcome of the second patch being
reviewed.

Applied to the togreg branch of iio.git - initially pushed out as testing
for the autobuilders to play with it.

Thanks,

Jonathan
> ---
>  drivers/iio/adc/ti_am335x_adc.c | 29 +++++++++++++++++++----------
>  1 file changed, 19 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
> index 2e5cc4409f78..2f818405ffbe 100644
> --- a/drivers/iio/adc/ti_am335x_adc.c
> +++ b/drivers/iio/adc/ti_am335x_adc.c
> @@ -396,16 +396,30 @@ static const struct iio_info tiadc_info = {
>  	.driver_module = THIS_MODULE,
>  };
>  
> +static int tiadc_parse_dt(struct platform_device *pdev,
> +			  struct tiadc_device *adc_dev)
> +{
> +	struct device_node *node = pdev->dev.of_node;
> +	struct property *prop;
> +	const __be32 *cur;
> +	int channels = 0;
> +	u32 val;
> +
> +	of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
> +		adc_dev->channel_line[channels] = val;
> +		channels++;
> +	}
> +
> +	adc_dev->channels = channels;
> +	return 0;
> +}
> +
>  static int tiadc_probe(struct platform_device *pdev)
>  {
>  	struct iio_dev		*indio_dev;
>  	struct tiadc_device	*adc_dev;
>  	struct device_node	*node = pdev->dev.of_node;
> -	struct property		*prop;
> -	const __be32		*cur;
>  	int			err;
> -	u32			val;
> -	int			channels = 0;
>  
>  	if (!node) {
>  		dev_err(&pdev->dev, "Could not find valid DT data.\n");
> @@ -421,12 +435,7 @@ static int tiadc_probe(struct platform_device *pdev)
>  	adc_dev = iio_priv(indio_dev);
>  
>  	adc_dev->mfd_tscadc = ti_tscadc_dev_get(pdev);
> -
> -	of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
> -		adc_dev->channel_line[channels] = val;
> -		channels++;
> -	}
> -	adc_dev->channels = channels;
> +	tiadc_parse_dt(pdev, adc_dev);
>  
>  	indio_dev->dev.parent = &pdev->dev;
>  	indio_dev->name = dev_name(&pdev->dev);
> 

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

* Re: [PATCH 2/2] iio: adc: ti_am335x_adc: make sample delay, open delay, averaging DT parameters
@ 2015-04-09 14:19     ` Jonathan Cameron
  0 siblings, 0 replies; 16+ messages in thread
From: Jonathan Cameron @ 2015-04-09 14:19 UTC (permalink / raw)
  To: Vignesh R, Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell,
	Kumar Gala
  Cc: Hartmut Knaack, Lars-Peter Clausen, Peter Meerwald,
	Dmitry Torokhov, Karol Wrona, Jan Kardell, devicetree,
	linux-kernel, linux-iio, fcooper

On 31/03/15 12:12, Vignesh R wrote:
> Add optional DT properties to set open delay, sample delay and number
> of averages per sample for each adc step. Open delay, sample delay
> and averaging are some of the parameters that affect the sampling rate
> and accuracy of the sample. Making these parameters configurable via
> DT will help in balancing speed vs accuracy.
> 
> Signed-off-by: Vignesh R <vigneshr@ti.com>
All looks fine to me, but I would ideally like a devicetree
ack on this one.

Jonathan
> ---
>  .../bindings/input/touchscreen/ti-tsc-adc.txt      | 24 ++++++++++
>  drivers/iio/adc/ti_am335x_adc.c                    | 54 +++++++++++++++++++---
>  2 files changed, 72 insertions(+), 6 deletions(-)
> 
> diff --git a/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt b/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt
> index 6c4fb34823d3..8aafbe87f0eb 100644
> --- a/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt
> +++ b/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt
> @@ -42,6 +42,27 @@ Optional properties:
>  			 hardware knob for adjusting the amount of "settling
>  			 time".
>  
> +- child "adc"
> +	ti,chan-step-opendelay: List of open delays for each channel of
> +				ADC in the order of ti,adc-channels. The
> +				value corresponds to the number of ADC
> +				clock cycles to wait after applying the
> +				step configuration registers and before
> +				sending the start of ADC conversion.
> +				Maximum value is 0x3FFFF.
> +       ti,chan-step-sampledelay: List of sample delays for each channel
> +				  of ADC in the order of ti,adc-channels.
> +				  The value corresponds to the number of
> +				  ADC clock cycles to sample (to hold
> +				  start of conversion high).
> +				  Maximum value is 0xFF.
> +       ti,chan-step-avg: Number of averages to be performed for each
> +			  channel of ADC. If average is 16 then input
> +			  is sampled 16 times and averaged to get more
> +			  accurate value. This increases the time taken
> +			  by ADC to generate a sample. Valid range is 0
> +			  average to 16 averages. Maximum value is 16.
> +
>  Example:
>  	tscadc: tscadc@44e0d000 {
>  		compatible = "ti,am3359-tscadc";
> @@ -55,5 +76,8 @@ Example:
>  
>  		adc {
>  			ti,adc-channels = <4 5 6 7>;
> +			ti,chan-step-opendelay = <0x098 0x3ffff 0x098 0x0>;
> +			ti,chan-step-sampledelay = <0xff 0x0 0xf 0x0>;
> +			ti,chan-step-avg = <16 2 4 8>;
>  		};
>  	}
> diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
> index 2f818405ffbe..5ee597b4a1af 100644
> --- a/drivers/iio/adc/ti_am335x_adc.c
> +++ b/drivers/iio/adc/ti_am335x_adc.c
> @@ -37,6 +37,7 @@ struct tiadc_device {
>  	u8 channel_step[8];
>  	int buffer_en_ch_steps;
>  	u16 data[8];
> +	u32 open_delay[8], sample_delay[8], step_avg[8];
>  };
>  
>  static unsigned int tiadc_readl(struct tiadc_device *adc, unsigned int reg)
> @@ -85,6 +86,7 @@ static u32 get_adc_step_bit(struct tiadc_device *adc_dev, int chan)
>  static void tiadc_step_config(struct iio_dev *indio_dev)
>  {
>  	struct tiadc_device *adc_dev = iio_priv(indio_dev);
> +	struct device *dev = adc_dev->mfd_tscadc->dev;
>  	unsigned int stepconfig;
>  	int i, steps = 0;
>  
> @@ -98,20 +100,47 @@ static void tiadc_step_config(struct iio_dev *indio_dev)
>  	 * needs to be given to ADC to digitalize data.
>  	 */
>  
> -	if (iio_buffer_enabled(indio_dev))
> -		stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1
> -					| STEPCONFIG_MODE_SWCNT;
> -	else
> -		stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1;
>  
>  	for (i = 0; i < adc_dev->channels; i++) {
>  		int chan;
>  
>  		chan = adc_dev->channel_line[i];
> +
> +		if (adc_dev->step_avg[i] > STEPCONFIG_AVG_16) {
> +			dev_warn(dev, "chan %d step_avg truncating to %d\n",
> +				 chan, STEPCONFIG_AVG_16);
> +			adc_dev->step_avg[i] = STEPCONFIG_AVG_16;
> +		}
> +
> +		if (adc_dev->step_avg[i])
> +			stepconfig =
> +			STEPCONFIG_AVG(ffs(adc_dev->step_avg[i]) - 1) |
> +			STEPCONFIG_FIFO1;
> +		else
> +			stepconfig = STEPCONFIG_FIFO1;
> +
> +		if (iio_buffer_enabled(indio_dev))
> +			stepconfig |= STEPCONFIG_MODE_SWCNT;
> +
>  		tiadc_writel(adc_dev, REG_STEPCONFIG(steps),
>  				stepconfig | STEPCONFIG_INP(chan));
> +
> +		if (adc_dev->open_delay[i] > STEPDELAY_OPEN_MASK)alue corresponds to the number of ADC
> +				clock cycles to wait after applying the
> +				step configuration registers and before
> +				sending the start of ADC conversion.
> +				Maximum value is 0x3FFFF.
> +       ti,chan-step-sampledelay: List of sample delays for each channel
> +				  of ADC in the order of ti,adc-channels.
> +				  The value corresponds to the number of
> +				  ADC clock cycles to sample (to hold
> +				  start of conversion high).
> +				  Maximum value is 0xFF.
> +       ti,chan-step-avg: Number of averages to be performed for each
> +			  channel of ADC. If average is 16 then input
> +			  is sampled 16 times and averaged to get more
> +			  accurate value. This increases the time taken
> +			  by ADC to generate a sample. Valid range is 0
> +			  average to 16 averages. Maximum value is 16. {
> +			dev_warn(dev, "chan %d open delay truncating to 0x3FFFF\n",
> +				 chan);
> +			adc_dev->open_delay[i] = STEPDELAY_OPEN_MASK;
> +		}
> +
> +		if (adc_dev->sample_delay[i] > 0xFF) {
> +			dev_warn(dev, "chan %d sample delay truncating to 0xFF\n",
> +				 chan);
> +			adc_dev->sample_delay[i] = 0xFF;
> +		}
> +
>  		tiadc_writel(adc_dev, REG_STEPDELAY(steps),
> -				STEPCONFIG_OPENDLY);
> +				STEPDELAY_OPEN(adc_dev->open_delay[i]) |
> +				STEPDELAY_SAMPLE(adc_dev->sample_delay[i]));
> +
>  		adc_dev->channel_step[i] = steps;
>  		steps++;
>  	}
> @@ -407,9 +436,22 @@ static int tiadc_parse_dt(struct platform_device *pdev,
>  
>  	of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
>  		adc_dev->channel_line[channels] = val;
> +
> +		/* Set Default values for optional DT parameters */
> +		adc_dev->open_delay[channels] = STEPCONFIG_OPENDLY;
> +		adc_dev->sample_delay[channels] = STEPCONFIG_SAMPLEDLY;
> +		adc_dev->step_avg[channels] = 16;
> +
>  		channels++;
>  	}
>  
> +	of_property_read_u32_array(node, "ti,chan-step-avg",
> +				   adc_dev->step_avg, channels);
> +	of_property_read_u32_array(node, "ti,chan-step-opendelay",
> +				   adc_dev->open_delay, channels);
> +	of_property_read_u32_array(node, "ti,chan-step-sampledelay",
> +				   adc_dev->sample_delay, channels);
> +
>  	adc_dev->channels = channels;
>  	return 0;
>  }
> 


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

* Re: [PATCH 2/2] iio: adc: ti_am335x_adc: make sample delay, open delay, averaging DT parameters
@ 2015-04-09 14:19     ` Jonathan Cameron
  0 siblings, 0 replies; 16+ messages in thread
From: Jonathan Cameron @ 2015-04-09 14:19 UTC (permalink / raw)
  To: Vignesh R, Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell,
	Kumar Gala
  Cc: Hartmut Knaack, Lars-Peter Clausen, Peter Meerwald,
	Dmitry Torokhov, Karol Wrona, Jan Kardell,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-iio-u79uwXL29TY76Z2rM5mHXA, fcooper-l0cyMroinI0

On 31/03/15 12:12, Vignesh R wrote:
> Add optional DT properties to set open delay, sample delay and number
> of averages per sample for each adc step. Open delay, sample delay
> and averaging are some of the parameters that affect the sampling rate
> and accuracy of the sample. Making these parameters configurable via
> DT will help in balancing speed vs accuracy.
> 
> Signed-off-by: Vignesh R <vigneshr-l0cyMroinI0@public.gmane.org>
All looks fine to me, but I would ideally like a devicetree
ack on this one.

Jonathan
> ---
>  .../bindings/input/touchscreen/ti-tsc-adc.txt      | 24 ++++++++++
>  drivers/iio/adc/ti_am335x_adc.c                    | 54 +++++++++++++++++++---
>  2 files changed, 72 insertions(+), 6 deletions(-)
> 
> diff --git a/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt b/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt
> index 6c4fb34823d3..8aafbe87f0eb 100644
> --- a/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt
> +++ b/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt
> @@ -42,6 +42,27 @@ Optional properties:
>  			 hardware knob for adjusting the amount of "settling
>  			 time".
>  
> +- child "adc"
> +	ti,chan-step-opendelay: List of open delays for each channel of
> +				ADC in the order of ti,adc-channels. The
> +				value corresponds to the number of ADC
> +				clock cycles to wait after applying the
> +				step configuration registers and before
> +				sending the start of ADC conversion.
> +				Maximum value is 0x3FFFF.
> +       ti,chan-step-sampledelay: List of sample delays for each channel
> +				  of ADC in the order of ti,adc-channels.
> +				  The value corresponds to the number of
> +				  ADC clock cycles to sample (to hold
> +				  start of conversion high).
> +				  Maximum value is 0xFF.
> +       ti,chan-step-avg: Number of averages to be performed for each
> +			  channel of ADC. If average is 16 then input
> +			  is sampled 16 times and averaged to get more
> +			  accurate value. This increases the time taken
> +			  by ADC to generate a sample. Valid range is 0
> +			  average to 16 averages. Maximum value is 16.
> +
>  Example:
>  	tscadc: tscadc@44e0d000 {
>  		compatible = "ti,am3359-tscadc";
> @@ -55,5 +76,8 @@ Example:
>  
>  		adc {
>  			ti,adc-channels = <4 5 6 7>;
> +			ti,chan-step-opendelay = <0x098 0x3ffff 0x098 0x0>;
> +			ti,chan-step-sampledelay = <0xff 0x0 0xf 0x0>;
> +			ti,chan-step-avg = <16 2 4 8>;
>  		};
>  	}
> diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
> index 2f818405ffbe..5ee597b4a1af 100644
> --- a/drivers/iio/adc/ti_am335x_adc.c
> +++ b/drivers/iio/adc/ti_am335x_adc.c
> @@ -37,6 +37,7 @@ struct tiadc_device {
>  	u8 channel_step[8];
>  	int buffer_en_ch_steps;
>  	u16 data[8];
> +	u32 open_delay[8], sample_delay[8], step_avg[8];
>  };
>  
>  static unsigned int tiadc_readl(struct tiadc_device *adc, unsigned int reg)
> @@ -85,6 +86,7 @@ static u32 get_adc_step_bit(struct tiadc_device *adc_dev, int chan)
>  static void tiadc_step_config(struct iio_dev *indio_dev)
>  {
>  	struct tiadc_device *adc_dev = iio_priv(indio_dev);
> +	struct device *dev = adc_dev->mfd_tscadc->dev;
>  	unsigned int stepconfig;
>  	int i, steps = 0;
>  
> @@ -98,20 +100,47 @@ static void tiadc_step_config(struct iio_dev *indio_dev)
>  	 * needs to be given to ADC to digitalize data.
>  	 */
>  
> -	if (iio_buffer_enabled(indio_dev))
> -		stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1
> -					| STEPCONFIG_MODE_SWCNT;
> -	else
> -		stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1;
>  
>  	for (i = 0; i < adc_dev->channels; i++) {
>  		int chan;
>  
>  		chan = adc_dev->channel_line[i];
> +
> +		if (adc_dev->step_avg[i] > STEPCONFIG_AVG_16) {
> +			dev_warn(dev, "chan %d step_avg truncating to %d\n",
> +				 chan, STEPCONFIG_AVG_16);
> +			adc_dev->step_avg[i] = STEPCONFIG_AVG_16;
> +		}
> +
> +		if (adc_dev->step_avg[i])
> +			stepconfig =
> +			STEPCONFIG_AVG(ffs(adc_dev->step_avg[i]) - 1) |
> +			STEPCONFIG_FIFO1;
> +		else
> +			stepconfig = STEPCONFIG_FIFO1;
> +
> +		if (iio_buffer_enabled(indio_dev))
> +			stepconfig |= STEPCONFIG_MODE_SWCNT;
> +
>  		tiadc_writel(adc_dev, REG_STEPCONFIG(steps),
>  				stepconfig | STEPCONFIG_INP(chan));
> +
> +		if (adc_dev->open_delay[i] > STEPDELAY_OPEN_MASK)alue corresponds to the number of ADC
> +				clock cycles to wait after applying the
> +				step configuration registers and before
> +				sending the start of ADC conversion.
> +				Maximum value is 0x3FFFF.
> +       ti,chan-step-sampledelay: List of sample delays for each channel
> +				  of ADC in the order of ti,adc-channels.
> +				  The value corresponds to the number of
> +				  ADC clock cycles to sample (to hold
> +				  start of conversion high).
> +				  Maximum value is 0xFF.
> +       ti,chan-step-avg: Number of averages to be performed for each
> +			  channel of ADC. If average is 16 then input
> +			  is sampled 16 times and averaged to get more
> +			  accurate value. This increases the time taken
> +			  by ADC to generate a sample. Valid range is 0
> +			  average to 16 averages. Maximum value is 16. {
> +			dev_warn(dev, "chan %d open delay truncating to 0x3FFFF\n",
> +				 chan);
> +			adc_dev->open_delay[i] = STEPDELAY_OPEN_MASK;
> +		}
> +
> +		if (adc_dev->sample_delay[i] > 0xFF) {
> +			dev_warn(dev, "chan %d sample delay truncating to 0xFF\n",
> +				 chan);
> +			adc_dev->sample_delay[i] = 0xFF;
> +		}
> +
>  		tiadc_writel(adc_dev, REG_STEPDELAY(steps),
> -				STEPCONFIG_OPENDLY);
> +				STEPDELAY_OPEN(adc_dev->open_delay[i]) |
> +				STEPDELAY_SAMPLE(adc_dev->sample_delay[i]));
> +
>  		adc_dev->channel_step[i] = steps;
>  		steps++;
>  	}
> @@ -407,9 +436,22 @@ static int tiadc_parse_dt(struct platform_device *pdev,
>  
>  	of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
>  		adc_dev->channel_line[channels] = val;
> +
> +		/* Set Default values for optional DT parameters */
> +		adc_dev->open_delay[channels] = STEPCONFIG_OPENDLY;
> +		adc_dev->sample_delay[channels] = STEPCONFIG_SAMPLEDLY;
> +		adc_dev->step_avg[channels] = 16;
> +
>  		channels++;
>  	}
>  
> +	of_property_read_u32_array(node, "ti,chan-step-avg",
> +				   adc_dev->step_avg, channels);
> +	of_property_read_u32_array(node, "ti,chan-step-opendelay",
> +				   adc_dev->open_delay, channels);
> +	of_property_read_u32_array(node, "ti,chan-step-sampledelay",
> +				   adc_dev->sample_delay, channels);
> +
>  	adc_dev->channels = channels;
>  	return 0;
>  }
> 

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

* Re: [PATCH 2/2] iio: adc: ti_am335x_adc: make sample delay, open delay, averaging DT parameters
  2015-04-09 14:19     ` Jonathan Cameron
  (?)
@ 2015-05-13  7:42     ` Vignesh R
  2015-05-13 17:38         ` Jonathan Cameron
  -1 siblings, 1 reply; 16+ messages in thread
From: Vignesh R @ 2015-05-13  7:42 UTC (permalink / raw)
  To: Jonathan Cameron, Rob Herring, Pawel Moll, Mark Rutland,
	Ian Campbell, Kumar Gala
  Cc: Hartmut Knaack, Lars-Peter Clausen, Peter Meerwald,
	Dmitry Torokhov, Karol Wrona, Jan Kardell, devicetree,
	linux-kernel, linux-iio, Cooper Jr.,
	Franklin



On Thursday 09 April 2015 07:49 PM, Jonathan Cameron wrote:
> On 31/03/15 12:12, Vignesh R wrote:
>> Add optional DT properties to set open delay, sample delay and number
>> of averages per sample for each adc step. Open delay, sample delay
>> and averaging are some of the parameters that affect the sampling rate
>> and accuracy of the sample. Making these parameters configurable via
>> DT will help in balancing speed vs accuracy.
>>
>> Signed-off-by: Vignesh R <vigneshr@ti.com>
> All looks fine to me, but I would ideally like a devicetree
> ack on this one.
> 
> Jonathan

Gentle ping...

Regards
Vignesh
>> ---
>>  .../bindings/input/touchscreen/ti-tsc-adc.txt      | 24 ++++++++++
>>  drivers/iio/adc/ti_am335x_adc.c                    | 54 +++++++++++++++++++---
>>  2 files changed, 72 insertions(+), 6 deletions(-)
>>
>> diff --git a/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt b/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt
>> index 6c4fb34823d3..8aafbe87f0eb 100644
>> --- a/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt
>> +++ b/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt
>> @@ -42,6 +42,27 @@ Optional properties:
>>  			 hardware knob for adjusting the amount of "settling
>>  			 time".
>>  
>> +- child "adc"
>> +	ti,chan-step-opendelay: List of open delays for each channel of
>> +				ADC in the order of ti,adc-channels. The
>> +				value corresponds to the number of ADC
>> +				clock cycles to wait after applying the
>> +				step configuration registers and before
>> +				sending the start of ADC conversion.
>> +				Maximum value is 0x3FFFF.
>> +       ti,chan-step-sampledelay: List of sample delays for each channel
>> +				  of ADC in the order of ti,adc-channels.
>> +				  The value corresponds to the number of
>> +				  ADC clock cycles to sample (to hold
>> +				  start of conversion high).
>> +				  Maximum value is 0xFF.
>> +       ti,chan-step-avg: Number of averages to be performed for each
>> +			  channel of ADC. If average is 16 then input
>> +			  is sampled 16 times and averaged to get more
>> +			  accurate value. This increases the time taken
>> +			  by ADC to generate a sample. Valid range is 0
>> +			  average to 16 averages. Maximum value is 16.
>> +
>>  Example:
>>  	tscadc: tscadc@44e0d000 {
>>  		compatible = "ti,am3359-tscadc";
>> @@ -55,5 +76,8 @@ Example:
>>  
>>  		adc {
>>  			ti,adc-channels = <4 5 6 7>;
>> +			ti,chan-step-opendelay = <0x098 0x3ffff 0x098 0x0>;
>> +			ti,chan-step-sampledelay = <0xff 0x0 0xf 0x0>;
>> +			ti,chan-step-avg = <16 2 4 8>;
>>  		};
>>  	}
>> diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
>> index 2f818405ffbe..5ee597b4a1af 100644
>> --- a/drivers/iio/adc/ti_am335x_adc.c
>> +++ b/drivers/iio/adc/ti_am335x_adc.c
>> @@ -37,6 +37,7 @@ struct tiadc_device {
>>  	u8 channel_step[8];
>>  	int buffer_en_ch_steps;
>>  	u16 data[8];
>> +	u32 open_delay[8], sample_delay[8], step_avg[8];
>>  };
>>  
>>  static unsigned int tiadc_readl(struct tiadc_device *adc, unsigned int reg)
>> @@ -85,6 +86,7 @@ static u32 get_adc_step_bit(struct tiadc_device *adc_dev, int chan)
>>  static void tiadc_step_config(struct iio_dev *indio_dev)
>>  {
>>  	struct tiadc_device *adc_dev = iio_priv(indio_dev);
>> +	struct device *dev = adc_dev->mfd_tscadc->dev;
>>  	unsigned int stepconfig;
>>  	int i, steps = 0;
>>  
>> @@ -98,20 +100,47 @@ static void tiadc_step_config(struct iio_dev *indio_dev)
>>  	 * needs to be given to ADC to digitalize data.
>>  	 */
>>  
>> -	if (iio_buffer_enabled(indio_dev))
>> -		stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1
>> -					| STEPCONFIG_MODE_SWCNT;
>> -	else
>> -		stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1;
>>  
>>  	for (i = 0; i < adc_dev->channels; i++) {
>>  		int chan;
>>  
>>  		chan = adc_dev->channel_line[i];
>> +
>> +		if (adc_dev->step_avg[i] > STEPCONFIG_AVG_16) {
>> +			dev_warn(dev, "chan %d step_avg truncating to %d\n",
>> +				 chan, STEPCONFIG_AVG_16);
>> +			adc_dev->step_avg[i] = STEPCONFIG_AVG_16;
>> +		}
>> +
>> +		if (adc_dev->step_avg[i])
>> +			stepconfig =
>> +			STEPCONFIG_AVG(ffs(adc_dev->step_avg[i]) - 1) |
>> +			STEPCONFIG_FIFO1;
>> +		else
>> +			stepconfig = STEPCONFIG_FIFO1;
>> +
>> +		if (iio_buffer_enabled(indio_dev))
>> +			stepconfig |= STEPCONFIG_MODE_SWCNT;
>> +
>>  		tiadc_writel(adc_dev, REG_STEPCONFIG(steps),
>>  				stepconfig | STEPCONFIG_INP(chan));
>> +
>> +		if (adc_dev->open_delay[i] > STEPDELAY_OPEN_MASK)alue corresponds to the number of ADC
>> +				clock cycles to wait after applying the
>> +				step configuration registers and before
>> +				sending the start of ADC conversion.
>> +				Maximum value is 0x3FFFF.
>> +       ti,chan-step-sampledelay: List of sample delays for each channel
>> +				  of ADC in the order of ti,adc-channels.
>> +				  The value corresponds to the number of
>> +				  ADC clock cycles to sample (to hold
>> +				  start of conversion high).
>> +				  Maximum value is 0xFF.
>> +       ti,chan-step-avg: Number of averages to be performed for each
>> +			  channel of ADC. If average is 16 then input
>> +			  is sampled 16 times and averaged to get more
>> +			  accurate value. This increases the time taken
>> +			  by ADC to generate a sample. Valid range is 0
>> +			  average to 16 averages. Maximum value is 16. {
>> +			dev_warn(dev, "chan %d open delay truncating to 0x3FFFF\n",
>> +				 chan);
>> +			adc_dev->open_delay[i] = STEPDELAY_OPEN_MASK;
>> +		}
>> +
>> +		if (adc_dev->sample_delay[i] > 0xFF) {
>> +			dev_warn(dev, "chan %d sample delay truncating to 0xFF\n",
>> +				 chan);
>> +			adc_dev->sample_delay[i] = 0xFF;
>> +		}
>> +
>>  		tiadc_writel(adc_dev, REG_STEPDELAY(steps),
>> -				STEPCONFIG_OPENDLY);
>> +				STEPDELAY_OPEN(adc_dev->open_delay[i]) |
>> +				STEPDELAY_SAMPLE(adc_dev->sample_delay[i]));
>> +
>>  		adc_dev->channel_step[i] = steps;
>>  		steps++;
>>  	}
>> @@ -407,9 +436,22 @@ static int tiadc_parse_dt(struct platform_device *pdev,
>>  
>>  	of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
>>  		adc_dev->channel_line[channels] = val;
>> +
>> +		/* Set Default values for optional DT parameters */
>> +		adc_dev->open_delay[channels] = STEPCONFIG_OPENDLY;
>> +		adc_dev->sample_delay[channels] = STEPCONFIG_SAMPLEDLY;
>> +		adc_dev->step_avg[channels] = 16;
>> +
>>  		channels++;
>>  	}
>>  
>> +	of_property_read_u32_array(node, "ti,chan-step-avg",
>> +				   adc_dev->step_avg, channels);
>> +	of_property_read_u32_array(node, "ti,chan-step-opendelay",
>> +				   adc_dev->open_delay, channels);
>> +	of_property_read_u32_array(node, "ti,chan-step-sampledelay",
>> +				   adc_dev->sample_delay, channels);
>> +
>>  	adc_dev->channels = channels;
>>  	return 0;
>>  }
>>
> 

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

* Re: [PATCH 2/2] iio: adc: ti_am335x_adc: make sample delay, open delay, averaging DT parameters
@ 2015-05-13 17:38         ` Jonathan Cameron
  0 siblings, 0 replies; 16+ messages in thread
From: Jonathan Cameron @ 2015-05-13 17:38 UTC (permalink / raw)
  To: Vignesh R, Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell,
	Kumar Gala
  Cc: Hartmut Knaack, Lars-Peter Clausen, Peter Meerwald,
	Dmitry Torokhov, Karol Wrona, Jan Kardell, devicetree,
	linux-kernel, linux-iio, Cooper Jr.,
	Franklin

On 13/05/15 08:42, Vignesh R wrote:
> 
> 
> On Thursday 09 April 2015 07:49 PM, Jonathan Cameron wrote:
>> On 31/03/15 12:12, Vignesh R wrote:
>>> Add optional DT properties to set open delay, sample delay and number
>>> of averages per sample for each adc step. Open delay, sample delay
>>> and averaging are some of the parameters that affect the sampling rate
>>> and accuracy of the sample. Making these parameters configurable via
>>> DT will help in balancing speed vs accuracy.
>>>
>>> Signed-off-by: Vignesh R <vigneshr@ti.com>
>> All looks fine to me, but I would ideally like a devicetree
>> ack on this one.
>>
>> Jonathan
> 
> Gentle ping...
Thanks. Had forgotten about this one.  Ah well, no device tree response...

Applied to the togreg branch of iio.git, initially pushed out as testing.

Thanks,

Jonathan
> 
> Regards
> Vignesh
>>> ---
>>>  .../bindings/input/touchscreen/ti-tsc-adc.txt      | 24 ++++++++++
>>>  drivers/iio/adc/ti_am335x_adc.c                    | 54 +++++++++++++++++++---
>>>  2 files changed, 72 insertions(+), 6 deletions(-)
>>>
>>> diff --git a/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt b/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt
>>> index 6c4fb34823d3..8aafbe87f0eb 100644
>>> --- a/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt
>>> +++ b/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt
>>> @@ -42,6 +42,27 @@ Optional properties:
>>>  			 hardware knob for adjusting the amount of "settling
>>>  			 time".
>>>  
>>> +- child "adc"
>>> +	ti,chan-step-opendelay: List of open delays for each channel of
>>> +				ADC in the order of ti,adc-channels. The
>>> +				value corresponds to the number of ADC
>>> +				clock cycles to wait after applying the
>>> +				step configuration registers and before
>>> +				sending the start of ADC conversion.
>>> +				Maximum value is 0x3FFFF.
>>> +       ti,chan-step-sampledelay: List of sample delays for each channel
>>> +				  of ADC in the order of ti,adc-channels.
>>> +				  The value corresponds to the number of
>>> +				  ADC clock cycles to sample (to hold
>>> +				  start of conversion high).
>>> +				  Maximum value is 0xFF.
>>> +       ti,chan-step-avg: Number of averages to be performed for each
>>> +			  channel of ADC. If average is 16 then input
>>> +			  is sampled 16 times and averaged to get more
>>> +			  accurate value. This increases the time taken
>>> +			  by ADC to generate a sample. Valid range is 0
>>> +			  average to 16 averages. Maximum value is 16.
>>> +
>>>  Example:
>>>  	tscadc: tscadc@44e0d000 {
>>>  		compatible = "ti,am3359-tscadc";
>>> @@ -55,5 +76,8 @@ Example:
>>>  
>>>  		adc {
>>>  			ti,adc-channels = <4 5 6 7>;
>>> +			ti,chan-step-opendelay = <0x098 0x3ffff 0x098 0x0>;
>>> +			ti,chan-step-sampledelay = <0xff 0x0 0xf 0x0>;
>>> +			ti,chan-step-avg = <16 2 4 8>;
>>>  		};
>>>  	}
>>> diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
>>> index 2f818405ffbe..5ee597b4a1af 100644
>>> --- a/drivers/iio/adc/ti_am335x_adc.c
>>> +++ b/drivers/iio/adc/ti_am335x_adc.c
>>> @@ -37,6 +37,7 @@ struct tiadc_device {
>>>  	u8 channel_step[8];
>>>  	int buffer_en_ch_steps;
>>>  	u16 data[8];
>>> +	u32 open_delay[8], sample_delay[8], step_avg[8];
>>>  };
>>>  
>>>  static unsigned int tiadc_readl(struct tiadc_device *adc, unsigned int reg)
>>> @@ -85,6 +86,7 @@ static u32 get_adc_step_bit(struct tiadc_device *adc_dev, int chan)
>>>  static void tiadc_step_config(struct iio_dev *indio_dev)
>>>  {
>>>  	struct tiadc_device *adc_dev = iio_priv(indio_dev);
>>> +	struct device *dev = adc_dev->mfd_tscadc->dev;
>>>  	unsigned int stepconfig;
>>>  	int i, steps = 0;
>>>  
>>> @@ -98,20 +100,47 @@ static void tiadc_step_config(struct iio_dev *indio_dev)
>>>  	 * needs to be given to ADC to digitalize data.
>>>  	 */
>>>  
>>> -	if (iio_buffer_enabled(indio_dev))
>>> -		stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1
>>> -					| STEPCONFIG_MODE_SWCNT;
>>> -	else
>>> -		stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1;
>>>  
>>>  	for (i = 0; i < adc_dev->channels; i++) {
>>>  		int chan;
>>>  
>>>  		chan = adc_dev->channel_line[i];
>>> +
>>> +		if (adc_dev->step_avg[i] > STEPCONFIG_AVG_16) {
>>> +			dev_warn(dev, "chan %d step_avg truncating to %d\n",
>>> +				 chan, STEPCONFIG_AVG_16);
>>> +			adc_dev->step_avg[i] = STEPCONFIG_AVG_16;
>>> +		}
>>> +
>>> +		if (adc_dev->step_avg[i])
>>> +			stepconfig =
>>> +			STEPCONFIG_AVG(ffs(adc_dev->step_avg[i]) - 1) |
>>> +			STEPCONFIG_FIFO1;
>>> +		else
>>> +			stepconfig = STEPCONFIG_FIFO1;
>>> +
>>> +		if (iio_buffer_enabled(indio_dev))
>>> +			stepconfig |= STEPCONFIG_MODE_SWCNT;
>>> +
>>>  		tiadc_writel(adc_dev, REG_STEPCONFIG(steps),
>>>  				stepconfig | STEPCONFIG_INP(chan));
>>> +
>>> +		if (adc_dev->open_delay[i] > STEPDELAY_OPEN_MASK)alue corresponds to the number of ADC
>>> +				clock cycles to wait after applying the
>>> +				step configuration registers and before
>>> +				sending the start of ADC conversion.
>>> +				Maximum value is 0x3FFFF.
>>> +       ti,chan-step-sampledelay: List of sample delays for each channel
>>> +				  of ADC in the order of ti,adc-channels.
>>> +				  The value corresponds to the number of
>>> +				  ADC clock cycles to sample (to hold
>>> +				  start of conversion high).
>>> +				  Maximum value is 0xFF.
>>> +       ti,chan-step-avg: Number of averages to be performed for each
>>> +			  channel of ADC. If average is 16 then input
>>> +			  is sampled 16 times and averaged to get more
>>> +			  accurate value. This increases the time taken
>>> +			  by ADC to generate a sample. Valid range is 0
>>> +			  average to 16 averages. Maximum value is 16. {
>>> +			dev_warn(dev, "chan %d open delay truncating to 0x3FFFF\n",
>>> +				 chan);
>>> +			adc_dev->open_delay[i] = STEPDELAY_OPEN_MASK;
>>> +		}
>>> +
>>> +		if (adc_dev->sample_delay[i] > 0xFF) {
>>> +			dev_warn(dev, "chan %d sample delay truncating to 0xFF\n",
>>> +				 chan);
>>> +			adc_dev->sample_delay[i] = 0xFF;
>>> +		}
>>> +
>>>  		tiadc_writel(adc_dev, REG_STEPDELAY(steps),
>>> -				STEPCONFIG_OPENDLY);
>>> +				STEPDELAY_OPEN(adc_dev->open_delay[i]) |
>>> +				STEPDELAY_SAMPLE(adc_dev->sample_delay[i]));
>>> +
>>>  		adc_dev->channel_step[i] = steps;
>>>  		steps++;
>>>  	}
>>> @@ -407,9 +436,22 @@ static int tiadc_parse_dt(struct platform_device *pdev,
>>>  
>>>  	of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
>>>  		adc_dev->channel_line[channels] = val;
>>> +
>>> +		/* Set Default values for optional DT parameters */
>>> +		adc_dev->open_delay[channels] = STEPCONFIG_OPENDLY;
>>> +		adc_dev->sample_delay[channels] = STEPCONFIG_SAMPLEDLY;
>>> +		adc_dev->step_avg[channels] = 16;
>>> +
>>>  		channels++;
>>>  	}
>>>  
>>> +	of_property_read_u32_array(node, "ti,chan-step-avg",
>>> +				   adc_dev->step_avg, channels);
>>> +	of_property_read_u32_array(node, "ti,chan-step-opendelay",
>>> +				   adc_dev->open_delay, channels);
>>> +	of_property_read_u32_array(node, "ti,chan-step-sampledelay",
>>> +				   adc_dev->sample_delay, channels);
>>> +
>>>  	adc_dev->channels = channels;
>>>  	return 0;
>>>  }
>>>
>>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-iio" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 


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

* Re: [PATCH 2/2] iio: adc: ti_am335x_adc: make sample delay, open delay, averaging DT parameters
@ 2015-05-13 17:38         ` Jonathan Cameron
  0 siblings, 0 replies; 16+ messages in thread
From: Jonathan Cameron @ 2015-05-13 17:38 UTC (permalink / raw)
  To: Vignesh R, Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell,
	Kumar Gala
  Cc: Hartmut Knaack, Lars-Peter Clausen, Peter Meerwald,
	Dmitry Torokhov, Karol Wrona, Jan Kardell,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-iio-u79uwXL29TY76Z2rM5mHXA, Cooper Jr.,
	Franklin

On 13/05/15 08:42, Vignesh R wrote:
> 
> 
> On Thursday 09 April 2015 07:49 PM, Jonathan Cameron wrote:
>> On 31/03/15 12:12, Vignesh R wrote:
>>> Add optional DT properties to set open delay, sample delay and number
>>> of averages per sample for each adc step. Open delay, sample delay
>>> and averaging are some of the parameters that affect the sampling rate
>>> and accuracy of the sample. Making these parameters configurable via
>>> DT will help in balancing speed vs accuracy.
>>>
>>> Signed-off-by: Vignesh R <vigneshr-l0cyMroinI0@public.gmane.org>
>> All looks fine to me, but I would ideally like a devicetree
>> ack on this one.
>>
>> Jonathan
> 
> Gentle ping...
Thanks. Had forgotten about this one.  Ah well, no device tree response...

Applied to the togreg branch of iio.git, initially pushed out as testing.

Thanks,

Jonathan
> 
> Regards
> Vignesh
>>> ---
>>>  .../bindings/input/touchscreen/ti-tsc-adc.txt      | 24 ++++++++++
>>>  drivers/iio/adc/ti_am335x_adc.c                    | 54 +++++++++++++++++++---
>>>  2 files changed, 72 insertions(+), 6 deletions(-)
>>>
>>> diff --git a/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt b/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt
>>> index 6c4fb34823d3..8aafbe87f0eb 100644
>>> --- a/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt
>>> +++ b/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt
>>> @@ -42,6 +42,27 @@ Optional properties:
>>>  			 hardware knob for adjusting the amount of "settling
>>>  			 time".
>>>  
>>> +- child "adc"
>>> +	ti,chan-step-opendelay: List of open delays for each channel of
>>> +				ADC in the order of ti,adc-channels. The
>>> +				value corresponds to the number of ADC
>>> +				clock cycles to wait after applying the
>>> +				step configuration registers and before
>>> +				sending the start of ADC conversion.
>>> +				Maximum value is 0x3FFFF.
>>> +       ti,chan-step-sampledelay: List of sample delays for each channel
>>> +				  of ADC in the order of ti,adc-channels.
>>> +				  The value corresponds to the number of
>>> +				  ADC clock cycles to sample (to hold
>>> +				  start of conversion high).
>>> +				  Maximum value is 0xFF.
>>> +       ti,chan-step-avg: Number of averages to be performed for each
>>> +			  channel of ADC. If average is 16 then input
>>> +			  is sampled 16 times and averaged to get more
>>> +			  accurate value. This increases the time taken
>>> +			  by ADC to generate a sample. Valid range is 0
>>> +			  average to 16 averages. Maximum value is 16.
>>> +
>>>  Example:
>>>  	tscadc: tscadc@44e0d000 {
>>>  		compatible = "ti,am3359-tscadc";
>>> @@ -55,5 +76,8 @@ Example:
>>>  
>>>  		adc {
>>>  			ti,adc-channels = <4 5 6 7>;
>>> +			ti,chan-step-opendelay = <0x098 0x3ffff 0x098 0x0>;
>>> +			ti,chan-step-sampledelay = <0xff 0x0 0xf 0x0>;
>>> +			ti,chan-step-avg = <16 2 4 8>;
>>>  		};
>>>  	}
>>> diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
>>> index 2f818405ffbe..5ee597b4a1af 100644
>>> --- a/drivers/iio/adc/ti_am335x_adc.c
>>> +++ b/drivers/iio/adc/ti_am335x_adc.c
>>> @@ -37,6 +37,7 @@ struct tiadc_device {
>>>  	u8 channel_step[8];
>>>  	int buffer_en_ch_steps;
>>>  	u16 data[8];
>>> +	u32 open_delay[8], sample_delay[8], step_avg[8];
>>>  };
>>>  
>>>  static unsigned int tiadc_readl(struct tiadc_device *adc, unsigned int reg)
>>> @@ -85,6 +86,7 @@ static u32 get_adc_step_bit(struct tiadc_device *adc_dev, int chan)
>>>  static void tiadc_step_config(struct iio_dev *indio_dev)
>>>  {
>>>  	struct tiadc_device *adc_dev = iio_priv(indio_dev);
>>> +	struct device *dev = adc_dev->mfd_tscadc->dev;
>>>  	unsigned int stepconfig;
>>>  	int i, steps = 0;
>>>  
>>> @@ -98,20 +100,47 @@ static void tiadc_step_config(struct iio_dev *indio_dev)
>>>  	 * needs to be given to ADC to digitalize data.
>>>  	 */
>>>  
>>> -	if (iio_buffer_enabled(indio_dev))
>>> -		stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1
>>> -					| STEPCONFIG_MODE_SWCNT;
>>> -	else
>>> -		stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1;
>>>  
>>>  	for (i = 0; i < adc_dev->channels; i++) {
>>>  		int chan;
>>>  
>>>  		chan = adc_dev->channel_line[i];
>>> +
>>> +		if (adc_dev->step_avg[i] > STEPCONFIG_AVG_16) {
>>> +			dev_warn(dev, "chan %d step_avg truncating to %d\n",
>>> +				 chan, STEPCONFIG_AVG_16);
>>> +			adc_dev->step_avg[i] = STEPCONFIG_AVG_16;
>>> +		}
>>> +
>>> +		if (adc_dev->step_avg[i])
>>> +			stepconfig =
>>> +			STEPCONFIG_AVG(ffs(adc_dev->step_avg[i]) - 1) |
>>> +			STEPCONFIG_FIFO1;
>>> +		else
>>> +			stepconfig = STEPCONFIG_FIFO1;
>>> +
>>> +		if (iio_buffer_enabled(indio_dev))
>>> +			stepconfig |= STEPCONFIG_MODE_SWCNT;
>>> +
>>>  		tiadc_writel(adc_dev, REG_STEPCONFIG(steps),
>>>  				stepconfig | STEPCONFIG_INP(chan));
>>> +
>>> +		if (adc_dev->open_delay[i] > STEPDELAY_OPEN_MASK)alue corresponds to the number of ADC
>>> +				clock cycles to wait after applying the
>>> +				step configuration registers and before
>>> +				sending the start of ADC conversion.
>>> +				Maximum value is 0x3FFFF.
>>> +       ti,chan-step-sampledelay: List of sample delays for each channel
>>> +				  of ADC in the order of ti,adc-channels.
>>> +				  The value corresponds to the number of
>>> +				  ADC clock cycles to sample (to hold
>>> +				  start of conversion high).
>>> +				  Maximum value is 0xFF.
>>> +       ti,chan-step-avg: Number of averages to be performed for each
>>> +			  channel of ADC. If average is 16 then input
>>> +			  is sampled 16 times and averaged to get more
>>> +			  accurate value. This increases the time taken
>>> +			  by ADC to generate a sample. Valid range is 0
>>> +			  average to 16 averages. Maximum value is 16. {
>>> +			dev_warn(dev, "chan %d open delay truncating to 0x3FFFF\n",
>>> +				 chan);
>>> +			adc_dev->open_delay[i] = STEPDELAY_OPEN_MASK;
>>> +		}
>>> +
>>> +		if (adc_dev->sample_delay[i] > 0xFF) {
>>> +			dev_warn(dev, "chan %d sample delay truncating to 0xFF\n",
>>> +				 chan);
>>> +			adc_dev->sample_delay[i] = 0xFF;
>>> +		}
>>> +
>>>  		tiadc_writel(adc_dev, REG_STEPDELAY(steps),
>>> -				STEPCONFIG_OPENDLY);
>>> +				STEPDELAY_OPEN(adc_dev->open_delay[i]) |
>>> +				STEPDELAY_SAMPLE(adc_dev->sample_delay[i]));
>>> +
>>>  		adc_dev->channel_step[i] = steps;
>>>  		steps++;
>>>  	}
>>> @@ -407,9 +436,22 @@ static int tiadc_parse_dt(struct platform_device *pdev,
>>>  
>>>  	of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
>>>  		adc_dev->channel_line[channels] = val;
>>> +
>>> +		/* Set Default values for optional DT parameters */
>>> +		adc_dev->open_delay[channels] = STEPCONFIG_OPENDLY;
>>> +		adc_dev->sample_delay[channels] = STEPCONFIG_SAMPLEDLY;
>>> +		adc_dev->step_avg[channels] = 16;
>>> +
>>>  		channels++;
>>>  	}
>>>  
>>> +	of_property_read_u32_array(node, "ti,chan-step-avg",
>>> +				   adc_dev->step_avg, channels);
>>> +	of_property_read_u32_array(node, "ti,chan-step-opendelay",
>>> +				   adc_dev->open_delay, channels);
>>> +	of_property_read_u32_array(node, "ti,chan-step-sampledelay",
>>> +				   adc_dev->sample_delay, channels);
>>> +
>>>  	adc_dev->channels = channels;
>>>  	return 0;
>>>  }
>>>
>>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-iio" in
> the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 

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

* Re: [PATCH 1/2] iio: adc: ti_am335x_adc: refactor DT parsing into a function
  2014-08-27 12:19 ` Vignesh R
  (?)
@ 2014-08-30  9:44 ` Jonathan Cameron
  -1 siblings, 0 replies; 16+ messages in thread
From: Jonathan Cameron @ 2014-08-30  9:44 UTC (permalink / raw)
  To: Vignesh R, Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell,
	Kumar Gala
  Cc: Randy Dunlap, Samuel Ortiz, Lee Jones, Felipe Balbi,
	Sebastian Andrzej Siewior, devicetree, linux-doc, linux-iio

On 27/08/14 13:19, Vignesh R wrote:
> Refactor DT parsing into a seperate function from probe() to
> help addition of more DT parameters later.
> 
> No functional changes.
> 
> Signed-off-by: Vignesh R <vigneshr@ti.com>
Entirely sensible, will pick up once we have sorted patch 2.
> ---
>  drivers/iio/adc/ti_am335x_adc.c |   29 +++++++++++++++++++----------
>  1 file changed, 19 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
> index 63b2bb6..dfb0db0 100644
> --- a/drivers/iio/adc/ti_am335x_adc.c
> +++ b/drivers/iio/adc/ti_am335x_adc.c
> @@ -407,16 +407,30 @@ static const struct iio_info tiadc_info = {
>  	.driver_module = THIS_MODULE,
>  };
>  
> +static int tiadc_parse_dt(struct platform_device *pdev,
> +				struct tiadc_device *adc_dev)
> +{
> +	struct device_node *node = pdev->dev.of_node;
> +	struct property *prop;
> +	const __be32 *cur;
> +	int channels = 0;
> +	u32 val;
> +
> +	of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
> +		adc_dev->channel_line[channels] = val;
> +		channels++;
> +	}
> +
> +	adc_dev->channels = channels;
> +	return 0;
> +}
> +
>  static int tiadc_probe(struct platform_device *pdev)
>  {
>  	struct iio_dev		*indio_dev;
>  	struct tiadc_device	*adc_dev;
>  	struct device_node	*node = pdev->dev.of_node;
> -	struct property		*prop;
> -	const __be32		*cur;
>  	int			err;
> -	u32			val;
> -	int			channels = 0;
>  
>  	if (!node) {
>  		dev_err(&pdev->dev, "Could not find valid DT data.\n");
> @@ -432,12 +446,7 @@ static int tiadc_probe(struct platform_device *pdev)
>  	adc_dev = iio_priv(indio_dev);
>  
>  	adc_dev->mfd_tscadc = ti_tscadc_dev_get(pdev);
> -
> -	of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
> -		adc_dev->channel_line[channels] = val;
> -		channels++;
> -	}
> -	adc_dev->channels = channels;
> +	tiadc_parse_dt(pdev, adc_dev);
>  
>  	indio_dev->dev.parent = &pdev->dev;
>  	indio_dev->name = dev_name(&pdev->dev);
> 

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

* [PATCH 1/2] iio: adc: ti_am335x_adc: refactor DT parsing into a function
@ 2014-08-27 12:19 ` Vignesh R
  0 siblings, 0 replies; 16+ messages in thread
From: Vignesh R @ 2014-08-27 12:19 UTC (permalink / raw)
  To: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Jonathan Cameron
  Cc: Randy Dunlap, Samuel Ortiz, Lee Jones, Felipe Balbi,
	Sebastian Andrzej Siewior, devicetree, linux-doc, linux-iio,
	Vignesh R

Refactor DT parsing into a seperate function from probe() to
help addition of more DT parameters later.

No functional changes.

Signed-off-by: Vignesh R <vigneshr@ti.com>
---
 drivers/iio/adc/ti_am335x_adc.c |   29 +++++++++++++++++++----------
 1 file changed, 19 insertions(+), 10 deletions(-)

diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index 63b2bb6..dfb0db0 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -407,16 +407,30 @@ static const struct iio_info tiadc_info = {
 	.driver_module = THIS_MODULE,
 };
 
+static int tiadc_parse_dt(struct platform_device *pdev,
+				struct tiadc_device *adc_dev)
+{
+	struct device_node *node = pdev->dev.of_node;
+	struct property *prop;
+	const __be32 *cur;
+	int channels = 0;
+	u32 val;
+
+	of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
+		adc_dev->channel_line[channels] = val;
+		channels++;
+	}
+
+	adc_dev->channels = channels;
+	return 0;
+}
+
 static int tiadc_probe(struct platform_device *pdev)
 {
 	struct iio_dev		*indio_dev;
 	struct tiadc_device	*adc_dev;
 	struct device_node	*node = pdev->dev.of_node;
-	struct property		*prop;
-	const __be32		*cur;
 	int			err;
-	u32			val;
-	int			channels = 0;
 
 	if (!node) {
 		dev_err(&pdev->dev, "Could not find valid DT data.\n");
@@ -432,12 +446,7 @@ static int tiadc_probe(struct platform_device *pdev)
 	adc_dev = iio_priv(indio_dev);
 
 	adc_dev->mfd_tscadc = ti_tscadc_dev_get(pdev);
-
-	of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
-		adc_dev->channel_line[channels] = val;
-		channels++;
-	}
-	adc_dev->channels = channels;
+	tiadc_parse_dt(pdev, adc_dev);
 
 	indio_dev->dev.parent = &pdev->dev;
 	indio_dev->name = dev_name(&pdev->dev);
-- 
1.7.9.5

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

* [PATCH 1/2] iio: adc: ti_am335x_adc: refactor DT parsing into a function
@ 2014-08-27 12:19 ` Vignesh R
  0 siblings, 0 replies; 16+ messages in thread
From: Vignesh R @ 2014-08-27 12:19 UTC (permalink / raw)
  To: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Jonathan Cameron
  Cc: Randy Dunlap, Samuel Ortiz, Lee Jones, Felipe Balbi,
	Sebastian Andrzej Siewior, devicetree, linux-doc, linux-iio,
	Vignesh R

Refactor DT parsing into a seperate function from probe() to
help addition of more DT parameters later.

No functional changes.

Signed-off-by: Vignesh R <vigneshr@ti.com>
---
 drivers/iio/adc/ti_am335x_adc.c |   29 +++++++++++++++++++----------
 1 file changed, 19 insertions(+), 10 deletions(-)

diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index 63b2bb6..dfb0db0 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -407,16 +407,30 @@ static const struct iio_info tiadc_info = {
 	.driver_module = THIS_MODULE,
 };
 
+static int tiadc_parse_dt(struct platform_device *pdev,
+				struct tiadc_device *adc_dev)
+{
+	struct device_node *node = pdev->dev.of_node;
+	struct property *prop;
+	const __be32 *cur;
+	int channels = 0;
+	u32 val;
+
+	of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
+		adc_dev->channel_line[channels] = val;
+		channels++;
+	}
+
+	adc_dev->channels = channels;
+	return 0;
+}
+
 static int tiadc_probe(struct platform_device *pdev)
 {
 	struct iio_dev		*indio_dev;
 	struct tiadc_device	*adc_dev;
 	struct device_node	*node = pdev->dev.of_node;
-	struct property		*prop;
-	const __be32		*cur;
 	int			err;
-	u32			val;
-	int			channels = 0;
 
 	if (!node) {
 		dev_err(&pdev->dev, "Could not find valid DT data.\n");
@@ -432,12 +446,7 @@ static int tiadc_probe(struct platform_device *pdev)
 	adc_dev = iio_priv(indio_dev);
 
 	adc_dev->mfd_tscadc = ti_tscadc_dev_get(pdev);
-
-	of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
-		adc_dev->channel_line[channels] = val;
-		channels++;
-	}
-	adc_dev->channels = channels;
+	tiadc_parse_dt(pdev, adc_dev);
 
 	indio_dev->dev.parent = &pdev->dev;
 	indio_dev->name = dev_name(&pdev->dev);
-- 
1.7.9.5

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

end of thread, other threads:[~2015-05-13 17:38 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-03-31 11:12 [PATCH 0/2] iio: ti_am335x_adc: Add optional DT properties for tscadc Vignesh R
2015-03-31 11:12 ` Vignesh R
2015-03-31 11:12 ` [PATCH 1/2] iio: adc: ti_am335x_adc: refactor DT parsing into a function Vignesh R
2015-03-31 11:12   ` Vignesh R
2015-04-09 14:13   ` Jonathan Cameron
2015-04-09 14:13     ` Jonathan Cameron
2015-03-31 11:12 ` [PATCH 2/2] iio: adc: ti_am335x_adc: make sample delay, open delay, averaging DT parameters Vignesh R
2015-03-31 11:12   ` Vignesh R
2015-04-09 14:19   ` Jonathan Cameron
2015-04-09 14:19     ` Jonathan Cameron
2015-05-13  7:42     ` Vignesh R
2015-05-13 17:38       ` Jonathan Cameron
2015-05-13 17:38         ` Jonathan Cameron
  -- strict thread matches above, loose matches on Subject: below --
2014-08-27 12:19 [PATCH 1/2] iio: adc: ti_am335x_adc: refactor DT parsing into a function Vignesh R
2014-08-27 12:19 ` Vignesh R
2014-08-30  9:44 ` 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.