]> www.infradead.org Git - users/hch/misc.git/commitdiff
net: ethernet: ti: am65-cpsw-nuss: use of_platform_device_create() for mdio
authorGrygorii Strashko <grygorii.strashko@ti.com>
Wed, 6 May 2020 18:13:59 +0000 (21:13 +0300)
committerDavid S. Miller <davem@davemloft.net>
Fri, 8 May 2020 00:51:03 +0000 (17:51 -0700)
The MCU CPSW expected to populate only MDIO device, but follow up patches
will add "compatible" property to the MCU CPSW CPTS node which will cause
creation of CPTS device and MCU CPSW init failure. Hence, switch to use
of_platform_device_create() instead of of_platform_populate() for MDIO
device population.

Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/ti/am65-cpsw-nuss.c
drivers/net/ethernet/ti/am65-cpsw-nuss.h

index f8c589929308bd06c60ce4c9857fac4e3dd5abae..8cdbb2b9b13a59011edd50f63a055686bed8da79 100644 (file)
@@ -2031,10 +2031,21 @@ static int am65_cpsw_nuss_probe(struct platform_device *pdev)
                return ret;
        }
 
-       ret = of_platform_populate(dev->of_node, NULL, NULL, dev);
-       /* We do not want to force this, as in some cases may not have child */
-       if (ret)
-               dev_warn(dev, "populating child nodes err:%d\n", ret);
+       node = of_get_child_by_name(dev->of_node, "mdio");
+       if (!node) {
+               dev_warn(dev, "MDIO node not found\n");
+       } else if (of_device_is_available(node)) {
+               struct platform_device *mdio_pdev;
+
+               mdio_pdev = of_platform_device_create(node, NULL, dev);
+               if (!mdio_pdev) {
+                       ret = -ENODEV;
+                       goto err_pm_clear;
+               }
+
+               common->mdio_dev =  &mdio_pdev->dev;
+       }
+       of_node_put(node);
 
        am65_cpsw_nuss_get_ver(common);
 
@@ -2090,7 +2101,8 @@ static int am65_cpsw_nuss_probe(struct platform_device *pdev)
        return 0;
 
 err_of_clear:
-       of_platform_depopulate(dev);
+       of_platform_device_destroy(common->mdio_dev, NULL);
+err_pm_clear:
        pm_runtime_put_sync(dev);
        pm_runtime_disable(dev);
        return ret;
@@ -2115,7 +2127,7 @@ static int am65_cpsw_nuss_remove(struct platform_device *pdev)
         */
        am65_cpsw_nuss_cleanup_ndev(common);
 
-       of_platform_depopulate(dev);
+       of_platform_device_destroy(common->mdio_dev, NULL);
 
        pm_runtime_put_sync(&pdev->dev);
        pm_runtime_disable(&pdev->dev);
index b1cddfd05a4576ac4bd1ce1afbb115b2fb4f14fa..8a6382188cb5c2ff408b17b91f36d7242621fc22 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/netdevice.h>
+#include <linux/platform_device.h>
 
 struct am65_cpts;
 
@@ -76,6 +77,7 @@ struct am65_cpsw_pdata {
 
 struct am65_cpsw_common {
        struct device           *dev;
+       struct device           *mdio_dev;
        const struct am65_cpsw_pdata *pdata;
 
        void __iomem            *ss_base;