]> Pileus Git - ~andy/linux/commitdiff
Merge tag 'for-3.12-rc1' of git://gitorious.org/linux-pwm/linux-pwm
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 4 Sep 2013 04:15:23 +0000 (21:15 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 4 Sep 2013 04:15:23 +0000 (21:15 -0700)
Pull pwm changes from Thierry Reding:
 "A set of patches makes the device tree documentation for the various
  PWM drivers more consistent.  Device tree support is added to the
  Renesas TPU driver.  The sysfs interface now makes use of dev_groups.
  Other than that there is a healthy assortment of fixes and
  enhancements for minor issues that have shown up"

* tag 'for-3.12-rc1' of git://gitorious.org/linux-pwm/linux-pwm:
  pwm: pxa: Use module_platform_driver
  pwm: tiehrpwm: add missing __iomem annotation
  pwm: tiecap: add CONFIG_PM_SLEEP to ecap_pwm_{save,restore}_context()
  pwm: simplify use of devm_ioremap_resource
  pwm: renesas-tpu: Add DT support
  ARM: dts: Use the PWM polarity flags
  pwm: Update DT bindings to reference pwm.txt for cells documentation
  pwm: Use the DT macro directly when parsing PWM DT flags
  pwm: Add PWM polarity flag macro for DT
  pwm: mxs: Check the return value from stmp_reset_block()
  pwm: convert class code to use dev_groups

26 files changed:
Documentation/devicetree/bindings/pwm/atmel-tcb-pwm.txt
Documentation/devicetree/bindings/pwm/imx-pwm.txt
Documentation/devicetree/bindings/pwm/mxs-pwm.txt
Documentation/devicetree/bindings/pwm/nvidia,tegra20-pwm.txt
Documentation/devicetree/bindings/pwm/nxp,pca9685-pwm.txt
Documentation/devicetree/bindings/pwm/pwm-samsung.txt
Documentation/devicetree/bindings/pwm/pwm-tiecap.txt
Documentation/devicetree/bindings/pwm/pwm-tiehrpwm.txt
Documentation/devicetree/bindings/pwm/pwm.txt
Documentation/devicetree/bindings/pwm/renesas,tpu-pwm.txt [new file with mode: 0644]
Documentation/devicetree/bindings/pwm/spear-pwm.txt
Documentation/devicetree/bindings/pwm/ti,twl-pwm.txt
Documentation/devicetree/bindings/pwm/ti,twl-pwmled.txt
Documentation/devicetree/bindings/pwm/vt8500-pwm.txt
arch/arm/boot/dts/am335x-evmsk.dts
arch/arm/boot/dts/wm8850-w70v2.dts
drivers/pwm/core.c
drivers/pwm/pwm-lpc32xx.c
drivers/pwm/pwm-mxs.c
drivers/pwm/pwm-pxa.c
drivers/pwm/pwm-renesas-tpu.c
drivers/pwm/pwm-spear.c
drivers/pwm/pwm-tiecap.c
drivers/pwm/pwm-tiehrpwm.c
drivers/pwm/sysfs.c
include/dt-bindings/pwm/pwm.h [new file with mode: 0644]

index de0eaed866514536d8bb3e88c98a33061fd4fb2f..8031148bcf85ad7a8f516d6b985d0c0493c8ae27 100644 (file)
@@ -2,11 +2,9 @@ Atmel TCB PWM controller
 
 Required properties:
 - compatible: should be "atmel,tcb-pwm"
-- #pwm-cells: Should be 3.  The first cell specifies the per-chip index
-  of the PWM to use, the second cell is the period in nanoseconds and
-  bit 0 in the third cell is used to encode the polarity of PWM output.
-  Set bit 0 of the third cell in PWM specifier to 1 for inverse polarity &
-  set to 0 for normal polarity.
+- #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.
 - tc-block: The Timer Counter block to use as a PWM chip.
 
 Example:
index 8522bfbccfd79f3bdd40306d2cf9650ce08edc6b..b50d7a6d9d7f88ca00524533981c44726e860d3f 100644 (file)
@@ -3,8 +3,8 @@ Freescale i.MX PWM controller
 Required properties:
 - compatible: should be "fsl,<soc>-pwm"
 - reg: physical base address and length of the controller's registers
-- #pwm-cells: should be 2.  The first cell specifies the per-chip index
-  of the PWM to use and the second cell is the period in nanoseconds.
+- #pwm-cells: should be 2. See pwm.txt in this directory for a description of
+  the cells format.
 - interrupts: The interrupt for the pwm controller
 
 Example:
index 9e3f8f1d46a26642577177806d5f94f2db2b91a1..96cdde5f6208eb1817a7cba95fdba96b5dc3beaa 100644 (file)
@@ -3,8 +3,8 @@ Freescale MXS PWM controller
 Required properties:
 - compatible: should be "fsl,imx23-pwm"
 - reg: physical base address and length of the controller's registers
-- #pwm-cells: should be 2.  The first cell specifies the per-chip index
-  of the PWM to use and the second cell is the period in nanoseconds.
+- #pwm-cells: should be 2. See pwm.txt in this directory for a description of
+  the cells format.
 - fsl,pwm-number: the number of PWM devices
 
 Example:
index 01438ecd6628b80920dba8c783483dc94320373b..c3fc57af877260e5f25ca1290e1ca333895d9bdd 100644 (file)
@@ -5,9 +5,8 @@ Required properties:
   - "nvidia,tegra20-pwm"
   - "nvidia,tegra30-pwm"
 - reg: physical base address and length of the controller's registers
-- #pwm-cells: On Tegra the number of cells used to specify a PWM is 2. The
-  first cell specifies the per-chip index of the PWM to use and the second
-  cell is the period in nanoseconds.
+- #pwm-cells: should be 2. See pwm.txt in this directory for a description of
+  the cells format.
 
 Example:
 
index 1e3dfe7a4894c7ac44752b9edb5a15befdad21ba..f84ec9d291ea885d8d30045c3093876fa4b0e455 100644 (file)
@@ -3,8 +3,8 @@ NXP PCA9685 16-channel 12-bit PWM LED controller
 
 Required properties:
   - compatible: "nxp,pca9685-pwm"
-  - #pwm-cells: should be 2. The first cell specifies the per-chip index
-    of the PWM to use and the second cell is the period in nanoseconds.
+  - #pwm-cells: Should be 2. See pwm.txt in this directory for a description of
+    the cells format.
     The index 16 is the ALLCALL channel, that sets all PWM channels at the same
     time.
 
index ac67c687a3274e3cdffa7219484f24b73761e705..4caa1a78863e088415ca6af4ebd756f354ab3455 100644 (file)
@@ -19,13 +19,9 @@ Required properties:
 - reg: base address and size of register area
 - interrupts: list of timer interrupts (one interrupt per timer, starting at
   timer 0)
-- #pwm-cells: number of cells used for PWM specifier - must be 3
-   the specifier format is as follows:
-     - phandle to PWM controller node
-     - index of PWM channel (from 0 to 4)
-     - PWM signal period in nanoseconds
-     - bitmask of optional PWM flags:
-        0x1 - invert PWM signal
+- #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.
 
 Optional properties:
 - samsung,pwm-outputs: list of PWM channels used as PWM outputs on particular
index 681afad737785a8b1e8d4a47f33e13d28a04704a..fb81179dce3781a0da0d11295ff80e79d0b96ad3 100644 (file)
@@ -4,11 +4,9 @@ Required properties:
 - compatible: Must be "ti,<soc>-ecap".
   for am33xx - compatible = "ti,am33xx-ecap";
   for da850  - compatible = "ti,da850-ecap", "ti,am33xx-ecap";
-- #pwm-cells: Should be 3. Number of cells being used to specify PWM property.
-  First cell specifies the per-chip index of the PWM to use, the second
-  cell is the period in nanoseconds and bit 0 in the third cell is used to
-  encode the polarity of PWM output. Set bit 0 of the third in PWM specifier
-  to 1 for inverse polarity & set to 0 for normal polarity.
+- #pwm-cells: should be 3. See pwm.txt in this directory for a description of
+  the cells format. The PWM channel index ranges from 0 to 4. The only third
+  cell flag supported by this binding is PWM_POLARITY_INVERTED.
 - reg: physical base address and size of the registers map.
 
 Optional properties:
index 337c6fc65d3f8f0afbc8d79236bb49c4b58dc029..9c100b2c5b23c4731cc886b363330b6c1c588f36 100644 (file)
@@ -4,11 +4,9 @@ Required properties:
 - compatible: Must be "ti,<soc>-ehrpwm".
   for am33xx - compatible = "ti,am33xx-ehrpwm";
   for da850  - compatible = "ti,da850-ehrpwm", "ti,am33xx-ehrpwm";
-- #pwm-cells: Should be 3. Number of cells being used to specify PWM property.
-  First cell specifies the per-chip index of the PWM to use, the second
-  cell is the period in nanoseconds and bit 0 in the third cell is used to
-  encode the polarity of PWM output. Set bit 0 of the third in PWM specifier
-  to 1 for inverse polarity & set to 0 for normal polarity.
+- #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.
 - reg: physical base address and size of the registers map.
 
 Optional properties:
index 06e67247859aa7eef3bc253d11cf6f18ca810680..8556263b85026af7943d957659b74bc1ae2c0d23 100644 (file)
@@ -43,13 +43,14 @@ because the name "backlight" would be used as fallback anyway.
 pwm-specifier typically encodes the chip-relative PWM number and the PWM
 period in nanoseconds.
 
-Optionally, the pwm-specifier can encode a number of flags in a third cell:
-- bit 0: PWM signal polarity (0: normal polarity, 1: inverse polarity)
+Optionally, the pwm-specifier can encode a number of flags (defined in
+<dt-bindings/pwm/pwm.h>) in a third cell:
+- PWM_POLARITY_INVERTED: invert the PWM signal polarity
 
 Example with optional PWM specifier for inverse polarity
 
        bl: backlight {
-               pwms = <&pwm 0 5000000 1>;
+               pwms = <&pwm 0 5000000 PWM_POLARITY_INVERTED>;
                pwm-names = "backlight";
        };
 
diff --git a/Documentation/devicetree/bindings/pwm/renesas,tpu-pwm.txt b/Documentation/devicetree/bindings/pwm/renesas,tpu-pwm.txt
new file mode 100644 (file)
index 0000000..b067e84
--- /dev/null
@@ -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>;
+       };
index 3ac779d833869561f09a81218382f2def0623bf8..b486de2c3fe31b92c128e1bef22a4c4f9eff6e66 100644 (file)
@@ -5,9 +5,8 @@ Required properties:
   - "st,spear320-pwm"
   - "st,spear1340-pwm"
 - reg: physical base address and length of the controller's registers
