aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Jarzmik <rjarzmik@free.fr>2008-06-10 23:02:31 +0100
committerRussell King <rmk+kernel@arm.linux.org.uk>2008-07-03 13:24:59 +0100
commitc860d701cc5f77b74c481dcbd25b2d8b31c622fc (patch)
treec1fc9022ab9bf207bb84f9eb8a29997536647b94
parentb5f0228afa7810f3cad1f2f741cc747a2378b890 (diff)
[ARM] 5087/1: Get the PWM layer to handle clock enable/disable properly.
Allow pwm_enable()/pwm_disable() to be called as many times as the driver wants (and not even count them). The PWM model is different from things like the clock API where we need enable counting, because PWMs have one exclusive user per PWM whereas the clock API can have multiple users of the same clock. Acked-by: eric miao <eric.miao@marvell.com> Signed-off-by: Robert Jarzmik <rjarzmik@free.fr> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
-rw-r--r--arch/arm/mach-pxa/pwm.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/arch/arm/mach-pxa/pwm.c b/arch/arm/mach-pxa/pwm.c
index 92fef391d99..7c86dd1d108 100644
--- a/arch/arm/mach-pxa/pwm.c
+++ b/arch/arm/mach-pxa/pwm.c
@@ -36,6 +36,7 @@ struct pwm_device {
const char *label;
struct clk *clk;
+ int clk_enabled;
void __iomem *mmio_base;
unsigned int use_count;
@@ -87,13 +88,23 @@ EXPORT_SYMBOL(pwm_config);
int pwm_enable(struct pwm_device *pwm)
{
- return clk_enable(pwm->clk);
+ int rc = 0;
+
+ if (!pwm->clk_enabled) {
+ rc = clk_enable(pwm->clk);
+ if (!rc)
+ pwm->clk_enabled = 1;
+ }
+ return rc;
}
EXPORT_SYMBOL(pwm_enable);
void pwm_disable(struct pwm_device *pwm)
{
- clk_disable(pwm->clk);
+ if (pwm->clk_enabled) {
+ clk_disable(pwm->clk);
+ pwm->clk_enabled = 0;
+ }
}
EXPORT_SYMBOL(pwm_disable);
@@ -161,6 +172,7 @@ static struct pwm_device *pwm_probe(struct platform_device *pdev,
ret = PTR_ERR(pwm->clk);
goto err_free;
}
+ pwm->clk_enabled = 0;
pwm->use_count = 0;
pwm->pwm_id = pwm_id;