[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <1359473048-26551-5-git-send-email-florian@openwrt.org>
Date: Tue, 29 Jan 2013 16:24:07 +0100
From: Florian Fainelli <florian@...nwrt.org>
To: davem@...emloft.net
Cc: Grant Likely <grant.likely@...retlab.ca>,
Rob Herring <rob.herring@...xeda.com>,
Rob Landley <rob@...dley.net>,
Jason Cooper <jason@...edaemon.net>,
Andrew Lunn <andrew@...n.ch>,
Russell King <linux@....linux.org.uk>,
Benjamin Herrenschmidt <benh@...nel.crashing.org>,
Paul Mackerras <paulus@...ba.org>,
Lennert Buytenhek <buytenh@...tstofly.org>,
Florian Fainelli <florian@...nwrt.org>,
Thomas Petazzoni <thomas.petazzoni@...e-electrons.com>,
Greg Kroah-Hartman <gregkh@...uxfoundation.org>,
devicetree-discuss@...ts.ozlabs.org, linux-doc@...r.kernel.org,
linux-kernel@...r.kernel.org, linux-arm-kernel@...ts.infradead.org,
linuxppc-dev@...ts.ozlabs.org, netdev@...r.kernel.org
Subject: [PATCH 4/5] net: mvmdio: allow Device Tree and platform device to coexist
This patch changes the Marvell MDIO driver to be registered by using
both Device Tree and platform device methods. The driver voluntarily
does not use devm_ioremap() to share the same error path for Device Tree
and non-Device Tree cases.
Signed-off-by: Florian Fainelli <florian@...nwrt.org>
---
drivers/net/ethernet/marvell/mvmdio.c | 46 +++++++++++++++++++++++----------
1 file changed, 33 insertions(+), 13 deletions(-)
diff --git a/drivers/net/ethernet/marvell/mvmdio.c b/drivers/net/ethernet/marvell/mvmdio.c
index cada794..10c593c 100644
--- a/drivers/net/ethernet/marvell/mvmdio.c
+++ b/drivers/net/ethernet/marvell/mvmdio.c
@@ -190,6 +190,7 @@ static irqreturn_t orion_mdio_err_irq(int irq, void *dev_id)
static int orion_mdio_probe(struct platform_device *pdev)
{
struct device_node *np = pdev->dev.of_node;
+ struct resource *r = NULL;
struct mii_bus *bus;
struct orion_mdio_dev *dev;
int i, ret;
@@ -219,18 +220,31 @@ static int orion_mdio_probe(struct platform_device *pdev)
bus->irq[i] = PHY_POLL;
dev = bus->priv;
- dev->regs = of_iomap(pdev->dev.of_node, 0);
- if (!dev->regs) {
- dev_err(&pdev->dev, "No SMI register address given in DT\n");
- kfree(bus->irq);
- mdiobus_free(bus);
- return -ENODEV;
- }
-
dev->err_interrupt = NO_IRQ;
init_waitqueue_head(&dev->smi_busy_wait);
- dev->err_interrupt = irq_of_parse_and_map(pdev->dev.of_node, 0);
+ if (pdev->dev.of_node) {
+ dev->regs = of_iomap(pdev->dev.of_node, 0);
+ if (!dev->regs) {
+ dev_err(&pdev->dev, "No SMI register address given in DT\n");
+ ret = -ENODEV;
+ goto out_free;
+ }
+
+ dev->err_interrupt = irq_of_parse_and_map(pdev->dev.of_node, 0);
+ } else {
+ r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+
+ dev->regs = ioremap(r->start, resource_size(r));
+ if (!dev->regs) {
+ dev_err(&pdev->dev, "No SMI register address given\n");
+ ret = -ENODEV;
+ goto out_free;
+ }
+
+ dev->err_interrupt = platform_get_irq(pdev, 0);
+ }
+
if (dev->err_interrupt != NO_IRQ) {
ret = devm_request_irq(&pdev->dev, dev->err_interrupt,
orion_mdio_err_irq,
@@ -242,18 +256,24 @@ static int orion_mdio_probe(struct platform_device *pdev)
mutex_init(&dev->lock);
- ret = of_mdiobus_register(bus, np);
+ if (np)
+ ret = of_mdiobus_register(bus, np);
+ else
+ ret = mdiobus_register(bus);
if (ret < 0) {
dev_err(&pdev->dev, "Cannot register MDIO bus (%d)\n", ret);
iounmap(dev->regs);
- kfree(bus->irq);
- mdiobus_free(bus);
- return ret;
+ goto out_free;
}
platform_set_drvdata(pdev, bus);
return 0;
+
+out_free:
+ kfree(bus->irq);
+ mdiobus_free(bus);
+ return ret;
}
static int orion_mdio_remove(struct platform_device *pdev)
--
1.7.10.4
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists