Skip to content

Commit

Permalink
drivers: net: ethernet: davince_mdio: device tree implementation
Browse files Browse the repository at this point in the history
device tree implementation for davinci mdio driver

Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Mugunthan V N authored and David S. Miller committed Aug 7, 2012
1 parent aae06bf commit ec03e6a
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 4 deletions.
33 changes: 33 additions & 0 deletions Documentation/devicetree/bindings/net/davinci-mdio.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
TI SoC Davinci MDIO Controller Device Tree Bindings
---------------------------------------------------

Required properties:
- compatible : Should be "ti,davinci_mdio"
- reg : physical base address and size of the davinci mdio
registers map
- bus_freq : Mdio Bus frequency

Optional properties:
- ti,hwmods : Must be "davinci_mdio"

Note: "ti,hwmods" field is used to fetch the base address and irq
resources from TI, omap hwmod data base during device registration.
Future plan is to migrate hwmod data base contents into device tree
blob so that, all the required data will be used from device tree dts
file.

Examples:

mdio: davinci_mdio@4A101000 {
compatible = "ti,cpsw";
reg = <0x4A101000 0x1000>;
bus_freq = <1000000>;
};

(or)

mdio: davinci_mdio@4A101000 {
compatible = "ti,cpsw";
ti,hwmods = "davinci_mdio";
bus_freq = <1000000>;
};
41 changes: 37 additions & 4 deletions drivers/net/ethernet/ti/davinci_mdio.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@
#include <linux/io.h>
#include <linux/pm_runtime.h>
#include <linux/davinci_emac.h>
#include <linux/of.h>
#include <linux/of_device.h>

/*
* This timeout definition is a worst-case ultra defensive measure against
Expand Down Expand Up @@ -289,6 +291,25 @@ static int davinci_mdio_write(struct mii_bus *bus, int phy_id,
return 0;
}

static int davinci_mdio_probe_dt(struct mdio_platform_data *data,
struct platform_device *pdev)
{
struct device_node *node = pdev->dev.of_node;
u32 prop;

if (!node)
return -EINVAL;

if (of_property_read_u32(node, "bus_freq", &prop)) {
pr_err("Missing bus_freq property in the DT.\n");
return -EINVAL;
}
data->bus_freq = prop;

return 0;
}


static int __devinit davinci_mdio_probe(struct platform_device *pdev)
{
struct mdio_platform_data *pdata = pdev->dev.platform_data;
Expand All @@ -304,23 +325,29 @@ static int __devinit davinci_mdio_probe(struct platform_device *pdev)
return -ENOMEM;
}

data->pdata = pdata ? (*pdata) : default_pdata;

data->bus = mdiobus_alloc();
if (!data->bus) {
dev_err(dev, "failed to alloc mii bus\n");
ret = -ENOMEM;
goto bail_out;
}

if (dev->of_node) {
if (davinci_mdio_probe_dt(&data->pdata, pdev))
data->pdata = default_pdata;
snprintf(data->bus->id, MII_BUS_ID_SIZE, "%s", pdev->name);
} else {
data->pdata = pdata ? (*pdata) : default_pdata;
snprintf(data->bus->id, MII_BUS_ID_SIZE, "%s-%x",
pdev->name, pdev->id);
}

data->bus->name = dev_name(dev);
data->bus->read = davinci_mdio_read,
data->bus->write = davinci_mdio_write,
data->bus->reset = davinci_mdio_reset,
data->bus->parent = dev;
data->bus->priv = data;
snprintf(data->bus->id, MII_BUS_ID_SIZE, "%s-%x",
pdev->name, pdev->id);

pm_runtime_enable(&pdev->dev);
pm_runtime_get_sync(&pdev->dev);
Expand Down Expand Up @@ -454,11 +481,17 @@ static const struct dev_pm_ops davinci_mdio_pm_ops = {
.resume = davinci_mdio_resume,
};

static const struct of_device_id davinci_mdio_of_mtable[] = {
{ .compatible = "ti,davinci_mdio", },
{ /* sentinel */ },
};

static struct platform_driver davinci_mdio_driver = {
.driver = {
.name = "davinci_mdio",
.owner = THIS_MODULE,
.pm = &davinci_mdio_pm_ops,
.of_match_table = of_match_ptr(davinci_mdio_of_mtable),
},
.probe = davinci_mdio_probe,
.remove = __devexit_p(davinci_mdio_remove),
Expand Down

0 comments on commit ec03e6a

Please sign in to comment.