linux-pwm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Mike Dunn <mikedunn@newsguy.com>
To: Thierry Reding <thierry.reding@gmail.com>
Cc: Rob Herring <rob.herring@calxeda.com>,
	Pawel Moll <pawel.moll@arm.com>,
	Mark Rutland <mark.rutland@arm.com>,
	Stephen Warren <swarren@wwwdotorg.org>,
	Ian Campbell <ian.campbell@citrix.com>,
	linux-pwm@vger.kernel.org, Grant Likely <grant.likely@linaro.org>,
	Haojian Zhuang <haojian.zhuang@linaro.org>,
	Robert Jarzmik <robert.jarzmik@free.fr>,
	Marek Vasut <marex@denx.de>,
	devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
	Dmitry Torokhov <dmitry.torokhov@gmail.com>,
	Chao Xie <chao.xie@marvell.com>,
	Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
Subject: Re: [PATCH RESEND v5 1/2] PWM: PXA: add device tree support to PWM driver
Date: Thu, 10 Oct 2013 09:58:34 -0700	[thread overview]
Message-ID: <5256DCBA.6020408@newsguy.com> (raw)
In-Reply-To: <20131008131214.GA12839@ulmo.nvidia.com>

On 10/08/2013 06:12 AM, Thierry Reding wrote:
> On Sat, Sep 21, 2013 at 12:19:33PM -0700, Mike Dunn wrote:
>> This patch adds device tree support to the PXA's PWM driver.  Nothing
>> needs to be extracted from the device tree node by the PWM device.
>> Client devices need only specify the period; the per-chip index is
>> implicitly zero because one device node must be present for each PWM
>> output in use.  This approach is more convenient due to the wide
>> variability in the number of PWM channels present across the various PXA
>> variants, and is made possible by the fact that the register sets for
>> each PWM channel are segregated from each other.  An of_xlate() method
>> is added to parse this single-cell node.  The existing ID table is
>> reused for the match table data.
>>
>> Tested on a Palm Treo 680 (both platform data and DT cases).
>>
>> Signed-off-by: Mike Dunn <mikedunn@newsguy.com>
>> ---
>>  Documentation/devicetree/bindings/pwm/pxa-pwm.txt | 30 +++++++++++++
>>  drivers/pwm/pwm-pxa.c                             | 52 ++++++++++++++++++++++-
>>  2 files changed, 81 insertions(+), 1 deletion(-)
>>  create mode 100644 Documentation/devicetree/bindings/pwm/pxa-pwm.txt
> 
> This looks good to me, but I'd like to get an Acked-by: from one of the
> device tree bindings maintainers.
> 
> Thierry


Thanks much Thierry and Stephen for the reviews and advice.  Stephen, are there
any remaining issues with the bindings below?

Thanks again,
Mike


