26
26
#define ST_CLK_GATE 3
27
27
#define ST_MAX_CLKS 4
28
28
29
+ #define RV_CLK_48M 0
30
+ #define RV_CLK_GATE 1
31
+ #define RV_MAX_CLKS 2
32
+
29
33
static const char * const clk_oscout1_parents [] = { "clk48MHz" , "clk25MHz" };
30
34
static struct clk_hw * hws [ST_MAX_CLKS ];
31
35
@@ -37,33 +41,52 @@ static int fch_clk_probe(struct platform_device *pdev)
37
41
if (!fch_data || !fch_data -> base )
38
42
return - EINVAL ;
39
43
40
- hws [ST_CLK_48M ] = clk_hw_register_fixed_rate (NULL , "clk48MHz" , NULL , 0 ,
41
- 48000000 );
42
- hws [ST_CLK_25M ] = clk_hw_register_fixed_rate (NULL , "clk25MHz" , NULL , 0 ,
43
- 25000000 );
44
+ if (!fch_data -> is_rv ) {
45
+ hws [ST_CLK_48M ] = clk_hw_register_fixed_rate (NULL , "clk48MHz" ,
46
+ NULL , 0 , 48000000 );
47
+ hws [ST_CLK_25M ] = clk_hw_register_fixed_rate (NULL , "clk25MHz" ,
48
+ NULL , 0 , 25000000 );
49
+
50
+ hws [ST_CLK_MUX ] = clk_hw_register_mux (NULL , "oscout1_mux" ,
51
+ clk_oscout1_parents , ARRAY_SIZE (clk_oscout1_parents ),
52
+ 0 , fch_data -> base + CLKDRVSTR2 , OSCOUT1CLK25MHZ , 3 , 0 ,
53
+ NULL );
44
54
45
- hws [ST_CLK_MUX ] = clk_hw_register_mux (NULL , "oscout1_mux" ,
46
- clk_oscout1_parents , ARRAY_SIZE (clk_oscout1_parents ),
47
- 0 , fch_data -> base + CLKDRVSTR2 , OSCOUT1CLK25MHZ , 3 , 0 , NULL );
55
+ clk_set_parent (hws [ST_CLK_MUX ]-> clk , hws [ST_CLK_48M ]-> clk );
48
56
49
- clk_set_parent (hws [ST_CLK_MUX ]-> clk , hws [ST_CLK_48M ]-> clk );
57
+ hws [ST_CLK_GATE ] = clk_hw_register_gate (NULL , "oscout1" ,
58
+ "oscout1_mux" , 0 , fch_data -> base + MISCCLKCNTL1 ,
59
+ OSCCLKENB , CLK_GATE_SET_TO_DISABLE , NULL );
50
60
51
- hws [ST_CLK_GATE ] = clk_hw_register_gate (NULL , "oscout1" , "oscout1_mux" ,
52
- 0 , fch_data -> base + MISCCLKCNTL1 , OSCCLKENB ,
53
- CLK_GATE_SET_TO_DISABLE , NULL );
61
+ devm_clk_hw_register_clkdev (& pdev -> dev , hws [ST_CLK_GATE ],
62
+ "oscout1" , NULL );
63
+ } else {
64
+ hws [RV_CLK_48M ] = clk_hw_register_fixed_rate (NULL , "clk48MHz" ,
65
+ NULL , 0 , 48000000 );
54
66
55
- devm_clk_hw_register_clkdev (& pdev -> dev , hws [ST_CLK_GATE ], "oscout1" ,
56
- NULL );
67
+ hws [RV_CLK_GATE ] = clk_hw_register_gate (NULL , "oscout1" ,
68
+ "clk48MHz" , 0 , fch_data -> base + MISCCLKCNTL1 ,
69
+ OSCCLKENB , CLK_GATE_SET_TO_DISABLE , NULL );
70
+
71
+ devm_clk_hw_register_clkdev (& pdev -> dev , hws [RV_CLK_GATE ],
72
+ "oscout1" , NULL );
73
+ }
57
74
58
75
return 0 ;
59
76
}
60
77
61
78
static int fch_clk_remove (struct platform_device * pdev )
62
79
{
63
- int i ;
80
+ int i , clks ;
81
+ struct fch_clk_data * fch_data ;
64
82
65
- for (i = 0 ; i < ST_MAX_CLKS ; i ++ )
83
+ fch_data = dev_get_platdata (& pdev -> dev );
84
+
85
+ clks = fch_data -> is_rv ? RV_MAX_CLKS : ST_MAX_CLKS ;
86
+
87
+ for (i = 0 ; i < clks ; i ++ )
66
88
clk_hw_unregister (hws [i ]);
89
+
67
90
return 0 ;
68
91
}
69
92
0 commit comments