aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Lamparter <chunkeey@gmail.com>2018-10-17 22:37:36 +0200
committerJohn Crispin <john@phrozen.org>2018-11-26 12:05:46 +0100
commit910c2f9e68554ed36f622d005c76f39780b367ab (patch)
tree33b29da65a5702ce8d4faf4714a076764456f677
parentfb4bed5fe93961d769317014133a4d0006e5a6ea (diff)
downloadupstream-910c2f9e68554ed36f622d005c76f39780b367ab.tar.gz
upstream-910c2f9e68554ed36f622d005c76f39780b367ab.tar.bz2
upstream-910c2f9e68554ed36f622d005c76f39780b367ab.zip
generic: rtl836x: support defered probe on mdio-bus
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>
-rw-r--r--target/linux/generic/files/drivers/net/phy/rtl8366_smi.c14
-rw-r--r--target/linux/generic/files/drivers/net/phy/rtl8366rb.c4
-rw-r--r--target/linux/generic/files/drivers/net/phy/rtl8366s.c4
-rw-r--r--target/linux/generic/files/drivers/net/phy/rtl8367.c4
-rw-r--r--target/linux/generic/files/drivers/net/phy/rtl8367b.c4
5 files changed, 17 insertions, 13 deletions
diff --git a/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c b/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c
index c0cb680e23..2c4d53fc67 100644
--- a/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c
+++ b/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c
@@ -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);
diff --git a/target/linux/generic/files/drivers/net/phy/rtl8366rb.c b/target/linux/generic/files/drivers/net/phy/rtl8366rb.c
index dc394c02b6..0e0116051a 100644
--- a/target/linux/generic/files/drivers/net/phy/rtl8366rb.c
+++ b/target/linux/generic/files/drivers/net/phy/rtl8366rb.c
@@ -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;
diff --git a/target/linux/generic/files/drivers/net/phy/rtl8366s.c b/target/linux/generic/files/drivers/net/phy/rtl8366s.c
index 3f458f9dec..8c746778b8 100644
--- a/target/linux/generic/files/drivers/net/phy/rtl8366s.c
+++ b/target/linux/generic/files/drivers/net/phy/rtl8366s.c
@@ -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;
diff --git a/target/linux/generic/files/drivers/net/phy/rtl8367.c b/target/linux/generic/files/drivers/net/phy/rtl8367.c
index 9549961d76..7f0569d038 100644
--- a/target/linux/generic/files/drivers/net/phy/rtl8367.c
+++ b/target/linux/generic/files/drivers/net/phy/rtl8367.c
@@ -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;
diff --git a/target/linux/generic/files/drivers/net/phy/rtl8367b.c b/target/linux/generic/files/drivers/net/phy/rtl8367b.c
index e6ea6509ae..cd8de810b5 100644
--- a/target/linux/generic/files/drivers/net/phy/rtl8367b.c
+++ b/target/linux/generic/files/drivers/net/phy/rtl8367b.c
@@ -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;