diff options
| author | Philip, Avinash <avinashphilip@ti.com> | 2012-09-06 10:40:02 +0530 | 
|---|---|---|
| committer | Thierry Reding <thierry.reding@avionic-design.de> | 2012-09-10 17:05:52 +0200 | 
| commit | 454870a44b0687675180506b7774fb559d610675 (patch) | |
| tree | 4ce95213a641f5911350a1a085e5fc1cee9c477b /drivers/pwm/pwm-tiecap.c | |
| parent | 6354316dbe5a13b25bea15d7ffc891be025eb267 (diff) | |
| download | olio-linux-3.10-454870a44b0687675180506b7774fb559d610675.tar.xz olio-linux-3.10-454870a44b0687675180506b7774fb559d610675.zip  | |
pwm: pwm-tiecap: Add support for configuring polarity of PWM
ECAP APWM hardware supports polarity configuration of PWM output.
This commit adds support for polarity configuration of ECAP APWM.
Signed-off-by: Philip, Avinash <avinashphilip@ti.com>
Signed-off-by: Thierry Reding <thierry.reding@avionic-design.de>
Diffstat (limited to 'drivers/pwm/pwm-tiecap.c')
| -rw-r--r-- | drivers/pwm/pwm-tiecap.c | 22 | 
1 files changed, 22 insertions, 0 deletions
diff --git a/drivers/pwm/pwm-tiecap.c b/drivers/pwm/pwm-tiecap.c index 4b6688909fe..081471fbb09 100644 --- a/drivers/pwm/pwm-tiecap.c +++ b/drivers/pwm/pwm-tiecap.c @@ -32,6 +32,7 @@  #define CAP3			0x10  #define CAP4			0x14  #define ECCTL2			0x2A +#define ECCTL2_APWM_POL_LOW	BIT(10)  #define ECCTL2_APWM_MODE	BIT(9)  #define ECCTL2_SYNC_SEL_DISA	(BIT(7) | BIT(6))  #define ECCTL2_TSCTR_FREERUN	BIT(4) @@ -111,6 +112,26 @@ static int ecap_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,  	return 0;  } +static int ecap_pwm_set_polarity(struct pwm_chip *chip, struct pwm_device *pwm, +		enum pwm_polarity polarity) +{ +	struct ecap_pwm_chip *pc = to_ecap_pwm_chip(chip); +	unsigned short reg_val; + +	pm_runtime_get_sync(pc->chip.dev); +	reg_val = readw(pc->mmio_base + ECCTL2); +	if (polarity == PWM_POLARITY_INVERSED) +		/* Duty cycle defines LOW period of PWM */ +		reg_val |= ECCTL2_APWM_POL_LOW; +	else +		/* Duty cycle defines HIGH period of PWM */ +		reg_val &= ~ECCTL2_APWM_POL_LOW; + +	writew(reg_val, pc->mmio_base + ECCTL2); +	pm_runtime_put_sync(pc->chip.dev); +	return 0; +} +  static int ecap_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)  {  	struct ecap_pwm_chip *pc = to_ecap_pwm_chip(chip); @@ -157,6 +178,7 @@ static void ecap_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm)  static const struct pwm_ops ecap_pwm_ops = {  	.free		= ecap_pwm_free,  	.config		= ecap_pwm_config, +	.set_polarity	= ecap_pwm_set_polarity,  	.enable		= ecap_pwm_enable,  	.disable	= ecap_pwm_disable,  	.owner		= THIS_MODULE,  |