14
14
15
15
static DEFINE_MUTEX (measure_lock );
16
16
17
- #define MSR_CLK_DUTY 0x0
18
- #define MSR_CLK_REG0 0x4
19
- #define MSR_CLK_REG1 0x8
20
- #define MSR_CLK_REG2 0xc
21
-
22
17
#define MSR_DURATION GENMASK(15, 0)
23
18
#define MSR_ENABLE BIT(16)
24
19
#define MSR_CONT BIT(17) /* continuous measurement */
@@ -39,9 +34,17 @@ struct meson_msr_id {
39
34
const char * name ;
40
35
};
41
36
37
+ struct msr_reg_offset {
38
+ unsigned int duty_val ;
39
+ unsigned int freq_ctrl ;
40
+ unsigned int duty_ctrl ;
41
+ unsigned int freq_val ;
42
+ };
43
+
42
44
struct meson_msr_data {
43
45
struct meson_msr_id * msr_table ;
44
46
unsigned int msr_count ;
47
+ const struct msr_reg_offset * reg ;
45
48
};
46
49
47
50
struct meson_msr {
@@ -495,40 +498,41 @@ static int meson_measure_id(struct meson_msr_id *clk_msr_id,
495
498
unsigned int duration )
496
499
{
497
500
struct meson_msr * priv = clk_msr_id -> priv ;
501
+ const struct msr_reg_offset * reg = priv -> data .reg ;
498
502
unsigned int val ;
499
503
int ret ;
500
504
501
505
ret = mutex_lock_interruptible (& measure_lock );
502
506
if (ret )
503
507
return ret ;
504
508
505
- regmap_write (priv -> regmap , MSR_CLK_REG0 , 0 );
509
+ regmap_write (priv -> regmap , reg -> freq_ctrl , 0 );
506
510
507
511
/* Set measurement duration */
508
- regmap_update_bits (priv -> regmap , MSR_CLK_REG0 , MSR_DURATION ,
512
+ regmap_update_bits (priv -> regmap , reg -> freq_ctrl , MSR_DURATION ,
509
513
FIELD_PREP (MSR_DURATION , duration - 1 ));
510
514
511
515
/* Set ID */
512
- regmap_update_bits (priv -> regmap , MSR_CLK_REG0 , MSR_CLK_SRC ,
516
+ regmap_update_bits (priv -> regmap , reg -> freq_ctrl , MSR_CLK_SRC ,
513
517
FIELD_PREP (MSR_CLK_SRC , clk_msr_id -> id ));
514
518
515
519
/* Enable & Start */
516
- regmap_update_bits (priv -> regmap , MSR_CLK_REG0 ,
520
+ regmap_update_bits (priv -> regmap , reg -> freq_ctrl ,
517
521
MSR_RUN | MSR_ENABLE ,
518
522
MSR_RUN | MSR_ENABLE );
519
523
520
- ret = regmap_read_poll_timeout (priv -> regmap , MSR_CLK_REG0 ,
524
+ ret = regmap_read_poll_timeout (priv -> regmap , reg -> freq_ctrl ,
521
525
val , !(val & MSR_BUSY ), 10 , 10000 );
522
526
if (ret ) {
523
527
mutex_unlock (& measure_lock );
524
528
return ret ;
525
529
}
526
530
527
531
/* Disable */
528
- regmap_update_bits (priv -> regmap , MSR_CLK_REG0 , MSR_ENABLE , 0 );
532
+ regmap_update_bits (priv -> regmap , reg -> freq_ctrl , MSR_ENABLE , 0 );
529
533
530
534
/* Get the value in multiple of gate time counts */
531
- regmap_read (priv -> regmap , MSR_CLK_REG2 , & val );
535
+ regmap_read (priv -> regmap , reg -> freq_val , & val );
532
536
533
537
mutex_unlock (& measure_lock );
534
538
@@ -599,18 +603,18 @@ static int clk_msr_summary_show(struct seq_file *s, void *data)
599
603
}
600
604
DEFINE_SHOW_ATTRIBUTE (clk_msr_summary );
601
605
602
- static const struct regmap_config meson_clk_msr_regmap_config = {
606
+ static struct regmap_config meson_clk_msr_regmap_config = {
603
607
.reg_bits = 32 ,
604
608
.val_bits = 32 ,
605
609
.reg_stride = 4 ,
606
- .max_register = MSR_CLK_REG2 ,
607
610
};
608
611
609
612
static int meson_msr_probe (struct platform_device * pdev )
610
613
{
611
614
const struct meson_msr_data * match_data ;
612
615
struct meson_msr * priv ;
613
616
struct dentry * root , * clks ;
617
+ struct resource * res ;
614
618
void __iomem * base ;
615
619
int i ;
616
620
@@ -636,15 +640,24 @@ static int meson_msr_probe(struct platform_device *pdev)
636
640
match_data -> msr_count * sizeof (struct meson_msr_id ));
637
641
priv -> data .msr_count = match_data -> msr_count ;
638
642
639
- base = devm_platform_ioremap_resource (pdev , 0 );
643
+ base = devm_platform_get_and_ioremap_resource (pdev , 0 , & res );
640
644
if (IS_ERR (base ))
641
645
return PTR_ERR (base );
642
646
647
+ meson_clk_msr_regmap_config .max_register = resource_size (res ) - 4 ;
643
648
priv -> regmap = devm_regmap_init_mmio (& pdev -> dev , base ,
644
649
& meson_clk_msr_regmap_config );
645
650
if (IS_ERR (priv -> regmap ))
646
651
return PTR_ERR (priv -> regmap );
647
652
653
+ priv -> data .reg = devm_kzalloc (& pdev -> dev , sizeof (struct msr_reg_offset ),
654
+ GFP_KERNEL );
655
+ if (!priv -> data .reg )
656
+ return - ENOMEM ;
657
+
658
+ memcpy ((void * )priv -> data .reg , match_data -> reg ,
659
+ sizeof (struct msr_reg_offset ));
660
+
648
661
root = debugfs_create_dir ("meson-clk-msr" , NULL );
649
662
clks = debugfs_create_dir ("clks" , root );
650
663
@@ -664,29 +677,41 @@ static int meson_msr_probe(struct platform_device *pdev)
664
677
return 0 ;
665
678
}
666
679
680
+ static const struct msr_reg_offset msr_reg_offset = {
681
+ .duty_val = 0x0 ,
682
+ .freq_ctrl = 0x4 ,
683
+ .duty_ctrl = 0x8 ,
684
+ .freq_val = 0xc ,
685
+ };
686
+
667
687
static const struct meson_msr_data clk_msr_gx_data = {
668
688
.msr_table = (void * )clk_msr_gx ,
669
689
.msr_count = ARRAY_SIZE (clk_msr_gx ),
690
+ .reg = & msr_reg_offset ,
670
691
};
671
692
672
693
static const struct meson_msr_data clk_msr_m8_data = {
673
694
.msr_table = (void * )clk_msr_m8 ,
674
695
.msr_count = ARRAY_SIZE (clk_msr_m8 ),
696
+ .reg = & msr_reg_offset ,
675
697
};
676
698
677
699
static const struct meson_msr_data clk_msr_axg_data = {
678
700
.msr_table = (void * )clk_msr_axg ,
679
701
.msr_count = ARRAY_SIZE (clk_msr_axg ),
702
+ .reg = & msr_reg_offset ,
680
703
};
681
704
682
705
static const struct meson_msr_data clk_msr_g12a_data = {
683
706
.msr_table = (void * )clk_msr_g12a ,
684
707
.msr_count = ARRAY_SIZE (clk_msr_g12a ),
708
+ .reg = & msr_reg_offset ,
685
709
};
686
710
687
711
static const struct meson_msr_data clk_msr_sm1_data = {
688
712
.msr_table = (void * )clk_msr_sm1 ,
689
713
.msr_count = ARRAY_SIZE (clk_msr_sm1 ),
714
+ .reg = & msr_reg_offset ,
690
715
};
691
716
692
717
static const struct of_device_id meson_msr_match_table [] = {
0 commit comments