1
0
mirror of git://projects.qi-hardware.com/openwrt-xburst.git synced 2025-04-21 12:27:27 +03:00

ar71xx: use dynamic clock dividers on the 2nd MDIO of AR934x

git-svn-id: svn://svn.openwrt.org/openwrt/trunk@33343 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
juhosg
2012-09-09 14:05:20 +00:00
parent c4b6e540e4
commit 527f8049cd
2 changed files with 47 additions and 4 deletions

View File

@@ -19,6 +19,7 @@
#include <linux/etherdevice.h>
#include <linux/platform_device.h>
#include <linux/serial_8250.h>
#include <linux/clk.h>
#include <asm/mach-ath79/ath79.h>
#include <asm/mach-ath79/ar71xx_regs.h>
@@ -146,6 +147,31 @@ static void ath79_mii_ctrl_set_speed(unsigned int reg, unsigned int speed)
iounmap(base);
}
static unsigned long ar934x_get_mdio_ref_clock(void)
{
void __iomem *base;
unsigned long ret;
u32 t;
base = ioremap(AR71XX_PLL_BASE, AR71XX_PLL_SIZE);
ret = 0;
t = __raw_readl(base + AR934X_PLL_SWITCH_CLOCK_CONTROL_REG);
if (t & AR934X_PLL_SWITCH_CLOCK_CONTROL_MDIO_CLK_SEL) {
ret = 100 * 1000 * 1000;
} else {
struct clk *clk;
clk = clk_get(NULL, "ref");
if (!IS_ERR(clk))
ret = clk_get_rate(clk);
}
iounmap(base);
return ret;
}
void __init ath79_register_mdio(unsigned int id, u32 phy_mask)
{
struct platform_device *mdio_dev;
@@ -217,6 +243,13 @@ void __init ath79_register_mdio(unsigned int id, u32 phy_mask)
case ATH79_SOC_AR9341:
case ATH79_SOC_AR9342:
case ATH79_SOC_AR9344:
if (id == 1) {
mdio_data->builtin_switch = 1;
mdio_data->ref_clock = ar934x_get_mdio_ref_clock();
mdio_data->mdio_clock = 6250000;
}
mdio_data->is_ar934x = 1;
break;
case ATH79_SOC_QCA9558:
if (id == 1)
mdio_data->builtin_switch = 1;