@@ -33,6 +33,7 @@ struct rk_gmac_ops {
33
33
void (* set_clock_selection )(struct rk_priv_data * bsp_priv , bool input ,
34
34
bool enable );
35
35
void (* integrated_phy_powerup )(struct rk_priv_data * bsp_priv );
36
+ void (* integrated_phy_powerdown )(struct rk_priv_data * bsp_priv );
36
37
bool php_grf_required ;
37
38
bool regs_valid ;
38
39
u32 regs [];
@@ -92,6 +93,76 @@ struct rk_priv_data {
92
93
(((tx) ? soc##_GMAC_TXCLK_DLY_ENABLE : soc##_GMAC_TXCLK_DLY_DISABLE) | \
93
94
((rx) ? soc##_GMAC_RXCLK_DLY_ENABLE : soc##_GMAC_RXCLK_DLY_DISABLE))
94
95
96
+ #define RK_GRF_MACPHY_CON0 0xb00
97
+ #define RK_GRF_MACPHY_CON1 0xb04
98
+ #define RK_GRF_MACPHY_CON2 0xb08
99
+ #define RK_GRF_MACPHY_CON3 0xb0c
100
+
101
+ #define RK_MACPHY_ENABLE GRF_BIT(0)
102
+ #define RK_MACPHY_DISABLE GRF_CLR_BIT(0)
103
+ #define RK_MACPHY_CFG_CLK_50M GRF_BIT(14)
104
+ #define RK_GMAC2PHY_RMII_MODE (GRF_BIT(6) | GRF_CLR_BIT(7))
105
+ #define RK_GRF_CON2_MACPHY_ID HIWORD_UPDATE(0x1234, 0xffff, 0)
106
+ #define RK_GRF_CON3_MACPHY_ID HIWORD_UPDATE(0x35, 0x3f, 0)
107
+
108
+ static void rk_gmac_integrated_ephy_powerup (struct rk_priv_data * priv )
109
+ {
110
+ regmap_write (priv -> grf , RK_GRF_MACPHY_CON0 , RK_MACPHY_CFG_CLK_50M );
111
+ regmap_write (priv -> grf , RK_GRF_MACPHY_CON0 , RK_GMAC2PHY_RMII_MODE );
112
+
113
+ regmap_write (priv -> grf , RK_GRF_MACPHY_CON2 , RK_GRF_CON2_MACPHY_ID );
114
+ regmap_write (priv -> grf , RK_GRF_MACPHY_CON3 , RK_GRF_CON3_MACPHY_ID );
115
+
116
+ if (priv -> phy_reset ) {
117
+ /* PHY needs to be disabled before trying to reset it */
118
+ regmap_write (priv -> grf , RK_GRF_MACPHY_CON0 , RK_MACPHY_DISABLE );
119
+ if (priv -> phy_reset )
120
+ reset_control_assert (priv -> phy_reset );
121
+ usleep_range (10 , 20 );
122
+ if (priv -> phy_reset )
123
+ reset_control_deassert (priv -> phy_reset );
124
+ usleep_range (10 , 20 );
125
+ regmap_write (priv -> grf , RK_GRF_MACPHY_CON0 , RK_MACPHY_ENABLE );
126
+ msleep (30 );
127
+ }
128
+ }
129
+
130
+ static void rk_gmac_integrated_ephy_powerdown (struct rk_priv_data * priv )
131
+ {
132
+ regmap_write (priv -> grf , RK_GRF_MACPHY_CON0 , RK_MACPHY_DISABLE );
133
+ if (priv -> phy_reset )
134
+ reset_control_assert (priv -> phy_reset );
135
+ }
136
+
137
+ #define RK_FEPHY_SHUTDOWN GRF_BIT(1)
138
+ #define RK_FEPHY_POWERUP GRF_CLR_BIT(1)
139
+ #define RK_FEPHY_INTERNAL_RMII_SEL GRF_BIT(6)
140
+ #define RK_FEPHY_24M_CLK_SEL (GRF_BIT(8) | GRF_BIT(9))
141
+ #define RK_FEPHY_PHY_ID GRF_BIT(11)
142
+
143
+ static void rk_gmac_integrated_fephy_powerup (struct rk_priv_data * priv ,
144
+ unsigned int reg )
145
+ {
146
+ reset_control_assert (priv -> phy_reset );
147
+ usleep_range (20 , 30 );
148
+
149
+ regmap_write (priv -> grf , reg ,
150
+ RK_FEPHY_POWERUP |
151
+ RK_FEPHY_INTERNAL_RMII_SEL |
152
+ RK_FEPHY_24M_CLK_SEL |
153
+ RK_FEPHY_PHY_ID );
154
+ usleep_range (10000 , 12000 );
155
+
156
+ reset_control_deassert (priv -> phy_reset );
157
+ usleep_range (50000 , 60000 );
158
+ }
159
+
160
+ static void rk_gmac_integrated_fephy_powerdown (struct rk_priv_data * priv ,
161
+ unsigned int reg )
162
+ {
163
+ regmap_write (priv -> grf , reg , RK_FEPHY_SHUTDOWN );
164
+ }
165
+
95
166
#define PX30_GRF_GMAC_CON1 0x0904
96
167
97
168
/* PX30_GRF_GMAC_CON1 */
@@ -324,14 +395,17 @@ static void rk3228_integrated_phy_powerup(struct rk_priv_data *priv)
324
395
{
325
396
regmap_write (priv -> grf , RK3228_GRF_CON_MUX ,
326
397
RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY );
398
+
399
+ rk_gmac_integrated_ephy_powerup (priv );
327
400
}
328
401
329
402
static const struct rk_gmac_ops rk3228_ops = {
330
403
.set_to_rgmii = rk3228_set_to_rgmii ,
331
404
.set_to_rmii = rk3228_set_to_rmii ,
332
405
.set_rgmii_speed = rk3228_set_rgmii_speed ,
333
406
.set_rmii_speed = rk3228_set_rmii_speed ,
334
- .integrated_phy_powerup = rk3228_integrated_phy_powerup ,
407
+ .integrated_phy_powerup = rk3228_integrated_phy_powerup ,
408
+ .integrated_phy_powerdown = rk_gmac_integrated_ephy_powerdown ,
335
409
};
336
410
337
411
#define RK3288_GRF_SOC_CON1 0x0248
@@ -557,14 +631,17 @@ static void rk3328_integrated_phy_powerup(struct rk_priv_data *priv)
557
631
{
558
632
regmap_write (priv -> grf , RK3328_GRF_MACPHY_CON1 ,
559
633
RK3328_MACPHY_RMII_MODE );
634
+
635
+ rk_gmac_integrated_ephy_powerup (priv );
560
636
}
561
637
562
638
static const struct rk_gmac_ops rk3328_ops = {
563
639
.set_to_rgmii = rk3328_set_to_rgmii ,
564
640
.set_to_rmii = rk3328_set_to_rmii ,
565
641
.set_rgmii_speed = rk3328_set_rgmii_speed ,
566
642
.set_rmii_speed = rk3328_set_rmii_speed ,
567
- .integrated_phy_powerup = rk3328_integrated_phy_powerup ,
643
+ .integrated_phy_powerup = rk3328_integrated_phy_powerup ,
644
+ .integrated_phy_powerdown = rk_gmac_integrated_ephy_powerdown ,
568
645
};
569
646
570
647
#define RK3366_GRF_SOC_CON6 0x0418
@@ -828,6 +905,149 @@ static const struct rk_gmac_ops rk3399_ops = {
828
905
.set_rmii_speed = rk3399_set_rmii_speed ,
829
906
};
830
907
908
+ #define RK3528_VO_GRF_GMAC_CON 0x0018
909
+ #define RK3528_VO_GRF_MACPHY_CON0 0x001c
910
+ #define RK3528_VO_GRF_MACPHY_CON1 0x0020
911
+ #define RK3528_VPU_GRF_GMAC_CON5 0x0018
912
+ #define RK3528_VPU_GRF_GMAC_CON6 0x001c
913
+
914
+ #define RK3528_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15)
915
+ #define RK3528_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15)
916
+ #define RK3528_GMAC_TXCLK_DLY_ENABLE GRF_BIT(14)
917
+ #define RK3528_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(14)
918
+
919
+ #define RK3528_GMAC_CLK_RX_DL_CFG (val ) HIWORD_UPDATE(val, 0xFF, 8)
920
+ #define RK3528_GMAC_CLK_TX_DL_CFG (val ) HIWORD_UPDATE(val, 0xFF, 0)
921
+
922
+ #define RK3528_GMAC0_PHY_INTF_SEL_RMII GRF_BIT(1)
923
+ #define RK3528_GMAC1_PHY_INTF_SEL_RGMII GRF_CLR_BIT(8)
924
+ #define RK3528_GMAC1_PHY_INTF_SEL_RMII GRF_BIT(8)
925
+
926
+ #define RK3528_GMAC1_CLK_SELECT_CRU GRF_CLR_BIT(12)
927
+ #define RK3528_GMAC1_CLK_SELECT_IO GRF_BIT(12)
928
+
929
+ #define RK3528_GMAC0_CLK_RMII_DIV2 GRF_BIT(3)
930
+ #define RK3528_GMAC0_CLK_RMII_DIV20 GRF_CLR_BIT(3)
931
+ #define RK3528_GMAC1_CLK_RMII_DIV2 GRF_BIT(10)
932
+ #define RK3528_GMAC1_CLK_RMII_DIV20 GRF_CLR_BIT(10)
933
+
934
+ #define RK3528_GMAC1_CLK_RGMII_DIV1 (GRF_CLR_BIT(11) | GRF_CLR_BIT(10))
935
+ #define RK3528_GMAC1_CLK_RGMII_DIV5 (GRF_BIT(11) | GRF_BIT(10))
936
+ #define RK3528_GMAC1_CLK_RGMII_DIV50 (GRF_BIT(11) | GRF_CLR_BIT(10))
937
+
938
+ #define RK3528_GMAC0_CLK_RMII_GATE GRF_BIT(2)
939
+ #define RK3528_GMAC0_CLK_RMII_NOGATE GRF_CLR_BIT(2)
940
+ #define RK3528_GMAC1_CLK_RMII_GATE GRF_BIT(9)
941
+ #define RK3528_GMAC1_CLK_RMII_NOGATE GRF_CLR_BIT(9)
942
+
943
+ static void rk3528_set_to_rgmii (struct rk_priv_data * bsp_priv ,
944
+ int tx_delay , int rx_delay )
945
+ {
946
+ regmap_write (bsp_priv -> grf , RK3528_VPU_GRF_GMAC_CON5 ,
947
+ RK3528_GMAC1_PHY_INTF_SEL_RGMII );
948
+
949
+ regmap_write (bsp_priv -> grf , RK3528_VPU_GRF_GMAC_CON5 ,
950
+ DELAY_ENABLE (RK3528 , tx_delay , rx_delay ));
951
+
952
+ regmap_write (bsp_priv -> grf , RK3528_VPU_GRF_GMAC_CON6 ,
953
+ RK3528_GMAC_CLK_RX_DL_CFG (rx_delay ) |
954
+ RK3528_GMAC_CLK_TX_DL_CFG (tx_delay ));
955
+ }
956
+
957
+ static void rk3528_set_to_rmii (struct rk_priv_data * bsp_priv )
958
+ {
959
+ if (bsp_priv -> id == 1 )
960
+ regmap_write (bsp_priv -> grf , RK3528_VPU_GRF_GMAC_CON5 ,
961
+ RK3528_GMAC1_PHY_INTF_SEL_RMII );
962
+ else
963
+ regmap_write (bsp_priv -> grf , RK3528_VO_GRF_GMAC_CON ,
964
+ RK3528_GMAC0_PHY_INTF_SEL_RMII |
965
+ RK3528_GMAC0_CLK_RMII_DIV2 );
966
+ }
967
+
968
+ static void rk3528_set_rgmii_speed (struct rk_priv_data * bsp_priv , int speed )
969
+ {
970
+ struct device * dev = & bsp_priv -> pdev -> dev ;
971
+
972
+ if (speed == 10 )
973
+ regmap_write (bsp_priv -> grf , RK3528_VPU_GRF_GMAC_CON5 ,
974
+ RK3528_GMAC1_CLK_RGMII_DIV50 );
975
+ else if (speed == 100 )
976
+ regmap_write (bsp_priv -> grf , RK3528_VPU_GRF_GMAC_CON5 ,
977
+ RK3528_GMAC1_CLK_RGMII_DIV5 );
978
+ else if (speed == 1000 )
979
+ regmap_write (bsp_priv -> grf , RK3528_VPU_GRF_GMAC_CON5 ,
980
+ RK3528_GMAC1_CLK_RGMII_DIV1 );
981
+ else
982
+ dev_err (dev , "unknown speed value for RGMII! speed=%d" , speed );
983
+ }
984
+
985
+ static void rk3528_set_rmii_speed (struct rk_priv_data * bsp_priv , int speed )
986
+ {
987
+ struct device * dev = & bsp_priv -> pdev -> dev ;
988
+ unsigned int reg , val ;
989
+
990
+ if (speed == 10 )
991
+ val = bsp_priv -> id == 1 ? RK3528_GMAC1_CLK_RMII_DIV20 :
992
+ RK3528_GMAC0_CLK_RMII_DIV20 ;
993
+ else if (speed == 100 )
994
+ val = bsp_priv -> id == 1 ? RK3528_GMAC1_CLK_RMII_DIV2 :
995
+ RK3528_GMAC0_CLK_RMII_DIV2 ;
996
+ else {
997
+ dev_err (dev , "unknown speed value for RMII! speed=%d" , speed );
998
+ return ;
999
+ }
1000
+
1001
+ reg = bsp_priv -> id == 1 ? RK3528_VPU_GRF_GMAC_CON5 :
1002
+ RK3528_VO_GRF_GMAC_CON ;
1003
+
1004
+ regmap_write (bsp_priv -> grf , reg , val );
1005
+ }
1006
+
1007
+ static void rk3528_set_clock_selection (struct rk_priv_data * bsp_priv ,
1008
+ bool input , bool enable )
1009
+ {
1010
+ unsigned int val ;
1011
+
1012
+ if (bsp_priv -> id == 1 ) {
1013
+ val = input ? RK3528_GMAC1_CLK_SELECT_IO :
1014
+ RK3528_GMAC1_CLK_SELECT_CRU ;
1015
+ val |= enable ? RK3528_GMAC1_CLK_RMII_NOGATE :
1016
+ RK3528_GMAC1_CLK_RMII_GATE ;
1017
+ regmap_write (bsp_priv -> grf , RK3528_VPU_GRF_GMAC_CON5 , val );
1018
+ } else {
1019
+ val = enable ? RK3528_GMAC0_CLK_RMII_NOGATE :
1020
+ RK3528_GMAC0_CLK_RMII_GATE ;
1021
+ regmap_write (bsp_priv -> grf , RK3528_VO_GRF_GMAC_CON , val );
1022
+ }
1023
+ }
1024
+
1025
+ static void rk3528_integrated_phy_powerup (struct rk_priv_data * bsp_priv )
1026
+ {
1027
+ rk_gmac_integrated_fephy_powerup (bsp_priv , RK3528_VO_GRF_MACPHY_CON0 );
1028
+ }
1029
+
1030
+ static void rk3528_integrated_phy_powerdown (struct rk_priv_data * bsp_priv )
1031
+ {
1032
+ rk_gmac_integrated_fephy_powerdown (bsp_priv , RK3528_VO_GRF_MACPHY_CON0 );
1033
+ }
1034
+
1035
+ static const struct rk_gmac_ops rk3528_ops = {
1036
+ .set_to_rgmii = rk3528_set_to_rgmii ,
1037
+ .set_to_rmii = rk3528_set_to_rmii ,
1038
+ .set_rgmii_speed = rk3528_set_rgmii_speed ,
1039
+ .set_rmii_speed = rk3528_set_rmii_speed ,
1040
+ .set_clock_selection = rk3528_set_clock_selection ,
1041
+ .integrated_phy_powerup = rk3528_integrated_phy_powerup ,
1042
+ .integrated_phy_powerdown = rk3528_integrated_phy_powerdown ,
1043
+ .regs_valid = true,
1044
+ .regs = {
1045
+ 0xffbd0000 , /* gmac0 */
1046
+ 0xffbe0000 , /* gmac1 */
1047
+ 0x0 , /* sentinel */
1048
+ },
1049
+ };
1050
+
831
1051
#define RK3568_GRF_GMAC0_CON0 0x0380
832
1052
#define RK3568_GRF_GMAC0_CON1 0x0384
833
1053
#define RK3568_GRF_GMAC1_CON0 0x0388
@@ -1332,50 +1552,6 @@ static const struct rk_gmac_ops rv1126_ops = {
1332
1552
.set_rmii_speed = rv1126_set_rmii_speed ,
1333
1553
};
1334
1554
1335
- #define RK_GRF_MACPHY_CON0 0xb00
1336
- #define RK_GRF_MACPHY_CON1 0xb04
1337
- #define RK_GRF_MACPHY_CON2 0xb08
1338
- #define RK_GRF_MACPHY_CON3 0xb0c
1339
-
1340
- #define RK_MACPHY_ENABLE GRF_BIT(0)
1341
- #define RK_MACPHY_DISABLE GRF_CLR_BIT(0)
1342
- #define RK_MACPHY_CFG_CLK_50M GRF_BIT(14)
1343
- #define RK_GMAC2PHY_RMII_MODE (GRF_BIT(6) | GRF_CLR_BIT(7))
1344
- #define RK_GRF_CON2_MACPHY_ID HIWORD_UPDATE(0x1234, 0xffff, 0)
1345
- #define RK_GRF_CON3_MACPHY_ID HIWORD_UPDATE(0x35, 0x3f, 0)
1346
-
1347
- static void rk_gmac_integrated_phy_powerup (struct rk_priv_data * priv )
1348
- {
1349
- if (priv -> ops -> integrated_phy_powerup )
1350
- priv -> ops -> integrated_phy_powerup (priv );
1351
-
1352
- regmap_write (priv -> grf , RK_GRF_MACPHY_CON0 , RK_MACPHY_CFG_CLK_50M );
1353
- regmap_write (priv -> grf , RK_GRF_MACPHY_CON0 , RK_GMAC2PHY_RMII_MODE );
1354
-
1355
- regmap_write (priv -> grf , RK_GRF_MACPHY_CON2 , RK_GRF_CON2_MACPHY_ID );
1356
- regmap_write (priv -> grf , RK_GRF_MACPHY_CON3 , RK_GRF_CON3_MACPHY_ID );
1357
-
1358
- if (priv -> phy_reset ) {
1359
- /* PHY needs to be disabled before trying to reset it */
1360
- regmap_write (priv -> grf , RK_GRF_MACPHY_CON0 , RK_MACPHY_DISABLE );
1361
- if (priv -> phy_reset )
1362
- reset_control_assert (priv -> phy_reset );
1363
- usleep_range (10 , 20 );
1364
- if (priv -> phy_reset )
1365
- reset_control_deassert (priv -> phy_reset );
1366
- usleep_range (10 , 20 );
1367
- regmap_write (priv -> grf , RK_GRF_MACPHY_CON0 , RK_MACPHY_ENABLE );
1368
- msleep (30 );
1369
- }
1370
- }
1371
-
1372
- static void rk_gmac_integrated_phy_powerdown (struct rk_priv_data * priv )
1373
- {
1374
- regmap_write (priv -> grf , RK_GRF_MACPHY_CON0 , RK_MACPHY_DISABLE );
1375
- if (priv -> phy_reset )
1376
- reset_control_assert (priv -> phy_reset );
1377
- }
1378
-
1379
1555
static int rk_gmac_clk_init (struct plat_stmmacenet_data * plat )
1380
1556
{
1381
1557
struct rk_priv_data * bsp_priv = plat -> bsp_priv ;
@@ -1671,16 +1847,16 @@ static int rk_gmac_powerup(struct rk_priv_data *bsp_priv)
1671
1847
1672
1848
pm_runtime_get_sync (dev );
1673
1849
1674
- if (bsp_priv -> integrated_phy )
1675
- rk_gmac_integrated_phy_powerup (bsp_priv );
1850
+ if (bsp_priv -> integrated_phy && bsp_priv -> ops -> integrated_phy_powerup )
1851
+ bsp_priv -> ops -> integrated_phy_powerup (bsp_priv );
1676
1852
1677
1853
return 0 ;
1678
1854
}
1679
1855
1680
1856
static void rk_gmac_powerdown (struct rk_priv_data * gmac )
1681
1857
{
1682
- if (gmac -> integrated_phy )
1683
- rk_gmac_integrated_phy_powerdown (gmac );
1858
+ if (gmac -> integrated_phy && gmac -> ops -> integrated_phy_powerdown )
1859
+ gmac -> ops -> integrated_phy_powerdown (gmac );
1684
1860
1685
1861
pm_runtime_put_sync (& gmac -> pdev -> dev );
1686
1862
@@ -1819,6 +1995,7 @@ static const struct of_device_id rk_gmac_dwmac_match[] = {
1819
1995
{ .compatible = "rockchip,rk3366-gmac" , .data = & rk3366_ops },
1820
1996
{ .compatible = "rockchip,rk3368-gmac" , .data = & rk3368_ops },
1821
1997
{ .compatible = "rockchip,rk3399-gmac" , .data = & rk3399_ops },
1998
+ { .compatible = "rockchip,rk3528-gmac" , .data = & rk3528_ops },
1822
1999
{ .compatible = "rockchip,rk3568-gmac" , .data = & rk3568_ops },
1823
2000
{ .compatible = "rockchip,rk3576-gmac" , .data = & rk3576_ops },
1824
2001
{ .compatible = "rockchip,rk3588-gmac" , .data = & rk3588_ops },
0 commit comments