aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/pwm/pwm-sti.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/drivers/pwm/pwm-sti.c b/drivers/pwm/pwm-sti.c
index 4e8ff9e04f77..711c33643259 100644
--- a/drivers/pwm/pwm-sti.c
+++ b/drivers/pwm/pwm-sti.c
@@ -74,6 +74,7 @@ struct sti_pwm_compat_data {
74struct sti_pwm_chip { 74struct sti_pwm_chip {
75 struct device *dev; 75 struct device *dev;
76 struct clk *pwm_clk; 76 struct clk *pwm_clk;
77 struct clk *cpt_clk;
77 struct regmap *regmap; 78 struct regmap *regmap;
78 struct sti_pwm_compat_data *cdata; 79 struct sti_pwm_compat_data *cdata;
79 struct regmap_field *prescale_low; 80 struct regmap_field *prescale_low;
@@ -183,6 +184,10 @@ static int sti_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
183 if (ret) 184 if (ret)
184 return ret; 185 return ret;
185 186
187 ret = clk_enable(pc->cpt_clk);
188 if (ret)
189 return ret;
190
186 if (!period_same) { 191 if (!period_same) {
187 ret = sti_pwm_get_prescale(pc, period_ns, &prescale); 192 ret = sti_pwm_get_prescale(pc, period_ns, &prescale);
188 if (ret) 193 if (ret)
@@ -227,6 +232,7 @@ static int sti_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
227 232
228clk_dis: 233clk_dis:
229 clk_disable(pc->pwm_clk); 234 clk_disable(pc->pwm_clk);
235 clk_disable(pc->cpt_clk);
230 return ret; 236 return ret;
231} 237}
232 238
@@ -246,6 +252,10 @@ static int sti_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)
246 if (ret) 252 if (ret)
247 goto out; 253 goto out;
248 254
255 ret = clk_enable(pc->cpt_clk);
256 if (ret)
257 goto out;
258
249 ret = regmap_field_write(pc->pwm_out_en, 1); 259 ret = regmap_field_write(pc->pwm_out_en, 1);
250 if (ret) { 260 if (ret) {
251 dev_err(dev, "failed to enable PWM device:%d\n", 261 dev_err(dev, "failed to enable PWM device:%d\n",
@@ -271,6 +281,7 @@ static void sti_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)
271 regmap_field_write(pc->pwm_out_en, 0); 281 regmap_field_write(pc->pwm_out_en, 0);
272 282
273 clk_disable(pc->pwm_clk); 283 clk_disable(pc->pwm_clk);
284 clk_disable(pc->cpt_clk);
274 mutex_unlock(&pc->sti_pwm_lock); 285 mutex_unlock(&pc->sti_pwm_lock);
275} 286}
276 287
@@ -390,6 +401,18 @@ static int sti_pwm_probe(struct platform_device *pdev)
390 return ret; 401 return ret;
391 } 402 }
392 403
404 pc->cpt_clk = of_clk_get_by_name(dev->of_node, "capture");
405 if (IS_ERR(pc->cpt_clk)) {
406 dev_err(dev, "failed to get PWM capture clock\n");
407 return PTR_ERR(pc->cpt_clk);
408 }
409
410 ret = clk_prepare(pc->cpt_clk);
411 if (ret) {
412 dev_err(dev, "failed to prepare clock\n");
413 return ret;
414 }
415
393 pc->chip.dev = dev; 416 pc->chip.dev = dev;
394 pc->chip.ops = &sti_pwm_ops; 417 pc->chip.ops = &sti_pwm_ops;
395 pc->chip.base = -1; 418 pc->chip.base = -1;
@@ -399,6 +422,7 @@ static int sti_pwm_probe(struct platform_device *pdev)
399 ret = pwmchip_add(&pc->chip); 422 ret = pwmchip_add(&pc->chip);
400 if (ret < 0) { 423 if (ret < 0) {
401 clk_unprepare(pc->pwm_clk); 424 clk_unprepare(pc->pwm_clk);
425 clk_unprepare(pc->cpt_clk);
402 return ret; 426 return ret;
403 } 427 }
404 428
@@ -416,6 +440,7 @@ static int sti_pwm_remove(struct platform_device *pdev)
416 pwm_disable(&pc->chip.pwms[i]); 440 pwm_disable(&pc->chip.pwms[i]);
417 441
418 clk_unprepare(pc->pwm_clk); 442 clk_unprepare(pc->pwm_clk);
443 clk_unprepare(pc->cpt_clk);
419 444
420 return pwmchip_remove(&pc->chip); 445 return pwmchip_remove(&pc->chip);
421} 446}