summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--target/linux/ar71xx/files/arch/mips/ar71xx/devices.c8
-rw-r--r--target/linux/ar71xx/files/arch/mips/include/asm/mach-ar71xx/platform.h1
-rw-r--r--target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx.h7
-rw-r--r--target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_mdio.c18
4 files changed, 23 insertions, 11 deletions
diff --git a/target/linux/ar71xx/files/arch/mips/ar71xx/devices.c b/target/linux/ar71xx/files/arch/mips/ar71xx/devices.c
index 7c08bc997..d55022f88 100644
--- a/target/linux/ar71xx/files/arch/mips/ar71xx/devices.c
+++ b/target/linux/ar71xx/files/arch/mips/ar71xx/devices.c
@@ -186,9 +186,7 @@ static struct resource ar71xx_mdio_resources[] = {
}
};
-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",
@@ -202,7 +200,11 @@ static struct platform_device ar71xx_mdio_device = {
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);
}
diff --git a/target/linux/ar71xx/files/arch/mips/include/asm/mach-ar71xx/platform.h b/target/linux/ar71xx/files/arch/mips/include/asm/mach-ar71xx/platform.h
index c305a821d..52f41f47a 100644
--- a/target/linux/ar71xx/files/arch/mips/include/asm/mach-ar71xx/platform.h
+++ b/target/linux/ar71xx/files/arch/mips/include/asm/mach-ar71xx/platform.h
@@ -37,6 +37,7 @@ struct ag71xx_platform_data {
struct ag71xx_mdio_platform_data {
u32 phy_mask;
+ int is_ar7240;
};
struct ar71xx_ehci_platform_data {
diff --git a/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx.h b/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx.h
index f4ae0eb17..77962fec8 100644
--- a/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx.h
+++ b/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx.h
@@ -103,9 +103,10 @@ struct ag71xx_ring {
};
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 {
diff --git a/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_mdio.c b/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_mdio.c
index d3cbacedb..b6fccbbcd 100644
--- a/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_mdio.c
+++ b/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_mdio.c
@@ -106,7 +106,10 @@ static int ag71xx_mdio_reset(struct mii_bus *bus)
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);
@@ -143,12 +146,20 @@ static int __init ag71xx_mdio_probe(struct platform_device *pdev)
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");
@@ -177,10 +188,7 @@ static int __init ag71xx_mdio_probe(struct platform_device *pdev)
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;