Skip to content

Commit

Permalink
pwm: Add support for configuring the PWM polarity
Browse files Browse the repository at this point in the history
Some hardware supports inverting the polarity of the PWM signal. This
commit adds support to the PWM framework to allow users of the PWM API
to configure the polarity. Note that in order to reduce complexity,
changing the polarity of a PWM signal is only allowed while the PWM is
disabled.

A practical example where this can prove useful is to simulate inversion
of the duty cycle. While inversion of polarity and duty cycle are not
exactly the same, the differences for most use-cases are negligible.

Signed-off-by: Philip, Avinash <avinashphilip@ti.com>
Signed-off-by: Thierry Reding <thierry.reding@avionic-design.de>
  • Loading branch information
Philip, Avinash authored and Thierry Reding committed Sep 10, 2012
1 parent 01b2d45 commit 0aa0869
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 0 deletions.
22 changes: 22 additions & 0 deletions drivers/pwm/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -378,6 +378,28 @@ int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns)
}
EXPORT_SYMBOL_GPL(pwm_config);

/**
* pwm_set_polarity() - configure the polarity of a PWM signal
* @pwm: PWM device
* @polarity: new polarity of the PWM signal
*
* Note that the polarity cannot be configured while the PWM device is enabled
*/
int pwm_set_polarity(struct pwm_device *pwm, enum pwm_polarity polarity)
{
if (!pwm || !pwm->chip->ops)
return -EINVAL;

if (!pwm->chip->ops->set_polarity)
return -ENOSYS;

if (test_bit(PWMF_ENABLED, &pwm->flags))
return -EBUSY;

return pwm->chip->ops->set_polarity(pwm->chip, pwm, polarity);
}
EXPORT_SYMBOL_GPL(pwm_set_polarity);

/**
* pwm_enable() - start a PWM output toggling
* @pwm: PWM device
Expand Down
23 changes: 23 additions & 0 deletions include/linux/pwm.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,20 @@ void pwm_disable(struct pwm_device *pwm);
#ifdef CONFIG_PWM
struct pwm_chip;

/**
* enum pwm_polarity - polarity of a PWM signal
* @PWM_POLARITY_NORMAL: a high signal for the duration of the duty-
* cycle, followed by a low signal for the remainder of the pulse
* period
* @PWM_POLARITY_INVERSED: a low signal for the duration of the duty-
* cycle, followed by a high signal for the remainder of the pulse
* period
*/
enum pwm_polarity {
PWM_POLARITY_NORMAL,
PWM_POLARITY_INVERSED,
};

enum {
PWMF_REQUESTED = 1 << 0,
PWMF_ENABLED = 1 << 1,
Expand Down Expand Up @@ -61,11 +75,17 @@ static inline unsigned int pwm_get_period(struct pwm_device *pwm)
return pwm ? pwm->period : 0;
}

/*
* pwm_set_polarity - configure the polarity of a PWM signal
*/
int pwm_set_polarity(struct pwm_device *pwm, enum pwm_polarity polarity);

/**
* struct pwm_ops - PWM controller operations
* @request: optional hook for requesting a PWM
* @free: optional hook for freeing a PWM
* @config: configure duty cycles and period length for this PWM
* @set_polarity: configure the polarity of this PWM
* @enable: enable PWM output toggling
* @disable: disable PWM output toggling
* @dbg_show: optional routine to show contents in debugfs
Expand All @@ -79,6 +99,9 @@ struct pwm_ops {
int (*config)(struct pwm_chip *chip,
struct pwm_device *pwm,
int duty_ns, int period_ns);
int (*set_polarity)(struct pwm_chip *chip,
struct pwm_device *pwm,
enum pwm_polarity polarity);
int (*enable)(struct pwm_chip *chip,
struct pwm_device *pwm);
void (*disable)(struct pwm_chip *chip,
Expand Down

0 comments on commit 0aa0869

Please sign in to comment.