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