diff options
| author | juhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2009-10-30 12:26:22 +0000 | 
|---|---|---|
| committer | juhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2009-10-30 12:26:22 +0000 | 
| commit | 0724c81c225516ac88aeb5cd6b837b1fddca7bb1 (patch) | |
| tree | 47098902642e409cdda14f08dfd6485238f6288b | |
| parent | 5be08769f35ba9a5c170eb7a1139f7778a2549a1 (diff) | |
ar71xx: use soc specific divider for mdio clock
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@18225 3c298f89-4303-0410-b956-a3cf2f4a3e73
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; | 