-- #pwm-cells: number of cells used to specify PWM which is fixed to 2 on
-  SPEAr. The first cell specifies the per-chip index of the PWM to use and
-  the second cell is the period in nanoseconds.
+- #pwm-cells: should be 2. See pwm.txt in this directory for a description of
+  the cells format.
 
 Example:
 
index 2943ee5fce00e71b4b1f83b740bc040021333f01..4e32bee11201b6a968ef89f3dc547df45c0fc47b 100644 (file)
@@ -6,8 +6,8 @@ On TWL6030 series: PWM0 and PWM1
 
 Required properties:
 - compatible: "ti,twl4030-pwm" or "ti,twl6030-pwm"
-- #pwm-cells: should be 2.  The first cell specifies the per-chip index
-  of the PWM to use and the second cell is the period in nanoseconds.
+- #pwm-cells: should be 2. See pwm.txt in this directory for a description of
+  the cells format.
 
 Example:
 
index cb64f3acc10f4b0e124503b6d47ff3e2851503b7..9f4b460907827909f012ec4e36ddbbaf44cc1369 100644 (file)
@@ -6,8 +6,8 @@ On TWL6030 series: LED PWM (mainly used as charging indicator LED)
 
 Required properties:
 - compatible: "ti,twl4030-pwmled" or "ti,twl6030-pwmled"
