* [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
[parent not found: <1456833376-29758-1-git-send-email-sean.nyekjaer-rjjw5hvvQKZaa/9Udqfwiw@public.gmane.org>]
* [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
[parent not found: <1456833376-29758-2-git-send-email-sean.nyekjaer-rjjw5hvvQKZaa/9Udqfwiw@public.gmane.org>]
* [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
[parent not found: <1456833376-29758-3-git-send-email-sean.nyekjaer-rjjw5hvvQKZaa/9Udqfwiw@public.gmane.org>]
* [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
[parent not found: <1456833376-29758-4-git-send-email-sean.nyekjaer-rjjw5hvvQKZaa/9Udqfwiw@public.gmane.org>]
* 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).