ar71xx: use soc specific divider for mdio clock

SVN-Revision: 18225
owl
Gabor Juhos 2009-10-30 12:26:22 +00:00
parent f336f8748c
commit 21fc9ffe63
4 changed files with 23 additions and 11 deletions

View File

@ -186,9 +186,7 @@ static struct resource ar71xx_mdio_resources[] = {
} }
}; };
static struct ag71xx_mdio_platform_data ar71xx_mdio_data = { static struct ag71xx_mdio_platform_data ar71xx_mdio_data;
.phy_mask = 0xffffffff,
};
static struct platform_device ar71xx_mdio_device = { static struct platform_device ar71xx_mdio_device = {
.name = "ag71xx-mdio", .name = "ag71xx-mdio",
@ -202,7 +200,11 @@ static struct platform_device ar71xx_mdio_device = {
void __init ar71xx_add_device_mdio(u32 phy_mask) 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; ar71xx_mdio_data.phy_mask = phy_mask;
platform_device_register(&ar71xx_mdio_device); platform_device_register(&ar71xx_mdio_device);
} }

View File

@ -37,6 +37,7 @@ struct ag71xx_platform_data {
struct ag71xx_mdio_platform_data { struct ag71xx_mdio_platform_data {
u32 phy_mask; u32 phy_mask;
int is_ar7240;
}; };
struct ar71xx_ehci_platform_data { struct ar71xx_ehci_platform_data {

View File

@ -106,6 +106,7 @@ struct ag71xx_mdio {
struct mii_bus *mii_bus; struct mii_bus *mii_bus;
int mii_irq[PHY_MAX_ADDR]; int mii_irq[PHY_MAX_ADDR];
void __iomem *mdio_base; void __iomem *mdio_base;
struct ag71xx_mdio_platform_data *pdata;
}; };
struct ag71xx { struct ag71xx {

View File

@ -106,6 +106,9 @@ static int ag71xx_mdio_reset(struct mii_bus *bus)
struct ag71xx_mdio *am = bus->priv; struct ag71xx_mdio *am = bus->priv;
u32 t; u32 t;
if (am->pdata->is_ar7240)
t = MII_CFG_CLK_DIV_6;
else
t = MII_CFG_CLK_DIV_28; t = MII_CFG_CLK_DIV_28;
ag71xx_mdio_wr(am, AG71XX_REG_MII_CFG, t | MII_CFG_RESET); ag71xx_mdio_wr(am, AG71XX_REG_MII_CFG, t | MII_CFG_RESET);
@ -143,12 +146,20 @@ static int __init ag71xx_mdio_probe(struct platform_device *pdev)
if (ag71xx_mdio_bus) if (ag71xx_mdio_bus)
return -EBUSY; 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); am = kzalloc(sizeof(*am), GFP_KERNEL);
if (!am) { if (!am) {
err = -ENOMEM; err = -ENOMEM;
goto err_out; goto err_out;
} }
am->pdata = pdata;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res) { if (!res) {
dev_err(&pdev->dev, "no iomem resource found\n"); dev_err(&pdev->dev, "no iomem resource found\n");
@ -177,9 +188,6 @@ static int __init ag71xx_mdio_probe(struct platform_device *pdev)
am->mii_bus->priv = am; am->mii_bus->priv = am;
am->mii_bus->parent = &pdev->dev; am->mii_bus->parent = &pdev->dev;
snprintf(am->mii_bus->id, MII_BUS_ID_SIZE, "%x", 0); 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++) for (i = 0; i < PHY_MAX_ADDR; i++)