-- #pwm-cells: should be 2.  The first cell specifies the per-chip index
-  of the PWM to use and the second cell is the period in nanoseconds.
+- #pwm-cells: should be 2. See pwm.txt in this directory for a description of
+  the cells format.
 
 Example:
 
index d21d82d29855cded82dfc6caf00482745c2a26c3..a76390e6df2efb63bafbd6376b56557eb89958c9 100644 (file)
@@ -3,11 +3,9 @@ VIA/Wondermedia VT8500/WM8xxx series SoC PWM controller
 Required properties:
 - compatible: should be "via,vt8500-pwm"
 - reg: physical base address and length of the controller's registers
-- #pwm-cells: Should be 3. Number of cells being used to specify PWM property.
-  First cell specifies the per-chip index of the PWM to use, the second
-  cell is the period in nanoseconds and bit 0 in the third cell is used to
-  encode the polarity of PWM output. Set bit 0 of the third in PWM specifier
-  to 1 for inverse polarity & set to 0 for normal polarity.
+- #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.
 - clocks: phandle to the PWM source clock
 
 Example:
index a6c5033be442293721e4c615d61ef4e47198984d..4f339fa91c5772b7eaaa4c9a306a1d6808387765 100644 (file)
@@ -14,6 +14,7 @@
 /dts-v1/;
 
 #include "am33xx.dtsi"
