#include <linux/of_platform.h>
 #include <linux/of_mdio.h>
 
+#include <linux/platform_data/mdio-bcm-unimac.h>
+
 #define MDIO_CMD               0x00
 #define  MDIO_START_BUSY       (1 << 29)
 #define  MDIO_READ_FAIL                (1 << 28)
 struct unimac_mdio_priv {
        struct mii_bus          *mii_bus;
        void __iomem            *base;
+       int (*wait_func)        (void *wait_func_data);
+       void                    *wait_func_data;
 };
 
 static inline void unimac_mdio_start(struct unimac_mdio_priv *priv)
        return __raw_readl(priv->base + MDIO_CMD) & MDIO_START_BUSY;
 }
 
-static int unimac_mdio_poll(struct unimac_mdio_priv *priv)
+static int unimac_mdio_poll(void *wait_func_data)
 {
+       struct unimac_mdio_priv *priv = wait_func_data;
        unsigned int timeout = 1000;
 
        do {
 static int unimac_mdio_read(struct mii_bus *bus, int phy_id, int reg)
 {
        struct unimac_mdio_priv *priv = bus->priv;
+       int ret;
        u32 cmd;
 
        /* Prepare the read operation */
        /* Start MDIO transaction */
        unimac_mdio_start(priv);
 
-       ret = unimac_mdio_poll(priv);
+       ret = priv->wait_func(priv->wait_func_data);
        if (ret)
                return ret;
 
 
        unimac_mdio_start(priv);
 
-       return unimac_mdio_poll(priv);
+       return priv->wait_func(priv->wait_func_data);
 }
 
 /* Workaround for integrated BCM7xxx Gigabit PHYs which have a problem with
 
 static int unimac_mdio_probe(struct platform_device *pdev)
 {
+       struct unimac_mdio_pdata *pdata = pdev->dev.platform_data;
        struct unimac_mdio_priv *priv;
        struct device_node *np;
        struct mii_bus *bus;
 
        bus = priv->mii_bus;
        bus->priv = priv;
-       bus->name = "unimac MII bus";
+       if (pdata) {
+               bus->name = pdata->bus_name;
+               priv->wait_func = pdata->wait_func;
+               priv->wait_func_data = pdata->wait_func_data;
+               bus->phy_mask = ~pdata->phy_mask;
+       } else {
+               bus->name = "unimac MII bus";
+               priv->wait_func_data = priv;
+               priv->wait_func = unimac_mdio_poll;
+       }
        bus->parent = &pdev->dev;
        bus->read = unimac_mdio_read;
        bus->write = unimac_mdio_write;
 
 static struct platform_driver unimac_mdio_driver = {
        .driver = {
-               .name = "unimac-mdio",
+               .name = UNIMAC_MDIO_DRV_NAME,
                .of_match_table = unimac_mdio_ids,
        },
        .probe  = unimac_mdio_probe,
 MODULE_AUTHOR("Broadcom Corporation");
 MODULE_DESCRIPTION("Broadcom UniMAC MDIO bus controller");
 MODULE_LICENSE("GPL");
-MODULE_ALIAS("platform:unimac-mdio");
+MODULE_ALIAS("platform:" UNIMAC_MDIO_DRV_NAME);