|
@@ -21,6 +21,8 @@
|
|
|
#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)
|
|
@@ -41,6 +43,8 @@
|
|
|
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)
|
|
@@ -57,8 +61,9 @@ static inline unsigned int unimac_mdio_busy(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 {
|
|
@@ -77,6 +82,7 @@ static int unimac_mdio_poll(struct unimac_mdio_priv *priv)
|
|
|
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 */
|
|
@@ -86,7 +92,7 @@ static int unimac_mdio_read(struct mii_bus *bus, int phy_id, int reg)
|
|
|
/* Start MDIO transaction */
|
|
|
unimac_mdio_start(priv);
|
|
|
|
|
|
- ret = unimac_mdio_poll(priv);
|
|
|
+ ret = priv->wait_func(priv->wait_func_data);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
@@ -116,7 +122,7 @@ static int unimac_mdio_write(struct mii_bus *bus, int phy_id,
|
|
|
|
|
|
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
|
|
@@ -165,6 +171,7 @@ static int unimac_mdio_reset(struct mii_bus *bus)
|
|
|
|
|
|
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;
|
|
@@ -194,7 +201,16 @@ static int unimac_mdio_probe(struct platform_device *pdev)
|
|
|
|
|
|
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;
|
|
@@ -241,7 +257,7 @@ MODULE_DEVICE_TABLE(of, unimac_mdio_ids);
|
|
|
|
|
|
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,
|
|
@@ -252,4 +268,4 @@ module_platform_driver(unimac_mdio_driver);
|
|
|
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);
|