aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-pxa/pwm.c
diff options
context:
space:
mode:
authorRobert Jarzmik <rjarzmik@free.fr>2008-06-10 18:02:31 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2008-07-03 08:24:59 -0400
commitc860d701cc5f77b74c481dcbd25b2d8b31c622fc (patch)
treec1fc9022ab9bf207bb84f9eb8a29997536647b94 /arch/arm/mach-pxa/pwm.c
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>
Diffstat (limited to 'arch/arm/mach-pxa/pwm.c')
-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 92fef391d990..7c86dd1d108f 100644
--- a/arch/arm/mach-pxa/pwm.c
+++ b/arch/arm/mach-pxa/pwm.c
@@ -36,6 +36,7 @@ struct pwm_device {
36 36
37 const char *label; 37 const char *label;
38 struct clk *clk; 38 struct clk *clk;
39 int clk_enabled;
39 void __iomem *mmio_base; 40 void __iomem *mmio_base;
40 41
41 unsigned int use_count; 42 unsigned int use_count;
@@ -87,13 +88,23 @@ EXPORT_SYMBOL(pwm_config);
87 88
88int pwm_enable(struct pwm_device *pwm) 89int pwm_enable(struct pwm_device *pwm)
89{ 90{
90 return clk_enable(pwm->clk); 91 int rc = 0;
92
93 if (!pwm->clk_enabled) {
94 rc = clk_enable(pwm->clk);
95 if (!rc)
96 pwm->clk_enabled = 1;
97 }
98 return rc;
91} 99}
92EXPORT_SYMBOL(pwm_enable); 100EXPORT_SYMBOL(pwm_enable);
93 101
94void pwm_disable(struct pwm_device *pwm) 102void pwm_disable(struct pwm_device *pwm)
95{ 103{
96 clk_disable(pwm->clk); 104 if (pwm->clk_enabled) {
105 clk_disable(pwm->clk);
106 pwm->clk_enabled = 0;
107 }
97} 108}
98EXPORT_SYMBOL(pwm_disable); 109EXPORT_SYMBOL(pwm_disable);
99 110
@@ -161,6 +172,7 @@ static struct pwm_device *pwm_probe(struct platform_device *pdev,
161 ret = PTR_ERR(pwm->clk); 172 ret = PTR_ERR(pwm->clk);
162 goto err_free; 173 goto err_free;
163 } 174 }
175 pwm->clk_enabled = 0;
164 176
165 pwm->use_count = 0; 177 pwm->use_count = 0;
166 pwm->pwm_id = pwm_id; 178 pwm->pwm_id = pwm_id;