| From 88e52bb403941d0a0c4bdcd8788b2e0175054143 Mon Sep 17 00:00:00 2001 |
| From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> |
| Date: Fri, 26 Jul 2013 00:27:41 +0200 |
| Subject: pwm: renesas-tpu: Add DT support |
| |
| Specify DT bindings for the TPU PWM controller and add OF support to the |
| driver. |
| |
| Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> |
| Acked-by: Stephen Warren <swarren@nvidia.com> |
| Signed-off-by: Thierry Reding <thierry.reding@gmail.com> |
| (cherry picked from commit 382457e562bbb1ea7d94923e58fcbac9e981ff18) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| .../devicetree/bindings/pwm/renesas,tpu-pwm.txt | 28 +++++++++++++++ |
| drivers/pwm/pwm-renesas-tpu.c | 41 ++++++++++++++++++---- |
| 2 files changed, 62 insertions(+), 7 deletions(-) |
| create mode 100644 Documentation/devicetree/bindings/pwm/renesas,tpu-pwm.txt |
| |
| diff --git a/Documentation/devicetree/bindings/pwm/renesas,tpu-pwm.txt b/Documentation/devicetree/bindings/pwm/renesas,tpu-pwm.txt |
| new file mode 100644 |
| index 00000000..b067e84a |
| --- /dev/null |
| +++ b/Documentation/devicetree/bindings/pwm/renesas,tpu-pwm.txt |
| @@ -0,0 +1,28 @@ |
| +* Renesas R-Car Timer Pulse Unit PWM Controller |
| + |
| +Required Properties: |
| + |
| + - compatible: should be one of the following. |
| + - "renesas,tpu-r8a73a4": for R8A77A4 (R-Mobile APE6) compatible PWM controller. |
| + - "renesas,tpu-r8a7740": for R8A7740 (R-Mobile A1) compatible PWM controller. |
| + - "renesas,tpu-r8a7790": for R8A7790 (R-Car H2) compatible PWM controller. |
| + - "renesas,tpu-sh7372": for SH7372 (SH-Mobile AP4) compatible PWM controller. |
| + - "renesas,tpu": for generic R-Car TPU PWM controller. |
| + |
| + - reg: Base address and length of each memory resource used by the PWM |
| + controller hardware module. |
| + |
| + - #pwm-cells: should be 3. See pwm.txt in this directory for a description of |
| + the cells format. The only third cell flag supported by this binding is |
| + PWM_POLARITY_INVERTED. |
| + |
| +Please refer to pwm.txt in this directory for details of the common PWM bindings |
| +used by client devices. |
| + |
| +Example: R8A7740 (R-Car A1) TPU controller node |
| + |
| + tpu: pwm@e6600000 { |
| + compatible = "renesas,tpu-r8a7740", "renesas,tpu"; |
| + reg = <0xe6600000 0x100>; |
| + #pwm-cells = <3>; |
| + }; |
| diff --git a/drivers/pwm/pwm-renesas-tpu.c b/drivers/pwm/pwm-renesas-tpu.c |
| index 26008927..3eeffff6 100644 |
| --- a/drivers/pwm/pwm-renesas-tpu.c |
| +++ b/drivers/pwm/pwm-renesas-tpu.c |
| @@ -20,6 +20,7 @@ |
| #include <linux/ioport.h> |
| #include <linux/module.h> |
| #include <linux/mutex.h> |
| +#include <linux/of.h> |
| #include <linux/platform_data/pwm-renesas-tpu.h> |
| #include <linux/platform_device.h> |
| #include <linux/pm_runtime.h> |
| @@ -86,7 +87,7 @@ struct tpu_pwm_device { |
| |
| struct tpu_device { |
| struct platform_device *pdev; |
| - struct tpu_pwm_platform_data *pdata; |
| + enum pwm_polarity polarities[TPU_CHANNEL_MAX]; |
| struct pwm_chip chip; |
| spinlock_t lock; |
| |
| @@ -228,8 +229,7 @@ static int tpu_pwm_request(struct pwm_chip *chip, struct pwm_device *_pwm) |
| |
| pwm->tpu = tpu; |
| pwm->channel = _pwm->hwpwm; |
| - pwm->polarity = tpu->pdata ? tpu->pdata->channels[pwm->channel].polarity |
| - : PWM_POLARITY_NORMAL; |
| + pwm->polarity = tpu->polarities[pwm->channel]; |
| pwm->prescaler = 0; |
| pwm->period = 0; |
| pwm->duty = 0; |
| @@ -388,6 +388,16 @@ static const struct pwm_ops tpu_pwm_ops = { |
| * Probe and remove |
| */ |
| |
| +static void tpu_parse_pdata(struct tpu_device *tpu) |
| +{ |
| + struct tpu_pwm_platform_data *pdata = tpu->pdev->dev.platform_data; |
| + unsigned int i; |
| + |
| + for (i = 0; i < ARRAY_SIZE(tpu->polarities); ++i) |
| + tpu->polarities[i] = pdata ? pdata->channels[i].polarity |
| + : PWM_POLARITY_NORMAL; |
| +} |
| + |
| static int tpu_probe(struct platform_device *pdev) |
| { |
| struct tpu_device *tpu; |
| @@ -400,7 +410,11 @@ static int tpu_probe(struct platform_device *pdev) |
| return -ENOMEM; |
| } |
| |
| - tpu->pdata = pdev->dev.platform_data; |
| + spin_lock_init(&tpu->lock); |
| + tpu->pdev = pdev; |
| + |
| + /* Initialize device configuration from platform data. */ |
| + tpu_parse_pdata(tpu); |
| |
| /* Map memory, get clock and pin control. */ |
| res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| @@ -422,11 +436,10 @@ static int tpu_probe(struct platform_device *pdev) |
| /* Initialize and register the device. */ |
| platform_set_drvdata(pdev, tpu); |
| |
| - spin_lock_init(&tpu->lock); |
| - tpu->pdev = pdev; |
| - |
| tpu->chip.dev = &pdev->dev; |
| tpu->chip.ops = &tpu_pwm_ops; |
| + tpu->chip.of_xlate = of_pwm_xlate_with_flags; |
| + tpu->chip.of_pwm_n_cells = 3; |
| tpu->chip.base = -1; |
| tpu->chip.npwm = TPU_CHANNEL_MAX; |
| |
| @@ -457,12 +470,26 @@ static int tpu_remove(struct platform_device *pdev) |
| return 0; |
| } |
| |
| +#ifdef CONFIG_OF |
| +static const struct of_device_id tpu_of_table[] = { |
| + { .compatible = "renesas,tpu-r8a73a4", }, |
| + { .compatible = "renesas,tpu-r8a7740", }, |
| + { .compatible = "renesas,tpu-r8a7790", }, |
| + { .compatible = "renesas,tpu-sh7372", }, |
| + { .compatible = "renesas,tpu", }, |
| + { }, |
| +}; |
| + |
| +MODULE_DEVICE_TABLE(of, tpu_of_table); |
| +#endif |
| + |
| static struct platform_driver tpu_driver = { |
| .probe = tpu_probe, |
| .remove = tpu_remove, |
| .driver = { |
| .name = "renesas-tpu-pwm", |
| .owner = THIS_MODULE, |
| + .of_match_table = of_match_ptr(tpu_of_table), |
| } |
| }; |
| |
| -- |
| 1.8.4.3.gca3854a |
| |