}
};
-static struct ag71xx_mdio_platform_data ar71xx_mdio_data = {
- .phy_mask = 0xffffffff,
-};
+static struct ag71xx_mdio_platform_data ar71xx_mdio_data;
static struct platform_device ar71xx_mdio_device = {
.name = "ag71xx-mdio",
void __init ar71xx_add_device_mdio(u32 phy_mask)
{
+ if (ar71xx_soc == AR71XX_SOC_AR7240)
+ ar71xx_mdio_data.is_ar7240 = 1;
+
ar71xx_mdio_data.phy_mask = phy_mask;
+
platform_device_register(&ar71xx_mdio_device);
}
};
struct ag71xx_mdio {
- struct mii_bus *mii_bus;
- int mii_irq[PHY_MAX_ADDR];
- void __iomem *mdio_base;
+ struct mii_bus *mii_bus;
+ int mii_irq[PHY_MAX_ADDR];
+ void __iomem *mdio_base;
+ struct ag71xx_mdio_platform_data *pdata;
};
struct ag71xx {
struct ag71xx_mdio *am = bus->priv;
u32 t;
- t = MII_CFG_CLK_DIV_28;
+ if (am->pdata->is_ar7240)
+ t = MII_CFG_CLK_DIV_6;
+ else
+ t = MII_CFG_CLK_DIV_28;
ag71xx_mdio_wr(am, AG71XX_REG_MII_CFG, t | MII_CFG_RESET);
udelay(100);
if (ag71xx_mdio_bus)
return -EBUSY;
+ pdata = pdev->dev.platform_data;
+ if (!pdata) {
+ dev_err(&pdev->dev, "no platform data specified\n");
+ return -EINVAL;
+ }
+
am = kzalloc(sizeof(*am), GFP_KERNEL);
if (!am) {
err = -ENOMEM;
goto err_out;
}
+ am->pdata = pdata;
+
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res) {
dev_err(&pdev->dev, "no iomem resource found\n");
am->mii_bus->priv = am;
am->mii_bus->parent = &pdev->dev;
snprintf(am->mii_bus->id, MII_BUS_ID_SIZE, "%x", 0);
-
- pdata = pdev->dev.platform_data;
- if (pdata)
- am->mii_bus->phy_mask = pdata->phy_mask;
+ am->mii_bus->phy_mask = pdata->phy_mask;
for (i = 0; i < PHY_MAX_ADDR; i++)
am->mii_irq[i] = PHY_POLL;