* [PATCH v4 1/4] iio: ad5755: add support for dt bindings
@ 2016-03-01 11:56 Sean Nyekjaer
[not found] ` <1456833376-29758-1-git-send-email-sean.nyekjaer-rjjw5hvvQKZaa/9Udqfwiw@public.gmane.org>
0 siblings, 1 reply; 6+ messages in thread
From: Sean Nyekjaer @ 2016-03-01 11:56 UTC (permalink / raw)
To: linux-iio-u79uwXL29TY76Z2rM5mHXA
Cc: Sean Nyekjaer, devicetree-u79uwXL29TY76Z2rM5mHXA
Still missing a way to provide default modes and settings
for the driver from dt, but I see this as a start.
Signed-off-by: Sean Nyekjaer <sean.nyekjaer-rjjw5hvvQKZaa/9Udqfwiw@public.gmane.org>
---
drivers/iio/dac/ad5755.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/drivers/iio/dac/ad5755.c b/drivers/iio/dac/ad5755.c
index bfb350a..e1b6e78 100644
--- a/drivers/iio/dac/ad5755.c
+++ b/drivers/iio/dac/ad5755.c
@@ -607,6 +607,16 @@ static const struct spi_device_id ad5755_id[] = {
};
MODULE_DEVICE_TABLE(spi, ad5755_id);
+static const struct of_device_id ad5755_of_match[] = {
+ { .compatible = "adi,ad5755" },
+ { .compatible = "adi,ad5755-1" },
+ { .compatible = "adi,ad5757" },
+ { .compatible = "adi,ad5735" },
+ { .compatible = "adi,ad5737" },
+ { }
+};
+MODULE_DEVICE_TABLE(of, ad5755_of_match);
+
static struct spi_driver ad5755_driver = {
.driver = {
.name = "ad5755",
--
2.7.2
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v4 2/4] iio: ad5755: Add DT binding documentation
[not found] ` <1456833376-29758-1-git-send-email-sean.nyekjaer-rjjw5hvvQKZaa/9Udqfwiw@public.gmane.org>
@ 2016-03-01 11:56 ` Sean Nyekjaer
[not found] ` <1456833376-29758-2-git-send-email-sean.nyekjaer-rjjw5hvvQKZaa/9Udqfwiw@public.gmane.org>
0 siblings, 1 reply; 6+ messages in thread
From: Sean Nyekjaer @ 2016-03-01 11:56 UTC (permalink / raw)
To: linux-iio-u79uwXL29TY76Z2rM5mHXA
Cc: Sean Nyekjaer, devicetree-u79uwXL29TY76Z2rM5mHXA
Signed-off-by: Sean Nyekjaer <sean.nyekjaer-rjjw5hvvQKZaa/9Udqfwiw@public.gmane.org>
Acked-by: Rob Herring <robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
---
.../devicetree/bindings/iio/dac/ad5755.txt | 24 ++++++++++++++++++++++
1 file changed, 24 insertions(+)
create mode 100644 Documentation/devicetree/bindings/iio/dac/ad5755.txt
diff --git a/Documentation/devicetree/bindings/iio/dac/ad5755.txt b/Documentation/devicetree/bindings/iio/dac/ad5755.txt
new file mode 100644
index 0000000..4c91583
--- /dev/null
+++ b/Documentation/devicetree/bindings/iio/dac/ad5755.txt
@@ -0,0 +1,24 @@
+* Analog Device AD5755 IIO Multi-Channel DAC Linux Driver
+
+Required properties:
+ - compatible: Has to contain one of the following:
+ adi,ad5755
+ adi,ad5755-1
+ adi,ad5757
+ adi,ad5735
+ adi,ad5737
+
+ - reg: spi chip select number for the device
+ - spi-cpha or spi-cpol: is the only modes that is supported
+
+Recommended properties:
+ - spi-max-frequency: Definition as per
+ Documentation/devicetree/bindings/spi/spi-bus.txt
+
+Example:
+dac@0 {
+ compatible = "adi,ad5755";
+ reg = <0>;
+ spi-max-frequency = <1000000>;
+ spi-cpha;
+};
--
2.7.2
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v4 3/4] iio: ad5755: added full support for devicetree
[not found] ` <1456833376-29758-2-git-send-email-sean.nyekjaer-rjjw5hvvQKZaa/9Udqfwiw@public.gmane.org>
@ 2016-03-01 11:56 ` Sean Nyekjaer
[not found] ` <1456833376-29758-3-git-send-email-sean.nyekjaer-rjjw5hvvQKZaa/9Udqfwiw@public.gmane.org>
0 siblings, 1 reply; 6+ messages in thread
From: Sean Nyekjaer @ 2016-03-01 11:56 UTC (permalink / raw)
To: linux-iio-u79uwXL29TY76Z2rM5mHXA
Cc: Sean Nyekjaer, devicetree-u79uwXL29TY76Z2rM5mHXA
Devicetree can provide platform data
Signed-off-by: Sean Nyekjaer <sean.nyekjaer-rjjw5hvvQKZaa/9Udqfwiw@public.gmane.org>
---
These large switch cases make the driver hard to read? Does someone have any
ideas to make this more readable?
The dc-dc-phase and channel mode i rather hard to do without defines? Will it
be okay to use them here?
Example:
adi,mode = CURRENT_4mA_20mA or adi,mode = VOLTAGE_PLUSMINUS_10V
They are generic DAC/ADC properties...
Changes since v3:
- replaced '_' with '-'
- Now used actual values instead of register values.
Changes since v2:
- removed defines from DT
drivers/iio/dac/ad5755.c | 227 ++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 226 insertions(+), 1 deletion(-)
diff --git a/drivers/iio/dac/ad5755.c b/drivers/iio/dac/ad5755.c
index e1b6e78..4a2866e 100644
--- a/drivers/iio/dac/ad5755.c
+++ b/drivers/iio/dac/ad5755.c
@@ -14,6 +14,7 @@
#include <linux/slab.h>
#include <linux/sysfs.h>
#include <linux/delay.h>
+#include <linux/of.h>
#include <linux/iio/iio.h>
#include <linux/iio/sysfs.h>
#include <linux/platform_data/ad5755.h>
@@ -556,6 +557,223 @@ static const struct ad5755_platform_data ad5755_default_pdata = {
},
};
+#ifdef CONFIG_OF
+static struct ad5755_platform_data *ad5755_parse_dt(struct device *dev)
+{
+ struct device_node *np = dev->of_node;
+ struct device_node *pp;
+ struct ad5755_platform_data *pdata;
+ unsigned int tmp;
+ unsigned int tmparray[3];
+ int devnr;
+
+ pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
+ if (!pdata)
+ return NULL;
+
+ pdata->ext_dc_dc_compenstation_resistor =
+ of_property_read_bool(np, "adi,ext-dc-dc-compenstation-resistor");
+
+ if (!of_property_read_u32(np, "adi,dc-dc-phase", &tmp))
+ pdata->dc_dc_phase = tmp;
+ else
+ pdata->dc_dc_phase = AD5755_DC_DC_PHASE_ALL_SAME_EDGE;
+
+ if (!of_property_read_u32(np, "adi,dc-dc-freq", &tmp))
+ switch (tmp) {
+ case 250000:
+ pdata->dc_dc_freq = AD5755_DC_DC_FREQ_250kHZ;
+ break;
+ case 410000:
+ pdata->dc_dc_freq = AD5755_DC_DC_FREQ_410kHZ;
+ break;
+ case 650000:
+ pdata->dc_dc_freq = AD5755_DC_DC_FREQ_650kHZ;
+ break;
+ default:
+ dev_err(dev,
+ "adi,dc-dc-freq out of range selecting 410kHz");
+ pdata->dc_dc_freq = AD5755_DC_DC_FREQ_410kHZ;
+ } else
+ pdata->dc_dc_freq = AD5755_DC_DC_FREQ_410kHZ;
+
+ if (!of_property_read_u32(np, "adi,dc-dc-maxv", &tmp))
+ switch (tmp) {
+ case 23000:
+ pdata->dc_dc_maxv = AD5755_DC_DC_MAXV_23V;
+ break;
+ case 24500:
+ pdata->dc_dc_maxv = AD5755_DC_DC_MAXV_24V5;
+ break;
+ case 27000:
+ pdata->dc_dc_maxv = AD5755_DC_DC_MAXV_27V;
+ break;
+ case 29500:
+ pdata->dc_dc_maxv = AD5755_DC_DC_MAXV_29V5;
+ break;
+ default:
+ dev_err(dev,
+ "adi,dc-dc-maxv out of range selecting 23V");
+ pdata->dc_dc_maxv = AD5755_DC_DC_MAXV_23V;
+ } else
+ pdata->dc_dc_maxv = AD5755_DC_DC_MAXV_23V;
+
+ devnr = 0;
+ for_each_child_of_node(np, pp) {
+ if (devnr > AD5755_NUM_CHANNELS) {
+ dev_err(dev,
+ "There is to many channels defined in DT\n");
+ goto error_out;
+ }
+
+ if (!of_property_read_u32(pp, "adi,mode", &tmp))
+ pdata->dac[devnr].mode = tmp;
+ else
+ pdata->dac[devnr].mode = AD5755_MODE_CURRENT_4mA_20mA;
+
+ pdata->dac[devnr].ext_current_sense_resistor =
+ of_property_read_bool(pp, "adi,ext-current-sense-resistor");
+
+ pdata->dac[devnr].enable_voltage_overrange =
+ of_property_read_bool(pp, "adi,enable-voltage-overrange");
+
+ if (!of_property_read_u32_array(pp, "adi,slew", tmparray, 3)) {
+ pdata->dac[devnr].slew.enable = tmparray[0];
+ switch (tmparray[1]) {
+ case 64000:
+ pdata->dac[devnr].slew.rate =
+ AD5755_SLEW_RATE_64k;
+ break;
+ case 32000:
+ pdata->dac[devnr].slew.rate =
+ AD5755_SLEW_RATE_32k;
+ break;
+ case 16000:
+ pdata->dac[devnr].slew.rate =
+ AD5755_SLEW_RATE_16k;
+ break;
+ case 8000:
+ pdata->dac[devnr].slew.rate =
+ AD5755_SLEW_RATE_8k;
+ break;
+ case 4000:
+ pdata->dac[devnr].slew.rate =
+ AD5755_SLEW_RATE_4k;
+ break;
+ case 2000:
+ pdata->dac[devnr].slew.rate =
+ AD5755_SLEW_RATE_2k;
+ break;
+ case 1000:
+ pdata->dac[devnr].slew.rate =
+ AD5755_SLEW_RATE_1k;
+ break;
+ case 500:
+ pdata->dac[devnr].slew.rate =
+ AD5755_SLEW_RATE_500;
+ break;
+ case 250:
+ pdata->dac[devnr].slew.rate =
+ AD5755_SLEW_RATE_250;
+ break;
+ case 125:
+ pdata->dac[devnr].slew.rate =
+ AD5755_SLEW_RATE_125;
+ break;
+ case 64:
+ pdata->dac[devnr].slew.rate =
+ AD5755_SLEW_RATE_64;
+ break;
+ case 32:
+ pdata->dac[devnr].slew.rate =
+ AD5755_SLEW_RATE_32;
+ break;
+ case 16:
+ pdata->dac[devnr].slew.rate =
+ AD5755_SLEW_RATE_16;
+ break;
+ case 8:
+ pdata->dac[devnr].slew.rate =
+ AD5755_SLEW_RATE_8;
+ break;
+ case 4:
+ pdata->dac[devnr].slew.rate =
+ AD5755_SLEW_RATE_4;
+ break;
+ case 0:
+ pdata->dac[devnr].slew.rate =
+ AD5755_SLEW_RATE_0_5;
+ break;
+ default:
+ dev_err(dev,
+ "channel %d slew rate out of range selecting 64kHz",
+ devnr);
+ pdata->dac[devnr].slew.rate =
+ AD5755_SLEW_RATE_64k;
+ }
+ switch (tmparray[2]) {
+ case 1:
+ pdata->dac[devnr].slew.step_size =
+ AD5755_SLEW_STEP_SIZE_1;
+ break;
+ case 2:
+ pdata->dac[devnr].slew.step_size =
+ AD5755_SLEW_STEP_SIZE_2;
+ break;
+ case 4:
+ pdata->dac[devnr].slew.step_size =
+ AD5755_SLEW_STEP_SIZE_4;
+ break;
+ case 16:
+ pdata->dac[devnr].slew.step_size =
+ AD5755_SLEW_STEP_SIZE_16;
+ break;
+ case 32:
+ pdata->dac[devnr].slew.step_size =
+ AD5755_SLEW_STEP_SIZE_32;
+ break;
+ case 64:
+ pdata->dac[devnr].slew.step_size =
+ AD5755_SLEW_STEP_SIZE_64;
+ break;
+ case 128:
+ pdata->dac[devnr].slew.step_size =
+ AD5755_SLEW_STEP_SIZE_128;
+ break;
+ case 256:
+ pdata->dac[devnr].slew.step_size =
+ AD5755_SLEW_STEP_SIZE_256;
+ break;
+ default:
+ dev_err(dev,
+ "channel %d slew step size out of range selecting 1 LSB",
+ devnr);
+ pdata->dac[devnr].slew.step_size =
+ AD5755_SLEW_STEP_SIZE_1;
+ }
+ } else {
+ pdata->dac[devnr].slew.enable = false;
+ pdata->dac[devnr].slew.rate = AD5755_SLEW_RATE_64k;
+ pdata->dac[devnr].slew.step_size =
+ AD5755_SLEW_STEP_SIZE_1;
+ }
+ devnr++;
+ }
+
+ return pdata;
+
+ error_out:
+ devm_kfree(dev, pdata);
+ return NULL;
+}
+#else
+static
+struct adf4350_platform_data *adf4350_parse_dt(struct device *dev)
+{
+ return NULL;
+}
+#endif
+
static int ad5755_probe(struct spi_device *spi)
{
enum ad5755_type type = spi_get_device_id(spi)->driver_data;
@@ -583,8 +801,15 @@ static int ad5755_probe(struct spi_device *spi)
indio_dev->modes = INDIO_DIRECT_MODE;
indio_dev->num_channels = AD5755_NUM_CHANNELS;
- if (!pdata)
+ if (spi->dev.of_node)
+ pdata = ad5755_parse_dt(&spi->dev);
+ else
+ pdata = spi->dev.platform_data;
+
+ if (!pdata) {
+ dev_warn(&spi->dev, "no platform data? using default\n");
pdata = &ad5755_default_pdata;
+ }
ret = ad5755_init_channels(indio_dev, pdata);
if (ret)
--
2.7.2
--
To unsubscribe from this list: send the line "unsubscribe devicetree" 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 related [flat|nested] 6+ messages in thread
* [PATCH v4 4/4] iio: ad5755: Add full DT binding documentation
[not found] ` <1456833376-29758-3-git-send-email-sean.nyekjaer-rjjw5hvvQKZaa/9Udqfwiw@public.gmane.org>
@ 2016-03-01 11:56 ` Sean Nyekjaer
[not found] ` <1456833376-29758-4-git-send-email-sean.nyekjaer-rjjw5hvvQKZaa/9Udqfwiw@public.gmane.org>
2016-03-05 14:32 ` [PATCH v4 3/4] iio: ad5755: added full support for devicetree Jonathan Cameron
1 sibling, 1 reply; 6+ messages in thread
From: Sean Nyekjaer @ 2016-03-01 11:56 UTC (permalink / raw)
To: linux-iio-u79uwXL29TY76Z2rM5mHXA
Cc: Sean Nyekjaer, devicetree-u79uwXL29TY76Z2rM5mHXA
Signed-off-by: Sean Nyekjaer <sean.nyekjaer-rjjw5hvvQKZaa/9Udqfwiw@public.gmane.org>
---
Still missing some ideas to dc-dc-phase and mode options :-)
Changes since v3:
- replaced '_' with '-'
- Now used actual values instead of register values.
Changes since v2:
- Removed defines, alot easier to read :-)
.../devicetree/bindings/iio/dac/ad5755.txt | 94 ++++++++++++++++++++++
1 file changed, 94 insertions(+)
diff --git a/Documentation/devicetree/bindings/iio/dac/ad5755.txt b/Documentation/devicetree/bindings/iio/dac/ad5755.txt
index 4c91583..83b4c3f 100644
--- a/Documentation/devicetree/bindings/iio/dac/ad5755.txt
+++ b/Documentation/devicetree/bindings/iio/dac/ad5755.txt
@@ -15,10 +15,104 @@ Recommended properties:
- spi-max-frequency: Definition as per
Documentation/devicetree/bindings/spi/spi-bus.txt
+Optional properties:
+See include/dt-bindings/iio/ad5755.h
+ - adi,ext-dc-dc-compenstation-resistor: boolean set if the hardware have an
+ external resistor and thereby bypasses
+ the internal compensation resistor.
+ - adi,dc-dc-phase:
+ Valid values for DC DC Phase control is:
+ 0: All dc-to-dc converters clock on the same edge.
+ 1: Channel A and Channel B clock on the same edge,
+ Channel C and Channel D clock on opposite edges.
+ 2: Channel A and Channel C clock on the same edge,
+ Channel B and Channel D clock on opposite edges.
+ 3: Channel A, Channel B, Channel C, and Channel D
+ clock 90 degrees out of phase from each other.
+ - adi,dc-dc-freq:
+ Valid values for DC DC frequency is [Hz]:
+ 250000
+ 410000
+ 650000
+ - adi,dc-dc-maxv:
+ Valid values for the maximum allowed Vboost voltage supplied by
+ the dc-to-dc converter is [mV]:
+ 23000
+ 24500
+ 27000
+ 29500
+
+Optional for every channel:
+ - adi,mode:
+ Valid values for DAC modes is:
+ 0: 0 V to 5 V voltage range.
+ 1: 0 V to 10 V voltage range.
+ 2: Plus minus 5 V voltage range.
+ 3: Plus minus 10 V voltage range.
+ 4: 4 mA to 20 mA current range.
+ 5: 0 mA to 20 mA current range.
+ 6: 0 mA to 24 mA current range.
+ - adi,ext-current-sense-resistor: boolean set if the hardware a external
+ current sense resistor.
+ - adi,enable-voltage-overrange: boolean enable voltage overrange
+ - adi,slew: Array of slewrate settings should contain 3 fields:
+ 1: Should be either 0 or 1 in order to enable or disable slewrate.
+ 2: Slew rate settings:
+ Valid values for the slew rate update frequency:
+ 64000
+ 32000
+ 16000
+ 8000
+ 4000
+ 2000
+ 1000
+ 500
+ 250
+ 125
+ 64
+ 32
+ 16
+ 8
+ 4
+ 0
+ 3: Slew step size:
+ Valid values for the step size LSBs:
+ 1
+ 2
+ 4
+ 16
+ 32
+ 64
+ 128
+ 256
+
Example:
dac@0 {
compatible = "adi,ad5755";
reg = <0>;
spi-max-frequency = <1000000>;
spi-cpha;
+ adi,dc-dc-phase = <0>;
+ adi,dc-dc-freq = <1>;
+ adi,dc-dc-maxv = <0>;
+ channel@0 {
+ adi,mode = <4>;
+ adi,ext-current-sense-resistor;
+ adi,slew = <0 64000 1>;
+ };
+ channel@1 {
+ adi,mode = <4>;
+ adi,ext-current-sense-resistor;
+ adi,slew = <0 64000 1>;
+ };
+ channel@2 {
+ adi,mode = <4>;
+ adi,ext-current-sense-resistor;
+ adi,slew = <0 64000 1>;
+ };
+ channel@3 {
+ adi,mode = <4>;
+ adi,ext-current-sense-resistor;
+ adi,slew = <0 64000 1>;
+ };
};
--
2.7.2
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v4 4/4] iio: ad5755: Add full DT binding documentation
[not found] ` <1456833376-29758-4-git-send-email-sean.nyekjaer-rjjw5hvvQKZaa/9Udqfwiw@public.gmane.org>
@ 2016-03-05 4:25 ` Rob Herring
0 siblings, 0 replies; 6+ messages in thread
From: Rob Herring @ 2016-03-05 4:25 UTC (permalink / raw)
To: Sean Nyekjaer
Cc: linux-iio-u79uwXL29TY76Z2rM5mHXA,
devicetree-u79uwXL29TY76Z2rM5mHXA
On Tue, Mar 01, 2016 at 12:56:16PM +0100, Sean Nyekjaer wrote:
> Signed-off-by: Sean Nyekjaer <sean.nyekjaer-rjjw5hvvQKZaa/9Udqfwiw@public.gmane.org>
> ---
> Still missing some ideas to dc-dc-phase and mode options :-)
Please combine patches 2 and 4. Binding changes don't have to correlate
one to one with driver changes.
>
> Changes since v3:
> - replaced '_' with '-'
> - Now used actual values instead of register values.
>
> Changes since v2:
> - Removed defines, alot easier to read :-)
>
> .../devicetree/bindings/iio/dac/ad5755.txt | 94 ++++++++++++++++++++++
> 1 file changed, 94 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/iio/dac/ad5755.txt b/Documentation/devicetree/bindings/iio/dac/ad5755.txt
> index 4c91583..83b4c3f 100644
> --- a/Documentation/devicetree/bindings/iio/dac/ad5755.txt
> +++ b/Documentation/devicetree/bindings/iio/dac/ad5755.txt
> @@ -15,10 +15,104 @@ Recommended properties:
> - spi-max-frequency: Definition as per
> Documentation/devicetree/bindings/spi/spi-bus.txt
>
> +Optional properties:
> +See include/dt-bindings/iio/ad5755.h
> + - adi,ext-dc-dc-compenstation-resistor: boolean set if the hardware have an
> + external resistor and thereby bypasses
> + the internal compensation resistor.
> + - adi,dc-dc-phase:
> + Valid values for DC DC Phase control is:
> + 0: All dc-to-dc converters clock on the same edge.
> + 1: Channel A and Channel B clock on the same edge,
> + Channel C and Channel D clock on opposite edges.
> + 2: Channel A and Channel C clock on the same edge,
> + Channel B and Channel D clock on opposite edges.
> + 3: Channel A, Channel B, Channel C, and Channel D
> + clock 90 degrees out of phase from each other.
> + - adi,dc-dc-freq:
Please append "-hz".
> + Valid values for DC DC frequency is [Hz]:
> + 250000
> + 410000
> + 650000
> + - adi,dc-dc-maxv:
adi,dc-dc-max-microvolt
Just trying to keep units somewhat standard.
> + Valid values for the maximum allowed Vboost voltage supplied by
> + the dc-to-dc converter is [mV]:
> + 23000
> + 24500
> + 27000
> + 29500
> +
> +Optional for every channel:
> + - adi,mode:
> + Valid values for DAC modes is:
> + 0: 0 V to 5 V voltage range.
> + 1: 0 V to 10 V voltage range.
> + 2: Plus minus 5 V voltage range.
> + 3: Plus minus 10 V voltage range.
> + 4: 4 mA to 20 mA current range.
> + 5: 0 mA to 20 mA current range.
> + 6: 0 mA to 24 mA current range.
> + - adi,ext-current-sense-resistor: boolean set if the hardware a external
> + current sense resistor.
> + - adi,enable-voltage-overrange: boolean enable voltage overrange
> + - adi,slew: Array of slewrate settings should contain 3 fields:
> + 1: Should be either 0 or 1 in order to enable or disable slewrate.
> + 2: Slew rate settings:
> + Valid values for the slew rate update frequency:
> + 64000
> + 32000
> + 16000
> + 8000
> + 4000
> + 2000
> + 1000
> + 500
> + 250
> + 125
> + 64
> + 32
> + 16
> + 8
> + 4
> + 0
> + 3: Slew step size:
> + Valid values for the step size LSBs:
> + 1
> + 2
> + 4
> + 16
> + 32
> + 64
> + 128
> + 256
> +
> Example:
> dac@0 {
> compatible = "adi,ad5755";
> reg = <0>;
> spi-max-frequency = <1000000>;
> spi-cpha;
> + adi,dc-dc-phase = <0>;
> + adi,dc-dc-freq = <1>;
> + adi,dc-dc-maxv = <0>;
> + channel@0 {
unit addresses require a reg property, so add one here.
> + adi,mode = <4>;
> + adi,ext-current-sense-resistor;
> + adi,slew = <0 64000 1>;
> + };
> + channel@1 {
> + adi,mode = <4>;
> + adi,ext-current-sense-resistor;
> + adi,slew = <0 64000 1>;
> + };
> + channel@2 {
> + adi,mode = <4>;
> + adi,ext-current-sense-resistor;
> + adi,slew = <0 64000 1>;
> + };
> + channel@3 {
> + adi,mode = <4>;
> + adi,ext-current-sense-resistor;
> + adi,slew = <0 64000 1>;
> + };
> };
> --
> 2.7.2
>
> --
> To unsubscribe from this list: send the line "unsubscribe devicetree" in
> the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe devicetree" 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] 6+ messages in thread
* Re: [PATCH v4 3/4] iio: ad5755: added full support for devicetree
[not found] ` <1456833376-29758-3-git-send-email-sean.nyekjaer-rjjw5hvvQKZaa/9Udqfwiw@public.gmane.org>
2016-03-01 11:56 ` [PATCH v4 4/4] iio: ad5755: Add full DT binding documentation Sean Nyekjaer
@ 2016-03-05 14:32 ` Jonathan Cameron
1 sibling, 0 replies; 6+ messages in thread
From: Jonathan Cameron @ 2016-03-05 14:32 UTC (permalink / raw)
To: Sean Nyekjaer, linux-iio-u79uwXL29TY76Z2rM5mHXA
Cc: devicetree-u79uwXL29TY76Z2rM5mHXA
On 01/03/16 11:56, Sean Nyekjaer wrote:
> Devicetree can provide platform data
>
> Signed-off-by: Sean Nyekjaer <sean.nyekjaer-rjjw5hvvQKZaa/9Udqfwiw@public.gmane.org>
> ---
> These large switch cases make the driver hard to read? Does someone have any
> ideas to make this more readable?
Only option that comes to mind would be to use a look up table and search
it... See below. Moves the switch statement stuff into a static array. Can
be done neater than I have below, but you'll get the idea.
>
> The dc-dc-phase and channel mode i rather hard to do without defines? Will it
> be okay to use them here?
> Example:
> adi,mode = CURRENT_4mA_20mA or adi,mode = VOLTAGE_PLUSMINUS_10V
> They are generic DAC/ADC properties...
I can't think of a better way - there are too many missing cases that are
invalid to break it up into more elements. So sure, fine in my view as is.
>
> Changes since v3:
> - replaced '_' with '-'
> - Now used actual values instead of register values.
>
> Changes since v2:
> - removed defines from DT
>
> drivers/iio/dac/ad5755.c | 227 ++++++++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 226 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/iio/dac/ad5755.c b/drivers/iio/dac/ad5755.c
> index e1b6e78..4a2866e 100644
> --- a/drivers/iio/dac/ad5755.c
> +++ b/drivers/iio/dac/ad5755.c
> @@ -14,6 +14,7 @@
> #include <linux/slab.h>
> #include <linux/sysfs.h>
> #include <linux/delay.h>
> +#include <linux/of.h>
> #include <linux/iio/iio.h>
> #include <linux/iio/sysfs.h>
> #include <linux/platform_data/ad5755.h>
> @@ -556,6 +557,223 @@ static const struct ad5755_platform_data ad5755_default_pdata = {
> },
> };
>
> +#ifdef CONFIG_OF
> +static struct ad5755_platform_data *ad5755_parse_dt(struct device *dev)
> +{
> + struct device_node *np = dev->of_node;
> + struct device_node *pp;
> + struct ad5755_platform_data *pdata;
> + unsigned int tmp;
> + unsigned int tmparray[3];
> + int devnr;
> +
> + pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
> + if (!pdata)
> + return NULL;
> +
> + pdata->ext_dc_dc_compenstation_resistor =
> + of_property_read_bool(np, "adi,ext-dc-dc-compenstation-resistor");
> +
> + if (!of_property_read_u32(np, "adi,dc-dc-phase", &tmp))
> + pdata->dc_dc_phase = tmp;
> + else
> + pdata->dc_dc_phase = AD5755_DC_DC_PHASE_ALL_SAME_EDGE;
> +
> + if (!of_property_read_u32(np, "adi,dc-dc-freq", &tmp))
> + switch (tmp) {
static const int ad5755_dcdc_freq_table[3][2] =
{ { 250000, AD5755_DC_DC_FREQ_250kHZ },
{ 410000, AD5755_DC_DC_FREQ_410kHZ },
{ 650000, AD5755_DC_DC_FREQ_650kZ } };
for (i = 0; i < 3; i++) {
if (tmp == ad5755_dcdc_freq_table[i][0]) {
pdata->dc_dc_freq = ad5755_dcdc_freq_table[i][1];
break;
}
if (i == 3) {
dev_err(dev,
"adi,dc-dc-freq out of range selecting 410kHz");
pdata->dc_dc_freq = AD5755_DC_DC_FREQ_410kHZ;
}
Or something along those lines.. Makes more sense for the larger ones.
> + case 250000:
> + pdata->dc_dc_freq = AD5755_DC_DC_FREQ_250kHZ;
> + break;
> + case 410000:
> + pdata->dc_dc_freq = AD5755_DC_DC_FREQ_410kHZ;
> + break;
> + case 650000:
> + pdata->dc_dc_freq = AD5755_DC_DC_FREQ_650kHZ;
> + break;
> + default:
> + dev_err(dev,
> + "adi,dc-dc-freq out of range selecting 410kHz");
> + pdata->dc_dc_freq = AD5755_DC_DC_FREQ_410kHZ;
> + } else
> + pdata->dc_dc_freq = AD5755_DC_DC_FREQ_410kHZ;
> +
> + if (!of_property_read_u32(np, "adi,dc-dc-maxv", &tmp))
> + switch (tmp) {
> + case 23000:
> + pdata->dc_dc_maxv = AD5755_DC_DC_MAXV_23V;
> + break;
> + case 24500:
> + pdata->dc_dc_maxv = AD5755_DC_DC_MAXV_24V5;
> + break;
> + case 27000:
> + pdata->dc_dc_maxv = AD5755_DC_DC_MAXV_27V;
> + break;
> + case 29500:
> + pdata->dc_dc_maxv = AD5755_DC_DC_MAXV_29V5;
> + break;
> + default:
> + dev_err(dev,
> + "adi,dc-dc-maxv out of range selecting 23V");
> + pdata->dc_dc_maxv = AD5755_DC_DC_MAXV_23V;
> + } else
> + pdata->dc_dc_maxv = AD5755_DC_DC_MAXV_23V;
> +
> + devnr = 0;
> + for_each_child_of_node(np, pp) {
> + if (devnr > AD5755_NUM_CHANNELS) {
> + dev_err(dev,
> + "There is to many channels defined in DT\n");
> + goto error_out;
> + }
> +
> + if (!of_property_read_u32(pp, "adi,mode", &tmp))
> + pdata->dac[devnr].mode = tmp;
> + else
> + pdata->dac[devnr].mode = AD5755_MODE_CURRENT_4mA_20mA;
> +
> + pdata->dac[devnr].ext_current_sense_resistor =
> + of_property_read_bool(pp, "adi,ext-current-sense-resistor");
> +
> + pdata->dac[devnr].enable_voltage_overrange =
> + of_property_read_bool(pp, "adi,enable-voltage-overrange");
> +
> + if (!of_property_read_u32_array(pp, "adi,slew", tmparray, 3)) {
> + pdata->dac[devnr].slew.enable = tmparray[0];
> + switch (tmparray[1]) {
> + case 64000:
> + pdata->dac[devnr].slew.rate =
> + AD5755_SLEW_RATE_64k;
> + break;
> + case 32000:
> + pdata->dac[devnr].slew.rate =
> + AD5755_SLEW_RATE_32k;
> + break;
> + case 16000:
> + pdata->dac[devnr].slew.rate =
> + AD5755_SLEW_RATE_16k;
> + break;
> + case 8000:
> + pdata->dac[devnr].slew.rate =
> + AD5755_SLEW_RATE_8k;
> + break;
> + case 4000:
> + pdata->dac[devnr].slew.rate =
> + AD5755_SLEW_RATE_4k;
> + break;
> + case 2000:
> + pdata->dac[devnr].slew.rate =
> + AD5755_SLEW_RATE_2k;
> + break;
> + case 1000:
> + pdata->dac[devnr].slew.rate =
> + AD5755_SLEW_RATE_1k;
> + break;
> + case 500:
> + pdata->dac[devnr].slew.rate =
> + AD5755_SLEW_RATE_500;
> + break;
> + case 250:
> + pdata->dac[devnr].slew.rate =
> + AD5755_SLEW_RATE_250;
> + break;
> + case 125:
> + pdata->dac[devnr].slew.rate =
> + AD5755_SLEW_RATE_125;
> + break;
> + case 64:
> + pdata->dac[devnr].slew.rate =
> + AD5755_SLEW_RATE_64;
> + break;
> + case 32:
> + pdata->dac[devnr].slew.rate =
> + AD5755_SLEW_RATE_32;
> + break;
> + case 16:
> + pdata->dac[devnr].slew.rate =
> + AD5755_SLEW_RATE_16;
> + break;
> + case 8:
> + pdata->dac[devnr].slew.rate =
> + AD5755_SLEW_RATE_8;
> + break;
> + case 4:
> + pdata->dac[devnr].slew.rate =
> + AD5755_SLEW_RATE_4;
> + break;
> + case 0:
> + pdata->dac[devnr].slew.rate =
> + AD5755_SLEW_RATE_0_5;
> + break;
> + default:
> + dev_err(dev,
> + "channel %d slew rate out of range selecting 64kHz",
> + devnr);
> + pdata->dac[devnr].slew.rate =
> + AD5755_SLEW_RATE_64k;
> + }
> + switch (tmparray[2]) {
> + case 1:
> + pdata->dac[devnr].slew.step_size =
> + AD5755_SLEW_STEP_SIZE_1;
> + break;
> + case 2:
> + pdata->dac[devnr].slew.step_size =
> + AD5755_SLEW_STEP_SIZE_2;
> + break;
> + case 4:
> + pdata->dac[devnr].slew.step_size =
> + AD5755_SLEW_STEP_SIZE_4;
> + break;
> + case 16:
> + pdata->dac[devnr].slew.step_size =
> + AD5755_SLEW_STEP_SIZE_16;
> + break;
> + case 32:
> + pdata->dac[devnr].slew.step_size =
> + AD5755_SLEW_STEP_SIZE_32;
> + break;
> + case 64:
> + pdata->dac[devnr].slew.step_size =
> + AD5755_SLEW_STEP_SIZE_64;
> + break;
> + case 128:
> + pdata->dac[devnr].slew.step_size =
> + AD5755_SLEW_STEP_SIZE_128;
> + break;
> + case 256:
> + pdata->dac[devnr].slew.step_size =
> + AD5755_SLEW_STEP_SIZE_256;
> + break;
> + default:
> + dev_err(dev,
> + "channel %d slew step size out of range selecting 1 LSB",
> + devnr);
> + pdata->dac[devnr].slew.step_size =
> + AD5755_SLEW_STEP_SIZE_1;
> + }
> + } else {
> + pdata->dac[devnr].slew.enable = false;
> + pdata->dac[devnr].slew.rate = AD5755_SLEW_RATE_64k;
> + pdata->dac[devnr].slew.step_size =
> + AD5755_SLEW_STEP_SIZE_1;
> + }
> + devnr++;
> + }
> +
> + return pdata;
> +
> + error_out:
> + devm_kfree(dev, pdata);
> + return NULL;
> +}
> +#else
> +static
> +struct adf4350_platform_data *adf4350_parse_dt(struct device *dev)
> +{
> + return NULL;
> +}
> +#endif
> +
> static int ad5755_probe(struct spi_device *spi)
> {
> enum ad5755_type type = spi_get_device_id(spi)->driver_data;
> @@ -583,8 +801,15 @@ static int ad5755_probe(struct spi_device *spi)
> indio_dev->modes = INDIO_DIRECT_MODE;
> indio_dev->num_channels = AD5755_NUM_CHANNELS;
>
> - if (!pdata)
> + if (spi->dev.of_node)
> + pdata = ad5755_parse_dt(&spi->dev);
> + else
> + pdata = spi->dev.platform_data;
> +
> + if (!pdata) {
> + dev_warn(&spi->dev, "no platform data? using default\n");
> pdata = &ad5755_default_pdata;
> + }
>
> ret = ad5755_init_channels(indio_dev, pdata);
> if (ret)
>
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2016-03-05 14:32 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-03-01 11:56 [PATCH v4 1/4] iio: ad5755: add support for dt bindings Sean Nyekjaer
[not found] ` <1456833376-29758-1-git-send-email-sean.nyekjaer-rjjw5hvvQKZaa/9Udqfwiw@public.gmane.org>
2016-03-01 11:56 ` [PATCH v4 2/4] iio: ad5755: Add DT binding documentation Sean Nyekjaer
[not found] ` <1456833376-29758-2-git-send-email-sean.nyekjaer-rjjw5hvvQKZaa/9Udqfwiw@public.gmane.org>
2016-03-01 11:56 ` [PATCH v4 3/4] iio: ad5755: added full support for devicetree Sean Nyekjaer
[not found] ` <1456833376-29758-3-git-send-email-sean.nyekjaer-rjjw5hvvQKZaa/9Udqfwiw@public.gmane.org>
2016-03-01 11:56 ` [PATCH v4 4/4] iio: ad5755: Add full DT binding documentation Sean Nyekjaer
[not found] ` <1456833376-29758-4-git-send-email-sean.nyekjaer-rjjw5hvvQKZaa/9Udqfwiw@public.gmane.org>
2016-03-05 4:25 ` Rob Herring
2016-03-05 14:32 ` [PATCH v4 3/4] iio: ad5755: added full support for devicetree Jonathan Cameron
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).