@@ -74,6 +74,7 @@ struct sti_pwm_compat_data {
74
74
struct sti_pwm_chip {
75
75
struct device * dev ;
76
76
struct clk * pwm_clk ;
77
+ struct clk * cpt_clk ;
77
78
struct regmap * regmap ;
78
79
struct sti_pwm_compat_data * cdata ;
79
80
struct regmap_field * prescale_low ;
@@ -183,6 +184,10 @@ static int sti_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
183
184
if (ret )
184
185
return ret ;
185
186
187
+ ret = clk_enable (pc -> cpt_clk );
188
+ if (ret )
189
+ return ret ;
190
+
186
191
if (!period_same ) {
187
192
ret = sti_pwm_get_prescale (pc , period_ns , & prescale );
188
193
if (ret )
@@ -227,6 +232,7 @@ static int sti_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
227
232
228
233
clk_dis :
229
234
clk_disable (pc -> pwm_clk );
235
+ clk_disable (pc -> cpt_clk );
230
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
252
if (ret )
247
253
goto out ;
248
254
255
+ ret = clk_enable (pc -> cpt_clk );
256
+ if (ret )
257
+ goto out ;
258
+
249
259
ret = regmap_field_write (pc -> pwm_out_en , 1 );
250
260
if (ret ) {
251
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
281
regmap_field_write (pc -> pwm_out_en , 0 );
272
282
273
283
clk_disable (pc -> pwm_clk );
284
+ clk_disable (pc -> cpt_clk );
274
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
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
416
pc -> chip .dev = dev ;
394
417
pc -> chip .ops = & sti_pwm_ops ;
395
418
pc -> chip .base = -1 ;
@@ -399,6 +422,7 @@ static int sti_pwm_probe(struct platform_device *pdev)
399
422
ret = pwmchip_add (& pc -> chip );
400
423
if (ret < 0 ) {
401
424
clk_unprepare (pc -> pwm_clk );
425
+ clk_unprepare (pc -> cpt_clk );
402
426
return ret ;
403
427
}
404
428
@@ -416,6 +440,7 @@ static int sti_pwm_remove(struct platform_device *pdev)
416
440
pwm_disable (& pc -> chip .pwms [i ]);
417
441
418
442
clk_unprepare (pc -> pwm_clk );
443
+ clk_unprepare (pc -> cpt_clk );
419
444
420
445
return pwmchip_remove (& pc -> chip );
421
446
}
0 commit comments