aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bmips
diff options
context:
space:
mode:
authorÁlvaro Fernández Rojas <noltari@gmail.com>2023-03-28 19:36:59 +0200
committerÁlvaro Fernández Rojas <noltari@gmail.com>2023-03-28 19:36:59 +0200
commit414ca706849d19294ac1e90b370dcb822704757e (patch)
treee8b32b2efb15351d0e674e01f5fa23f42d810558 /target/linux/bmips
parent4d99f0ce4d01b31a3f67bc21e282f2a02c41422f (diff)
downloadupstream-414ca706849d19294ac1e90b370dcb822704757e.tar.gz
upstream-414ca706849d19294ac1e90b370dcb822704757e.tar.bz2
upstream-414ca706849d19294ac1e90b370dcb822704757e.zip
bmips: bcm6368-enetsw: refactor probe
- Switch to devm functions where possible. - Fix probing when no resets provided. - Properly check pointers (IS_ERR_OR_NULL/PTR_ERR). - Add probe info. Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
Diffstat (limited to 'target/linux/bmips')
-rw-r--r--target/linux/bmips/files/drivers/net/ethernet/broadcom/bcm6368-enetsw.c52
1 files changed, 29 insertions, 23 deletions
diff --git a/target/linux/bmips/files/drivers/net/ethernet/broadcom/bcm6368-enetsw.c b/target/linux/bmips/files/drivers/net/ethernet/broadcom/bcm6368-enetsw.c
index 0a94098231..124baee9b4 100644
--- a/target/linux/bmips/files/drivers/net/ethernet/broadcom/bcm6368-enetsw.c
+++ b/target/linux/bmips/files/drivers/net/ethernet/broadcom/bcm6368-enetsw.c
@@ -903,19 +903,25 @@ static const struct net_device_ops bcm6368_enetsw_ops = {
static int bcm6368_enetsw_probe(struct platform_device *pdev)
{
- struct bcm6368_enetsw *priv;
struct device *dev = &pdev->dev;
struct device_node *node = dev->of_node;
+ struct bcm6368_enetsw *priv;
struct net_device *ndev;
struct resource *res;
unsigned i;
+ int num_resets;
int ret;
- ndev = alloc_etherdev(sizeof(*priv));
+ ndev = devm_alloc_etherdev(dev, sizeof(*priv));
if (!ndev)
return -ENOMEM;
+ platform_set_drvdata(pdev, ndev);
+ SET_NETDEV_DEV(ndev, dev);
+
priv = netdev_priv(ndev);
+ priv->pdev = pdev;
+ priv->net_dev = ndev;
priv->num_pms = of_count_phandle_with_args(node, "power-domains",
"#power-domain-cells");
@@ -955,18 +961,18 @@ static int bcm6368_enetsw_probe(struct platform_device *pdev)
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dma");
priv->dma_base = devm_ioremap_resource(dev, res);
- if (IS_ERR(priv->dma_base))
+ if (IS_ERR_OR_NULL(priv->dma_base))
return PTR_ERR(priv->dma_base);
res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
"dma-channels");
priv->dma_chan = devm_ioremap_resource(dev, res);
- if (IS_ERR(priv->dma_chan))
+ if (IS_ERR_OR_NULL(priv->dma_chan))
return PTR_ERR(priv->dma_chan);
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dma-sram");
priv->dma_sram = devm_ioremap_resource(dev, res);
- if (IS_ERR(priv->dma_sram))
+ if (IS_ERR_OR_NULL(priv->dma_sram))
return PTR_ERR(priv->dma_sram);
priv->irq_rx = platform_get_irq_byname(pdev, "rx");
@@ -1006,14 +1012,14 @@ static int bcm6368_enetsw_probe(struct platform_device *pdev)
if (priv->num_clocks) {
priv->clock = devm_kcalloc(dev, priv->num_clocks,
sizeof(struct clk *), GFP_KERNEL);
- if (!priv->clock)
- return -ENOMEM;
+ if (IS_ERR_OR_NULL(priv->clock))
+ return PTR_ERR(priv->clock);
}
for (i = 0; i < priv->num_clocks; i++) {
priv->clock[i] = of_clk_get(node, i);
if (IS_ERR(priv->clock[i])) {
dev_err(dev, "error getting clock %d\n", i);
- return -EINVAL;
+ return PTR_ERR(priv->clock[i]);
}
ret = clk_prepare_enable(priv->clock[i]);
@@ -1023,20 +1029,24 @@ static int bcm6368_enetsw_probe(struct platform_device *pdev)
}
}
- priv->num_resets = of_count_phandle_with_args(node, "resets",
- "#reset-cells");
+ num_resets = of_count_phandle_with_args(node, "resets",
+ "#reset-cells");
+ if (num_resets > 0)
+ priv->num_resets = num_resets;
+ else
+ priv->num_resets = 0;
if (priv->num_resets) {
priv->reset = devm_kcalloc(dev, priv->num_resets,
sizeof(struct reset_control *),
GFP_KERNEL);
- if (!priv->reset)
- return -ENOMEM;
+ if (IS_ERR_OR_NULL(priv->reset))
+ return PTR_ERR(priv->reset);
}
for (i = 0; i < priv->num_resets; i++) {
priv->reset[i] = devm_reset_control_get_by_index(dev, i);
if (IS_ERR(priv->reset[i])) {
dev_err(dev, "error getting reset %d\n", i);
- return -EINVAL;
+ return PTR_ERR(priv->reset[i]);
}
ret = reset_control_reset(priv->reset[i]);
@@ -1056,16 +1066,16 @@ static int bcm6368_enetsw_probe(struct platform_device *pdev)
ndev->mtu = ETH_DATA_LEN + ENETSW_TAG_SIZE;
ndev->max_mtu = ETH_DATA_LEN + ENETSW_TAG_SIZE;
netif_napi_add(ndev, &priv->napi, bcm6368_enetsw_poll, 16);
- SET_NETDEV_DEV(ndev, dev);
- ret = register_netdev(ndev);
- if (ret)
+ ret = devm_register_netdev(dev, ndev);
+ if (ret) {
+ netif_napi_del(&priv->napi);
goto out_disable_clk;
+ }
netif_carrier_off(ndev);
- platform_set_drvdata(pdev, ndev);
- priv->pdev = pdev;
- priv->net_dev = ndev;
+
+ dev_info(dev, "%s at 0x%px, IRQ %d\n", ndev->name, priv->dma_base, ndev->irq);
return 0;
@@ -1086,8 +1096,6 @@ static int bcm6368_enetsw_remove(struct platform_device *pdev)
struct bcm6368_enetsw *priv = netdev_priv(ndev);
unsigned int i;
- unregister_netdev(ndev);
-
pm_runtime_put_sync(dev);
for (i = 0; priv->pm && i < priv->num_pms; i++) {
dev_pm_domain_detach(priv->pm[i], true);
@@ -1100,8 +1108,6 @@ static int bcm6368_enetsw_remove(struct platform_device *pdev)
for (i = 0; i < priv->num_clocks; i++)
clk_disable_unprepare(priv->clock[i]);
- free_netdev(ndev);
-
return 0;
}