@@ -83,6 +83,117 @@ struct rk_priv_data {
8383 (((tx) ? soc##_GMAC_TXCLK_DLY_ENABLE : soc##_GMAC_TXCLK_DLY_DISABLE) | \
8484 ((rx) ? soc##_GMAC_RXCLK_DLY_ENABLE : soc##_GMAC_RXCLK_DLY_DISABLE))
8585
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+
86197#define RK3228_GRF_MAC_CON0 0x0900
87198#define RK3228_GRF_MAC_CON1 0x0904
88199
@@ -1313,6 +1424,7 @@ static int rk_gmac_resume(struct device *dev)
13131424static SIMPLE_DEV_PM_OPS (rk_gmac_pm_ops , rk_gmac_suspend , rk_gmac_resume ) ;
13141425
13151426static const struct of_device_id rk_gmac_dwmac_match [] = {
1427+ { .compatible = "rockchip,rk3128-gmac" , .data = & rk3128_ops },
13161428 { .compatible = "rockchip,rk3228-gmac" , .data = & rk3228_ops },
13171429 { .compatible = "rockchip,rk3288-gmac" , .data = & rk3288_ops },
13181430 { .compatible = "rockchip,rk3328-gmac" , .data = & rk3328_ops },
0 commit comments