mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-30 22:26:55 +00:00
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>
This commit is contained in:
parent
8ab432caa4
commit
3ccb1c1702
2 changed files with 29 additions and 3 deletions
|
@ -3,14 +3,17 @@ VIA/Wondermedia VT8500/WM8xxx series SoC PWM controller
|
||||||
Required properties:
|
Required properties:
|
||||||
- compatible: should be "via,vt8500-pwm"
|
- compatible: should be "via,vt8500-pwm"
|
||||||
- reg: physical base address and length of the controller's registers
|
- reg: physical base address and length of the controller's registers
|
||||||
- #pwm-cells: should be 2. The first cell specifies the per-chip index
|
- #pwm-cells: Should be 3. Number of cells being used to specify PWM property.
|
||||||
of the PWM to use and the second cell is the period in nanoseconds.
|
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
|
- clocks: phandle to the PWM source clock
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
pwm1: pwm@d8220000 {
|
pwm1: pwm@d8220000 {
|
||||||
#pwm-cells = <2>;
|
#pwm-cells = <3>;
|
||||||
compatible = "via,vt8500-pwm";
|
compatible = "via,vt8500-pwm";
|
||||||
reg = <0xd8220000 0x1000>;
|
reg = <0xd8220000 0x1000>;
|
||||||
clocks = <&clkpwm>;
|
clocks = <&clkpwm>;
|
||||||
|
|
|
@ -164,10 +164,31 @@ static void vt8500_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)
|
||||||
clk_disable(vt8500->clk);
|
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 = {
|
static struct pwm_ops vt8500_pwm_ops = {
|
||||||
.enable = vt8500_pwm_enable,
|
.enable = vt8500_pwm_enable,
|
||||||
.disable = vt8500_pwm_disable,
|
.disable = vt8500_pwm_disable,
|
||||||
.config = vt8500_pwm_config,
|
.config = vt8500_pwm_config,
|
||||||
|
.set_polarity = vt8500_pwm_set_polarity,
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -197,6 +218,8 @@ static int vt8500_pwm_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
chip->chip.dev = &pdev->dev;
|
chip->chip.dev = &pdev->dev;
|
||||||
chip->chip.ops = &vt8500_pwm_ops;
|
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.base = -1;
|
||||||
chip->chip.npwm = VT8500_NR_PWMS;
|
chip->chip.npwm = VT8500_NR_PWMS;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue