@@ -302,6 +302,122 @@ static const struct rk_gmac_ops rk3288_ops = {
302
302
.set_rmii_speed = rk3288_set_rmii_speed ,
303
303
};
304
304
305
+ #define RK3328_GRF_MAC_CON0 0x0900
306
+ #define RK3328_GRF_MAC_CON1 0x0904
307
+
308
+ /* RK3328_GRF_MAC_CON0 */
309
+ #define RK3328_GMAC_CLK_RX_DL_CFG (val ) HIWORD_UPDATE(val, 0x7F, 7)
310
+ #define RK3328_GMAC_CLK_TX_DL_CFG (val ) HIWORD_UPDATE(val, 0x7F, 0)
311
+
312
+ /* RK3328_GRF_MAC_CON1 */
313
+ #define RK3328_GMAC_PHY_INTF_SEL_RGMII \
314
+ (GRF_BIT(4) | GRF_CLR_BIT(5) | GRF_CLR_BIT(6))
315
+ #define RK3328_GMAC_PHY_INTF_SEL_RMII \
316
+ (GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | GRF_BIT(6))
317
+ #define RK3328_GMAC_FLOW_CTRL GRF_BIT(3)
318
+ #define RK3328_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
319
+ #define RK3328_GMAC_SPEED_10M GRF_CLR_BIT(2)
320
+ #define RK3328_GMAC_SPEED_100M GRF_BIT(2)
321
+ #define RK3328_GMAC_RMII_CLK_25M GRF_BIT(7)
322
+ #define RK3328_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(7)
323
+ #define RK3328_GMAC_CLK_125M (GRF_CLR_BIT(11) | GRF_CLR_BIT(12))
324
+ #define RK3328_GMAC_CLK_25M (GRF_BIT(11) | GRF_BIT(12))
325
+ #define RK3328_GMAC_CLK_2_5M (GRF_CLR_BIT(11) | GRF_BIT(12))
326
+ #define RK3328_GMAC_RMII_MODE GRF_BIT(9)
327
+ #define RK3328_GMAC_RMII_MODE_CLR GRF_CLR_BIT(9)
328
+ #define RK3328_GMAC_TXCLK_DLY_ENABLE GRF_BIT(0)
329
+ #define RK3328_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(0)
330
+ #define RK3328_GMAC_RXCLK_DLY_ENABLE GRF_BIT(1)
331
+ #define RK3328_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(0)
332
+
333
+ static void rk3328_set_to_rgmii (struct rk_priv_data * bsp_priv ,
334
+ int tx_delay , int rx_delay )
335
+ {
336
+ struct device * dev = & bsp_priv -> pdev -> dev ;
337
+
338
+ if (IS_ERR (bsp_priv -> grf )) {
339
+ dev_err (dev , "Missing rockchip,grf property\n" );
340
+ return ;
341
+ }
342
+
343
+ regmap_write (bsp_priv -> grf , RK3328_GRF_MAC_CON1 ,
344
+ RK3328_GMAC_PHY_INTF_SEL_RGMII |
345
+ RK3328_GMAC_RMII_MODE_CLR |
346
+ RK3328_GMAC_RXCLK_DLY_ENABLE |
347
+ RK3328_GMAC_TXCLK_DLY_ENABLE );
348
+
349
+ regmap_write (bsp_priv -> grf , RK3328_GRF_MAC_CON0 ,
350
+ RK3328_GMAC_CLK_RX_DL_CFG (rx_delay ) |
351
+ RK3328_GMAC_CLK_TX_DL_CFG (tx_delay ));
352
+ }
353
+
354
+ static void rk3328_set_to_rmii (struct rk_priv_data * bsp_priv )
355
+ {
356
+ struct device * dev = & bsp_priv -> pdev -> dev ;
357
+
358
+ if (IS_ERR (bsp_priv -> grf )) {
359
+ dev_err (dev , "Missing rockchip,grf property\n" );
360
+ return ;
361
+ }
362
+
363
+ regmap_write (bsp_priv -> grf , RK3328_GRF_MAC_CON1 ,
364
+ RK3328_GMAC_PHY_INTF_SEL_RMII |
365
+ RK3328_GMAC_RMII_MODE );
366
+
367
+ /* set MAC to RMII mode */
368
+ regmap_write (bsp_priv -> grf , RK3328_GRF_MAC_CON1 , GRF_BIT (11 ));
369
+ }
370
+
371
+ static void rk3328_set_rgmii_speed (struct rk_priv_data * bsp_priv , int speed )
372
+ {
373
+ struct device * dev = & bsp_priv -> pdev -> dev ;
374
+
375
+ if (IS_ERR (bsp_priv -> grf )) {
376
+ dev_err (dev , "Missing rockchip,grf property\n" );
377
+ return ;
378
+ }
379
+
380
+ if (speed == 10 )
381
+ regmap_write (bsp_priv -> grf , RK3328_GRF_MAC_CON1 ,
382
+ RK3328_GMAC_CLK_2_5M );
383
+ else if (speed == 100 )
384
+ regmap_write (bsp_priv -> grf , RK3328_GRF_MAC_CON1 ,
385
+ RK3328_GMAC_CLK_25M );
386
+ else if (speed == 1000 )
387
+ regmap_write (bsp_priv -> grf , RK3328_GRF_MAC_CON1 ,
388
+ RK3328_GMAC_CLK_125M );
389
+ else
390
+ dev_err (dev , "unknown speed value for RGMII! speed=%d" , speed );
391
+ }
392
+
393
+ static void rk3328_set_rmii_speed (struct rk_priv_data * bsp_priv , int speed )
394
+ {
395
+ struct device * dev = & bsp_priv -> pdev -> dev ;
396
+
397
+ if (IS_ERR (bsp_priv -> grf )) {
398
+ dev_err (dev , "Missing rockchip,grf property\n" );
399
+ return ;
400
+ }
401
+
402
+ if (speed == 10 )
403
+ regmap_write (bsp_priv -> grf , RK3328_GRF_MAC_CON1 ,
404
+ RK3328_GMAC_RMII_CLK_2_5M |
405
+ RK3328_GMAC_SPEED_10M );
406
+ else if (speed == 100 )
407
+ regmap_write (bsp_priv -> grf , RK3328_GRF_MAC_CON1 ,
408
+ RK3328_GMAC_RMII_CLK_25M |
409
+ RK3328_GMAC_SPEED_100M );
410
+ else
411
+ dev_err (dev , "unknown speed value for RMII! speed=%d" , speed );
412
+ }
413
+
414
+ static const struct rk_gmac_ops rk3328_ops = {
415
+ .set_to_rgmii = rk3328_set_to_rgmii ,
416
+ .set_to_rmii = rk3328_set_to_rmii ,
417
+ .set_rgmii_speed = rk3328_set_rgmii_speed ,
418
+ .set_rmii_speed = rk3328_set_rmii_speed ,
419
+ };
420
+
305
421
#define RK3366_GRF_SOC_CON6 0x0418
306
422
#define RK3366_GRF_SOC_CON7 0x041c
307
423
@@ -1006,6 +1122,7 @@ static SIMPLE_DEV_PM_OPS(rk_gmac_pm_ops, rk_gmac_suspend, rk_gmac_resume);
1006
1122
static const struct of_device_id rk_gmac_dwmac_match [] = {
1007
1123
{ .compatible = "rockchip,rk3228-gmac" , .data = & rk3228_ops },
1008
1124
{ .compatible = "rockchip,rk3288-gmac" , .data = & rk3288_ops },
1125
+ { .compatible = "rockchip,rk3328-gmac" , .data = & rk3328_ops },
1009
1126
{ .compatible = "rockchip,rk3366-gmac" , .data = & rk3366_ops },
1010
1127
{ .compatible = "rockchip,rk3368-gmac" , .data = & rk3368_ops },
1011
1128
{ .compatible = "rockchip,rk3399-gmac" , .data = & rk3399_ops },
0 commit comments