+#include <dt-bindings/pwm/pwm.h>
 
 / {
        model = "TI AM335x EVM-SK";
 
        backlight {
                compatible = "pwm-backlight";
-               pwms = <&ecap2 0 50000 1>;
+               pwms = <&ecap2 0 50000 PWM_POLARITY_INVERTED>;
                brightness-levels = <0 58 61 66 75 90 125 170 255>;
                default-brightness-level = <8>;
        };
index 90e913fb64be39c62c34b1e18f975333510a3758..7a563d2523b02805c84e8521984bf451601dffc9 100644 (file)
 
 /dts-v1/;
 /include/ "wm8850.dtsi"
+#include <dt-bindings/pwm/pwm.h>
 
 / {
        model = "Wondermedia WM8850-W70v2 Tablet";
 
        backlight {
                compatible = "pwm-backlight";
-               pwms = <&pwm 0 50000 1>;        /* duty inverted */
+               pwms = <&pwm 0 50000 PWM_POLARITY_INVERTED>;
 
                brightness-levels = <0 40 60 80 100 130 190 255>;
                default-brightness-level = <5>;
index dfbfbc5217683de697d1c834f73c55de0ff850de..2ca95042a0b93bbe80289675f9aafe36e64031cc 100644 (file)
 #include <linux/debugfs.h>
 #include <linux/seq_file.h>
 
-#define MAX_PWMS 1024
+#include <dt-bindings/pwm/pwm.h>
 
-/* flags in the third cell of the DT PWM specifier */
-#define PWM_SPEC_POLARITY      (1 << 0)
+#define MAX_PWMS 1024
 
 static DEFINE_MUTEX(pwm_lookup_lock);
 static LIST_HEAD(pwm_lookup_list);
@@ -149,7 +148,7 @@ of_pwm_xlate_with_flags(struct pwm_chip *pc, const struct of_phandle_args *args)
 
        pwm_set_period(pwm, args->args[1]);
 
-       if (args->args[2] & PWM_SPEC_POLARITY)
+       if (args->args[2] & PWM_POLARITY_INVERTED)
                pwm_set_polarity(pwm, PWM_POLARITY_INVERSED);
        else
                pwm_set_polarity(pwm, PWM_POLARITY_NORMAL);
index efb6c7bf8750f0ffc8f31e956e1fbdaff8358e6b..efac99e03d57191c2d8667264cff0a5e8a603dbe 100644 (file)
@@ -124,9 +124,6 @@ static int lpc32xx_pwm_probe(struct platform_device *pdev)
                return -ENOMEM;
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!res)
-               return -EINVAL;
-
        lpc32xx->base = devm_ioremap_resource(&pdev->dev, res);
        if (IS_ERR(lpc32xx->base))
                return PTR_ERR(lpc32xx->base);
index 2c77b81da7c4a7fb50c70f94904ad5312a791a85..c2c5a4fd1b96bb4eede5bdd553911e3da66dee5e 100644 (file)
@@ -161,9 +161,15 @@ static int mxs_pwm_probe(struct platform_device *pdev)
 
        platform_set_drvdata(pdev, mxs);
 
-       stmp_reset_block(mxs->base);
+       ret = stmp_reset_block(mxs->base);
+       if (ret)
+               goto pwm_remove;
 
        return 0;
+
+pwm_remove:
+       pwmchip_remove(&mxs->chip);
+       return ret;
 }
 
 static int mxs_pwm_remove(struct platform_device *pdev)
index dc9717551d395be96800008bdee1f2379b04759a..a4d2164aaf55836cc662784f1e9a6f071e6d8be5 100644 (file)
@@ -182,16 +182,6 @@ static struct platform_driver pwm_driver = {
        .id_table       = pwm_id_table,
 };
 
-static int __init pwm_init(void)
-{
-       return platform_driver_register(&pwm_driver);
-}
-arch_initcall(pwm_init);
-
-static void __exit pwm_exit(void)
-{
-       platform_driver_unregister(&pwm_driver);
-}
-module_exit(pwm_exit);
+module_platform_driver(pwm_driver);
 
 MODULE_LICENSE("GPL v2");
index 2600892782c13eded21d810077485150521da55e..aff6ba9b49e7b4b3bac9d566af39f01c6136b6bb 100644 (file)
@@ -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,15 +410,14 @@ 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);
-       if (!res) {
-               dev_err(&pdev->dev, "failed to get I/O memory\n");
-               return -ENXIO;
-       }
-
        tpu->base = devm_ioremap_resource(&pdev->dev, res);
        if (IS_ERR(tpu->base))
                return PTR_ERR(tpu->base);
