2626#define ST_CLK_GATE 3
2727#define ST_MAX_CLKS 4
2828
29+ #define RV_CLK_48M 0
30+ #define RV_CLK_GATE 1
31+ #define RV_MAX_CLKS 2
32+
2933static const char * const clk_oscout1_parents [] = { "clk48MHz" , "clk25MHz" };
3034static struct clk_hw * hws [ST_MAX_CLKS ];
3135
@@ -37,33 +41,52 @@ static int fch_clk_probe(struct platform_device *pdev)
3741 if (!fch_data || !fch_data -> base )
3842 return - EINVAL ;
3943
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 );
4454
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 );
4856
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 );
5060
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 );
5466
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+ }
5774
5875 return 0 ;
5976}
6077
6178static int fch_clk_remove (struct platform_device * pdev )
6279{
63- int i ;
80+ int i , clks ;
81+ struct fch_clk_data * fch_data ;
6482
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 ++ )
6688 clk_hw_unregister (hws [i ]);
89+
6790 return 0 ;
6891}
6992
0 commit comments