@@ -121,7 +121,7 @@ struct rockchip_dfi {
121
121
struct regmap * regmap_pmu ;
122
122
struct regmap * regmap_grf ;
123
123
struct regmap * regmap_pmugrf ;
124
- struct clk * clk ;
124
+ struct clk * clk [ MAX_DMC_NUM_CH ] ;
125
125
u32 dram_type ;
126
126
u32 mon_version ;
127
127
u32 mon_idx ;
@@ -506,34 +506,69 @@ static int rockchip_dfi_get_busier_ch(struct devfreq_event_dev *edev)
506
506
return busier_ch ;
507
507
}
508
508
509
+ static int rockchip_dfi_clk_enable (struct rockchip_dfi * info )
510
+ {
511
+ u32 i ;
512
+ int ret ;
513
+
514
+ for (i = 0 ; i < MAX_DMC_NUM_CH ; i ++ ) {
515
+ if (!(info -> ch_msk & BIT (i )))
516
+ continue ;
517
+ if (info -> clk [i ]) {
518
+ ret = clk_prepare_enable (info -> clk [i ]);
519
+ if (ret ) {
520
+ dev_err (info -> dev , "failed to enable ch%d dfi clk: %d\n" ,
521
+ i , ret );
522
+ return ret ;
523
+ }
524
+ }
525
+ }
526
+
527
+ return 0 ;
528
+ }
529
+
530
+ static int rockchip_dfi_clk_disable (struct rockchip_dfi * info )
531
+ {
532
+ u32 i ;
533
+
534
+ for (i = 0 ; i < MAX_DMC_NUM_CH ; i ++ ) {
535
+ if (!(info -> ch_msk & BIT (i )))
536
+ continue ;
537
+ if (info -> clk [i ])
538
+ clk_disable_unprepare (info -> clk [i ]);
539
+ }
540
+
541
+ return 0 ;
542
+ }
509
543
static int rockchip_dfi_disable (struct devfreq_event_dev * edev )
510
544
{
545
+ int ret ;
511
546
struct rockchip_dfi * info = devfreq_event_get_drvdata (edev );
512
547
548
+ ret = rockchip_dfi_clk_enable (info );
549
+ if (ret )
550
+ return ret ;
551
+
513
552
rockchip_dfi_stop_hardware_counter (edev );
514
- if (info -> clk )
515
- clk_disable_unprepare (info -> clk );
553
+ rockchip_dfi_clk_disable (info );
516
554
517
555
return 0 ;
518
556
}
519
557
520
558
static int rockchip_dfi_enable (struct devfreq_event_dev * edev )
521
559
{
522
- struct rockchip_dfi * info = devfreq_event_get_drvdata (edev );
523
560
int ret ;
561
+ struct rockchip_dfi * info = devfreq_event_get_drvdata (edev );
524
562
525
- if (info -> clk ) {
526
- ret = clk_prepare_enable (info -> clk );
527
- if (ret ) {
528
- dev_err (& edev -> dev , "failed to enable dfi clk: %d\n" ,
529
- ret );
530
- return ret ;
531
- }
532
- }
563
+ ret = rockchip_dfi_clk_enable (info );
564
+ if (ret )
565
+ return ret ;
533
566
534
567
rockchip_dfi_get_mon_version (edev );
535
568
536
569
rockchip_dfi_start_hardware_counter (edev );
570
+ rockchip_dfi_clk_disable (info );
571
+
537
572
return 0 ;
538
573
}
539
574
@@ -548,11 +583,18 @@ static int rockchip_dfi_get_event(struct devfreq_event_dev *edev,
548
583
struct rockchip_dfi * info = devfreq_event_get_drvdata (edev );
549
584
int busier_ch ;
550
585
unsigned long flags ;
586
+ int ret ;
587
+
588
+ ret = rockchip_dfi_clk_enable (info );
589
+ if (ret )
590
+ return ret ;
551
591
552
592
local_irq_save (flags );
553
593
busier_ch = rockchip_dfi_get_busier_ch (edev );
554
594
local_irq_restore (flags );
555
595
596
+ rockchip_dfi_clk_disable (info );
597
+
556
598
edata -> load_count = info -> ch_usage [busier_ch ].access ;
557
599
edata -> total_count = info -> ch_usage [busier_ch ].total ;
558
600
@@ -572,7 +614,8 @@ static __maybe_unused __init int rk3588_dfi_init(struct platform_device *pdev,
572
614
{
573
615
struct device_node * np = pdev -> dev .of_node ;
574
616
struct resource * res ;
575
- u32 val_2 , val_3 , val_4 ;
617
+ u32 val_2 , val_3 , val_4 , i ;
618
+ char clk_name [20 ];
576
619
577
620
res = platform_get_resource (pdev , IORESOURCE_MEM , 0 );
578
621
data -> regs = devm_ioremap_resource (& pdev -> dev , res );
@@ -598,7 +641,17 @@ static __maybe_unused __init int rk3588_dfi_init(struct platform_device *pdev,
598
641
data -> count_rate = 2 ;
599
642
data -> dram_dynamic_info_reg = RK3588_PMUGRF_OS_REG (6 );
600
643
data -> ch_msk = READ_CH_INFO (val_2 ) | READ_CH_INFO (val_4 ) << 2 ;
601
- data -> clk = NULL ;
644
+
645
+ for (i = 0 ; i < MAX_DMC_NUM_CH ; i ++ ) {
646
+ if (data -> ch_msk & BIT (i )) {
647
+ snprintf (clk_name , sizeof (clk_name ), "pclk_ddr_mon_ch%d" , i );
648
+ data -> clk [i ] = devm_clk_get (& pdev -> dev , clk_name );
649
+ if (IS_ERR (data -> clk [i ])) {
650
+ dev_err (& pdev -> dev , "Failed to get %s\n" , clk_name );
651
+ return PTR_ERR (data -> clk [i ]);
652
+ }
653
+ }
654
+ }
602
655
603
656
desc -> ops = & rockchip_dfi_ops ;
604
657
@@ -647,7 +700,6 @@ static __maybe_unused __init int px30_dfi_init(struct platform_device *pdev,
647
700
else
648
701
data -> dram_type = READ_DRAMTYPE_INFO (val_2 );
649
702
data -> ch_msk = 1 ;
650
- data -> clk = NULL ;
651
703
652
704
desc -> ops = & rockchip_dfi_ops ;
653
705
@@ -739,9 +791,9 @@ static __maybe_unused __init int rockchip_dfi_init(struct platform_device *pdev,
739
791
if (IS_ERR (data -> regs ))
740
792
return PTR_ERR (data -> regs );
741
793
742
- data -> clk = devm_clk_get (dev , "pclk_ddr_mon" );
743
- if (IS_ERR (data -> clk ))
744
- return dev_err_probe (dev , PTR_ERR (data -> clk ),
794
+ data -> clk [ 0 ] = devm_clk_get (dev , "pclk_ddr_mon" );
795
+ if (IS_ERR (data -> clk [ 0 ] ))
796
+ return dev_err_probe (dev , PTR_ERR (data -> clk [ 0 ] ),
745
797
"Cannot get the clk pclk_ddr_mon\n" );
746
798
747
799
node = of_parse_phandle (np , "rockchip,pmu" , 0 );
@@ -785,7 +837,6 @@ static __maybe_unused __init int rk3328_dfi_init(struct platform_device *pdev,
785
837
regmap_read (data -> regmap_grf , RK3328_GRF_OS_REG2 , & val );
786
838
data -> dram_type = READ_DRAMTYPE_INFO (val );
787
839
data -> ch_msk = 1 ;
788
- data -> clk = NULL ;
789
840
790
841
desc -> ops = & rockchip_dfi_ops ;
791
842
@@ -820,7 +871,6 @@ static __maybe_unused __init int rk3528_dfi_init(struct platform_device *pdev,
820
871
data -> dram_type = READ_DRAMTYPE_INFO (val_18 );
821
872
data -> count_rate = 2 ;
822
873
data -> ch_msk = 1 ;
823
- data -> clk = NULL ;
824
874
825
875
desc -> ops = & rockchip_dfi_ops ;
826
876
0 commit comments