diff options
-rw-r--r-- | drivers/pwm/pwm-sti.c | 25 |
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 { | |||
74 | struct sti_pwm_chip { | 74 | struct 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 | ||
228 | clk_dis: | 233 | clk_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 | } |