@@ -33,23 +33,26 @@ static DEFINE_MUTEX(measure_lock);
33
33
#define DIV_STEP 32
34
34
#define DIV_MAX 640
35
35
36
- #define CLK_MSR_MAX 128
37
-
38
36
struct meson_msr_id {
39
37
struct meson_msr * priv ;
40
38
unsigned int id ;
41
39
const char * name ;
42
40
};
43
41
42
+ struct meson_msr_data {
43
+ struct meson_msr_id * msr_table ;
44
+ unsigned int msr_count ;
45
+ };
46
+
44
47
struct meson_msr {
45
48
struct regmap * regmap ;
46
- struct meson_msr_id msr_table [ CLK_MSR_MAX ] ;
49
+ struct meson_msr_data data ;
47
50
};
48
51
49
52
#define CLK_MSR_ID (__id , __name ) \
50
53
[__id] = {.id = __id, .name = __name,}
51
54
52
- static struct meson_msr_id clk_msr_m8 [CLK_MSR_MAX ] = {
55
+ static const struct meson_msr_id clk_msr_m8 [] = {
53
56
CLK_MSR_ID (0 , "ring_osc_out_ee0" ),
54
57
CLK_MSR_ID (1 , "ring_osc_out_ee1" ),
55
58
CLK_MSR_ID (2 , "ring_osc_out_ee2" ),
@@ -98,7 +101,7 @@ static struct meson_msr_id clk_msr_m8[CLK_MSR_MAX] = {
98
101
CLK_MSR_ID (63 , "mipi_csi_cfg" ),
99
102
};
100
103
101
- static struct meson_msr_id clk_msr_gx [CLK_MSR_MAX ] = {
104
+ static const struct meson_msr_id clk_msr_gx [] = {
102
105
CLK_MSR_ID (0 , "ring_osc_out_ee_0" ),
103
106
CLK_MSR_ID (1 , "ring_osc_out_ee_1" ),
104
107
CLK_MSR_ID (2 , "ring_osc_out_ee_2" ),
@@ -168,7 +171,7 @@ static struct meson_msr_id clk_msr_gx[CLK_MSR_MAX] = {
168
171
CLK_MSR_ID (82 , "ge2d" ),
169
172
};
170
173
171
- static struct meson_msr_id clk_msr_axg [CLK_MSR_MAX ] = {
174
+ static const struct meson_msr_id clk_msr_axg [] = {
172
175
CLK_MSR_ID (0 , "ring_osc_out_ee_0" ),
173
176
CLK_MSR_ID (1 , "ring_osc_out_ee_1" ),
174
177
CLK_MSR_ID (2 , "ring_osc_out_ee_2" ),
@@ -242,7 +245,7 @@ static struct meson_msr_id clk_msr_axg[CLK_MSR_MAX] = {
242
245
CLK_MSR_ID (109 , "audio_locker_in" ),
243
246
};
244
247
245
- static struct meson_msr_id clk_msr_g12a [CLK_MSR_MAX ] = {
248
+ static const struct meson_msr_id clk_msr_g12a [] = {
246
249
CLK_MSR_ID (0 , "ring_osc_out_ee_0" ),
247
250
CLK_MSR_ID (1 , "ring_osc_out_ee_1" ),
248
251
CLK_MSR_ID (2 , "ring_osc_out_ee_2" ),
@@ -358,7 +361,7 @@ static struct meson_msr_id clk_msr_g12a[CLK_MSR_MAX] = {
358
361
CLK_MSR_ID (122 , "audio_pdm_dclk" ),
359
362
};
360
363
361
- static struct meson_msr_id clk_msr_sm1 [CLK_MSR_MAX ] = {
364
+ static const struct meson_msr_id clk_msr_sm1 [] = {
362
365
CLK_MSR_ID (0 , "ring_osc_out_ee_0" ),
363
366
CLK_MSR_ID (1 , "ring_osc_out_ee_1" ),
364
367
CLK_MSR_ID (2 , "ring_osc_out_ee_2" ),
@@ -489,7 +492,7 @@ static struct meson_msr_id clk_msr_sm1[CLK_MSR_MAX] = {
489
492
};
490
493
491
494
static int meson_measure_id (struct meson_msr_id * clk_msr_id ,
492
- unsigned int duration )
495
+ unsigned int duration )
493
496
{
494
497
struct meson_msr * priv = clk_msr_id -> priv ;
495
498
unsigned int val ;
@@ -573,13 +576,14 @@ DEFINE_SHOW_ATTRIBUTE(clk_msr);
573
576
static int clk_msr_summary_show (struct seq_file * s , void * data )
574
577
{
575
578
struct meson_msr_id * msr_table = s -> private ;
579
+ unsigned int msr_count = msr_table -> priv -> data .msr_count ;
576
580
unsigned int precision = 0 ;
577
581
int val , i ;
578
582
579
583
seq_puts (s , " clock rate precision\n" );
580
584
seq_puts (s , "---------------------------------------------\n" );
581
585
582
- for (i = 0 ; i < CLK_MSR_MAX ; ++ i ) {
586
+ for (i = 0 ; i < msr_count ; ++ i ) {
583
587
if (!msr_table [i ].name )
584
588
continue ;
585
589
@@ -604,7 +608,7 @@ static const struct regmap_config meson_clk_msr_regmap_config = {
604
608
605
609
static int meson_msr_probe (struct platform_device * pdev )
606
610
{
607
- const struct meson_msr_id * match_data ;
611
+ const struct meson_msr_data * match_data ;
608
612
struct meson_msr * priv ;
609
613
struct dentry * root , * clks ;
610
614
void __iomem * base ;
@@ -621,7 +625,16 @@ static int meson_msr_probe(struct platform_device *pdev)
621
625
return - ENODEV ;
622
626
}
623
627
624
- memcpy (priv -> msr_table , match_data , sizeof (priv -> msr_table ));
628
+ priv -> data .msr_table = devm_kcalloc (& pdev -> dev ,
629
+ match_data -> msr_count ,
630
+ sizeof (struct meson_msr_id ),
631
+ GFP_KERNEL );
632
+ if (!priv -> data .msr_table )
633
+ return - ENOMEM ;
634
+
635
+ memcpy (priv -> data .msr_table , match_data -> msr_table ,
636
+ match_data -> msr_count * sizeof (struct meson_msr_id ));
637
+ priv -> data .msr_count = match_data -> msr_count ;
625
638
626
639
base = devm_platform_ioremap_resource (pdev , 0 );
627
640
if (IS_ERR (base ))
@@ -636,45 +649,70 @@ static int meson_msr_probe(struct platform_device *pdev)
636
649
clks = debugfs_create_dir ("clks" , root );
637
650
638
651
debugfs_create_file ("measure_summary" , 0444 , root ,
639
- priv -> msr_table , & clk_msr_summary_fops );
652
+ priv -> data . msr_table , & clk_msr_summary_fops );
640
653
641
- for (i = 0 ; i < CLK_MSR_MAX ; ++ i ) {
642
- if (!priv -> msr_table [i ].name )
654
+ for (i = 0 ; i < priv -> data . msr_count ; ++ i ) {
655
+ if (!priv -> data . msr_table [i ].name )
643
656
continue ;
644
657
645
- priv -> msr_table [i ].priv = priv ;
658
+ priv -> data . msr_table [i ].priv = priv ;
646
659
647
- debugfs_create_file (priv -> msr_table [i ].name , 0444 , clks ,
648
- & priv -> msr_table [i ], & clk_msr_fops );
660
+ debugfs_create_file (priv -> data . msr_table [i ].name , 0444 , clks ,
661
+ & priv -> data . msr_table [i ], & clk_msr_fops );
649
662
}
650
663
651
664
return 0 ;
652
665
}
653
666
667
+ static const struct meson_msr_data clk_msr_gx_data = {
668
+ .msr_table = (void * )clk_msr_gx ,
669
+ .msr_count = ARRAY_SIZE (clk_msr_gx ),
670
+ };
671
+
672
+ static const struct meson_msr_data clk_msr_m8_data = {
673
+ .msr_table = (void * )clk_msr_m8 ,
674
+ .msr_count = ARRAY_SIZE (clk_msr_m8 ),
675
+ };
676
+
677
+ static const struct meson_msr_data clk_msr_axg_data = {
678
+ .msr_table = (void * )clk_msr_axg ,
679
+ .msr_count = ARRAY_SIZE (clk_msr_axg ),
680
+ };
681
+
682
+ static const struct meson_msr_data clk_msr_g12a_data = {
683
+ .msr_table = (void * )clk_msr_g12a ,
684
+ .msr_count = ARRAY_SIZE (clk_msr_g12a ),
685
+ };
686
+
687
+ static const struct meson_msr_data clk_msr_sm1_data = {
688
+ .msr_table = (void * )clk_msr_sm1 ,
689
+ .msr_count = ARRAY_SIZE (clk_msr_sm1 ),
690
+ };
691
+
654
692
static const struct of_device_id meson_msr_match_table [] = {
655
693
{
656
694
.compatible = "amlogic,meson-gx-clk-measure" ,
657
- .data = ( void * ) clk_msr_gx ,
695
+ .data = & clk_msr_gx_data ,
658
696
},
659
697
{
660
698
.compatible = "amlogic,meson8-clk-measure" ,
661
- .data = ( void * ) clk_msr_m8 ,
699
+ .data = & clk_msr_m8_data ,
662
700
},
663
701
{
664
702
.compatible = "amlogic,meson8b-clk-measure" ,
665
- .data = ( void * ) clk_msr_m8 ,
703
+ .data = & clk_msr_m8_data ,
666
704
},
667
705
{
668
706
.compatible = "amlogic,meson-axg-clk-measure" ,
669
- .data = ( void * ) clk_msr_axg ,
707
+ .data = & clk_msr_axg_data ,
670
708
},
671
709
{
672
710
.compatible = "amlogic,meson-g12a-clk-measure" ,
673
- .data = ( void * ) clk_msr_g12a ,
711
+ .data = & clk_msr_g12a_data ,
674
712
},
675
713
{
676
714
.compatible = "amlogic,meson-sm1-clk-measure" ,
677
- .data = ( void * ) clk_msr_sm1 ,
715
+ .data = & clk_msr_sm1_data ,
678
716
},
679
717
{ /* sentinel */ }
680
718
};
0 commit comments