@@ -83,6 +83,117 @@ struct rk_priv_data {
83
83
(((tx) ? soc##_GMAC_TXCLK_DLY_ENABLE : soc##_GMAC_TXCLK_DLY_DISABLE) | \
84
84
((rx) ? soc##_GMAC_RXCLK_DLY_ENABLE : soc##_GMAC_RXCLK_DLY_DISABLE))
85
85
86
+ #define RK3128_GRF_MAC_CON0 0x0168
87
+ #define RK3128_GRF_MAC_CON1 0x016c
88
+
89
+ /* RK3128_GRF_MAC_CON0 */
90
+ #define RK3128_GMAC_TXCLK_DLY_ENABLE GRF_BIT(14)
91
+ #define RK3128_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(14)
92
+ #define RK3128_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15)
93
+ #define RK3128_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15)
94
+ #define RK3128_GMAC_CLK_RX_DL_CFG (val ) HIWORD_UPDATE(val, 0x7F, 7)
95
+ #define RK3128_GMAC_CLK_TX_DL_CFG (val ) HIWORD_UPDATE(val, 0x7F, 0)
96
+
97
+ /* RK3128_GRF_MAC_CON1 */
98
+ #define RK3128_GMAC_PHY_INTF_SEL_RGMII \
99
+ (GRF_BIT(6) | GRF_CLR_BIT(7) | GRF_CLR_BIT(8))
100
+ #define RK3128_GMAC_PHY_INTF_SEL_RMII \
101
+ (GRF_CLR_BIT(6) | GRF_CLR_BIT(7) | GRF_BIT(8))
102
+ #define RK3128_GMAC_FLOW_CTRL GRF_BIT(9)
103
+ #define RK3128_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(9)
104
+ #define RK3128_GMAC_SPEED_10M GRF_CLR_BIT(10)
105
+ #define RK3128_GMAC_SPEED_100M GRF_BIT(10)
106
+ #define RK3128_GMAC_RMII_CLK_25M GRF_BIT(11)
107
+ #define RK3128_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(11)
108
+ #define RK3128_GMAC_CLK_125M (GRF_CLR_BIT(12) | GRF_CLR_BIT(13))
109
+ #define RK3128_GMAC_CLK_25M (GRF_BIT(12) | GRF_BIT(13))
110
+ #define RK3128_GMAC_CLK_2_5M (GRF_CLR_BIT(12) | GRF_BIT(13))
111
+ #define RK3128_GMAC_RMII_MODE GRF_BIT(14)
112
+ #define RK3128_GMAC_RMII_MODE_CLR GRF_CLR_BIT(14)
113
+
114
+ static void rk3128_set_to_rgmii (struct rk_priv_data * bsp_priv ,
115
+ int tx_delay , int rx_delay )
116
+ {
117
+ struct device * dev = & bsp_priv -> pdev -> dev ;
118
+
119
+ if (IS_ERR (bsp_priv -> grf )) {
120
+ dev_err (dev , "Missing rockchip,grf property\n" );
121
+ return ;
122
+ }
123
+
124
+ regmap_write (bsp_priv -> grf , RK3128_GRF_MAC_CON1 ,
125
+ RK3128_GMAC_PHY_INTF_SEL_RGMII |
126
+ RK3128_GMAC_RMII_MODE_CLR );
127
+ regmap_write (bsp_priv -> grf , RK3128_GRF_MAC_CON0 ,
128
+ DELAY_ENABLE (RK3128 , tx_delay , rx_delay ) |
129
+ RK3128_GMAC_CLK_RX_DL_CFG (rx_delay ) |
130
+ RK3128_GMAC_CLK_TX_DL_CFG (tx_delay ));
131
+ }
132
+
133
+ static void rk3128_set_to_rmii (struct rk_priv_data * bsp_priv )
134
+ {
135
+ struct device * dev = & bsp_priv -> pdev -> dev ;
136
+
137
+ if (IS_ERR (bsp_priv -> grf )) {
138
+ dev_err (dev , "Missing rockchip,grf property\n" );
139
+ return ;
140
+ }
141
+
142
+ regmap_write (bsp_priv -> grf , RK3128_GRF_MAC_CON1 ,
143
+ RK3128_GMAC_PHY_INTF_SEL_RMII | RK3128_GMAC_RMII_MODE );
144
+ }
145
+
146
+ static void rk3128_set_rgmii_speed (struct rk_priv_data * bsp_priv , int speed )
147
+ {
148
+ struct device * dev = & bsp_priv -> pdev -> dev ;
149
+
150
+ if (IS_ERR (bsp_priv -> grf )) {
151
+ dev_err (dev , "Missing rockchip,grf property\n" );
152
+ return ;
153
+ }
154
+
155
+ if (speed == 10 )
156
+ regmap_write (bsp_priv -> grf , RK3128_GRF_MAC_CON1 ,
157
+ RK3128_GMAC_CLK_2_5M );
158
+ else if (speed == 100 )
159
+ regmap_write (bsp_priv -> grf , RK3128_GRF_MAC_CON1 ,
160
+ RK3128_GMAC_CLK_25M );
161
+ else if (speed == 1000 )
162
+ regmap_write (bsp_priv -> grf , RK3128_GRF_MAC_CON1 ,
163
+ RK3128_GMAC_CLK_125M );
164
+ else
165
+ dev_err (dev , "unknown speed value for RGMII! speed=%d" , speed );
166
+ }
167
+
168
+ static void rk3128_set_rmii_speed (struct rk_priv_data * bsp_priv , int speed )
169
+ {
170
+ struct device * dev = & bsp_priv -> pdev -> dev ;
171
+
172
+ if (IS_ERR (bsp_priv -> grf )) {
173
+ dev_err (dev , "Missing rockchip,grf property\n" );
174
+ return ;
175
+ }
176
+
177
+ if (speed == 10 ) {
178
+ regmap_write (bsp_priv -> grf , RK3128_GRF_MAC_CON1 ,
179
+ RK3128_GMAC_RMII_CLK_2_5M |
180
+ RK3128_GMAC_SPEED_10M );
181
+ } else if (speed == 100 ) {
182
+ regmap_write (bsp_priv -> grf , RK3128_GRF_MAC_CON1 ,
183
+ RK3128_GMAC_RMII_CLK_25M |
184
+ RK3128_GMAC_SPEED_100M );
185
+ } else {
186
+ dev_err (dev , "unknown speed value for RMII! speed=%d" , speed );
187
+ }
188
+ }
189
+
190
+ static const struct rk_gmac_ops rk3128_ops = {
191
+ .set_to_rgmii = rk3128_set_to_rgmii ,
192
+ .set_to_rmii = rk3128_set_to_rmii ,
193
+ .set_rgmii_speed = rk3128_set_rgmii_speed ,
194
+ .set_rmii_speed = rk3128_set_rmii_speed ,
195
+ };
196
+
86
197
#define RK3228_GRF_MAC_CON0 0x0900
87
198
#define RK3228_GRF_MAC_CON1 0x0904
88
199
@@ -1313,6 +1424,7 @@ static int rk_gmac_resume(struct device *dev)
1313
1424
static SIMPLE_DEV_PM_OPS (rk_gmac_pm_ops , rk_gmac_suspend , rk_gmac_resume ) ;
1314
1425
1315
1426
static const struct of_device_id rk_gmac_dwmac_match [] = {
1427
+ { .compatible = "rockchip,rk3128-gmac" , .data = & rk3128_ops },
1316
1428
{ .compatible = "rockchip,rk3228-gmac" , .data = & rk3228_ops },
1317
1429
{ .compatible = "rockchip,rk3288-gmac" , .data = & rk3288_ops },
1318
1430
{ .compatible = "rockchip,rk3328-gmac" , .data = & rk3328_ops },
0 commit comments