]> git.sur5r.net Git - u-boot/blob - drivers/net/gmac_rockchip.c
Merge tag 'signed-efi-next' of git://github.com/agraf/u-boot
[u-boot] / drivers / net / gmac_rockchip.c
1 /*
2  * (C) Copyright 2015 Sjoerd Simons <sjoerd.simons@collabora.co.uk>
3  *
4  * SPDX-License-Identifier:     GPL-2.0+
5  *
6  * Rockchip GMAC ethernet IP driver for U-Boot
7  */
8
9 #include <common.h>
10 #include <dm.h>
11 #include <clk.h>
12 #include <phy.h>
13 #include <syscon.h>
14 #include <asm/io.h>
15 #include <asm/arch/periph.h>
16 #include <asm/arch/clock.h>
17 #include <asm/arch/hardware.h>
18 #include <asm/arch/grf_rk322x.h>
19 #include <asm/arch/grf_rk3288.h>
20 #include <asm/arch/grf_rk3328.h>
21 #include <asm/arch/grf_rk3368.h>
22 #include <asm/arch/grf_rk3399.h>
23 #include <asm/arch/grf_rv1108.h>
24 #include <dm/pinctrl.h>
25 #include <dt-bindings/clock/rk3288-cru.h>
26 #include "designware.h"
27
28 DECLARE_GLOBAL_DATA_PTR;
29
30 /*
31  * Platform data for the gmac
32  *
33  * dw_eth_pdata: Required platform data for designware driver (must be first)
34  */
35 struct gmac_rockchip_platdata {
36         struct dw_eth_pdata dw_eth_pdata;
37         bool clock_input;
38         int tx_delay;
39         int rx_delay;
40 };
41
42 struct rk_gmac_ops {
43         int (*fix_mac_speed)(struct dw_eth_dev *priv);
44         void (*set_to_rmii)(struct gmac_rockchip_platdata *pdata);
45         void (*set_to_rgmii)(struct gmac_rockchip_platdata *pdata);
46 };
47
48
49 static int gmac_rockchip_ofdata_to_platdata(struct udevice *dev)
50 {
51         struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
52         const char *string;
53
54         string = dev_read_string(dev, "clock_in_out");
55         if (!strcmp(string, "input"))
56                 pdata->clock_input = true;
57         else
58                 pdata->clock_input = false;
59
60         /* Check the new naming-style first... */
61         pdata->tx_delay = dev_read_u32_default(dev, "tx_delay", -ENOENT);
62         pdata->rx_delay = dev_read_u32_default(dev, "rx_delay", -ENOENT);
63
64         /* ... and fall back to the old naming style or default, if necessary */
65         if (pdata->tx_delay == -ENOENT)
66                 pdata->tx_delay = dev_read_u32_default(dev, "tx-delay", 0x30);
67         if (pdata->rx_delay == -ENOENT)
68                 pdata->rx_delay = dev_read_u32_default(dev, "rx-delay", 0x10);
69
70         return designware_eth_ofdata_to_platdata(dev);
71 }
72
73 static int rk3228_gmac_fix_mac_speed(struct dw_eth_dev *priv)
74 {
75         struct rk322x_grf *grf;
76         int clk;
77         enum {
78                 RK3228_GMAC_CLK_SEL_SHIFT = 8,
79                 RK3228_GMAC_CLK_SEL_MASK  = GENMASK(9, 8),
80                 RK3228_GMAC_CLK_SEL_125M  = 0 << 8,
81                 RK3228_GMAC_CLK_SEL_25M   = 3 << 8,
82                 RK3228_GMAC_CLK_SEL_2_5M  = 2 << 8,
83         };
84
85         switch (priv->phydev->speed) {
86         case 10:
87                 clk = RK3228_GMAC_CLK_SEL_2_5M;
88                 break;
89         case 100:
90                 clk = RK3228_GMAC_CLK_SEL_25M;
91                 break;
92         case 1000:
93                 clk = RK3228_GMAC_CLK_SEL_125M;
94                 break;
95         default:
96                 debug("Unknown phy speed: %d\n", priv->phydev->speed);
97                 return -EINVAL;
98         }
99
100         grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
101         rk_clrsetreg(&grf->mac_con[1], RK3228_GMAC_CLK_SEL_MASK, clk);
102
103         return 0;
104 }
105
106 static int rk3288_gmac_fix_mac_speed(struct dw_eth_dev *priv)
107 {
108         struct rk3288_grf *grf;
109         int clk;
110
111         switch (priv->phydev->speed) {
112         case 10:
113                 clk = RK3288_GMAC_CLK_SEL_2_5M;
114                 break;
115         case 100:
116                 clk = RK3288_GMAC_CLK_SEL_25M;
117                 break;
118         case 1000:
119                 clk = RK3288_GMAC_CLK_SEL_125M;
120                 break;
121         default:
122                 debug("Unknown phy speed: %d\n", priv->phydev->speed);
123                 return -EINVAL;
124         }
125
126         grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
127         rk_clrsetreg(&grf->soc_con1, RK3288_GMAC_CLK_SEL_MASK, clk);
128
129         return 0;
130 }
131
132 static int rk3328_gmac_fix_mac_speed(struct dw_eth_dev *priv)
133 {
134         struct rk3328_grf_regs *grf;
135         int clk;
136         enum {
137                 RK3328_GMAC_CLK_SEL_SHIFT = 11,
138                 RK3328_GMAC_CLK_SEL_MASK  = GENMASK(12, 11),
139                 RK3328_GMAC_CLK_SEL_125M  = 0 << 11,
140                 RK3328_GMAC_CLK_SEL_25M   = 3 << 11,
141                 RK3328_GMAC_CLK_SEL_2_5M  = 2 << 11,
142         };
143
144         switch (priv->phydev->speed) {
145         case 10:
146                 clk = RK3328_GMAC_CLK_SEL_2_5M;
147                 break;
148         case 100:
149                 clk = RK3328_GMAC_CLK_SEL_25M;
150                 break;
151         case 1000:
152                 clk = RK3328_GMAC_CLK_SEL_125M;
153                 break;
154         default:
155                 debug("Unknown phy speed: %d\n", priv->phydev->speed);
156                 return -EINVAL;
157         }
158
159         grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
160         rk_clrsetreg(&grf->mac_con[1], RK3328_GMAC_CLK_SEL_MASK, clk);
161
162         return 0;
163 }
164
165 static int rk3368_gmac_fix_mac_speed(struct dw_eth_dev *priv)
166 {
167         struct rk3368_grf *grf;
168         int clk;
169         enum {
170                 RK3368_GMAC_CLK_SEL_2_5M = 2 << 4,
171                 RK3368_GMAC_CLK_SEL_25M = 3 << 4,
172                 RK3368_GMAC_CLK_SEL_125M = 0 << 4,
173                 RK3368_GMAC_CLK_SEL_MASK = GENMASK(5, 4),
174         };
175
176         switch (priv->phydev->speed) {
177         case 10:
178                 clk = RK3368_GMAC_CLK_SEL_2_5M;
179                 break;
180         case 100:
181                 clk = RK3368_GMAC_CLK_SEL_25M;
182                 break;
183         case 1000:
184                 clk = RK3368_GMAC_CLK_SEL_125M;
185                 break;
186         default:
187                 debug("Unknown phy speed: %d\n", priv->phydev->speed);
188                 return -EINVAL;
189         }
190
191         grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
192         rk_clrsetreg(&grf->soc_con15, RK3368_GMAC_CLK_SEL_MASK, clk);
193
194         return 0;
195 }
196
197 static int rk3399_gmac_fix_mac_speed(struct dw_eth_dev *priv)
198 {
199         struct rk3399_grf_regs *grf;
200         int clk;
201
202         switch (priv->phydev->speed) {
203         case 10:
204                 clk = RK3399_GMAC_CLK_SEL_2_5M;
205                 break;
206         case 100:
207                 clk = RK3399_GMAC_CLK_SEL_25M;
208                 break;
209         case 1000:
210                 clk = RK3399_GMAC_CLK_SEL_125M;
211                 break;
212         default:
213                 debug("Unknown phy speed: %d\n", priv->phydev->speed);
214                 return -EINVAL;
215         }
216
217         grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
218         rk_clrsetreg(&grf->soc_con5, RK3399_GMAC_CLK_SEL_MASK, clk);
219
220         return 0;
221 }
222
223 static int rv1108_set_rmii_speed(struct dw_eth_dev *priv)
224 {
225         struct rv1108_grf *grf;
226         int clk, speed;
227         enum {
228                 RV1108_GMAC_SPEED_MASK          = BIT(2),
229                 RV1108_GMAC_SPEED_10M           = 0 << 2,
230                 RV1108_GMAC_SPEED_100M          = 1 << 2,
231                 RV1108_GMAC_CLK_SEL_MASK        = BIT(7),
232                 RV1108_GMAC_CLK_SEL_2_5M        = 0 << 7,
233                 RV1108_GMAC_CLK_SEL_25M         = 1 << 7,
234         };
235
236         switch (priv->phydev->speed) {
237         case 10:
238                 clk = RV1108_GMAC_CLK_SEL_2_5M;
239                 speed = RV1108_GMAC_SPEED_10M;
240                 break;
241         case 100:
242                 clk = RV1108_GMAC_CLK_SEL_25M;
243                 speed = RV1108_GMAC_SPEED_100M;
244                 break;
245         default:
246                 debug("Unknown phy speed: %d\n", priv->phydev->speed);
247                 return -EINVAL;
248         }
249
250         grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
251         rk_clrsetreg(&grf->gmac_con0,
252                      RV1108_GMAC_CLK_SEL_MASK | RV1108_GMAC_SPEED_MASK,
253                      clk | speed);
254
255         return 0;
256 }
257
258 static void rk3228_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
259 {
260         struct rk322x_grf *grf;
261         enum {
262                 RK3228_RMII_MODE_SHIFT = 10,
263                 RK3228_RMII_MODE_MASK  = BIT(10),
264
265                 RK3228_GMAC_PHY_INTF_SEL_SHIFT = 4,
266                 RK3228_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
267                 RK3228_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
268
269                 RK3228_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
270                 RK3228_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
271                 RK3228_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
272
273                 RK3228_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
274                 RK3228_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
275                 RK3228_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
276         };
277         enum {
278                 RK3228_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7,
279                 RK3228_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7),
280
281                 RK3228_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
282                 RK3228_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
283         };
284
285         grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
286         rk_clrsetreg(&grf->mac_con[1],
287                      RK3228_RMII_MODE_MASK |
288                      RK3228_GMAC_PHY_INTF_SEL_MASK |
289                      RK3228_RXCLK_DLY_ENA_GMAC_MASK |
290                      RK3228_TXCLK_DLY_ENA_GMAC_MASK,
291                      RK3228_GMAC_PHY_INTF_SEL_RGMII |
292                      RK3228_RXCLK_DLY_ENA_GMAC_ENABLE |
293                      RK3228_TXCLK_DLY_ENA_GMAC_ENABLE);
294
295         rk_clrsetreg(&grf->mac_con[0],
296                      RK3228_CLK_RX_DL_CFG_GMAC_MASK |
297                      RK3228_CLK_TX_DL_CFG_GMAC_MASK,
298                      pdata->rx_delay << RK3228_CLK_RX_DL_CFG_GMAC_SHIFT |
299                      pdata->tx_delay << RK3228_CLK_TX_DL_CFG_GMAC_SHIFT);
300 }
301
302 static void rk3288_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
303 {
304         struct rk3288_grf *grf;
305
306         grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
307         rk_clrsetreg(&grf->soc_con1,
308                      RK3288_RMII_MODE_MASK | RK3288_GMAC_PHY_INTF_SEL_MASK,
309                      RK3288_GMAC_PHY_INTF_SEL_RGMII);
310
311         rk_clrsetreg(&grf->soc_con3,
312                      RK3288_RXCLK_DLY_ENA_GMAC_MASK |
313                      RK3288_TXCLK_DLY_ENA_GMAC_MASK |
314                      RK3288_CLK_RX_DL_CFG_GMAC_MASK |
315                      RK3288_CLK_TX_DL_CFG_GMAC_MASK,
316                      RK3288_RXCLK_DLY_ENA_GMAC_ENABLE |
317                      RK3288_TXCLK_DLY_ENA_GMAC_ENABLE |
318                      pdata->rx_delay << RK3288_CLK_RX_DL_CFG_GMAC_SHIFT |
319                      pdata->tx_delay << RK3288_CLK_TX_DL_CFG_GMAC_SHIFT);
320 }
321
322 static void rk3328_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
323 {
324         struct rk3328_grf_regs *grf;
325         enum {
326                 RK3328_RMII_MODE_SHIFT = 9,
327                 RK3328_RMII_MODE_MASK  = BIT(9),
328
329                 RK3328_GMAC_PHY_INTF_SEL_SHIFT = 4,
330                 RK3328_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
331                 RK3328_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
332
333                 RK3328_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
334                 RK3328_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
335                 RK3328_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
336
337                 RK3328_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
338                 RK3328_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
339                 RK3328_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
340         };
341         enum {
342                 RK3328_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7,
343                 RK3328_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7),
344
345                 RK3328_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
346                 RK3328_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
347         };
348
349         grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
350         rk_clrsetreg(&grf->mac_con[1],
351                      RK3328_RMII_MODE_MASK |
352                      RK3328_GMAC_PHY_INTF_SEL_MASK |
353                      RK3328_RXCLK_DLY_ENA_GMAC_MASK |
354                      RK3328_TXCLK_DLY_ENA_GMAC_MASK,
355                      RK3328_GMAC_PHY_INTF_SEL_RGMII |
356                      RK3328_RXCLK_DLY_ENA_GMAC_MASK |
357                      RK3328_TXCLK_DLY_ENA_GMAC_ENABLE);
358
359         rk_clrsetreg(&grf->mac_con[0],
360                      RK3328_CLK_RX_DL_CFG_GMAC_MASK |
361                      RK3328_CLK_TX_DL_CFG_GMAC_MASK,
362                      pdata->rx_delay << RK3328_CLK_RX_DL_CFG_GMAC_SHIFT |
363                      pdata->tx_delay << RK3328_CLK_TX_DL_CFG_GMAC_SHIFT);
364 }
365
366 static void rk3368_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
367 {
368         struct rk3368_grf *grf;
369         enum {
370                 RK3368_GMAC_PHY_INTF_SEL_RGMII = 1 << 9,
371                 RK3368_GMAC_PHY_INTF_SEL_MASK = GENMASK(11, 9),
372                 RK3368_RMII_MODE_MASK  = BIT(6),
373                 RK3368_RMII_MODE       = BIT(6),
374         };
375         enum {
376                 RK3368_RXCLK_DLY_ENA_GMAC_MASK = BIT(15),
377                 RK3368_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
378                 RK3368_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(15),
379                 RK3368_TXCLK_DLY_ENA_GMAC_MASK = BIT(7),
380                 RK3368_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
381                 RK3368_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(7),
382                 RK3368_CLK_RX_DL_CFG_GMAC_SHIFT = 8,
383                 RK3368_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8),
384                 RK3368_CLK_TX_DL_CFG_GMAC_SHIFT = 0,
385                 RK3368_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
386         };
387
388         grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
389         rk_clrsetreg(&grf->soc_con15,
390                      RK3368_RMII_MODE_MASK | RK3368_GMAC_PHY_INTF_SEL_MASK,
391                      RK3368_GMAC_PHY_INTF_SEL_RGMII);
392
393         rk_clrsetreg(&grf->soc_con16,
394                      RK3368_RXCLK_DLY_ENA_GMAC_MASK |
395                      RK3368_TXCLK_DLY_ENA_GMAC_MASK |
396                      RK3368_CLK_RX_DL_CFG_GMAC_MASK |
397                      RK3368_CLK_TX_DL_CFG_GMAC_MASK,
398                      RK3368_RXCLK_DLY_ENA_GMAC_ENABLE |
399                      RK3368_TXCLK_DLY_ENA_GMAC_ENABLE |
400                      pdata->rx_delay << RK3368_CLK_RX_DL_CFG_GMAC_SHIFT |
401                      pdata->tx_delay << RK3368_CLK_TX_DL_CFG_GMAC_SHIFT);
402 }
403
404 static void rk3399_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
405 {
406         struct rk3399_grf_regs *grf;
407
408         grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
409
410         rk_clrsetreg(&grf->soc_con5,
411                      RK3399_GMAC_PHY_INTF_SEL_MASK,
412                      RK3399_GMAC_PHY_INTF_SEL_RGMII);
413
414         rk_clrsetreg(&grf->soc_con6,
415                      RK3399_RXCLK_DLY_ENA_GMAC_MASK |
416                      RK3399_TXCLK_DLY_ENA_GMAC_MASK |
417                      RK3399_CLK_RX_DL_CFG_GMAC_MASK |
418                      RK3399_CLK_TX_DL_CFG_GMAC_MASK,
419                      RK3399_RXCLK_DLY_ENA_GMAC_ENABLE |
420                      RK3399_TXCLK_DLY_ENA_GMAC_ENABLE |
421                      pdata->rx_delay << RK3399_CLK_RX_DL_CFG_GMAC_SHIFT |
422                      pdata->tx_delay << RK3399_CLK_TX_DL_CFG_GMAC_SHIFT);
423 }
424
425 static void rv1108_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
426 {
427         struct rv1108_grf *grf;
428
429         enum {
430                 RV1108_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
431                 RV1108_GMAC_PHY_INTF_SEL_RMII  = 4 << 4,
432         };
433
434         grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
435         rk_clrsetreg(&grf->gmac_con0,
436                      RV1108_GMAC_PHY_INTF_SEL_MASK,
437                      RV1108_GMAC_PHY_INTF_SEL_RMII);
438 }
439
440 static int gmac_rockchip_probe(struct udevice *dev)
441 {
442         struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
443         struct rk_gmac_ops *ops =
444                 (struct rk_gmac_ops *)dev_get_driver_data(dev);
445         struct dw_eth_pdata *dw_pdata = dev_get_platdata(dev);
446         struct eth_pdata *eth_pdata = &dw_pdata->eth_pdata;
447         struct clk clk;
448         ulong rate;
449         int ret;
450
451         ret = clk_get_by_index(dev, 0, &clk);
452         if (ret)
453                 return ret;
454
455         switch (eth_pdata->phy_interface) {
456         case PHY_INTERFACE_MODE_RGMII:
457                 /*
458                  * If the gmac clock is from internal pll, need to set and
459                  * check the return value for gmac clock at RGMII mode. If
460                  * the gmac clock is from external source, the clock rate
461                  * is not set, because of it is bypassed.
462                  */
463                 if (!pdata->clock_input) {
464                         rate = clk_set_rate(&clk, 125000000);
465                         if (rate != 125000000)
466                                 return -EINVAL;
467                 }
468
469                 /* Set to RGMII mode */
470                 if (ops->set_to_rgmii)
471                         ops->set_to_rgmii(pdata);
472                 else
473                         return -EPERM;
474
475                 break;
476         case PHY_INTERFACE_MODE_RMII:
477                 /* The commet is the same as RGMII mode */
478                 if (!pdata->clock_input) {
479                         rate = clk_set_rate(&clk, 50000000);
480                         if (rate != 50000000)
481                                 return -EINVAL;
482                 }
483
484                 /* Set to RMII mode */
485                 if (ops->set_to_rmii)
486                         ops->set_to_rmii(pdata);
487                 else
488                         return -EPERM;
489
490                 break;
491         default:
492                 debug("NO interface defined!\n");
493                 return -ENXIO;
494         }
495
496         return designware_eth_probe(dev);
497 }
498
499 static int gmac_rockchip_eth_start(struct udevice *dev)
500 {
501         struct eth_pdata *pdata = dev_get_platdata(dev);
502         struct dw_eth_dev *priv = dev_get_priv(dev);
503         struct rk_gmac_ops *ops =
504                 (struct rk_gmac_ops *)dev_get_driver_data(dev);
505         int ret;
506
507         ret = designware_eth_init(priv, pdata->enetaddr);
508         if (ret)
509                 return ret;
510         ret = ops->fix_mac_speed(priv);
511         if (ret)
512                 return ret;
513         ret = designware_eth_enable(priv);
514         if (ret)
515                 return ret;
516
517         return 0;
518 }
519
520 const struct eth_ops gmac_rockchip_eth_ops = {
521         .start                  = gmac_rockchip_eth_start,
522         .send                   = designware_eth_send,
523         .recv                   = designware_eth_recv,
524         .free_pkt               = designware_eth_free_pkt,
525         .stop                   = designware_eth_stop,
526         .write_hwaddr           = designware_eth_write_hwaddr,
527 };
528
529 const struct rk_gmac_ops rk3228_gmac_ops = {
530         .fix_mac_speed = rk3228_gmac_fix_mac_speed,
531         .set_to_rgmii = rk3228_gmac_set_to_rgmii,
532 };
533
534 const struct rk_gmac_ops rk3288_gmac_ops = {
535         .fix_mac_speed = rk3288_gmac_fix_mac_speed,
536         .set_to_rgmii = rk3288_gmac_set_to_rgmii,
537 };
538
539 const struct rk_gmac_ops rk3328_gmac_ops = {
540         .fix_mac_speed = rk3328_gmac_fix_mac_speed,
541         .set_to_rgmii = rk3328_gmac_set_to_rgmii,
542 };
543
544 const struct rk_gmac_ops rk3368_gmac_ops = {
545         .fix_mac_speed = rk3368_gmac_fix_mac_speed,
546         .set_to_rgmii = rk3368_gmac_set_to_rgmii,
547 };
548
549 const struct rk_gmac_ops rk3399_gmac_ops = {
550         .fix_mac_speed = rk3399_gmac_fix_mac_speed,
551         .set_to_rgmii = rk3399_gmac_set_to_rgmii,
552 };
553
554 const struct rk_gmac_ops rv1108_gmac_ops = {
555         .fix_mac_speed = rv1108_set_rmii_speed,
556         .set_to_rmii = rv1108_gmac_set_to_rmii,
557 };
558
559 static const struct udevice_id rockchip_gmac_ids[] = {
560         { .compatible = "rockchip,rk3228-gmac",
561           .data = (ulong)&rk3228_gmac_ops },
562         { .compatible = "rockchip,rk3288-gmac",
563           .data = (ulong)&rk3288_gmac_ops },
564         { .compatible = "rockchip,rk3328-gmac",
565           .data = (ulong)&rk3328_gmac_ops },
566         { .compatible = "rockchip,rk3368-gmac",
567           .data = (ulong)&rk3368_gmac_ops },
568         { .compatible = "rockchip,rk3399-gmac",
569           .data = (ulong)&rk3399_gmac_ops },
570         { .compatible = "rockchip,rv1108-gmac",
571           .data = (ulong)&rv1108_gmac_ops },
572         { }
573 };
574
575 U_BOOT_DRIVER(eth_gmac_rockchip) = {
576         .name   = "gmac_rockchip",
577         .id     = UCLASS_ETH,
578         .of_match = rockchip_gmac_ids,
579         .ofdata_to_platdata = gmac_rockchip_ofdata_to_platdata,
580         .probe  = gmac_rockchip_probe,
581         .ops    = &gmac_rockchip_eth_ops,
582         .priv_auto_alloc_size = sizeof(struct dw_eth_dev),
583         .platdata_auto_alloc_size = sizeof(struct gmac_rockchip_platdata),
584         .flags = DM_FLAG_ALLOC_PRIV_DMA,
585 };