[ARM] 5087/1: Get the PWM layer to handle clock enable/disable properly.
authorRobert Jarzmik <rjarzmik@free.fr>
Tue, 10 Jun 2008 22:02:31 +0000 (23:02 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Thu, 3 Jul 2008 12:24:59 +0000 (13:24 +0100)
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>
arch/arm/mach-pxa/pwm.c

index 92fef391d990e957d3fa978c0a10ba9c9627b955..7c86dd1d108f14a7ea64034e86fc31ba8268d8ad 100644 (file)
@@ -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;