]> git.sur5r.net Git - u-boot/blob - drivers/net/ldpaa_eth/ldpaa_wriop.c
831a3300701ea6dc9813334b213ad83d5701254f
[u-boot] / drivers / net / ldpaa_eth / ldpaa_wriop.c
1 /*
2  * Copyright (C) 2015 Freescale Semiconductor
3  *
4  * SPDX-License-Identifier:     GPL-2.0+
5  */
6
7 #include <common.h>
8 #include <asm/io.h>
9 #include <asm/types.h>
10 #include <malloc.h>
11 #include <net.h>
12 #include <linux/compat.h>
13 #include <asm/arch/fsl_serdes.h>
14 #include <fsl-mc/ldpaa_wriop.h>
15
16 struct wriop_dpmac_info dpmac_info[NUM_WRIOP_PORTS];
17
18 __weak phy_interface_t wriop_dpmac_enet_if(int dpmac_id, int lane_prtc)
19 {
20         return PHY_INTERFACE_MODE_NONE;
21 }
22
23 void wriop_init_dpmac(int sd, int dpmac_id, int lane_prtcl)
24 {
25         phy_interface_t enet_if;
26
27         dpmac_info[dpmac_id].enabled = 0;
28         dpmac_info[dpmac_id].id = 0;
29         dpmac_info[dpmac_id].phy_addr = -1;
30         dpmac_info[dpmac_id].enet_if = PHY_INTERFACE_MODE_NONE;
31
32         enet_if = wriop_dpmac_enet_if(dpmac_id, lane_prtcl);
33         if (enet_if != PHY_INTERFACE_MODE_NONE) {
34                 dpmac_info[dpmac_id].enabled = 1;
35                 dpmac_info[dpmac_id].id = dpmac_id;
36                 dpmac_info[dpmac_id].enet_if = enet_if;
37         }
38 }
39
40 void wriop_init_dpmac_enet_if(int dpmac_id, phy_interface_t enet_if)
41 {
42         dpmac_info[dpmac_id].enabled = 1;
43         dpmac_info[dpmac_id].id = dpmac_id;
44         dpmac_info[dpmac_id].phy_addr = -1;
45         dpmac_info[dpmac_id].enet_if = enet_if;
46 }
47
48
49 /*TODO what it do */
50 static int wriop_dpmac_to_index(int dpmac_id)
51 {
52         int i;
53
54         for (i = WRIOP1_DPMAC1; i < NUM_WRIOP_PORTS; i++) {
55                 if (dpmac_info[i].id == dpmac_id)
56                         return i;
57         }
58
59         return -1;
60 }
61
62 void wriop_disable_dpmac(int dpmac_id)
63 {
64         int i = wriop_dpmac_to_index(dpmac_id);
65
66         if (i == -1)
67                 return;
68
69         dpmac_info[i].enabled = 0;
70         wriop_dpmac_disable(dpmac_id);
71 }
72
73 void wriop_enable_dpmac(int dpmac_id)
74 {
75         int i = wriop_dpmac_to_index(dpmac_id);
76
77         if (i == -1)
78                 return;
79
80         dpmac_info[i].enabled = 1;
81         wriop_dpmac_enable(dpmac_id);
82 }
83
84 u8 wriop_is_enabled_dpmac(int dpmac_id)
85 {
86         int i = wriop_dpmac_to_index(dpmac_id);
87
88         if (i == -1)
89                 return -1;
90
91         return dpmac_info[i].enabled;
92 }
93
94
95 void wriop_set_mdio(int dpmac_id, struct mii_dev *bus)
96 {
97         int i = wriop_dpmac_to_index(dpmac_id);
98
99         if (i == -1)
100                 return;
101
102         dpmac_info[i].bus = bus;
103 }
104
105 struct mii_dev *wriop_get_mdio(int dpmac_id)
106 {
107         int i = wriop_dpmac_to_index(dpmac_id);
108
109         if (i == -1)
110                 return NULL;
111
112         return dpmac_info[i].bus;
113 }
114
115 void wriop_set_phy_address(int dpmac_id, int address)
116 {
117         int i = wriop_dpmac_to_index(dpmac_id);
118
119         if (i == -1)
120                 return;
121
122         dpmac_info[i].phy_addr = address;
123 }
124
125 int wriop_get_phy_address(int dpmac_id)
126 {
127         int i = wriop_dpmac_to_index(dpmac_id);
128
129         if (i == -1)
130                 return -1;
131
132         return dpmac_info[i].phy_addr;
133 }
134
135 void wriop_set_phy_dev(int dpmac_id, struct phy_device *phydev)
136 {
137         int i = wriop_dpmac_to_index(dpmac_id);
138
139         if (i == -1)
140                 return;
141
142         dpmac_info[i].phydev = phydev;
143 }
144
145 struct phy_device *wriop_get_phy_dev(int dpmac_id)
146 {
147         int i = wriop_dpmac_to_index(dpmac_id);
148
149         if (i == -1)
150                 return NULL;
151
152         return dpmac_info[i].phydev;
153 }
154
155 phy_interface_t wriop_get_enet_if(int dpmac_id)
156 {
157         int i = wriop_dpmac_to_index(dpmac_id);
158
159         if (i == -1)
160                 return PHY_INTERFACE_MODE_NONE;
161
162         if (dpmac_info[i].enabled)
163                 return dpmac_info[i].enet_if;
164
165         return PHY_INTERFACE_MODE_NONE;
166 }