Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

pwm: vt8500: Add polarity support

Add support to set polarity on PWM devices, allowing for inverted
duty cycles.

Also update the binding document to #pwm-cells = <3> to allow
passing the flags from devicetree.

Signed-off-by: Tony Prisk <linux@prisktech.co.nz>
Signed-off-by: Thierry Reding <thierry.reding@avionic-design.de>

authored by

Tony Prisk and committed by
Thierry Reding
3ccb1c17 8ab432ca

+29 -3
+6 -3
Documentation/devicetree/bindings/pwm/vt8500-pwm.txt
··· 3 3 Required properties: 4 4 - compatible: should be "via,vt8500-pwm" 5 5 - reg: physical base address and length of the controller's registers 6 - - #pwm-cells: should be 2. The first cell specifies the per-chip index 7 - of the PWM to use and the second cell is the period in nanoseconds. 6 + - #pwm-cells: Should be 3. Number of cells being used to specify PWM property. 7 + First cell specifies the per-chip index of the PWM to use, the second 8 + cell is the period in nanoseconds and bit 0 in the third cell is used to 9 + encode the polarity of PWM output. Set bit 0 of the third in PWM specifier 10 + to 1 for inverse polarity & set to 0 for normal polarity. 8 11 - clocks: phandle to the PWM source clock 9 12 10 13 Example: 11 14 12 15 pwm1: pwm@d8220000 { 13 - #pwm-cells = <2>; 16 + #pwm-cells = <3>; 14 17 compatible = "via,vt8500-pwm"; 15 18 reg = <0xd8220000 0x1000>; 16 19 clocks = <&clkpwm>;
+23
drivers/pwm/pwm-vt8500.c
··· 164 164 clk_disable(vt8500->clk); 165 165 } 166 166 167 + static int vt8500_pwm_set_polarity(struct pwm_chip *chip, 168 + struct pwm_device *pwm, 169 + enum pwm_polarity polarity) 170 + { 171 + struct vt8500_chip *vt8500 = to_vt8500_chip(chip); 172 + u32 val; 173 + 174 + val = readl(vt8500->base + REG_CTRL(pwm->hwpwm)); 175 + 176 + if (polarity == PWM_POLARITY_INVERSED) 177 + val |= CTRL_INVERT; 178 + else 179 + val &= ~CTRL_INVERT; 180 + 181 + writel(val, vt8500->base + REG_CTRL(pwm->hwpwm)); 182 + pwm_busy_wait(vt8500, pwm->hwpwm, STATUS_CTRL_UPDATE); 183 + 184 + return 0; 185 + } 186 + 167 187 static struct pwm_ops vt8500_pwm_ops = { 168 188 .enable = vt8500_pwm_enable, 169 189 .disable = vt8500_pwm_disable, 170 190 .config = vt8500_pwm_config, 191 + .set_polarity = vt8500_pwm_set_polarity, 171 192 .owner = THIS_MODULE, 172 193 }; 173 194 ··· 218 197 219 198 chip->chip.dev = &pdev->dev; 220 199 chip->chip.ops = &vt8500_pwm_ops; 200 + chip->chip.of_xlate = of_pwm_xlate_with_flags; 201 + chip->chip.of_pwm_n_cells = 3; 221 202 chip->chip.base = -1; 222 203 chip->chip.npwm = VT8500_NR_PWMS; 223 204