Commit 3ccb1c17 authored by Tony Prisk's avatar Tony Prisk Committed by Thierry Reding
Browse files

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: default avatarTony Prisk <linux@prisktech.co.nz>
Signed-off-by: default avatarThierry Reding <thierry.reding@avionic-design.de>
parent 8ab432ca
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -3,14 +3,17 @@ 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 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 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.
- clocks: phandle to the PWM source clock

Example:

pwm1: pwm@d8220000 {
	#pwm-cells = <2>;
	#pwm-cells = <3>;
	compatible = "via,vt8500-pwm";
	reg = <0xd8220000 0x1000>;
	clocks = <&clkpwm>;
+23 −0
Original line number Diff line number Diff line
@@ -164,10 +164,31 @@ static void vt8500_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)
	clk_disable(vt8500->clk);
}

static int vt8500_pwm_set_polarity(struct pwm_chip *chip,
				   struct pwm_device *pwm,
				   enum pwm_polarity polarity)
{
	struct vt8500_chip *vt8500 = to_vt8500_chip(chip);
	u32 val;

	val = readl(vt8500->base + REG_CTRL(pwm->hwpwm));

	if (polarity == PWM_POLARITY_INVERSED)
		val |= CTRL_INVERT;
	else
		val &= ~CTRL_INVERT;

	writel(val, vt8500->base + REG_CTRL(pwm->hwpwm));
	pwm_busy_wait(vt8500, pwm->hwpwm, STATUS_CTRL_UPDATE);

	return 0;
}

static struct pwm_ops vt8500_pwm_ops = {
	.enable = vt8500_pwm_enable,
	.disable = vt8500_pwm_disable,
	.config = vt8500_pwm_config,
	.set_polarity = vt8500_pwm_set_polarity,
	.owner = THIS_MODULE,
};

@@ -197,6 +218,8 @@ static int vt8500_pwm_probe(struct platform_device *pdev)

	chip->chip.dev = &pdev->dev;
	chip->chip.ops = &vt8500_pwm_ops;
	chip->chip.of_xlate = of_pwm_xlate_with_flags;
	chip->chip.of_pwm_n_cells = 3;
	chip->chip.base = -1;
	chip->chip.npwm = VT8500_NR_PWMS;