make openwrt boot on ar9130 (currently no ethernet yet)
[openwrt-10.03/.git] / target / linux / ar71xx / files / arch / mips / ar71xx / setup.c
index 31185527f902cf048d24d98260c7c690b501cb5d..00c5cf7cf09d318bc2e084154f46641dc204ee54 100644 (file)
@@ -30,6 +30,7 @@
 
 #define AR71XX_SYS_TYPE_LEN    64
 #define AR71XX_BASE_FREQ       40000000
+#define AR91XX_BASE_FREQ       5000000
 
 #define AR71XX_MEM_SIZE_MIN    0x0200000
 #define AR71XX_MEM_SIZE_MAX    0x8000000
@@ -128,6 +129,9 @@ static void __init ar71xx_detect_sys_type(void)
        case REV_ID_CHIP_AR7161:
                chip = "7161";
                break;
+       case REV_ID_CHIP_AR9130:
+               chip = "9130";
+               break;
        default:
                chip = "71xx";
        }
@@ -136,24 +140,49 @@ static void __init ar71xx_detect_sys_type(void)
                chip, rev, id);
 }
 
+static void __init ar91xx_detect_sys_frequency(void)
+{
+       u32 pll;
+       u32 freq;
+       u32 div;
+
+       pll = ar71xx_pll_rr(PLL_REG_CPU_PLL_CFG);
+
+       div = ((pll >> AR91XX_PLL_DIV_SHIFT) & AR91XX_PLL_DIV_MASK);
+       freq = div * AR91XX_BASE_FREQ;
+
+       ar71xx_cpu_freq = freq;
+
+       div = ((pll >> AR91XX_DDR_DIV_SHIFT) & AR91XX_DDR_DIV_MASK) + 1;
+       ar71xx_ddr_freq = freq / div;
+
+       div = (((pll >> AR91XX_AHB_DIV_SHIFT) & AR91XX_AHB_DIV_MASK) + 1) * 2;
+       ar71xx_ahb_freq = ar71xx_cpu_freq / div;
+}
+
 static void __init ar71xx_detect_sys_frequency(void)
 {
        u32 pll;
        u32 freq;
        u32 div;
 
+       if ((ar71xx_reset_rr(RESET_REG_REV_ID) & REV_ID_MASK) >=
+                       REV_ID_CHIP_AR9130) {
+               return ar91xx_detect_sys_frequency();
+       }
+
        pll = ar71xx_pll_rr(PLL_REG_CPU_PLL_CFG);
 
-       div = ((pll >> PLL_DIV_SHIFT) & PLL_DIV_MASK) + 1;
+       div = ((pll >> AR71XX_PLL_DIV_SHIFT) & AR71XX_PLL_DIV_MASK) + 1;
        freq = div * AR71XX_BASE_FREQ;
 
-       div = ((pll >> CPU_DIV_SHIFT) & CPU_DIV_MASK) + 1;
+       div = ((pll >> AR71XX_CPU_DIV_SHIFT) & AR71XX_CPU_DIV_MASK) + 1;
        ar71xx_cpu_freq = freq / div;
 
-       div = ((pll >> DDR_DIV_SHIFT) & DDR_DIV_MASK) + 1;
+       div = ((pll >> AR71XX_DDR_DIV_SHIFT) & AR71XX_DDR_DIV_MASK) + 1;
        ar71xx_ddr_freq = freq / div;
 
-       div = (((pll >> AHB_DIV_SHIFT) & AHB_DIV_MASK) + 1) * 2;
+       div = (((pll >> AR71XX_AHB_DIV_SHIFT) & AR71XX_AHB_DIV_MASK) + 1) * 2;
        ar71xx_ahb_freq = ar71xx_cpu_freq / div;
 }