@@ -420,18 +420,14 @@ lgm_clk_ddiv_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
420
420
{
421
421
struct lgm_clk_ddiv * ddiv = to_lgm_clk_ddiv (hw );
422
422
unsigned int div0 , div1 , exdiv ;
423
- unsigned long flags ;
424
423
u64 prate ;
425
424
426
- spin_lock_irqsave (& ddiv -> lock , flags );
427
425
div0 = lgm_get_clk_val (ddiv -> membase , ddiv -> reg ,
428
426
ddiv -> shift0 , ddiv -> width0 ) + 1 ;
429
427
div1 = lgm_get_clk_val (ddiv -> membase , ddiv -> reg ,
430
428
ddiv -> shift1 , ddiv -> width1 ) + 1 ;
431
429
exdiv = lgm_get_clk_val (ddiv -> membase , ddiv -> reg ,
432
430
ddiv -> shift2 , ddiv -> width2 );
433
- spin_unlock_irqrestore (& ddiv -> lock , flags );
434
-
435
431
prate = (u64 )parent_rate ;
436
432
do_div (prate , div0 );
437
433
do_div (prate , div1 );
@@ -548,24 +544,21 @@ lgm_clk_ddiv_round_rate(struct clk_hw *hw, unsigned long rate,
548
544
div = div * 2 ;
549
545
div = DIV_ROUND_CLOSEST_ULL ((u64 )div , 5 );
550
546
}
547
+ spin_unlock_irqrestore (& ddiv -> lock , flags );
551
548
552
- if (div <= 0 ) {
553
- spin_unlock_irqrestore (& ddiv -> lock , flags );
549
+ if (div <= 0 )
554
550
return * prate ;
555
- }
556
551
557
- if (lgm_clk_get_ddiv_val (div , & ddiv1 , & ddiv2 ) != 0 ) {
558
- if (lgm_clk_get_ddiv_val (div + 1 , & ddiv1 , & ddiv2 ) != 0 ) {
559
- spin_unlock_irqrestore (& ddiv -> lock , flags );
552
+ if (lgm_clk_get_ddiv_val (div , & ddiv1 , & ddiv2 ) != 0 )
553
+ if (lgm_clk_get_ddiv_val (div + 1 , & ddiv1 , & ddiv2 ) != 0 )
560
554
return - EINVAL ;
561
- }
562
- }
563
555
564
556
rate64 = * prate ;
565
557
do_div (rate64 , ddiv1 );
566
558
do_div (rate64 , ddiv2 );
567
559
568
560
/* if predivide bit is enabled, modify rounded rate by factor of 2.5 */
561
+ spin_lock_irqsave (& ddiv -> lock , flags );
569
562
if (lgm_get_clk_val (ddiv -> membase , ddiv -> reg , ddiv -> shift2 , 1 )) {
570
563
rate64 = rate64 * 2 ;
571
564
rate64 = DIV_ROUND_CLOSEST_ULL (rate64 , 5 );
0 commit comments