> 
>>
>> diff --git a/Documentation/devicetree/bindings/pwm/pxa-pwm.txt b/Documentation/devicetree/bindings/pwm/pxa-pwm.txt
>> new file mode 100644
>> index 0000000..5ae9f1e
>> --- /dev/null
>> +++ b/Documentation/devicetree/bindings/pwm/pxa-pwm.txt
>> @@ -0,0 +1,30 @@
>> +Marvell PWM controller
>> +
>> +Required properties:
>> +- compatible: should be one or more of:
>> +  - "marvell,pxa250-pwm"
>> +  - "marvell,pxa270-pwm"
>> +  - "marvell,pxa168-pwm"
>> +  - "marvell,pxa910-pwm"
>> +- reg: Physical base address and length of the registers used by the PWM channel
>> +  Note that 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 1.  This cell is used to specify the period in
>> +  nanoseconds.
>> +
>> +Example PWM device node:
>> +
>> +pwm0: pwm@40b00000 {
>> +	compatible = "marvell,pxa250-pwm";
>> +	reg = <0x40b00000 0x10>;
>> +	#pwm-cells = <1>;
>> +};
>> +
>> +Example PWM client node:
>> +
>> +backlight {
>> +	compatible = "pwm-backlight";
>> +	pwms = <&pwm0 5000000>;
>> +	...
>> +}
>> diff --git a/drivers/pwm/pwm-pxa.c b/drivers/pwm/pwm-pxa.c
>> index a4d2164..e928cc8 100644
>> --- a/drivers/pwm/pwm-pxa.c
>> +++ b/drivers/pwm/pwm-pxa.c
>> @@ -19,6 +19,7 @@
>>  #include <linux/clk.h>
>>  #include <linux/io.h>
>>  #include <linux/pwm.h>
>> +#include <linux/of_device.h>
>>  
>>  #include <asm/div64.h>
>>  
>> @@ -124,6 +125,45 @@ static struct pwm_ops pxa_pwm_ops = {
>>  	.owner = THIS_MODULE,
>>  };
>>  
>> +#ifdef CONFIG_OF
>> +/*
>> + * Device tree users must 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.  Currently all devices are
>> + * supported identically.
>> + */
>> +static struct of_device_id pwm_of_match[] = {
>> +	{ .compatible = "marvell,pxa250-pwm", .data = &pwm_id_table[0]},
>> +	{ .compatible = "marvell,pxa270-pwm", .data = &pwm_id_table[0]},
>> +	{ .compatible = "marvell,pxa168-pwm", .data = &pwm_id_table[0]},
>> +	{ .compatible = "marvell,pxa910-pwm", .data = &pwm_id_table[0]},
>> +	{ }
>> +};
>> +MODULE_DEVICE_TABLE(of, pwm_of_match);
>> +#else
>> +static struct of_device_id *pwm_of_match;
>> +#endif
>> +
>> +static const struct platform_device_id *pxa_pwm_get_id_dt(struct device *dev)
>> +{
>> +	const struct of_device_id *id = of_match_device(pwm_of_match, dev);
>> +	return id ? id->data : NULL;
>> +}
>> +
>> +static struct pwm_device *
>> +pxa_pwm_of_xlate(struct pwm_chip *pc, const struct of_phandle_args *args)
>> +{
>> +	struct pwm_device *pwm;
>> +
>> +	pwm = pwm_request_from_chip(pc, 0, NULL);
>> +	if (IS_ERR(pwm))
>> +		return pwm;
>> +
>> +	pwm_set_period(pwm, args->args[0]);
>> +
>> +	return pwm;
>> +}
>> +
>>  static int pwm_probe(struct platform_device *pdev)
>>  {
>>  	const struct platform_device_id *id = platform_get_device_id(pdev);
>> @@ -131,6 +171,12 @@ static int pwm_probe(struct platform_device *pdev)
>>  	struct resource *r;
>>  	int ret = 0;
>>  
>> +	if (IS_ENABLED(CONFIG_OF) && id == NULL)
>> +		id = pxa_pwm_get_id_dt(&pdev->dev);
>> +
>> +	if (id == NULL)
>> +		return -EINVAL;
>> +
>>  	pwm = devm_kzalloc(&pdev->dev, sizeof(*pwm), GFP_KERNEL);
>>  	if (pwm == NULL) {
>>  		dev_err(&pdev->dev, "failed to allocate memory\n");
>> @@ -145,7 +191,10 @@ 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;
>> -
>> +	if (IS_ENABLED(CONFIG_OF)) {
>> +		pwm->chip.of_xlate = pxa_pwm_of_xlate;
>> +		pwm->chip.of_pwm_n_cells = 1;
>> +	}
>>  	r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
>>  	pwm->mmio_base = devm_ioremap_resource(&pdev->dev, r);
>>  	if (IS_ERR(pwm->mmio_base))
>> @@ -176,6 +225,7 @@ static struct platform_driver pwm_driver = {
>>  	.driver		= {
>>  		.name	= "pxa25x-pwm",
>>  		.owner	= THIS_MODULE,
>> +		.of_match_table	= of_match_ptr(pwm_of_match),
>>  	},
>>  	.probe		= pwm_probe,
>>  	.remove		= pwm_remove,
>> -- 
>> 1.8.1.5
>>

  reply	other threads:[~2013-10-10 16:58 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-09-21 19:19 [PATCH RESEND v5 0/2] PWM: PXA: add device tree support to PWM driver Mike Dunn
2013-09-21 19:19 ` [PATCH RESEND v5 1/2] " Mike Dunn
2013-10-08 13:12   ` Thierry Reding
2013-10-10 16:58     ` Mike Dunn [this message]
2013-12-03 10:17   ` Thierry Reding
2013-12-03 18:45     ` Mike Dunn
2013-12-04  1:12       ` Haojian Zhuang
2013-12-04  9:03         ` Thierry Reding
2013-12-04  9:17           ` Haojian Zhuang
2013-12-04  9:21       ` Thierry Reding
2013-12-04 18:21         ` Mike Dunn
2013-09-21 19:19 ` [PATCH RESEND v5 2/2] PXA: add PWM nodes to pxa27x.dtsi Mike Dunn

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5256DCBA.6020408@newsguy.com \
    --to=mikedunn@newsguy.com \
    --cc=chao.xie@marvell.com \
    --cc=devicetree@vger.kernel.org \
    --cc=dmitry.torokhov@gmail.com \
    --cc=grant.likely@linaro.org \
    --cc=haojian.zhuang@linaro.org \
    --cc=ian.campbell@citrix.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-pwm@vger.kernel.org \
    --cc=marex@denx.de \
    --cc=mark.rutland@arm.com \
    --cc=pawel.moll@arm.com \
    --cc=rob.herring@calxeda.com \
    --cc=robert.jarzmik@free.fr \
    --cc=sergei.shtylyov@cogentembedded.com \
    --cc=swarren@wwwdotorg.org \
    --cc=thierry.reding@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).