[PATCH v2] pwm: pxa: add device tree support to pwm driver

Mike Dunn mikedunn at newsguy.com
Mon Sep 9 11:37:35 EDT 2013


On 09/08/2013 05:49 PM, Marek Vasut wrote:
> Dear Mike Dunn,
> 
>> This patch adds device tree support to the pxa's pwm driver.  Only an OF
>> match table is added; nothing needs to be extracted from the device tree
>> node.  The existing platform_device id table is reused for the match table
>> data.  Support for inverted polarity is also added.
>>
>> Tested on a Palm Treo 680 (both platform data and DT cases).
>>
>> Signed-off-by: Mike Dunn <mikedunn at newsguy.com>
>> ---
>> Changle log:
>> v2:
>> - of_match_table contains only the "pxa250-pwm" compatible string; require
>> one device instance per pwm
>> - add Documentation/devicetree/bindings/pwm/pxa-pwm.txt
>> - add support for polarity flag in DT and implement set_polarity() method
>>   (the treo 680 inverts the signal between pwm out and backlight)
>> - return -EINVAL instead of -ENODEV if platform data or DT node not found
>> - output dev_info string if platform data missing
>> - expanded CC list of patch
>>
>>  Documentation/devicetree/bindings/pwm/pxa-pwm.txt | 33 +++++++++++++
>>  arch/arm/boot/dts/pxa27x.dtsi                     | 24 ++++++++++
>>  drivers/pwm/pwm-pxa.c                             | 57
>> +++++++++++++++++++++++ 3 files changed, 114 insertions(+)
>>  create mode 100644 Documentation/devicetree/bindings/pwm/pxa-pwm.txt
>>
>> diff --git a/Documentation/devicetree/bindings/pwm/pxa-pwm.txt
>> b/Documentation/devicetree/bindings/pwm/pxa-pwm.txt new file mode 100644
>> index 0000000..7b09bfa
>> --- /dev/null
>> +++ b/Documentation/devicetree/bindings/pwm/pxa-pwm.txt
>> @@ -0,0 +1,33 @@
>> +Marvell pwm controller
>> +
>> +Required properties:
>> +- compatible:
>> +  for pxa25x, pxa27x, pxa168, pxa910: must be compatible =
>> "marvell,pxa250-pwm"; +- reg: physical base address and length of the
>> registers used by the pwm channel +  NB: One device instance must be
>> created for each pwm that is used, so the +  length covers only the
>> register window for one pwm output, not that of the +  entire pwm
>> controller.  Currently length is 0x10 for all supported devices. +-
>> #pwm-cells: should be 3.
>> +   cell 1: the per-chip index of the PWM to use,
>> +   cell 2: the period in nanoseconds,
> 
> Is there no generic OF prop for this?


Yes, all the pwm drivers with DT support have the same definitions for cell 1
and 2.  Many have #pwm-cells=2, but for those with #pwm-cells=3, all define cell
3 the same way also.


> 
>> +   cell 3: flags; set bit 0 to specify inverse polarity.
> 
> Do we not have some generic flag to indicate inverted PWM polarity?


Yes, enum pwm_polarity, defined in include/linux/pwm.h.  The pwm drivers with
polarity support all define cell 3 the same way.  The wording in the bindings
documentation is a little different in each case, but all essentially say the
same thing.  In Documentation/devicetree/bindings/pwm/ see for example
atmel-tcb-pwm.txt and pwm-tiecap.txt.

I'm new to device tree, so maybe I am not understanding correctly this and your
previous question... All DT properties are described as integers lacking any
type (aside from their bit width), no?


> 
> [...]
>  
>> +#ifdef CONFIG_OF
>> +/*
>> + * Device tree users should create one device instance for each pwm
>> channel. + * Hence we dispense with the HAS_SECONDARY_PWM and "tell" the
>> original driver + * code that this is a single channel pxa25x-pwm.
>> + */
> 
> Above ... pxa250-pwm , no ?
> 
>> +static struct of_device_id pwm_of_match[] = {
>> +	{ .compatible = "marvell,pxa250-pwm", .data = &pwm_id_table[0]},
> 
> Surely, data can be NULL, no ?


It could, in which case pxa_pwm_get_id_dt() would explicitly return
&pwm_id_table[0] instead of the .data element of the of_device_id.  Not sure
which way is better and why.  That dumb platform_device_id table is causing all
kinds of nuisance :)


> 
> [...]
> 
>> @@ -145,6 +199,8 @@ static int pwm_probe(struct platform_device *pdev)
>>  	pwm->chip.ops = &pxa_pwm_ops;
>>  	pwm->chip.base = -1;
>>  	pwm->chip.npwm = (id->driver_data & HAS_SECONDARY_PWM) ? 2 : 1;
>> +	pwm->chip.of_xlate = of_pwm_xlate_with_flags;
>> +	pwm->chip.of_pwm_n_cells = 3;
> 
> Are these two settings needed ?


Yes.  See drivers/pwm/core.c:of_pwmchip_add(), where they are set to default
values of of_pwm_simple_xlate and 2 if left uninitialized.


Thanks again Marek,
Mike




More information about the linux-arm-kernel mailing list