Browse Source

ar71xx: use soc specific divider for mdio clock

SVN-Revision: 18225
Gabor Juhos 16 years ago
parent
commit
21fc9ffe63

+ 5 - 3
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);
 }
 

+ 1 - 0
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 {

+ 4 - 3
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 {

+ 13 - 5
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;