80
80
/* PWMPR register value of 0xffff has the same effect as 0xfffe */
81
81
#define MX3_PWMPR_MAX 0xfffe
82
82
83
+ static const char * const pwm_imx27_clks [] = {"ipg" , "per" };
84
+ #define PWM_IMX27_PER 1
85
+
83
86
struct pwm_imx27_chip {
84
- struct clk * clk_ipg ;
85
- struct clk * clk_per ;
87
+ struct clk_bulk_data clks [ ARRAY_SIZE ( pwm_imx27_clks )] ;
88
+ int clks_cnt ;
86
89
void __iomem * mmio_base ;
87
90
88
91
/*
@@ -98,29 +101,6 @@ static inline struct pwm_imx27_chip *to_pwm_imx27_chip(struct pwm_chip *chip)
98
101
return pwmchip_get_drvdata (chip );
99
102
}
100
103
101
- static int pwm_imx27_clk_prepare_enable (struct pwm_imx27_chip * imx )
102
- {
103
- int ret ;
104
-
105
- ret = clk_prepare_enable (imx -> clk_ipg );
106
- if (ret )
107
- return ret ;
108
-
109
- ret = clk_prepare_enable (imx -> clk_per );
110
- if (ret ) {
111
- clk_disable_unprepare (imx -> clk_ipg );
112
- return ret ;
113
- }
114
-
115
- return 0 ;
116
- }
117
-
118
- static void pwm_imx27_clk_disable_unprepare (struct pwm_imx27_chip * imx )
119
- {
120
- clk_disable_unprepare (imx -> clk_per );
121
- clk_disable_unprepare (imx -> clk_ipg );
122
- }
123
-
124
104
static int pwm_imx27_get_state (struct pwm_chip * chip ,
125
105
struct pwm_device * pwm , struct pwm_state * state )
126
106
{
@@ -129,7 +109,7 @@ static int pwm_imx27_get_state(struct pwm_chip *chip,
129
109
u64 tmp ;
130
110
int ret ;
131
111
132
- ret = pwm_imx27_clk_prepare_enable (imx );
112
+ ret = clk_bulk_prepare_enable (imx -> clks_cnt , imx -> clks );
133
113
if (ret < 0 )
134
114
return ret ;
135
115
@@ -152,7 +132,7 @@ static int pwm_imx27_get_state(struct pwm_chip *chip,
152
132
}
153
133
154
134
prescaler = MX3_PWMCR_PRESCALER_GET (val );
155
- pwm_clk = clk_get_rate (imx -> clk_per );
135
+ pwm_clk = clk_get_rate (imx -> clks [ PWM_IMX27_PER ]. clk );
156
136
val = readl (imx -> mmio_base + MX3_PWMPR );
157
137
period = val >= MX3_PWMPR_MAX ? MX3_PWMPR_MAX : val ;
158
138
@@ -172,7 +152,7 @@ static int pwm_imx27_get_state(struct pwm_chip *chip,
172
152
tmp = NSEC_PER_SEC * (u64 )(val ) * prescaler ;
173
153
state -> duty_cycle = DIV_ROUND_UP_ULL (tmp , pwm_clk );
174
154
175
- pwm_imx27_clk_disable_unprepare (imx );
155
+ clk_bulk_disable_unprepare (imx -> clks_cnt , imx -> clks );
176
156
177
157
return 0 ;
178
158
}
@@ -229,7 +209,7 @@ static int pwm_imx27_apply(struct pwm_chip *chip, struct pwm_device *pwm,
229
209
int ret ;
230
210
u32 cr ;
231
211
232
- clkrate = clk_get_rate (imx -> clk_per );
212
+ clkrate = clk_get_rate (imx -> clks [ PWM_IMX27_PER ]. clk );
233
213
c = clkrate * state -> period ;
234
214
235
215
do_div (c , NSEC_PER_SEC );
@@ -259,7 +239,7 @@ static int pwm_imx27_apply(struct pwm_chip *chip, struct pwm_device *pwm,
259
239
if (pwm -> state .enabled ) {
260
240
pwm_imx27_wait_fifo_slot (chip , pwm );
261
241
} else {
262
- ret = pwm_imx27_clk_prepare_enable (imx );
242
+ ret = clk_bulk_prepare_enable (imx -> clks_cnt , imx -> clks );
263
243
if (ret )
264
244
return ret ;
265
245
@@ -381,7 +361,7 @@ static int pwm_imx27_apply(struct pwm_chip *chip, struct pwm_device *pwm,
381
361
writel (cr , imx -> mmio_base + MX3_PWMCR );
382
362
383
363
if (!state -> enabled )
384
- pwm_imx27_clk_disable_unprepare (imx );
364
+ clk_bulk_disable_unprepare (imx -> clks_cnt , imx -> clks );
385
365
386
366
return 0 ;
387
367
}
@@ -403,36 +383,37 @@ static int pwm_imx27_probe(struct platform_device *pdev)
403
383
struct pwm_imx27_chip * imx ;
404
384
int ret ;
405
385
u32 pwmcr ;
386
+ int i ;
406
387
407
388
chip = devm_pwmchip_alloc (& pdev -> dev , 1 , sizeof (* imx ));
408
389
if (IS_ERR (chip ))
409
390
return PTR_ERR (chip );
410
391
imx = to_pwm_imx27_chip (chip );
411
392
412
- imx -> clk_ipg = devm_clk_get (& pdev -> dev , "ipg" );
413
- if (IS_ERR (imx -> clk_ipg ))
414
- return dev_err_probe (& pdev -> dev , PTR_ERR (imx -> clk_ipg ),
415
- "getting ipg clock failed\n" );
393
+ imx -> clks_cnt = ARRAY_SIZE (pwm_imx27_clks );
394
+ for (i = 0 ; i < imx -> clks_cnt ; ++ i )
395
+ imx -> clks [i ].id = pwm_imx27_clks [i ];
416
396
417
- imx -> clk_per = devm_clk_get (& pdev -> dev , "per" );
418
- if (IS_ERR (imx -> clk_per ))
419
- return dev_err_probe (& pdev -> dev , PTR_ERR (imx -> clk_per ),
420
- "failed to get peripheral clock\n" );
397
+ ret = devm_clk_bulk_get (& pdev -> dev , imx -> clks_cnt , imx -> clks );
398
+
399
+ if (ret )
400
+ return dev_err_probe (& pdev -> dev , ret ,
401
+ "getting clocks failed\n" );
421
402
422
403
chip -> ops = & pwm_imx27_ops ;
423
404
424
405
imx -> mmio_base = devm_platform_ioremap_resource (pdev , 0 );
425
406
if (IS_ERR (imx -> mmio_base ))
426
407
return PTR_ERR (imx -> mmio_base );
427
408
428
- ret = pwm_imx27_clk_prepare_enable (imx );
409
+ ret = clk_bulk_prepare_enable (imx -> clks_cnt , imx -> clks );
429
410
if (ret )
430
411
return ret ;
431
412
432
413
/* keep clks on if pwm is running */
433
414
pwmcr = readl (imx -> mmio_base + MX3_PWMCR );
434
415
if (!(pwmcr & MX3_PWMCR_EN ))
435
- pwm_imx27_clk_disable_unprepare (imx );
416
+ clk_bulk_disable_unprepare (imx -> clks_cnt , imx -> clks );
436
417
437
418
return devm_pwmchip_add (& pdev -> dev , chip );
438
419
}
0 commit comments