netsec: ignore 'phy-mode' device property on ACPI systems
[linux-2.6-microblaze.git] / drivers / net / ethernet / socionext / netsec.c
index 806eb65..1503cc9 100644 (file)
@@ -6,6 +6,7 @@
 #include <linux/pm_runtime.h>
 #include <linux/acpi.h>
 #include <linux/of_mdio.h>
+#include <linux/of_net.h>
 #include <linux/etherdevice.h>
 #include <linux/interrupt.h>
 #include <linux/io.h>
@@ -1833,6 +1834,14 @@ static const struct net_device_ops netsec_netdev_ops = {
 static int netsec_of_probe(struct platform_device *pdev,
                           struct netsec_priv *priv, u32 *phy_addr)
 {
+       int err;
+
+       err = of_get_phy_mode(pdev->dev.of_node, &priv->phy_interface);
+       if (err) {
+               dev_err(&pdev->dev, "missing required property 'phy-mode'\n");
+               return err;
+       }
+
        priv->phy_np = of_parse_phandle(pdev->dev.of_node, "phy-handle", 0);
        if (!priv->phy_np) {
                dev_err(&pdev->dev, "missing required property 'phy-handle'\n");
@@ -1859,6 +1868,14 @@ static int netsec_acpi_probe(struct platform_device *pdev,
        if (!IS_ENABLED(CONFIG_ACPI))
                return -ENODEV;
 
+       /* ACPI systems are assumed to configure the PHY in firmware, so
+        * there is really no need to discover the PHY mode from the DSDT.
+        * Since firmware is known to exist in the field that configures the
+        * PHY correctly but passes the wrong mode string in the phy-mode
+        * device property, we have no choice but to ignore it.
+        */
+       priv->phy_interface = PHY_INTERFACE_MODE_NA;
+
        ret = device_property_read_u32(&pdev->dev, "phy-channel", phy_addr);
        if (ret) {
                dev_err(&pdev->dev,
@@ -1995,13 +2012,6 @@ static int netsec_probe(struct platform_device *pdev)
        priv->msg_enable = NETIF_MSG_TX_ERR | NETIF_MSG_HW | NETIF_MSG_DRV |
                           NETIF_MSG_LINK | NETIF_MSG_PROBE;
 
-       priv->phy_interface = device_get_phy_mode(&pdev->dev);
-       if ((int)priv->phy_interface < 0) {
-               dev_err(&pdev->dev, "missing required property 'phy-mode'\n");
-               ret = -ENODEV;
-               goto free_ndev;
-       }
-
        priv->ioaddr = devm_ioremap(&pdev->dev, mmio_res->start,
                                    resource_size(mmio_res));
        if (!priv->ioaddr) {