generic: rtl836x: support defered probe on mdio-bus
authorChristian Lamparter <chunkeey@gmail.com>
Wed, 17 Oct 2018 20:37:36 +0000 (22:37 +0200)
committerJohn Crispin <john@phrozen.org>
Mon, 26 Nov 2018 11:05:46 +0000 (12:05 +0100)
On the WNDAP620, the mdio and mdc lines are controlled by
the EMAC ethernet device. This results in a hen-vs-egg problem.
The rtl8367b driver is probed before the ethernet driver and
the mdio-bus is not available yet, which caused the rtl8367b
driver to fail.

This patch changes the rtl8366_smi_probe_of() function to
return -EPROBE_DEFER if the mdio-bus lookup failed and changes
rtl8366_smi_probe()'s signature to return the error code back to
the callee, so it can propagate back to the kernel. Which, will
retry the switch probe at a later time.

Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
target/linux/generic/files/drivers/net/phy/rtl8366_smi.c
target/linux/generic/files/drivers/net/phy/rtl8366rb.c
target/linux/generic/files/drivers/net/phy/rtl8366s.c
target/linux/generic/files/drivers/net/phy/rtl8367.c
target/linux/generic/files/drivers/net/phy/rtl8367b.c

index c0cb680..2c4d53f 100644 (file)
@@ -1553,8 +1553,8 @@ int rtl8366_smi_probe_of(struct platform_device *pdev, struct rtl8366_smi *smi)
 
        smi->ext_mbus = of_mdio_find_bus(mdio_node);
        if (!smi->ext_mbus) {
-               dev_err(&pdev->dev,
-                       "cannot find mdio bus from bus handle");
+               dev_info(&pdev->dev,
+                       "cannot find mdio bus from bus handle (yet)");
                goto try_gpio;
        }
 
@@ -1562,8 +1562,12 @@ int rtl8366_smi_probe_of(struct platform_device *pdev, struct rtl8366_smi *smi)
 
 try_gpio:
        if (!gpio_is_valid(sck) || !gpio_is_valid(sda)) {
-               dev_err(&pdev->dev, "gpios missing in devictree\n");
-               return -EINVAL;
+               if (!mdio_node) {
+                       dev_err(&pdev->dev, "gpios missing in devictree\n");
+                       return -EINVAL;
+               } else {
+                       return -EPROBE_DEFER;
+               }
        }
 
        smi->gpio_sda = sda;
@@ -1619,7 +1623,7 @@ struct rtl8366_smi *rtl8366_smi_probe(struct platform_device *pdev)
 
 free_smi:
        kfree(smi);
-       return NULL;
+       return ERR_PTR(err);
 }
 EXPORT_SYMBOL_GPL(rtl8366_smi_probe);
 
index dc394c0..0e01160 100644 (file)
@@ -1445,8 +1445,8 @@ static int rtl8366rb_probe(struct platform_device *pdev)
                       " version " RTL8366RB_DRIVER_VER"\n");
 
        smi = rtl8366_smi_probe(pdev);
-       if (!smi)
-               return -ENODEV;
+       if (IS_ERR(smi))
+               return PTR_ERR(smi);
 
        smi->clk_delay = 10;
        smi->cmd_read = 0xa9;
index 3f458f9..8c74677 100644 (file)
@@ -1233,8 +1233,8 @@ static int rtl8366s_probe(struct platform_device *pdev)
                       " version " RTL8366S_DRIVER_VER"\n");
 
        smi = rtl8366_smi_probe(pdev);
-       if (!smi)
-               return -ENODEV;
+       if (IS_ERR(smi))
+               return PTR_ERR(smi);
 
        smi->clk_delay = 10;
        smi->cmd_read = 0xa9;
index 9549961..7f0569d 100644 (file)
@@ -1752,8 +1752,8 @@ static int rtl8367_probe(struct platform_device *pdev)
        int err;
 
        smi = rtl8366_smi_probe(pdev);
-       if (!smi)
-               return -ENODEV;
+       if (IS_ERR(smi))
+               return PTR_ERR(smi);
 
        smi->clk_delay = 1500;
        smi->cmd_read = 0xb9;
index e6ea650..cd8de81 100644 (file)
@@ -1527,8 +1527,8 @@ static int  rtl8367b_probe(struct platform_device *pdev)
        int err;
 
        smi = rtl8366_smi_probe(pdev);
-       if (!smi)
-               return -ENODEV;
+       if (IS_ERR(smi))
+               return PTR_ERR(smi);
 
        smi->clk_delay = 1500;
        smi->cmd_read = 0xb9;