@@ -422,11 +431,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 +465,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),
        }
 };
 
index a54d21401431d6caeb06b7ecd75da5b15c02fbfe..8ad26b8bf4189deff46af5844b1f5c65ad21d0ff 100644 (file)
@@ -178,18 +178,13 @@ static int spear_pwm_probe(struct platform_device *pdev)
        int ret;
        u32 val;
 
-       r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!r) {
-               dev_err(&pdev->dev, "no memory resources defined\n");
-               return -ENODEV;
-       }
-
        pc = devm_kzalloc(&pdev->dev, sizeof(*pc), GFP_KERNEL);
        if (!pc) {
                dev_err(&pdev->dev, "failed to allocate memory\n");
                return -ENOMEM;
        }
 
+       r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        pc->mmio_base = devm_ioremap_resource(&pdev->dev, r);
        if (IS_ERR(pc->mmio_base))
                return PTR_ERR(pc->mmio_base);
index 72ca42dfa733312e408f155db136d81eb1822ace..c2e2e5852362afbd62a8c097fb195ea92433cf15 100644 (file)
@@ -290,6 +290,7 @@ static int ecap_pwm_remove(struct platform_device *pdev)
        return pwmchip_remove(&pc->chip);
 }
 
+#ifdef CONFIG_PM_SLEEP
 static void ecap_pwm_save_context(struct ecap_pwm_chip *pc)
 {
        pm_runtime_get_sync(pc->chip.dev);
@@ -306,7 +307,6 @@ static void ecap_pwm_restore_context(struct ecap_pwm_chip *pc)
        writew(pc->ctx.ecctl2, pc->mmio_base + ECCTL2);
 }
 
