133 lines
4.3 KiB
Diff
133 lines
4.3 KiB
Diff
|
From 5378928ebac13756fc13d0b2de8dd45ace8026aa Mon Sep 17 00:00:00 2001
|
||
|
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||
|
Date: Mon, 15 Jul 2013 17:34:08 +0200
|
||
|
Subject: [PATCH 080/203] of: provide a binding for the 'fixed-link' property
|
||
|
|
||
|
Some Ethernet MACs have a "fixed link", and are not connected to a
|
||
|
normal MDIO-managed PHY device. For those situations, a Device Tree
|
||
|
binding allows to describe a "fixed link", as a "fixed-link" property
|
||
|
of the Ethernet device Device Tree node.
|
||
|
|
||
|
This patch adds:
|
||
|
|
||
|
* A documentation for the Device Tree property "fixed-link".
|
||
|
|
||
|
* A of_phy_register_fixed_link() OF helper, which provided an OF node
|
||
|
that contains a "fixed-link" property, registers the corresponding
|
||
|
fixed PHY.
|
||
|
|
||
|
* Removes the warning on the of_phy_connect_fixed_link() that says
|
||
|
new drivers should not use it, since Grant Likely indicated that
|
||
|
this "fixed-link" property is indeed the way to go.
|
||
|
|
||
|
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||
|
---
|
||
|
.../devicetree/bindings/net/fixed-link.txt | 26 ++++++++++++++++
|
||
|
drivers/of/of_mdio.c | 36 +++++++++++++++++++---
|
||
|
include/linux/of_mdio.h | 10 ++++++
|
||
|
3 files changed, 68 insertions(+), 4 deletions(-)
|
||
|
create mode 100644 Documentation/devicetree/bindings/net/fixed-link.txt
|
||
|
|
||
|
--- /dev/null
|
||
|
+++ b/Documentation/devicetree/bindings/net/fixed-link.txt
|
||
|
@@ -0,0 +1,26 @@
|
||
|
+Fixed link Device Tree binding
|
||
|
+------------------------------
|
||
|
+
|
||
|
+Some Ethernet MACs have a "fixed link", and are not connected to a
|
||
|
+normal MDIO-managed PHY device. For those situations, a Device Tree
|
||
|
+binding allows to describe a "fixed link".
|
||
|
+
|
||
|
+Such a fixed link situation is described within an Ethernet device
|
||
|
+Device Tree node using a 'fixed-link' property, composed of 5
|
||
|
+elements:
|
||
|
+
|
||
|
+ 1. A fake PHY ID, which must be unique accross all fixed-link PHYs in
|
||
|
+ the system.
|
||
|
+ 2. The duplex (1 for full-duplex, 0 for half-duplex)
|
||
|
+ 3. The speed (10, 100, 1000)
|
||
|
+ 4. The pause setting (1 for enabled, 0 for disabled)
|
||
|
+ 5. The asym pause setting (1 for enabled, 0 for disabled)
|
||
|
+
|
||
|
+Example:
|
||
|
+
|
||
|
+ethernet@0 {
|
||
|
+ ...
|
||
|
+ fixed-link = <1 1 1000 0 0>;
|
||
|
+ ...
|
||
|
+};
|
||
|
+
|
||
|
--- a/drivers/of/of_mdio.c
|
||
|
+++ b/drivers/of/of_mdio.c
|
||
|
@@ -14,6 +14,7 @@
|
||
|
#include <linux/netdevice.h>
|
||
|
#include <linux/err.h>
|
||
|
#include <linux/phy.h>
|
||
|
+#include <linux/phy_fixed.h>
|
||
|
#include <linux/of.h>
|
||
|
#include <linux/of_irq.h>
|
||
|
#include <linux/of_mdio.h>
|
||
|
@@ -215,10 +216,6 @@ EXPORT_SYMBOL(of_phy_connect);
|
||
|
* @dev: pointer to net_device claiming the phy
|
||
|
* @hndlr: Link state callback for the network device
|
||
|
* @iface: PHY data interface type
|
||
|
- *
|
||
|
- * This function is a temporary stop-gap and will be removed soon. It is
|
||
|
- * only to support the fs_enet, ucc_geth and gianfar Ethernet drivers. Do
|
||
|
- * not call this function from new drivers.
|
||
|
*/
|
||
|
struct phy_device *of_phy_connect_fixed_link(struct net_device *dev,
|
||
|
void (*hndlr)(struct net_device *),
|
||
|
@@ -247,3 +244,34 @@ struct phy_device *of_phy_connect_fixed_
|
||
|
return IS_ERR(phy) ? NULL : phy;
|
||
|
}
|
||
|
EXPORT_SYMBOL(of_phy_connect_fixed_link);
|
||
|
+
|
||
|
+#if defined(CONFIG_FIXED_PHY)
|
||
|
+/**
|
||
|
+ * of_phy_register_fixed_link - Parse fixed-link property and register a dummy phy
|
||
|
+ * @np: pointer to the OF device node that contains the "fixed-link"
|
||
|
+ * property for which a dummy phy should be registered.
|
||
|
+ */
|
||
|
+#define FIXED_LINK_PROPERTIES_COUNT 5
|
||
|
+int of_phy_register_fixed_link(struct device_node *np)
|
||
|
+{
|
||
|
+ struct fixed_phy_status status = {};
|
||
|
+ u32 fixed_link_props[FIXED_LINK_PROPERTIES_COUNT];
|
||
|
+ int ret;
|
||
|
+
|
||
|
+ ret = of_property_read_u32_array(np, "fixed-link",
|
||
|
+ fixed_link_props,
|
||
|
+ FIXED_LINK_PROPERTIES_COUNT);
|
||
|
+ if (ret < 0)
|
||
|
+ return ret;
|
||
|
+
|
||
|
+ status.link = 1;
|
||
|
+ status.duplex = fixed_link_props[1];
|
||
|
+ status.speed = fixed_link_props[2];
|
||
|
+ status.pause = fixed_link_props[3];
|
||
|
+ status.asym_pause = fixed_link_props[4];
|
||
|
+
|
||
|
+ return fixed_phy_add(PHY_POLL, fixed_link_props[0],
|
||
|
+ &status);
|
||
|
+}
|
||
|
+EXPORT_SYMBOL(of_phy_register_fixed_link);
|
||
|
+#endif
|
||
|
--- a/include/linux/of_mdio.h
|
||
|
+++ b/include/linux/of_mdio.h
|
||
|
@@ -57,4 +57,14 @@ static inline struct mii_bus *of_mdio_fi
|
||
|
}
|
||
|
#endif /* CONFIG_OF */
|
||
|
|
||
|
+#if defined(CONFIG_OF) && defined(CONFIG_FIXED_PHY)
|
||
|
+extern int of_phy_register_fixed_link(struct device_node *np);
|
||
|
+#else
|
||
|
+static inline int of_phy_register_fixed_link(struct device_node *np)
|
||
|
+{
|
||
|
+ return -ENOSYS;
|
||
|
+}
|
||
|
+#endif
|
||
|
+
|
||
|
+
|
||
|
#endif /* __LINUX_OF_MDIO_H */
|