@@ -21,6 +21,8 @@ enum loongson2_clk_type {
21
21
CLK_TYPE_PLL ,
22
22
CLK_TYPE_SCALE ,
23
23
CLK_TYPE_DIVIDER ,
24
+ CLK_TYPE_GATE ,
25
+ CLK_TYPE_FIXED ,
24
26
CLK_TYPE_NONE ,
25
27
};
26
28
@@ -45,11 +47,13 @@ struct loongson2_clk_board_info {
45
47
enum loongson2_clk_type type ;
46
48
const char * name ;
47
49
const char * parent_name ;
50
+ unsigned long fixed_rate ;
48
51
u8 reg_offset ;
49
52
u8 div_shift ;
50
53
u8 div_width ;
51
54
u8 mult_shift ;
52
55
u8 mult_width ;
56
+ u8 bit_idx ;
53
57
};
54
58
55
59
#define CLK_DIV (_id , _name , _pname , _offset , _dshift , _dwidth ) \
@@ -89,6 +93,25 @@ struct loongson2_clk_board_info {
89
93
.div_width = _dwidth, \
90
94
}
91
95
96
+ #define CLK_GATE (_id , _name , _pname , _offset , _bidx ) \
97
+ { \
98
+ .id = _id, \
99
+ .type = CLK_TYPE_GATE, \
100
+ .name = _name, \
101
+ .parent_name = _pname, \
102
+ .reg_offset = _offset, \
103
+ .bit_idx = _bidx, \
104
+ }
105
+
106
+ #define CLK_FIXED (_id , _name , _pname , _rate ) \
107
+ { \
108
+ .id = _id, \
109
+ .type = CLK_TYPE_FIXED, \
110
+ .name = _name, \
111
+ .parent_name = _pname, \
112
+ .fixed_rate = _rate, \
113
+ }
114
+
92
115
static const struct loongson2_clk_board_info ls2k0500_clks [] = {
93
116
CLK_PLL (LOONGSON2_NODE_PLL , "pll_node" , 0 , 16 , 8 , 8 , 6 ),
94
117
CLK_PLL (LOONGSON2_DDR_PLL , "pll_ddr" , 0x8 , 16 , 8 , 8 , 6 ),
@@ -137,6 +160,44 @@ static const struct loongson2_clk_board_info ls2k1000_clks[] = {
137
160
{ /* Sentinel */ },
138
161
};
139
162
163
+ static const struct loongson2_clk_board_info ls2k2000_clks [] = {
164
+ CLK_PLL (LOONGSON2_DC_PLL , "pll_0" , 0 , 21 , 9 , 32 , 6 ),
165
+ CLK_PLL (LOONGSON2_DDR_PLL , "pll_1" , 0x10 , 21 , 9 , 32 , 6 ),
166
+ CLK_PLL (LOONGSON2_NODE_PLL , "pll_2" , 0x20 , 21 , 9 , 32 , 6 ),
167
+ CLK_PLL (LOONGSON2_PIX0_PLL , "pll_pix0" , 0x30 , 21 , 9 , 32 , 6 ),
168
+ CLK_PLL (LOONGSON2_PIX1_PLL , "pll_pix1" , 0x40 , 21 , 9 , 32 , 6 ),
169
+ CLK_GATE (LOONGSON2_OUT0_GATE , "out0_gate" , "pll_0" , 0 , 40 ),
170
+ CLK_GATE (LOONGSON2_GMAC_GATE , "gmac_gate" , "pll_0" , 0 , 41 ),
171
+ CLK_GATE (LOONGSON2_RIO_GATE , "rio_gate" , "pll_0" , 0 , 42 ),
172
+ CLK_GATE (LOONGSON2_DC_GATE , "dc_gate" , "pll_1" , 0x10 , 40 ),
173
+ CLK_GATE (LOONGSON2_DDR_GATE , "ddr_gate" , "pll_1" , 0x10 , 41 ),
174
+ CLK_GATE (LOONGSON2_GPU_GATE , "gpu_gate" , "pll_1" , 0x10 , 42 ),
175
+ CLK_GATE (LOONGSON2_HDA_GATE , "hda_gate" , "pll_2" , 0x20 , 40 ),
176
+ CLK_GATE (LOONGSON2_NODE_GATE , "node_gate" , "pll_2" , 0x20 , 41 ),
177
+ CLK_GATE (LOONGSON2_EMMC_GATE , "emmc_gate" , "pll_2" , 0x20 , 42 ),
178
+ CLK_GATE (LOONGSON2_PIX0_GATE , "pix0_gate" , "pll_pix0" , 0x30 , 40 ),
179
+ CLK_GATE (LOONGSON2_PIX1_GATE , "pix1_gate" , "pll_pix1" , 0x40 , 40 ),
180
+ CLK_DIV (LOONGSON2_OUT0_CLK , "clk_out0" , "out0_gate" , 0 , 0 , 6 ),
181
+ CLK_DIV (LOONGSON2_GMAC_CLK , "clk_gmac" , "gmac_gate" , 0 , 7 , 6 ),
182
+ CLK_DIV (LOONGSON2_RIO_CLK , "clk_rio" , "rio_gate" , 0 , 14 , 6 ),
183
+ CLK_DIV (LOONGSON2_DC_CLK , "clk_dc" , "dc_gate" , 0x10 , 0 , 6 ),
184
+ CLK_DIV (LOONGSON2_GPU_CLK , "clk_gpu" , "gpu_gate" , 0x10 , 7 , 6 ),
185
+ CLK_DIV (LOONGSON2_DDR_CLK , "clk_ddr" , "ddr_gate" , 0x10 , 14 , 6 ),
186
+ CLK_DIV (LOONGSON2_HDA_CLK , "clk_hda" , "hda_gate" , 0x20 , 0 , 6 ),
187
+ CLK_DIV (LOONGSON2_NODE_CLK , "clk_node" , "node_gate" , 0x20 , 7 , 6 ),
188
+ CLK_DIV (LOONGSON2_EMMC_CLK , "clk_emmc" , "emmc_gate" , 0x20 , 14 , 6 ),
189
+ CLK_DIV (LOONGSON2_PIX0_CLK , "clk_pix0" , "pll_pix0" , 0x30 , 0 , 6 ),
190
+ CLK_DIV (LOONGSON2_PIX1_CLK , "clk_pix1" , "pll_pix1" , 0x40 , 0 , 6 ),
191
+ CLK_SCALE (LOONGSON2_SATA_CLK , "clk_sata" , "clk_out0" , 0x50 , 12 , 3 ),
192
+ CLK_SCALE (LOONGSON2_USB_CLK , "clk_usb" , "clk_out0" , 0x50 , 16 , 3 ),
193
+ CLK_SCALE (LOONGSON2_APB_CLK , "clk_apb" , "clk_node" , 0x50 , 20 , 3 ),
194
+ CLK_SCALE (LOONGSON2_BOOT_CLK , "clk_boot" , NULL , 0x50 , 23 , 3 ),
195
+ CLK_SCALE (LOONGSON2_DES_CLK , "clk_des" , "clk_node" , 0x50 , 40 , 3 ),
196
+ CLK_SCALE (LOONGSON2_I2S_CLK , "clk_i2s" , "clk_node" , 0x50 , 44 , 3 ),
197
+ CLK_FIXED (LOONGSON2_MISC_CLK , "clk_misc" , NULL , 50000000 ),
198
+ { /* Sentinel */ },
199
+ };
200
+
140
201
static inline struct loongson2_clk_data * to_loongson2_clk (struct clk_hw * hw )
141
202
{
142
203
return container_of (hw , struct loongson2_clk_data , hw );
@@ -265,6 +326,16 @@ static int loongson2_clk_probe(struct platform_device *pdev)
265
326
CLK_DIVIDER_ONE_BASED ,
266
327
& clp -> clk_lock );
267
328
break ;
329
+ case CLK_TYPE_GATE :
330
+ hw = devm_clk_hw_register_gate (dev , p -> name , p -> parent_name , 0 ,
331
+ clp -> base + p -> reg_offset ,
332
+ p -> bit_idx , 0 ,
333
+ & clp -> clk_lock );
334
+ break ;
335
+ case CLK_TYPE_FIXED :
336
+ hw = clk_hw_register_fixed_rate_parent_data (dev , p -> name , pdata ,
337
+ 0 , p -> fixed_rate );
338
+ break ;
268
339
default :
269
340
return dev_err_probe (dev , - EINVAL , "Invalid clk type\n" );
270
341
}
@@ -283,6 +354,7 @@ static int loongson2_clk_probe(struct platform_device *pdev)
283
354
static const struct of_device_id loongson2_clk_match_table [] = {
284
355
{ .compatible = "loongson,ls2k0500-clk" , .data = & ls2k0500_clks },
285
356
{ .compatible = "loongson,ls2k-clk" , .data = & ls2k1000_clks },
357
+ { .compatible = "loongson,ls2k2000-clk" , .data = & ls2k2000_clks },
286
358
{ }
287
359
};
288
360
MODULE_DEVICE_TABLE (of , loongson2_clk_match_table );
0 commit comments