-#ifdef CONFIG_PM_SLEEP
 static int ecap_pwm_suspend(struct device *dev)
 {
        struct ecap_pwm_chip *pc = dev_get_drvdata(dev);
index aa4c5586f53b1c2d11eab6541d256b5ccd812a9b..084f552465322654f9f3b7e0a765926ff8bd49fd 100644 (file)
@@ -139,17 +139,17 @@ static inline struct ehrpwm_pwm_chip *to_ehrpwm_pwm_chip(struct pwm_chip *chip)
        return container_of(chip, struct ehrpwm_pwm_chip, chip);
 }
 
-static u16 ehrpwm_read(void *base, int offset)
+static u16 ehrpwm_read(void __iomem *base, int offset)
 {
        return readw(base + offset);
 }
 
-static void ehrpwm_write(void *base, int offset, unsigned int val)
+static void ehrpwm_write(void __iomem *base, int offset, unsigned int val)
 {
        writew(val & 0xFFFF, base + offset);
 }
 
-static void ehrpwm_modify(void *base, int offset,
+static void ehrpwm_modify(void __iomem *base, int offset,
                unsigned short mask, unsigned short val)
 {
        unsigned short regval;
index 8ca5de316d3b02856881a6af29ce879ed6d141f6..8c20332d4825810a366e3af07b1d8831617d1951 100644 (file)
@@ -268,6 +268,7 @@ static ssize_t pwm_export_store(struct device *parent,
 
        return ret ? : len;
 }
+static DEVICE_ATTR(export, 0200, NULL, pwm_export_store);
 
 static ssize_t pwm_unexport_store(struct device *parent,
                                  struct device_attribute *attr,
@@ -288,27 +289,29 @@ static ssize_t pwm_unexport_store(struct device *parent,
 
        return ret ? : len;
 }
+static DEVICE_ATTR(unexport, 0200, NULL, pwm_unexport_store);
 
-static ssize_t pwm_npwm_show(struct device *parent,
-                            struct device_attribute *attr,
-                            char *buf)
+static ssize_t npwm_show(struct device *parent, struct device_attribute *attr,
+                        char *buf)
 {
        const struct pwm_chip *chip = dev_get_drvdata(parent);
 
        return sprintf(buf, "%u\n", chip->npwm);
 }
+static DEVICE_ATTR_RO(npwm);
 
-static struct device_attribute pwm_chip_attrs[] = {
-       __ATTR(export, 0200, NULL, pwm_export_store),
-       __ATTR(unexport, 0200, NULL, pwm_unexport_store),
-       __ATTR(npwm, 0444, pwm_npwm_show, NULL),
-       __ATTR_NULL,
+static struct attribute *pwm_chip_attrs[] = {
+       &dev_attr_export.attr,
+       &dev_attr_unexport.attr,
+       &dev_attr_npwm.attr,
+       NULL,
 };
+ATTRIBUTE_GROUPS(pwm_chip);
 
 static struct class pwm_class = {
        .name           = "pwm",
        .owner          = THIS_MODULE,
-       .dev_attrs      = pwm_chip_attrs,
+       .dev_groups     = pwm_chip_groups,
 };
 
 static int pwmchip_sysfs_match(struct device *parent, const void *data)
diff --git a/include/dt-bindings/pwm/pwm.h b/include/dt-bindings/pwm/pwm.h
new file mode 100644 (file)
index 0000000..96f49e8
--- /dev/null
@@ -0,0 +1,14 @@
+/*
+ * This header provides constants for most PWM bindings.
+ *
+ * Most PWM bindings can include a flags cell as part of the PWM specifier.
+ * In most cases, the format of the flags cell uses the standard values
+ * defined in this header.
+ */
+
+#ifndef _DT_BINDINGS_PWM_PWM_H
+#define _DT_BINDINGS_PWM_PWM_H
+
+#define PWM_POLARITY_INVERTED                  (1 << 0)
+
+#endif