ar71xx: use soc specific divider for mdio clock
authorGabor Juhos <juhosg@openwrt.org>
Fri, 30 Oct 2009 12:26:22 +0000 (12:26 +0000)
committerGabor Juhos <juhosg@openwrt.org>
Fri, 30 Oct 2009 12:26:22 +0000 (12:26 +0000)
SVN-Revision: 18225

target/linux/ar71xx/files/arch/mips/ar71xx/devices.c
target/linux/ar71xx/files/arch/mips/include/asm/mach-ar71xx/platform.h
target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx.h
target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_mdio.c

index 7c08bc997fb2d77b382e78c32634fae13ae4be1d..d55022f88a58c07b79912010c7c447a1968a56e8 100644 (file)
@@ -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);
 }
 
index c305a821d0c8bf09852c1d288c1a1f88780cbd20..52f41f47adecae3aa4a0c4acd2523892e46150cb 100644 (file)
@@ -37,6 +37,7 @@ struct ag71xx_platform_data {
 
 struct ag71xx_mdio_platform_data {
        u32             phy_mask;
+       int             is_ar7240;
 };
 
 struct ar71xx_ehci_platform_data {
index f4ae0eb1788828d0ed31625e79730dc14cf83e7d..77962fec80632c50306800863584ac292491fe92 100644 (file)
@@ -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 {
index d3cbacedb26596c96a81b0f649fb7018b7d3ab9e..b6fccbbcd681f46f138031d04305a514edca35db 100644 (file)
@@ -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;