#include <linux/interrupt.h>
#include <linux/platform_device.h>
#include <linux/of.h>
+#include <linux/of_mdio.h>
+#include <linux/of_net.h>
#include <linux/irq.h>
#include <linux/err.h>
#include <linux/phy.h>
struct platform_device *pdev;
struct mii_bus *mii_bus;
struct phy_device *phydev;
+ struct device_node *phy_node;
+ phy_interface_t phy_interface;
int old_link;
int old_duplex;
u32 msg_level;
goto out;
}
- phydev = phy_connect(dev, dev_name(&phydev->dev),
+ phydev = of_phy_connect(dev, priv->phy_node,
nuport_mac_adjust_link, 0,
- PHY_INTERFACE_MODE_MII);
+ priv->phy_interface);
if (IS_ERR(phydev)) {
netdev_err(dev, "could not attach PHY\n");
ret = PTR_ERR(phydev);
netif_napi_add(dev, &priv->napi, nuport_mac_poll, 64);
+ priv->phy_node = of_parse_phandle(pdev->dev.of_node, "phy", 0);
+ if (!priv->phy_node) {
+ dev_err(&pdev->dev, "no associated PHY\n");
+ ret = -ENODEV;
+ goto out;
+ }
+
+ priv->phy_interface = of_get_phy_mode(pdev->dev.of_node);
+ if (priv->phy_interface < 0) {
+ dev_err(&pdev->dev, "invalid PHY mode\n");
+ ret = -EINVAL;
+ goto out;
+ }
+
priv->mii_bus = mdiobus_alloc();
if (!priv->mii_bus) {
dev_err(&pdev->dev, "mii bus allocation failed\n");
for (i = 0; i < PHY_MAX_ADDR; i++)
priv->mii_bus->irq[i] = PHY_IGNORE_INTERRUPT;
- ret = mdiobus_register(priv->mii_bus);
+ ret = of_mdiobus_register(priv->mii_bus, pdev->dev.of_node);
if (ret) {
dev_err(&pdev->dev, "failed to register mii_bus\n");
goto out_mdio_irq;