Commit bbcecd60 authored by David S. Miller's avatar David S. Miller

Merge branch 'net-of_node_put'

Peter Chen says:

====================
add missing of_node_put after calling of_parse_phandle

This patch set fixes missing of_node_put issue at ethernet driver.
of_node_put needs to be called when the device node which is got
from of_parse_phandle has finished using.

The compilation test has passed by using allmodconfig for drivers/net/ethernet.

Changes for v2:
- If the device node is local variable, it can be put in the same function.
- If the device node will be used the whole driver life cycle,
  it should be put (call of_node_put) at driver's remove.
  Patch [4, 5, 9, 14, 15/15]
- Fix the issue that the node still be used at error patch [6/15]
- Add acked for patch [11,12/15]
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 0a2f0d2d 5817f977
...@@ -815,6 +815,7 @@ static int init_phy(struct net_device *dev) ...@@ -815,6 +815,7 @@ static int init_phy(struct net_device *dev)
phydev = of_phy_connect(dev, phynode, phydev = of_phy_connect(dev, phynode,
&altera_tse_adjust_link, 0, priv->phy_iface); &altera_tse_adjust_link, 0, priv->phy_iface);
} }
of_node_put(phynode);
if (!phydev) { if (!phydev) {
netdev_err(dev, "Could not find the PHY\n"); netdev_err(dev, "Could not find the PHY\n");
......
...@@ -772,6 +772,7 @@ int xgene_enet_phy_connect(struct net_device *ndev) ...@@ -772,6 +772,7 @@ int xgene_enet_phy_connect(struct net_device *ndev)
phy_dev = of_phy_connect(ndev, np, &xgene_enet_adjust_link, phy_dev = of_phy_connect(ndev, np, &xgene_enet_adjust_link,
0, pdata->phy_mode); 0, pdata->phy_mode);
of_node_put(np);
if (!phy_dev) { if (!phy_dev) {
netdev_err(ndev, "Could not connect to PHY\n"); netdev_err(ndev, "Could not connect to PHY\n");
return -ENODEV; return -ENODEV;
......
...@@ -749,14 +749,16 @@ int arc_emac_probe(struct net_device *ndev, int interface) ...@@ -749,14 +749,16 @@ int arc_emac_probe(struct net_device *ndev, int interface)
err = of_address_to_resource(dev->of_node, 0, &res_regs); err = of_address_to_resource(dev->of_node, 0, &res_regs);
if (err) { if (err) {
dev_err(dev, "failed to retrieve registers base from device tree\n"); dev_err(dev, "failed to retrieve registers base from device tree\n");
return -ENODEV; err = -ENODEV;
goto out_put_node;
} }
/* Get IRQ from device tree */ /* Get IRQ from device tree */
irq = irq_of_parse_and_map(dev->of_node, 0); irq = irq_of_parse_and_map(dev->of_node, 0);
if (!irq) { if (!irq) {
dev_err(dev, "failed to retrieve <irq> value from device tree\n"); dev_err(dev, "failed to retrieve <irq> value from device tree\n");
return -ENODEV; err = -ENODEV;
goto out_put_node;
} }
ndev->netdev_ops = &arc_emac_netdev_ops; ndev->netdev_ops = &arc_emac_netdev_ops;
...@@ -778,7 +780,7 @@ int arc_emac_probe(struct net_device *ndev, int interface) ...@@ -778,7 +780,7 @@ int arc_emac_probe(struct net_device *ndev, int interface)
err = clk_prepare_enable(priv->clk); err = clk_prepare_enable(priv->clk);
if (err) { if (err) {
dev_err(dev, "failed to enable clock\n"); dev_err(dev, "failed to enable clock\n");
return err; goto out_put_node;
} }
clock_frequency = clk_get_rate(priv->clk); clock_frequency = clk_get_rate(priv->clk);
...@@ -787,7 +789,8 @@ int arc_emac_probe(struct net_device *ndev, int interface) ...@@ -787,7 +789,8 @@ int arc_emac_probe(struct net_device *ndev, int interface)
if (of_property_read_u32(dev->of_node, "clock-frequency", if (of_property_read_u32(dev->of_node, "clock-frequency",
&clock_frequency)) { &clock_frequency)) {
dev_err(dev, "failed to retrieve <clock-frequency> from device tree\n"); dev_err(dev, "failed to retrieve <clock-frequency> from device tree\n");
return -EINVAL; err = -EINVAL;
goto out_put_node;
} }
} }
...@@ -867,6 +870,7 @@ int arc_emac_probe(struct net_device *ndev, int interface) ...@@ -867,6 +870,7 @@ int arc_emac_probe(struct net_device *ndev, int interface)
goto out_netif_api; goto out_netif_api;
} }
of_node_put(phy_node);
return 0; return 0;
out_netif_api: out_netif_api:
...@@ -877,6 +881,9 @@ int arc_emac_probe(struct net_device *ndev, int interface) ...@@ -877,6 +881,9 @@ int arc_emac_probe(struct net_device *ndev, int interface)
out_clken: out_clken:
if (priv->clk) if (priv->clk)
clk_disable_unprepare(priv->clk); clk_disable_unprepare(priv->clk);
out_put_node:
of_node_put(phy_node);
return err; return err;
} }
EXPORT_SYMBOL_GPL(arc_emac_probe); EXPORT_SYMBOL_GPL(arc_emac_probe);
......
...@@ -1504,6 +1504,7 @@ static int nb8800_probe(struct platform_device *pdev) ...@@ -1504,6 +1504,7 @@ static int nb8800_probe(struct platform_device *pdev)
err_free_dma: err_free_dma:
nb8800_dma_free(dev); nb8800_dma_free(dev);
err_free_bus: err_free_bus:
of_node_put(priv->phy_node);
mdiobus_unregister(bus); mdiobus_unregister(bus);
err_disable_clk: err_disable_clk:
clk_disable_unprepare(priv->clk); clk_disable_unprepare(priv->clk);
...@@ -1519,6 +1520,7 @@ static int nb8800_remove(struct platform_device *pdev) ...@@ -1519,6 +1520,7 @@ static int nb8800_remove(struct platform_device *pdev)
struct nb8800_priv *priv = netdev_priv(ndev); struct nb8800_priv *priv = netdev_priv(ndev);
unregister_netdev(ndev); unregister_netdev(ndev);
of_node_put(priv->phy_node);
mdiobus_unregister(priv->mii_bus); mdiobus_unregister(priv->mii_bus);
......
...@@ -1513,6 +1513,7 @@ static int octeon_mgmt_probe(struct platform_device *pdev) ...@@ -1513,6 +1513,7 @@ static int octeon_mgmt_probe(struct platform_device *pdev)
return 0; return 0;
err: err:
of_node_put(p->phy_np);
free_netdev(netdev); free_netdev(netdev);
return result; return result;
} }
...@@ -1520,8 +1521,10 @@ static int octeon_mgmt_probe(struct platform_device *pdev) ...@@ -1520,8 +1521,10 @@ static int octeon_mgmt_probe(struct platform_device *pdev)
static int octeon_mgmt_remove(struct platform_device *pdev) static int octeon_mgmt_remove(struct platform_device *pdev)
{ {
struct net_device *netdev = platform_get_drvdata(pdev); struct net_device *netdev = platform_get_drvdata(pdev);
struct octeon_mgmt *p = netdev_priv(netdev);
unregister_netdev(netdev); unregister_netdev(netdev);
of_node_put(p->phy_np);
free_netdev(netdev); free_netdev(netdev);
return 0; return 0;
} }
......
...@@ -795,6 +795,7 @@ static int hns_mac_get_info(struct hns_mac_cb *mac_cb) ...@@ -795,6 +795,7 @@ static int hns_mac_get_info(struct hns_mac_cb *mac_cb)
dev_dbg(mac_cb->dev, "mac%d phy_node: %s\n", dev_dbg(mac_cb->dev, "mac%d phy_node: %s\n",
mac_cb->mac_id, np->name); mac_cb->mac_id, np->name);
} }
of_node_put(np);
return 0; return 0;
} }
...@@ -812,10 +813,12 @@ static int hns_mac_get_info(struct hns_mac_cb *mac_cb) ...@@ -812,10 +813,12 @@ static int hns_mac_get_info(struct hns_mac_cb *mac_cb)
dev_dbg(mac_cb->dev, "mac%d phy_node: %s\n", dev_dbg(mac_cb->dev, "mac%d phy_node: %s\n",
mac_cb->mac_id, np->name); mac_cb->mac_id, np->name);
} }
of_node_put(np);
syscon = syscon_node_to_regmap( np = of_parse_phandle(to_of_node(mac_cb->fw_port),
of_parse_phandle(to_of_node(mac_cb->fw_port), "serdes-syscon", 0);
"serdes-syscon", 0)); syscon = syscon_node_to_regmap(np);
of_node_put(np);
if (IS_ERR_OR_NULL(syscon)) { if (IS_ERR_OR_NULL(syscon)) {
dev_err(mac_cb->dev, "serdes-syscon is needed!\n"); dev_err(mac_cb->dev, "serdes-syscon is needed!\n");
return -EINVAL; return -EINVAL;
......
...@@ -51,7 +51,7 @@ int hns_dsaf_get_cfg(struct dsaf_device *dsaf_dev) ...@@ -51,7 +51,7 @@ int hns_dsaf_get_cfg(struct dsaf_device *dsaf_dev)
const char *mode_str; const char *mode_str;
struct regmap *syscon; struct regmap *syscon;
struct resource *res; struct resource *res;
struct device_node *np = dsaf_dev->dev->of_node; struct device_node *np = dsaf_dev->dev->of_node, *np_temp;
struct platform_device *pdev = to_platform_device(dsaf_dev->dev); struct platform_device *pdev = to_platform_device(dsaf_dev->dev);
if (dev_of_node(dsaf_dev->dev)) { if (dev_of_node(dsaf_dev->dev)) {
...@@ -102,8 +102,9 @@ int hns_dsaf_get_cfg(struct dsaf_device *dsaf_dev) ...@@ -102,8 +102,9 @@ int hns_dsaf_get_cfg(struct dsaf_device *dsaf_dev)
dsaf_dev->dsaf_tc_mode = HRD_DSAF_4TC_MODE; dsaf_dev->dsaf_tc_mode = HRD_DSAF_4TC_MODE;
if (dev_of_node(dsaf_dev->dev)) { if (dev_of_node(dsaf_dev->dev)) {
syscon = syscon_node_to_regmap( np_temp = of_parse_phandle(np, "subctrl-syscon", 0);
of_parse_phandle(np, "subctrl-syscon", 0)); syscon = syscon_node_to_regmap(np_temp);
of_node_put(np_temp);
if (IS_ERR_OR_NULL(syscon)) { if (IS_ERR_OR_NULL(syscon)) {
res = platform_get_resource(pdev, IORESOURCE_MEM, res = platform_get_resource(pdev, IORESOURCE_MEM,
res_idx++); res_idx++);
......
...@@ -4118,6 +4118,7 @@ static int mvneta_probe(struct platform_device *pdev) ...@@ -4118,6 +4118,7 @@ static int mvneta_probe(struct platform_device *pdev)
pp->bm_priv = NULL; pp->bm_priv = NULL;
} }
} }
of_node_put(bm_node);
err = mvneta_init(&pdev->dev, pp); err = mvneta_init(&pdev->dev, pp);
if (err < 0) if (err < 0)
......
...@@ -6234,6 +6234,7 @@ static int mvpp2_port_probe(struct platform_device *pdev, ...@@ -6234,6 +6234,7 @@ static int mvpp2_port_probe(struct platform_device *pdev,
err_free_irq: err_free_irq:
irq_dispose_mapping(port->irq); irq_dispose_mapping(port->irq);
err_free_netdev: err_free_netdev:
of_node_put(phy_node);
free_netdev(dev); free_netdev(dev);
return err; return err;
} }
...@@ -6244,6 +6245,7 @@ static void mvpp2_port_remove(struct mvpp2_port *port) ...@@ -6244,6 +6245,7 @@ static void mvpp2_port_remove(struct mvpp2_port *port)
int i; int i;
unregister_netdev(port->dev); unregister_netdev(port->dev);
of_node_put(port->phy_node);
free_percpu(port->pcpu); free_percpu(port->pcpu);
free_percpu(port->stats); free_percpu(port->stats);
for (i = 0; i < txq_number; i++) for (i = 0; i < txq_number; i++)
......
...@@ -1506,6 +1506,7 @@ static int pxa168_eth_probe(struct platform_device *pdev) ...@@ -1506,6 +1506,7 @@ static int pxa168_eth_probe(struct platform_device *pdev)
} }
of_property_read_u32(np, "reg", &pep->phy_addr); of_property_read_u32(np, "reg", &pep->phy_addr);
pep->phy_intf = of_get_phy_mode(pdev->dev.of_node); pep->phy_intf = of_get_phy_mode(pdev->dev.of_node);
of_node_put(np);
} }
/* Hardware supports only 3 ports */ /* Hardware supports only 3 ports */
......
...@@ -1005,6 +1005,7 @@ static int ravb_phy_init(struct net_device *ndev) ...@@ -1005,6 +1005,7 @@ static int ravb_phy_init(struct net_device *ndev)
} }
phydev = of_phy_connect(ndev, pn, ravb_adjust_link, 0, phydev = of_phy_connect(ndev, pn, ravb_adjust_link, 0,
priv->phy_interface); priv->phy_interface);
of_node_put(pn);
if (!phydev) { if (!phydev) {
netdev_err(ndev, "failed to connect PHY\n"); netdev_err(ndev, "failed to connect PHY\n");
return -ENOENT; return -ENOENT;
......
...@@ -1780,6 +1780,7 @@ static int sh_eth_phy_init(struct net_device *ndev) ...@@ -1780,6 +1780,7 @@ static int sh_eth_phy_init(struct net_device *ndev)
sh_eth_adjust_link, 0, sh_eth_adjust_link, 0,
mdp->phy_interface); mdp->phy_interface);
of_node_put(pn);
if (!phydev) if (!phydev)
phydev = ERR_PTR(-ENOENT); phydev = ERR_PTR(-ENOENT);
} else { } else {
......
...@@ -135,7 +135,9 @@ static int socfpga_dwmac_parse_data(struct socfpga_dwmac *dwmac, struct device * ...@@ -135,7 +135,9 @@ static int socfpga_dwmac_parse_data(struct socfpga_dwmac *dwmac, struct device *
np_splitter = of_parse_phandle(np, "altr,emac-splitter", 0); np_splitter = of_parse_phandle(np, "altr,emac-splitter", 0);
if (np_splitter) { if (np_splitter) {
if (of_address_to_resource(np_splitter, 0, &res_splitter)) { ret = of_address_to_resource(np_splitter, 0, &res_splitter);
of_node_put(np_splitter);
if (ret) {
dev_info(dev, "Missing emac splitter address\n"); dev_info(dev, "Missing emac splitter address\n");
return -EINVAL; return -EINVAL;
} }
...@@ -159,14 +161,17 @@ static int socfpga_dwmac_parse_data(struct socfpga_dwmac *dwmac, struct device * ...@@ -159,14 +161,17 @@ static int socfpga_dwmac_parse_data(struct socfpga_dwmac *dwmac, struct device *
dev_err(dev, dev_err(dev,
"%s: ERROR: missing emac splitter address\n", "%s: ERROR: missing emac splitter address\n",
__func__); __func__);
return -EINVAL; ret = -EINVAL;
goto err_node_put;
} }
dwmac->splitter_base = dwmac->splitter_base =
devm_ioremap_resource(dev, &res_splitter); devm_ioremap_resource(dev, &res_splitter);
if (IS_ERR(dwmac->splitter_base)) if (IS_ERR(dwmac->splitter_base)) {
return PTR_ERR(dwmac->splitter_base); ret = PTR_ERR(dwmac->splitter_base);
goto err_node_put;
}
} }
index = of_property_match_string(np_sgmii_adapter, "reg-names", index = of_property_match_string(np_sgmii_adapter, "reg-names",
...@@ -178,14 +183,17 @@ static int socfpga_dwmac_parse_data(struct socfpga_dwmac *dwmac, struct device * ...@@ -178,14 +183,17 @@ static int socfpga_dwmac_parse_data(struct socfpga_dwmac *dwmac, struct device *
dev_err(dev, dev_err(dev,
"%s: ERROR: failed mapping adapter\n", "%s: ERROR: failed mapping adapter\n",
__func__); __func__);
return -EINVAL; ret = -EINVAL;
goto err_node_put;
} }
dwmac->pcs.sgmii_adapter_base = dwmac->pcs.sgmii_adapter_base =
devm_ioremap_resource(dev, &res_sgmii_adapter); devm_ioremap_resource(dev, &res_sgmii_adapter);
if (IS_ERR(dwmac->pcs.sgmii_adapter_base)) if (IS_ERR(dwmac->pcs.sgmii_adapter_base)) {
return PTR_ERR(dwmac->pcs.sgmii_adapter_base); ret = PTR_ERR(dwmac->pcs.sgmii_adapter_base);
goto err_node_put;
}
} }
index = of_property_match_string(np_sgmii_adapter, "reg-names", index = of_property_match_string(np_sgmii_adapter, "reg-names",
...@@ -197,22 +205,30 @@ static int socfpga_dwmac_parse_data(struct socfpga_dwmac *dwmac, struct device * ...@@ -197,22 +205,30 @@ static int socfpga_dwmac_parse_data(struct socfpga_dwmac *dwmac, struct device *
dev_err(dev, dev_err(dev,
"%s: ERROR: failed mapping tse control port\n", "%s: ERROR: failed mapping tse control port\n",
__func__); __func__);
return -EINVAL; ret = -EINVAL;
goto err_node_put;
} }
dwmac->pcs.tse_pcs_base = dwmac->pcs.tse_pcs_base =
devm_ioremap_resource(dev, &res_tse_pcs); devm_ioremap_resource(dev, &res_tse_pcs);
if (IS_ERR(dwmac->pcs.tse_pcs_base)) if (IS_ERR(dwmac->pcs.tse_pcs_base)) {
return PTR_ERR(dwmac->pcs.tse_pcs_base); ret = PTR_ERR(dwmac->pcs.tse_pcs_base);
goto err_node_put;
}
} }
} }
dwmac->reg_offset = reg_offset; dwmac->reg_offset = reg_offset;
dwmac->reg_shift = reg_shift; dwmac->reg_shift = reg_shift;
dwmac->sys_mgr_base_addr = sys_mgr_base_addr; dwmac->sys_mgr_base_addr = sys_mgr_base_addr;
dwmac->dev = dev; dwmac->dev = dev;
of_node_put(np_sgmii_adapter);
return 0; return 0;
err_node_put:
of_node_put(np_sgmii_adapter);
return ret;
} }
static int socfpga_dwmac_set_phy_mode(struct socfpga_dwmac *dwmac) static int socfpga_dwmac_set_phy_mode(struct socfpga_dwmac *dwmac)
......
...@@ -3397,6 +3397,7 @@ int stmmac_dvr_remove(struct device *dev) ...@@ -3397,6 +3397,7 @@ int stmmac_dvr_remove(struct device *dev)
stmmac_set_mac(priv->ioaddr, false); stmmac_set_mac(priv->ioaddr, false);
netif_carrier_off(ndev); netif_carrier_off(ndev);
unregister_netdev(ndev); unregister_netdev(ndev);
of_node_put(priv->plat->phy_node);
if (priv->stmmac_rst) if (priv->stmmac_rst)
reset_control_assert(priv->stmmac_rst); reset_control_assert(priv->stmmac_rst);
clk_disable_unprepare(priv->pclk); clk_disable_unprepare(priv->pclk);
......
...@@ -113,8 +113,10 @@ static struct stmmac_axi *stmmac_axi_setup(struct platform_device *pdev) ...@@ -113,8 +113,10 @@ static struct stmmac_axi *stmmac_axi_setup(struct platform_device *pdev)
return NULL; return NULL;
axi = kzalloc(sizeof(*axi), GFP_KERNEL); axi = kzalloc(sizeof(*axi), GFP_KERNEL);
if (!axi) if (!axi) {
of_node_put(np);
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
}
axi->axi_lpi_en = of_property_read_bool(np, "snps,lpi_en"); axi->axi_lpi_en = of_property_read_bool(np, "snps,lpi_en");
axi->axi_xit_frm = of_property_read_bool(np, "snps,xit_frm"); axi->axi_xit_frm = of_property_read_bool(np, "snps,xit_frm");
...@@ -127,6 +129,7 @@ static struct stmmac_axi *stmmac_axi_setup(struct platform_device *pdev) ...@@ -127,6 +129,7 @@ static struct stmmac_axi *stmmac_axi_setup(struct platform_device *pdev)
of_property_read_u32(np, "snps,wr_osr_lmt", &axi->axi_wr_osr_lmt); of_property_read_u32(np, "snps,wr_osr_lmt", &axi->axi_wr_osr_lmt);
of_property_read_u32(np, "snps,rd_osr_lmt", &axi->axi_rd_osr_lmt); of_property_read_u32(np, "snps,rd_osr_lmt", &axi->axi_rd_osr_lmt);
of_property_read_u32_array(np, "snps,blen", axi->axi_blen, AXI_BLEN); of_property_read_u32_array(np, "snps,blen", axi->axi_blen, AXI_BLEN);
of_node_put(np);
return axi; return axi;
} }
...@@ -302,7 +305,7 @@ stmmac_probe_config_dt(struct platform_device *pdev, const char **mac) ...@@ -302,7 +305,7 @@ stmmac_probe_config_dt(struct platform_device *pdev, const char **mac)
dma_cfg = devm_kzalloc(&pdev->dev, sizeof(*dma_cfg), dma_cfg = devm_kzalloc(&pdev->dev, sizeof(*dma_cfg),
GFP_KERNEL); GFP_KERNEL);
if (!dma_cfg) { if (!dma_cfg) {
of_node_put(np); of_node_put(plat->phy_node);
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
} }
plat->dma_cfg = dma_cfg; plat->dma_cfg = dma_cfg;
......
...@@ -1964,6 +1964,7 @@ static int davinci_emac_remove(struct platform_device *pdev) ...@@ -1964,6 +1964,7 @@ static int davinci_emac_remove(struct platform_device *pdev)
cpdma_ctlr_destroy(priv->dma); cpdma_ctlr_destroy(priv->dma);
unregister_netdev(ndev); unregister_netdev(ndev);
of_node_put(priv->phy_node);
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
free_netdev(ndev); free_netdev(ndev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment