78
78
#define VC3_PLL1_VCO_MIN 300000000UL
79
79
#define VC3_PLL1_VCO_MAX 600000000UL
80
80
81
- #define VC3_PLL2_VCO_MIN 400000000UL
82
- #define VC3_PLL2_VCO_MAX 1200000000UL
83
-
84
81
#define VC3_PLL3_VCO_MIN 300000000UL
85
82
#define VC3_PLL3_VCO_MAX 800000000UL
86
83
@@ -147,9 +144,13 @@ struct vc3_pfd_data {
147
144
u8 mdiv2_bitmsk ;
148
145
};
149
146
147
+ struct vc3_vco {
148
+ unsigned long min ;
149
+ unsigned long max ;
150
+ };
151
+
150
152
struct vc3_pll_data {
151
- unsigned long vco_min ;
152
- unsigned long vco_max ;
153
+ struct vc3_vco vco ;
153
154
u8 num ;
154
155
u8 int_div_msb_offs ;
155
156
u8 int_div_lsb_offs ;
@@ -166,12 +167,17 @@ struct vc3_div_data {
166
167
struct vc3_hw_data {
167
168
struct clk_hw hw ;
168
169
struct regmap * regmap ;
169
- const void * data ;
170
+ void * data ;
170
171
171
172
u32 div_int ;
172
173
u32 div_frc ;
173
174
};
174
175
176
+ struct vc3_hw_cfg {
177
+ struct vc3_vco pll2_vco ;
178
+ u32 se2_clk_sel_msk ;
179
+ };
180
+
175
181
static const struct clk_div_table div1_divs [] = {
176
182
{ .val = 0 , .div = 1 , }, { .val = 1 , .div = 4 , },
177
183
{ .val = 2 , .div = 5 , }, { .val = 3 , .div = 6 , },
@@ -386,10 +392,10 @@ static long vc3_pll_round_rate(struct clk_hw *hw, unsigned long rate,
386
392
const struct vc3_pll_data * pll = vc3 -> data ;
387
393
u64 div_frc ;
388
394
389
- if (rate < pll -> vco_min )
390
- rate = pll -> vco_min ;
391
- if (rate > pll -> vco_max )
392
- rate = pll -> vco_max ;
395
+ if (rate < pll -> vco . min )
396
+ rate = pll -> vco . min ;
397
+ if (rate > pll -> vco . max )
398
+ rate = pll -> vco . max ;
393
399
394
400
vc3 -> div_int = rate / * parent_rate ;
395
401
@@ -680,8 +686,10 @@ static struct vc3_hw_data clk_pll[] = {
680
686
.num = VC3_PLL1 ,
681
687
.int_div_msb_offs = VC3_PLL1_LOOP_FILTER_N_DIV_MSB ,
682
688
.int_div_lsb_offs = VC3_PLL1_VCO_N_DIVIDER ,
683
- .vco_min = VC3_PLL1_VCO_MIN ,
684
- .vco_max = VC3_PLL1_VCO_MAX
689
+ .vco = {
690
+ .min = VC3_PLL1_VCO_MIN ,
691
+ .max = VC3_PLL1_VCO_MAX
692
+ }
685
693
},
686
694
.hw .init = & (struct clk_init_data ) {
687
695
.name = "pll1" ,
@@ -698,8 +706,6 @@ static struct vc3_hw_data clk_pll[] = {
698
706
.num = VC3_PLL2 ,
699
707
.int_div_msb_offs = VC3_PLL2_FB_INT_DIV_MSB ,
700
708
.int_div_lsb_offs = VC3_PLL2_FB_INT_DIV_LSB ,
701
- .vco_min = VC3_PLL2_VCO_MIN ,
702
- .vco_max = VC3_PLL2_VCO_MAX
703
709
},
704
710
.hw .init = & (struct clk_init_data ) {
705
711
.name = "pll2" ,
@@ -716,8 +722,10 @@ static struct vc3_hw_data clk_pll[] = {
716
722
.num = VC3_PLL3 ,
717
723
.int_div_msb_offs = VC3_PLL3_LOOP_FILTER_N_DIV_MSB ,
718
724
.int_div_lsb_offs = VC3_PLL3_N_DIVIDER ,
719
- .vco_min = VC3_PLL3_VCO_MIN ,
720
- .vco_max = VC3_PLL3_VCO_MAX
725
+ .vco = {
726
+ .min = VC3_PLL3_VCO_MIN ,
727
+ .max = VC3_PLL3_VCO_MAX
728
+ }
721
729
},
722
730
.hw .init = & (struct clk_init_data ) {
723
731
.name = "pll3" ,
@@ -901,7 +909,6 @@ static struct vc3_hw_data clk_mux[] = {
901
909
[VC3_SE2_MUX ] = {
902
910
.data = & (struct vc3_clk_data ) {
903
911
.offs = VC3_SE2_CTRL_REG0 ,
904
- .bitmsk = VC3_SE2_CTRL_REG0_SE2_CLK_SEL
905
912
},
906
913
.hw .init = & (struct clk_init_data ) {
907
914
.name = "se2_mux" ,
@@ -982,6 +989,7 @@ static int vc3_probe(struct i2c_client *client)
982
989
{
983
990
struct device * dev = & client -> dev ;
984
991
u8 settings [NUM_CONFIG_REGISTERS ];
992
+ const struct vc3_hw_cfg * data ;
985
993
struct regmap * regmap ;
986
994
const char * name ;
987
995
int ret , i ;
@@ -1029,9 +1037,16 @@ static int vc3_probe(struct i2c_client *client)
1029
1037
clk_pfd [i ].hw .init -> name );
1030
1038
}
1031
1039
1040
+ data = i2c_get_match_data (client );
1041
+
1032
1042
/* Register pll's */
1033
1043
for (i = 0 ; i < ARRAY_SIZE (clk_pll ); i ++ ) {
1034
1044
clk_pll [i ].regmap = regmap ;
1045
+ if (i == VC3_PLL2 ) {
1046
+ struct vc3_pll_data * pll_data = clk_pll [i ].data ;
1047
+
1048
+ pll_data -> vco = data -> pll2_vco ;
1049
+ }
1035
1050
ret = devm_clk_hw_register (dev , & clk_pll [i ].hw );
1036
1051
if (ret )
1037
1052
return dev_err_probe (dev , ret , "%s failed\n" ,
@@ -1059,6 +1074,11 @@ static int vc3_probe(struct i2c_client *client)
1059
1074
/* Register clk muxes */
1060
1075
for (i = 0 ; i < ARRAY_SIZE (clk_mux ); i ++ ) {
1061
1076
clk_mux [i ].regmap = regmap ;
1077
+ if (i == VC3_SE2_MUX ) {
1078
+ struct vc3_clk_data * clk_data = clk_mux [i ].data ;
1079
+
1080
+ clk_data -> bitmsk = data -> se2_clk_sel_msk ;
1081
+ }
1062
1082
ret = devm_clk_hw_register (dev , & clk_mux [i ].hw );
1063
1083
if (ret )
1064
1084
return dev_err_probe (dev , ret , "%s failed\n" ,
@@ -1108,8 +1128,13 @@ static int vc3_probe(struct i2c_client *client)
1108
1128
return ret ;
1109
1129
}
1110
1130
1131
+ static const struct vc3_hw_cfg vc3_5p = {
1132
+ .pll2_vco = { .min = 400000000UL , .max = 1200000000UL },
1133
+ .se2_clk_sel_msk = BIT (6 ),
1134
+ };
1135
+
1111
1136
static const struct of_device_id dev_ids [] = {
1112
- { .compatible = "renesas,5p35023" },
1137
+ { .compatible = "renesas,5p35023" , . data = & vc3_5p },
1113
1138
{ /* Sentinel */ }
1114
1139
};
1115
1140
MODULE_DEVICE_TABLE (of , dev_ids );
0 commit comments