return -ENODEV;
        }
 
-       bus = mdiobus_alloc_size(sizeof(struct orion_mdio_dev));
-       if (!bus) {
-               dev_err(&pdev->dev, "Cannot allocate MDIO bus\n");
+       bus = devm_mdiobus_alloc_size(&pdev->dev,
+                                     sizeof(struct orion_mdio_dev));
+       if (!bus)
                return -ENOMEM;
-       }
 
        bus->name = "orion_mdio_bus";
        bus->read = orion_mdio_read;
                 dev_name(&pdev->dev));
        bus->parent = &pdev->dev;
 
-       bus->irq = kmalloc(sizeof(int) * PHY_MAX_ADDR, GFP_KERNEL);
-       if (!bus->irq) {
-               mdiobus_free(bus);
+       bus->irq = devm_kmalloc_array(&pdev->dev, PHY_MAX_ADDR, sizeof(int),
+                                     GFP_KERNEL);
+       if (!bus->irq)
                return -ENOMEM;
-       }
 
        for (i = 0; i < PHY_MAX_ADDR; i++)
                bus->irq[i] = PHY_POLL;
 out_mdio:
        if (!IS_ERR(dev->clk))
                clk_disable_unprepare(dev->clk);
-       kfree(bus->irq);
-       mdiobus_free(bus);
        return ret;
 }
 
 
        writel(0, dev->regs + MVMDIO_ERR_INT_MASK);
        mdiobus_unregister(bus);
-       kfree(bus->irq);
-       mdiobus_free(bus);
        if (!IS_ERR(dev->clk))
                clk_disable_unprepare(dev->clk);