8080/* PWMPR register value of 0xffff has the same effect as 0xfffe */
8181#define MX3_PWMPR_MAX 0xfffe
8282
83+ static const char * const pwm_imx27_clks [] = {"ipg" , "per" };
84+ #define PWM_IMX27_PER 1
85+
8386struct 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 ;
8689 void __iomem * mmio_base ;
8790
8891 /*
@@ -98,29 +101,6 @@ static inline struct pwm_imx27_chip *to_pwm_imx27_chip(struct pwm_chip *chip)
98101 return pwmchip_get_drvdata (chip );
99102}
100103
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-
124104static int pwm_imx27_get_state (struct pwm_chip * chip ,
125105 struct pwm_device * pwm , struct pwm_state * state )
126106{
@@ -129,7 +109,7 @@ static int pwm_imx27_get_state(struct pwm_chip *chip,
129109 u64 tmp ;
130110 int ret ;
131111
132- ret = pwm_imx27_clk_prepare_enable (imx );
112+ ret = clk_bulk_prepare_enable (imx -> clks_cnt , imx -> clks );
133113 if (ret < 0 )
134114 return ret ;
135115
@@ -152,7 +132,7 @@ static int pwm_imx27_get_state(struct pwm_chip *chip,
152132 }
153133
154134 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 );
156136 val = readl (imx -> mmio_base + MX3_PWMPR );
157137 period = val >= MX3_PWMPR_MAX ? MX3_PWMPR_MAX : val ;
158138
@@ -172,7 +152,7 @@ static int pwm_imx27_get_state(struct pwm_chip *chip,
172152 tmp = NSEC_PER_SEC * (u64 )(val ) * prescaler ;
173153 state -> duty_cycle = DIV_ROUND_UP_ULL (tmp , pwm_clk );
174154
175- pwm_imx27_clk_disable_unprepare (imx );
155+ clk_bulk_disable_unprepare (imx -> clks_cnt , imx -> clks );
176156
177157 return 0 ;
178158}
@@ -229,7 +209,7 @@ static int pwm_imx27_apply(struct pwm_chip *chip, struct pwm_device *pwm,
229209 int ret ;
230210 u32 cr ;
231211
232- clkrate = clk_get_rate (imx -> clk_per );
212+ clkrate = clk_get_rate (imx -> clks [ PWM_IMX27_PER ]. clk );
233213 c = clkrate * state -> period ;
234214
235215 do_div (c , NSEC_PER_SEC );
@@ -259,7 +239,7 @@ static int pwm_imx27_apply(struct pwm_chip *chip, struct pwm_device *pwm,
259239 if (pwm -> state .enabled ) {
260240 pwm_imx27_wait_fifo_slot (chip , pwm );
261241 } else {
262- ret = pwm_imx27_clk_prepare_enable (imx );
242+ ret = clk_bulk_prepare_enable (imx -> clks_cnt , imx -> clks );
263243 if (ret )
264244 return ret ;
265245
@@ -381,7 +361,7 @@ static int pwm_imx27_apply(struct pwm_chip *chip, struct pwm_device *pwm,
381361 writel (cr , imx -> mmio_base + MX3_PWMCR );
382362
383363 if (!state -> enabled )
384- pwm_imx27_clk_disable_unprepare (imx );
364+ clk_bulk_disable_unprepare (imx -> clks_cnt , imx -> clks );
385365
386366 return 0 ;
387367}
@@ -403,36 +383,37 @@ static int pwm_imx27_probe(struct platform_device *pdev)
403383 struct pwm_imx27_chip * imx ;
404384 int ret ;
405385 u32 pwmcr ;
386+ int i ;
406387
407388 chip = devm_pwmchip_alloc (& pdev -> dev , 1 , sizeof (* imx ));
408389 if (IS_ERR (chip ))
409390 return PTR_ERR (chip );
410391 imx = to_pwm_imx27_chip (chip );
411392
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 ];
416396
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" );
421402
422403 chip -> ops = & pwm_imx27_ops ;
423404
424405 imx -> mmio_base = devm_platform_ioremap_resource (pdev , 0 );
425406 if (IS_ERR (imx -> mmio_base ))
426407 return PTR_ERR (imx -> mmio_base );
427408
428- ret = pwm_imx27_clk_prepare_enable (imx );
409+ ret = clk_bulk_prepare_enable (imx -> clks_cnt , imx -> clks );
429410 if (ret )
430411 return ret ;
431412
432413 /* keep clks on if pwm is running */
433414 pwmcr = readl (imx -> mmio_base + MX3_PWMCR );
434415 if (!(pwmcr & MX3_PWMCR_EN ))
435- pwm_imx27_clk_disable_unprepare (imx );
416+ clk_bulk_disable_unprepare (imx -> clks_cnt , imx -> clks );
436417
437418 return devm_pwmchip_add (& pdev -> dev , chip );
438419}
0 commit comments