diff options
-rw-r--r-- | Documentation/powerpc/booting-without-of.txt | 4 | ||||
-rw-r--r-- | arch/powerpc/sysdev/fsl_soc.c | 79 |
2 files changed, 66 insertions, 17 deletions
diff --git a/Documentation/powerpc/booting-without-of.txt b/Documentation/powerpc/booting-without-of.txt index e58fd31bee1a..f920c2459e89 100644 --- a/Documentation/powerpc/booting-without-of.txt +++ b/Documentation/powerpc/booting-without-of.txt | |||
@@ -1257,6 +1257,10 @@ platforms are moved over to use the flattened-device-tree model. | |||
1257 | services interrupts for this device. | 1257 | services interrupts for this device. |
1258 | - phy-handle : The phandle for the PHY connected to this ethernet | 1258 | - phy-handle : The phandle for the PHY connected to this ethernet |
1259 | controller. | 1259 | controller. |
1260 | - fixed-link : <a b c d e> where a is emulated phy id - choose any, | ||
1261 | but unique to the all specified fixed-links, b is duplex - 0 half, | ||
1262 | 1 full, c is link speed - d#10/d#100/d#1000, d is pause - 0 no | ||
1263 | pause, 1 pause, e is asym_pause - 0 no asym_pause, 1 asym_pause. | ||
1260 | 1264 | ||
1261 | Recommended properties: | 1265 | Recommended properties: |
1262 | 1266 | ||
diff --git a/arch/powerpc/sysdev/fsl_soc.c b/arch/powerpc/sysdev/fsl_soc.c index f5c240242cfd..474cb8e22f64 100644 --- a/arch/powerpc/sysdev/fsl_soc.c +++ b/arch/powerpc/sysdev/fsl_soc.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/platform_device.h> | 24 | #include <linux/platform_device.h> |
25 | #include <linux/of_platform.h> | 25 | #include <linux/of_platform.h> |
26 | #include <linux/phy.h> | 26 | #include <linux/phy.h> |
27 | #include <linux/phy_fixed.h> | ||
27 | #include <linux/spi/spi.h> | 28 | #include <linux/spi/spi.h> |
28 | #include <linux/fsl_devices.h> | 29 | #include <linux/fsl_devices.h> |
29 | #include <linux/fs_enet_pd.h> | 30 | #include <linux/fs_enet_pd.h> |
@@ -130,6 +131,37 @@ u32 get_baudrate(void) | |||
130 | EXPORT_SYMBOL(get_baudrate); | 131 | EXPORT_SYMBOL(get_baudrate); |
131 | #endif /* CONFIG_CPM2 */ | 132 | #endif /* CONFIG_CPM2 */ |
132 | 133 | ||
134 | #ifdef CONFIG_FIXED_PHY | ||
135 | static int __init of_add_fixed_phys(void) | ||
136 | { | ||
137 | int ret; | ||
138 | struct device_node *np; | ||
139 | u32 *fixed_link; | ||
140 | struct fixed_phy_status status = {}; | ||
141 | |||
142 | for_each_node_by_name(np, "ethernet") { | ||
143 | fixed_link = (u32 *)of_get_property(np, "fixed-link", NULL); | ||
144 | if (!fixed_link) | ||
145 | continue; | ||
146 | |||
147 | status.link = 1; | ||
148 | status.duplex = fixed_link[1]; | ||
149 | status.speed = fixed_link[2]; | ||
150 | status.pause = fixed_link[3]; | ||
151 | status.asym_pause = fixed_link[4]; | ||
152 | |||
153 | ret = fixed_phy_add(PHY_POLL, fixed_link[0], &status); | ||
154 | if (ret) { | ||
155 | of_node_put(np); | ||
156 | return ret; | ||
157 | } | ||
158 | } | ||
159 | |||
160 | return 0; | ||
161 | } | ||
162 | arch_initcall(of_add_fixed_phys); | ||
163 | #endif /* CONFIG_FIXED_PHY */ | ||
164 | |||
133 | static int __init gfar_mdio_of_init(void) | 165 | static int __init gfar_mdio_of_init(void) |
134 | { | 166 | { |
135 | struct device_node *np = NULL; | 167 | struct device_node *np = NULL; |
@@ -198,7 +230,6 @@ static const char *gfar_tx_intr = "tx"; | |||
198 | static const char *gfar_rx_intr = "rx"; | 230 | static const char *gfar_rx_intr = "rx"; |
199 | static const char *gfar_err_intr = "error"; | 231 | static const char *gfar_err_intr = "error"; |
200 | 232 | ||
201 | |||
202 | static int __init gfar_of_init(void) | 233 | static int __init gfar_of_init(void) |
203 | { | 234 | { |
204 | struct device_node *np; | 235 | struct device_node *np; |
@@ -282,29 +313,43 @@ static int __init gfar_of_init(void) | |||
282 | gfar_data.interface = PHY_INTERFACE_MODE_MII; | 313 | gfar_data.interface = PHY_INTERFACE_MODE_MII; |
283 | 314 | ||
284 | ph = of_get_property(np, "phy-handle", NULL); | 315 | ph = of_get_property(np, "phy-handle", NULL); |
285 | phy = of_find_node_by_phandle(*ph); | 316 | if (ph == NULL) { |
317 | u32 *fixed_link; | ||
286 | 318 | ||
287 | if (phy == NULL) { | 319 | fixed_link = (u32 *)of_get_property(np, "fixed-link", |
288 | ret = -ENODEV; | 320 | NULL); |
289 | goto unreg; | 321 | if (!fixed_link) { |
290 | } | 322 | ret = -ENODEV; |
323 | goto unreg; | ||
324 | } | ||
291 | 325 | ||
292 | mdio = of_get_parent(phy); | 326 | gfar_data.bus_id = 0; |
327 | gfar_data.phy_id = fixed_link[0]; | ||
328 | } else { | ||
329 | phy = of_find_node_by_phandle(*ph); | ||
330 | |||
331 | if (phy == NULL) { | ||
332 | ret = -ENODEV; | ||
333 | goto unreg; | ||
334 | } | ||
335 | |||
336 | mdio = of_get_parent(phy); | ||
337 | |||
338 | id = of_get_property(phy, "reg", NULL); | ||
339 | ret = of_address_to_resource(mdio, 0, &res); | ||
340 | if (ret) { | ||
341 | of_node_put(phy); | ||
342 | of_node_put(mdio); | ||
343 | goto unreg; | ||
344 | } | ||
345 | |||
346 | gfar_data.phy_id = *id; | ||
347 | gfar_data.bus_id = res.start; | ||
293 | 348 | ||
294 | id = of_get_property(phy, "reg", NULL); | ||
295 | ret = of_address_to_resource(mdio, 0, &res); | ||
296 | if (ret) { | ||
297 | of_node_put(phy); | 349 | of_node_put(phy); |
298 | of_node_put(mdio); | 350 | of_node_put(mdio); |
299 | goto unreg; | ||
300 | } | 351 | } |
301 | 352 | ||
302 | gfar_data.phy_id = *id; | ||
303 | gfar_data.bus_id = res.start; | ||
304 | |||
305 | of_node_put(phy); | ||
306 | of_node_put(mdio); | ||
307 | |||
308 | ret = | 353 | ret = |
309 | platform_device_add_data(gfar_dev, &gfar_data, | 354 | platform_device_add_data(gfar_dev, &gfar_data, |
310 | sizeof(struct | 355 | sizeof(struct |