Changes in defines for AR9331 PLL and clocks registers values
[oweals/u-boot_mod.git] / u-boot / include / configs / ap121.h
index f603621afc1668b89d87ffad7d13c38b6149dc49..b39e6d363c6868169c1b3c77a41361e2bb191fe6 100755 (executable)
@@ -40,7 +40,8 @@
        defined(CONFIG_FOR_TPLINK_MR3040_V1V2) || \
        defined(CONFIG_FOR_TPLINK_MR10U_V1) || \
        defined(CONFIG_FOR_TPLINK_WR740N_V4) || \
-       defined(CONFIG_FOR_TPLINK_MR3220_V2)
+       defined(CONFIG_FOR_TPLINK_MR3220_V2) || \
+       defined(CONFIG_FOR_TPLINK_MR13U_V1)
 
        #define CONFIG_BOOTARGS "console=ttyS0,115200 root=31:02 rootfstype=squashfs init=/sbin/init mtdparts=ar7240-nor0:128k(u-boot),1024k(kernel),2816k(rootfs),64k(config),64k(ART)"
 
 
        #define CONFIG_BOOTARGS "console=ttyS0,115200 root=31:02 rootfstype=squashfs init=/sbin/init mtdparts=ar7240-nor0:128k(u-boot),1024k(kernel),6912k(rootfs),64k(config),64k(ART)"
 
+#elif defined(CONFIG_FOR_DLINK_DIR505_A1)
+
+       #define CONFIG_BOOTARGS "console=ttyS0,115200 root=31:06 rootfstype=squashfs init=/sbin/init mtdparts=ar7240-nor0:64k(u-boot),64k(ART),64k(mac),64k(nvram),256k(language),1024k(uImage),6656k(rootfs)"
+
 #elif defined(CONFIG_FOR_8DEVICES_CARAMBOLA2)
 
        #define CONFIG_BOOTARGS "console=ttyS0,115200 root=31:02 rootfstype=squashfs init=/sbin/init mtdparts=ar7240-nor0:256k(u-boot),64k(u-boot-env),16000k(firmware),64k(ART)"
 #undef CONFIG_LOADADDR
 #define CONFIG_LOADADDR                        0x80800000
 
-#if defined(CONFIG_FOR_8DEVICES_CARAMBOLA2)
+#if defined(CONFIG_FOR_DLINK_DIR505_A1)
+       #define CFG_LOAD_ADDR           0x9F080000
+#elif defined(CONFIG_FOR_8DEVICES_CARAMBOLA2)
        #define CFG_LOAD_ADDR           0x9F050000
 #else
        #define CFG_LOAD_ADDR           0x9F020000
 #endif
 
-#if defined(CONFIG_FOR_8DEVICES_CARAMBOLA2)
+#if defined(CONFIG_FOR_DLINK_DIR505_A1)
+       #define CONFIG_BOOTCOMMAND "bootm 0x9F080000"
+#elif defined(CONFIG_FOR_8DEVICES_CARAMBOLA2)
        #define CONFIG_BOOTCOMMAND "bootm 0x9F050000"
 #else
        #define CONFIG_BOOTCOMMAND "bootm 0x9F020000"
 #define CONFIG_IPADDR          192.168.1.1
 #define CONFIG_SERVERIP                192.168.1.2
 
-#undef CFG_PLL_FREQ
-#undef CFG_HZ
-#undef CPU_PLL_CONFIG_VAL1
-#undef CPU_CLK_CONTROL_VAL2
-
-#if defined(CONFIG_FOR_8DEVICES_CARAMBOLA2)
-       #define CONFIG_40MHZ_XTAL_SUPPORT       1       // Carambola 2 has 40 MHz XTAL, TP-Link routers use 25 MHz
-#endif
+#undef CFG_HZ
+#define        CFG_HZ                          bd->bi_cfg_hz
+#undef CPU_PLL_CONFIG_VAL
+#undef CPU_CLK_CONTROL_VAL
 
 // CPU-RAM-AHB frequency setting
-#define CFG_PLL_FREQ    CFG_PLL_400_400_200
-
-/*
- * MIPS32 24K Processor Core Family Software User's Manual
- *
- * 6.2.9 Count Register (CP0 Register 9, Select 0)
- * The Count register acts as a timer, incrementing at a constant
- * rate, whether or not an instruction is executed, retired, or
- * any forward progress is made through the pipeline.  The counter
- * increments every other clock, if the DC bit in the Cause register
- * is 0.
- *
- * Since the count is incremented every other tick, divide by 2
- * XXX derive this from CFG_PLL_FREQ
- */
-
+#ifndef CFG_PLL_FREQ
+       #define CFG_PLL_FREQ    CFG_PLL_400_400_200
+#endif
 
 /*
  * CPU_PLL_DITHER_FRAC_VAL
  * bits        20..29  NFRAC_STEP      =>      1
  *
  */
-#define CPU_PLL_DITHER_FRAC_VAL                0x001003e8
+#define CPU_PLL_DITHER_FRAC_VAL                0x001003E8
 
 /*
  * CPU_PLL_SETTLE_TIME_VAL
  *
  * Value written into CPU Phase Lock Loop Configuration Register 2 (CPU_PLL_CONFIG2)
  *
- * bits        0..11   SETTLE_TIME     =>      580 (0x352)
+ * bits        0..11   SETTLE_TIME     =>      850 (0x352)
  *
  */
 #if CONFIG_40MHZ_XTAL_SUPPORT
 #endif
 
 /*
- * CPU_CLK_CONTROL_VAL1
- * CPU_CLK_CONTROL_VAL2
+ * CPU_CLK_CONTROL_VAL
+ *
+ * In CPU_CLK_CONTROL_VAL bit 2 is set (BYPASS = 1 -> bypass PLL)
+ * After PLL configuration we nedd to clear this bit
  *
  * Values written into CPU Clock Control Register CLOCK_CONTROL
- * with PLL bypass disabled
  *
  * bits        2               (1bit)  BYPASS (Bypass PLL. This defaults to 1 for test purposes. Software must enable the CPU PLL for normal operation and then set this bit to 0)
  * bits        5..6    (2bit)  CPU_POST_DIV    =>      0       (DEFAULT, Ratio = 1)
  */
 
 /*
- * CPU_PLL_CONFIG_VAL1
- * CPU_PLL_CONFIG_VAL2
+ * CPU_PLL_CONFIG_VAL
  *
- * In CPU_PLL_CONFIG_VAL1 bit 30 is set (CPU_PLLPWD = 1 -> power down control for CPU PLL)
- * In CPU_PLL_CONFIG_VAL2 bit 30 is unset
+ * In CPU_PLL_CONFIG_VAL bit 30 is set (CPU_PLLPWD = 1 -> power down control for CPU PLL)
+ * After PLL configuration we need to clear this bit
  *
  * Values written into CPU Phase Lock Loop Configuration (CPU_PLL_CONFIG)
  *
  * bits 10..15 (6bit)  DIV_INT (The integer part of the DIV to CPU PLL)                        =>      32      (0x20)
- * bits 16..20 (5bit)  REFDIV  (Reference clock divider)                                                       =>      1       (0x1)           [doesn't start at valuse different than 1 (maybe need to change other dividers?)]
- * bits 21             (1bit)  RANGE   (Determine the VCO frequency range of the CPU PLL)      =>      0       (0x0)           [doesn't have impact on clock values]
- * bits 23..25 (3bit)  OUTDIV  (Define the ratio betwee VCO output and PLL output      =>      1       (0x1)
+ * bits 16..20 (5bit)  REFDIV  (Reference clock divider)                                                       =>      1       (0x1)   [doesn't start at values different than 1 (maybe need to change other dividers?)]
+ * bits 21             (1bit)  RANGE   (Determine the VCO frequency range of the CPU PLL)      =>      0       (0x0)   [doesn't have impact on clock values]
+ * bits 23..25 (3bit)  OUTDIV  (Define the ratio between VCO output and PLL output     =>      1       (0x1)   [value == 0 is illegal!]
  *                                                             VCOOUT * (1/2^OUTDIV) = PLLOUT)
  */
 
 /*
- * = PLL CALCULATION (guess) =============
- * PLL = (25 MHz * DIV_INT) / (2 ^ OUTDIV)     // XTAL=25 MHz
+ * = PLL CALCULATION =============
+ * PLL = ((25 MHz / REFDIV) * DIV_INT) / (2 ^ OUTDIV)  // XTAL=25 MHz
  * OR
- * PLL = (40 MHz * DIV_INT) / (2 ^ OUTDIV)     // XTAL=40 MHz
+ * PLL = ((40 MHz / REFDIV) * DIV_INT) / (2 ^ OUTDIV)  // XTAL=40 MHz
  *
  * CPU = PLL / CPU_POST_DIV
  * DDR = PLL / DDR_POST_DIV
  *
  */
 
-#if (CFG_PLL_FREQ == CFG_PLL_400_400_200)
+/*
+ * CPU_PLL_CONFIG and CPU_CLK_CONTROL registers values generator
+ */
+#define MAKE_AR9331_CPU_PLL_CONFIG_VAL(divint, refdiv, range, outdiv)  ( ((0x3F & divint) << 10) | \
+                                                                         ((0x1F & refdiv) << 16) | \
+                                                                         ((0x1 & range)   << 21) | \
+                                                                         ((0x7 & outdiv)  << 23) )
+
+#define MAKE_AR9331_CPU_CLK_CONTROL_VAL(cpudiv, ddrdiv, ahbdiv)        ( ((0x3 & (cpudiv - 1)) << 5)  | \
+                                                                         ((0x3 & (ddrdiv - 1)) << 10) | \
+                                                                         ((0x3 & (ahbdiv - 1)) << 15) )
+
+#define MAKE_AR9331_SPI_CONTROL_VAL(spidiv)                            ( ((spidiv >> 1) - 1) | 0x40 )
+
+/*
+ * Default values (400/400/200 MHz) for O/C recovery mode
+ */
+
+// CPU_DIV = 1, RAM_DIV = 1, AHB_DIV = 2
+#define CPU_CLK_CONTROL_VAL_DEFAULT            MAKE_AR9331_CPU_CLK_CONTROL_VAL(1, 1, 2)
+
+#if CONFIG_40MHZ_XTAL_SUPPORT
+       // DIV_INT = 20 (40 MHz * 20/2 = 400 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 1
+       #define CPU_PLL_CONFIG_VAL_DEFAULT      MAKE_AR9331_CPU_PLL_CONFIG_VAL(20, 1, 0, 1)
+#else
+       // DIV_INT = 32 (25 MHz * 32/2 = 400 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 1
+       #define CPU_PLL_CONFIG_VAL_DEFAULT      MAKE_AR9331_CPU_PLL_CONFIG_VAL(32, 1, 0, 1)
+#endif
+
+// CLOCK_DIVIDER = 2 (SPI clock = 200 / 6 ~ 33 MHz)
+#define AR7240_SPI_CONTROL_DEFAULT     MAKE_AR9331_SPI_CONTROL_VAL(6)
 
-       #define CFG_HZ                                  (400000000LU/2)
+#if (CFG_PLL_FREQ == CFG_PLL_200_200_100)
 
        // CPU_DIV = 1, RAM_DIV = 1, AHB_DIV = 2
-       #define CPU_CLK_CONTROL_VAL1    0x00018004
-       #define CPU_CLK_CONTROL_VAL2    0x00008000
+       #define CPU_CLK_CONTROL_VAL             MAKE_AR9331_CPU_CLK_CONTROL_VAL(1, 1, 2)
 
        #if CONFIG_40MHZ_XTAL_SUPPORT
-               // DIV_INT      = 20    (40 MHz * 20/2 = 400 MHz)
-               // REFDIV       = 1
-               // RANGE        = 0
-               // OUTDIV       = 1
-               #define CPU_PLL_CONFIG_VAL1             0x40815000
-               #define CPU_PLL_CONFIG_VAL2             0x00815000
+               // DIV_INT = 20 (40 MHz * 20/4 = 200 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 2
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(20, 1, 0, 2)
        #else
-               // DIV_INT      = 32    (25 MHz * 32/2 = 400 MHz)
-               // REFDIV       = 1
-               // RANGE        = 0
-               // OUTDIV       = 1
-               #define CPU_PLL_CONFIG_VAL1             0x40818000
-               #define CPU_PLL_CONFIG_VAL2             0x00818000
+               // DIV_INT = 32 (25 MHz * 32/4 = 200 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 2
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(32, 1, 0, 2)
+       #endif
+
+       // CLOCK_DIVIDER = 1 (SPI clock = 100 / 4 ~ 25 MHz)
+       #define AR7240_SPI_CONTROL      MAKE_AR9331_SPI_CONTROL_VAL(4)
+
+       #define CFG_HZ_FALLBACK (200000000LU/2)
+
+#elif (CFG_PLL_FREQ == CFG_PLL_200_200_200)
+
+       // CPU_DIV = 1, RAM_DIV = 1, AHB_DIV = 1
+       #define CPU_CLK_CONTROL_VAL             MAKE_AR9331_CPU_CLK_CONTROL_VAL(1, 1, 1)
+
+       #if CONFIG_40MHZ_XTAL_SUPPORT
+               // DIV_INT = 20 (40 MHz * 20/4 = 200 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 2
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(20, 1, 0, 2)
+       #else
+               // DIV_INT = 32 (25 MHz * 32/4 = 200 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 2
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(32, 1, 0, 2)
        #endif
 
        // CLOCK_DIVIDER = 2 (SPI clock = 200 / 6 ~ 33 MHz)
-       #define AR7240_SPI_CONTROL              0x42
+       #define AR7240_SPI_CONTROL      MAKE_AR9331_SPI_CONTROL_VAL(6)
+
+       #define CFG_HZ_FALLBACK (200000000LU/2)
+
+#elif (CFG_PLL_FREQ == CFG_PLL_225_225_112)
+
+       // CPU_DIV = 1, RAM_DIV = 1, AHB_DIV = 2
+       #define CPU_CLK_CONTROL_VAL             MAKE_AR9331_CPU_CLK_CONTROL_VAL(1, 1, 2)
+
+       #if CONFIG_40MHZ_XTAL_SUPPORT
+               #define FREQUENCY_NOT_SUPPORTED
+       #else
+               // DIV_INT = 36 (25 MHz * 36/4 = 225 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 2
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(36, 1, 0, 2)
+       #endif
+
+       // CLOCK_DIVIDER = 1 (SPI clock = 112 / 4 ~ 28 MHz)
+       #define AR7240_SPI_CONTROL      MAKE_AR9331_SPI_CONTROL_VAL(4)
+
+       #define CFG_HZ_FALLBACK (225000000LU/2)
+
+#elif (CFG_PLL_FREQ == CFG_PLL_225_225_225)
+
+       // CPU_DIV = 1, RAM_DIV = 1, AHB_DIV = 1
+       #define CPU_CLK_CONTROL_VAL             MAKE_AR9331_CPU_CLK_CONTROL_VAL(1, 1, 1)
+
+       #if CONFIG_40MHZ_XTAL_SUPPORT
+               #define FREQUENCY_NOT_SUPPORTED
+       #else
+               // DIV_INT = 36 (25 MHz * 36/4 = 225 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 2
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(36, 1, 0, 2)
+       #endif
+
+       // CLOCK_DIVIDER = 3 (SPI clock = 225 / 8 ~ 28 MHz)
+       #define AR7240_SPI_CONTROL      MAKE_AR9331_SPI_CONTROL_VAL(8)
+
+       #define CFG_HZ_FALLBACK (225000000LU/2)
+
+#elif (CFG_PLL_FREQ == CFG_PLL_250_250_125)
+
+       // CPU_DIV = 1, RAM_DIV = 1, AHB_DIV = 2
+       #define CPU_CLK_CONTROL_VAL             MAKE_AR9331_CPU_CLK_CONTROL_VAL(1, 1, 2)
+
+       #if CONFIG_40MHZ_XTAL_SUPPORT
+               // DIV_INT = 25 (40 MHz * 25/4 = 250 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 2
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(25, 1, 0, 2)
+       #else
+               // DIV_INT = 20 (25 MHz * 20/2 = 250 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 1
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(20, 1, 0, 1)
+       #endif
+
+       // CLOCK_DIVIDER = 1 (SPI clock = 125 / 4 ~ 31 MHz)
+       #define AR7240_SPI_CONTROL      MAKE_AR9331_SPI_CONTROL_VAL(4)
+
+       #define CFG_HZ_FALLBACK (250000000LU/2)
+
+#elif (CFG_PLL_FREQ == CFG_PLL_250_250_250)
+
+       // CPU_DIV = 1, RAM_DIV = 1, AHB_DIV = 1
+       #define CPU_CLK_CONTROL_VAL             MAKE_AR9331_CPU_CLK_CONTROL_VAL(1, 1, 1)
+
+       #if CONFIG_40MHZ_XTAL_SUPPORT
+               // DIV_INT = 25 (40 MHz * 25/4 = 250 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 2
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(25, 1, 0, 2)
+       #else
+               // DIV_INT = 20 (25 MHz * 20/2 = 250 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 1
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(20, 1, 0, 1)
+       #endif
+
+       // CLOCK_DIVIDER = 3 (SPI clock = 250 / 8 ~ 31 MHz)
+       #define AR7240_SPI_CONTROL      MAKE_AR9331_SPI_CONTROL_VAL(8)
+
+       #define CFG_HZ_FALLBACK (250000000LU/2)
+
+#elif (CFG_PLL_FREQ == CFG_PLL_300_300_150)
+
+       // CPU_DIV = 1, RAM_DIV = 1, AHB_DIV = 2
+       #define CPU_CLK_CONTROL_VAL             MAKE_AR9331_CPU_CLK_CONTROL_VAL(1, 1, 2)
+
+       #if CONFIG_40MHZ_XTAL_SUPPORT
+               // DIV_INT = 15 (40 MHz * 15/2 = 300 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 1
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(15, 1, 0, 1)
+       #else
+               // DIV_INT = 24 (25 MHz * 24/2 = 300 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 1
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(24, 1, 0, 1)
+       #endif
+
+       // CLOCK_DIVIDER = 2 (SPI clock = 150 / 6 ~ 25 MHz)
+       #define AR7240_SPI_CONTROL      MAKE_AR9331_SPI_CONTROL_VAL(6)
+
+       #define CFG_HZ_FALLBACK (300000000LU/2)
+
+#elif (CFG_PLL_FREQ == CFG_PLL_325_325_162)
+
+       // CPU_DIV = 1, RAM_DIV = 1, AHB_DIV = 2
+       #define CPU_CLK_CONTROL_VAL             MAKE_AR9331_CPU_CLK_CONTROL_VAL(1, 1, 2)
+
+       #if CONFIG_40MHZ_XTAL_SUPPORT
+               #define FREQUENCY_NOT_SUPPORTED
+       #else
+               // DIV_INT = 26 (25 MHz * 26/2 = 325 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 1
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(26, 1, 0, 1)
+       #endif
+
+       // CLOCK_DIVIDER = 2 (SPI clock = 162 / 6 ~ 27 MHz)
+       #define AR7240_SPI_CONTROL      MAKE_AR9331_SPI_CONTROL_VAL(6)
+
+       #define CFG_HZ_FALLBACK (325000000LU/2)
+
+#elif (CFG_PLL_FREQ == CFG_PLL_350_350_175)
+
+       // CPU_DIV = 1, RAM_DIV = 1, AHB_DIV = 2
+       #define CPU_CLK_CONTROL_VAL             MAKE_AR9331_CPU_CLK_CONTROL_VAL(1, 1, 2)
+
+       #if CONFIG_40MHZ_XTAL_SUPPORT
+               #define FREQUENCY_NOT_SUPPORTED
+       #else
+               // DIV_INT = 28 (25 MHz * 28/2 = 350 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 1
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(28, 1, 0, 1)
+       #endif
+
+       // CLOCK_DIVIDER = 2 (SPI clock = 175 / 6 ~ 29 MHz)
+       #define AR7240_SPI_CONTROL      MAKE_AR9331_SPI_CONTROL_VAL(6)
+
+       #define CFG_HZ_FALLBACK (350000000LU/2)
+
+#elif (CFG_PLL_FREQ == CFG_PLL_360_360_180)
+
+       // CPU_DIV = 1, RAM_DIV = 1, AHB_DIV = 2
+       #define CPU_CLK_CONTROL_VAL             MAKE_AR9331_CPU_CLK_CONTROL_VAL(1, 1, 2)
+
+       #if CONFIG_40MHZ_XTAL_SUPPORT
+               // DIV_INT = 18 (40 MHz * 18/2 = 360 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 1
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(18, 1, 0, 1)
+       #else
+               // DIV_INT = 29 (25 MHz * 28/2 = 362 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 1
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(29, 1, 0, 1)
+       #endif
+
+       // CLOCK_DIVIDER = 2 (SPI clock = 180 / 6 ~ 30 MHz)
+       #define AR7240_SPI_CONTROL      MAKE_AR9331_SPI_CONTROL_VAL(6)
+
+       #define CFG_HZ_FALLBACK (360000000LU/2)
+
+#elif (CFG_PLL_FREQ == CFG_PLL_380_380_190)
+
+       // CPU_DIV = 1, RAM_DIV = 1, AHB_DIV = 2
+       #define CPU_CLK_CONTROL_VAL             MAKE_AR9331_CPU_CLK_CONTROL_VAL(1, 1, 2)
+
+       #if CONFIG_40MHZ_XTAL_SUPPORT
+               // DIV_INT = 19 (40 MHz * 19/2 = 380 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 1
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(19, 1, 0, 1)
+       #else
+               #define FREQUENCY_NOT_SUPPORTED
+       #endif
+
+       // CLOCK_DIVIDER = 2 (SPI clock = 190 / 6 ~ 32 MHz)
+       #define AR7240_SPI_CONTROL      MAKE_AR9331_SPI_CONTROL_VAL(6)
+
+       #define CFG_HZ_FALLBACK (380000000LU/2)
+
+#elif (CFG_PLL_FREQ == CFG_PLL_400_400_200)
+
+       // default configuration
+       #define CPU_CLK_CONTROL_VAL     CPU_CLK_CONTROL_VAL_DEFAULT
+       #define CPU_PLL_CONFIG_VAL      CPU_PLL_CONFIG_VAL_DEFAULT
+       #define AR7240_SPI_CONTROL      AR7240_SPI_CONTROL_DEFAULT
+
+       #define CFG_HZ_FALLBACK (400000000LU/2)
 
 #elif (CFG_PLL_FREQ == CFG_PLL_412_412_206)
 
-       #define CFG_HZ                                  (412500000LU/2)
+       // CPU_DIV = 1, RAM_DIV = 1, AHB_DIV = 2
+       #define CPU_CLK_CONTROL_VAL             MAKE_AR9331_CPU_CLK_CONTROL_VAL(1, 1, 2)
+
+       #if CONFIG_40MHZ_XTAL_SUPPORT
+               #define FREQUENCY_NOT_SUPPORTED
+       #else
+               // DIV_INT = 33 (25 MHz * 33/2 = 412 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 1
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(33, 1, 0, 1)
+       #endif
+
+       // CLOCK_DIVIDER = 2 (SPI clock = 206 / 6 ~ 34 MHz)
+       #define AR7240_SPI_CONTROL      MAKE_AR9331_SPI_CONTROL_VAL(6)
+
+       #define CFG_HZ_FALLBACK (412000000LU/2)
+
+#elif (CFG_PLL_FREQ == CFG_PLL_420_420_210)
 
        // CPU_DIV = 1, RAM_DIV = 1, AHB_DIV = 2
-       #define CPU_CLK_CONTROL_VAL1    0x00018004
-       #define CPU_CLK_CONTROL_VAL2    0x00008000
+       #define CPU_CLK_CONTROL_VAL             MAKE_AR9331_CPU_CLK_CONTROL_VAL(1, 1, 2)
+
+       #if CONFIG_40MHZ_XTAL_SUPPORT
+               // DIV_INT = 21 (40 MHz * 21/2 = 420 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 1
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(21, 1, 0, 1)
+       #else
+               #define FREQUENCY_NOT_SUPPORTED
+       #endif
 
-       // DIV_INT      = 33    (25 MHz * 33/2 = 412,5 MHz)
-       // REFDIV       = 1
-       // RANGE        = 0
-       // OUTDIV       = 1
-       #define CPU_PLL_CONFIG_VAL1             0x40818400
-       #define CPU_PLL_CONFIG_VAL2             0x00818400
+       // CLOCK_DIVIDER = 2 (SPI clock = 210 / 6 ~ 35 MHz)
+       #define AR7240_SPI_CONTROL      MAKE_AR9331_SPI_CONTROL_VAL(6)
 
-       // CLOCK_DIVIDER = 2 (SPI clock = 206,25 / 6 ~ 34,4 MHz)
-       #define AR7240_SPI_CONTROL              0x42
+       #define CFG_HZ_FALLBACK (420000000LU/2)
 
 #elif (CFG_PLL_FREQ == CFG_PLL_425_425_212)
 
-       #define CFG_HZ                                  (425000000LU/2)
-
        // CPU_DIV = 1, RAM_DIV = 1, AHB_DIV = 2
-       #define CPU_CLK_CONTROL_VAL1    0x00018004
-       #define CPU_CLK_CONTROL_VAL2    0x00008000
+       #define CPU_CLK_CONTROL_VAL             MAKE_AR9331_CPU_CLK_CONTROL_VAL(1, 1, 2)
+
+       #if CONFIG_40MHZ_XTAL_SUPPORT
+               #define FREQUENCY_NOT_SUPPORTED
+       #else
+               // DIV_INT = 34 (25 MHz * 34/2 = 425 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 1
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(34, 1, 0, 1)
+       #endif
 
-       // DIV_INT      = 34    (25 MHz * 34/2 = 425 MHz)
-       // REFDIV       = 1
-       // RANGE        = 0
-       // OUTDIV       = 1
-       #define CPU_PLL_CONFIG_VAL1             0x40818800
-       #define CPU_PLL_CONFIG_VAL2             0x00818800
+       // CLOCK_DIVIDER = 2 (SPI clock = 212 / 6 ~ 35 MHz)
+       #define AR7240_SPI_CONTROL      MAKE_AR9331_SPI_CONTROL_VAL(6)
 
-       // CLOCK_DIVIDER = 2 (SPI clock = 212,5 / 6 ~ 35,4 MHz)
-       #define AR7240_SPI_CONTROL              0x42
+       #define CFG_HZ_FALLBACK (425000000LU/2)
 
 #elif (CFG_PLL_FREQ == CFG_PLL_437_437_218)
 
-       #define CFG_HZ                                  (437500000LU/2)
+       // CPU_DIV = 1, RAM_DIV = 1, AHB_DIV = 2
+       #define CPU_CLK_CONTROL_VAL             MAKE_AR9331_CPU_CLK_CONTROL_VAL(1, 1, 2)
+
+       #if CONFIG_40MHZ_XTAL_SUPPORT
+               #define FREQUENCY_NOT_SUPPORTED
+       #else
+               // DIV_INT = 35 (25 MHz * 35/2 = 437 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 1
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(35, 1, 0, 1)
+       #endif
+
+       // CLOCK_DIVIDER = 3 (SPI clock = 218 / 8 ~ 27 MHz)
+       #define AR7240_SPI_CONTROL      MAKE_AR9331_SPI_CONTROL_VAL(8)
+
+       #define CFG_HZ_FALLBACK (437000000LU/2)
+
+#elif (CFG_PLL_FREQ == CFG_PLL_440_440_220)
 
        // CPU_DIV = 1, RAM_DIV = 1, AHB_DIV = 2
-       #define CPU_CLK_CONTROL_VAL1    0x00018004
-       #define CPU_CLK_CONTROL_VAL2    0x00008000
+       #define CPU_CLK_CONTROL_VAL             MAKE_AR9331_CPU_CLK_CONTROL_VAL(1, 1, 2)
 
-       // DIV_INT      = 35    (25 MHz * 35/2 = 437,5 MHz)
-       // REFDIV       = 1
-       // RANGE        = 0
-       // OUTDIV       = 1
-       #define CPU_PLL_CONFIG_VAL1             0x40818C00
-       #define CPU_PLL_CONFIG_VAL2             0x00818C00
+       #if CONFIG_40MHZ_XTAL_SUPPORT
+               // DIV_INT = 22 (40 MHz * 22/2 = 440 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 1
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(22, 1, 0, 1)
+       #else
+               #define FREQUENCY_NOT_SUPPORTED
+       #endif
 
-       // CLOCK_DIVIDER = 2 (SPI clock = 218,75 / 6 ~ 36,5 MHz)
-       #define AR7240_SPI_CONTROL              0x42
+       // CLOCK_DIVIDER = 3 (SPI clock = 220 / 8 ~ 27 MHz)
+       #define AR7240_SPI_CONTROL      MAKE_AR9331_SPI_CONTROL_VAL(8)
 
+       #define CFG_HZ_FALLBACK (440000000LU/2)
 
 #elif (CFG_PLL_FREQ == CFG_PLL_450_450_225)
 
-       #define CFG_HZ                                  (450000000LU/2)
-
        // CPU_DIV = 1, RAM_DIV = 1, AHB_DIV = 2
-       #define CPU_CLK_CONTROL_VAL1    0x00018004
-       #define CPU_CLK_CONTROL_VAL2    0x00008000
+       #define CPU_CLK_CONTROL_VAL             MAKE_AR9331_CPU_CLK_CONTROL_VAL(1, 1, 2)
 
-       // DIV_INT      = 36    (25 MHz * 36/2 = 450 MHz)
-       // REFDIV       = 1
-       // RANGE        = 0
-       // OUTDIV       = 1
-       #define CPU_PLL_CONFIG_VAL1             0x40819000
-       #define CPU_PLL_CONFIG_VAL2             0x00819000
+       #if CONFIG_40MHZ_XTAL_SUPPORT
+               #define FREQUENCY_NOT_SUPPORTED
+       #else
+               // DIV_INT = 36 (25 MHz * 36/2 = 450 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 1
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(36, 1, 0, 1)
+       #endif
 
-       // CLOCK_DIVIDER = 3 (SPI clock = 225 / 6 ~ 37,5 MHz)
-       #define AR7240_SPI_CONTROL              0x42
+       // CLOCK_DIVIDER = 3 (SPI clock = 225 / 8 ~ 28 MHz)
+       #define AR7240_SPI_CONTROL      MAKE_AR9331_SPI_CONTROL_VAL(8)
 
-#elif (CFG_PLL_FREQ == CFG_PLL_462_462_231)
+       #define CFG_HZ_FALLBACK (450000000LU/2)
 
-       #define CFG_HZ                                  (462500000LU/2)
+#elif (CFG_PLL_FREQ == CFG_PLL_460_460_230)
 
        // CPU_DIV = 1, RAM_DIV = 1, AHB_DIV = 2
-       #define CPU_CLK_CONTROL_VAL1    0x00018004
-       #define CPU_CLK_CONTROL_VAL2    0x00008000
+       #define CPU_CLK_CONTROL_VAL             MAKE_AR9331_CPU_CLK_CONTROL_VAL(1, 1, 2)
 
-       // DIV_INT      = 37    (25 MHz * 37/2 = 462,5 MHz)
-       // REFDIV       = 1
-       // RANGE        = 0
-       // OUTDIV       = 1
-       #define CPU_PLL_CONFIG_VAL1             0x40819400
-       #define CPU_PLL_CONFIG_VAL2             0x00819400
+       #if CONFIG_40MHZ_XTAL_SUPPORT
+               // DIV_INT = 23 (40 MHz * 23/2 = 460 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 1
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(23, 1, 0, 1)
+       #else
+               // DIV_INT = 37 (25 MHz * 36/2 = 462 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 1
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(37, 1, 0, 1)
+       #endif
 
-       // CLOCK_DIVIDER = 3 (SPI clock = 231,25 / 6 ~ 38,5 MHz)
-       #define AR7240_SPI_CONTROL              0x42
+       // CLOCK_DIVIDER = 3 (SPI clock = 230 / 8 ~ 29 MHz)
+       #define AR7240_SPI_CONTROL      MAKE_AR9331_SPI_CONTROL_VAL(8)
+
+       #define CFG_HZ_FALLBACK (460000000LU/2)
 
 #elif (CFG_PLL_FREQ == CFG_PLL_475_475_237)
 
-       #define CFG_HZ                                  (475000000LU/2)
+       // CPU_DIV = 1, RAM_DIV = 1, AHB_DIV = 2
+       #define CPU_CLK_CONTROL_VAL             MAKE_AR9331_CPU_CLK_CONTROL_VAL(1, 1, 2)
+
+       #if CONFIG_40MHZ_XTAL_SUPPORT
+               #define FREQUENCY_NOT_SUPPORTED
+       #else
+               // DIV_INT = 38 (25 MHz * 38/2 = 475 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 1
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(38, 1, 0, 1)
+       #endif
+
+       // CLOCK_DIVIDER = 3 (SPI clock = 237 / 8 ~ 30 MHz)
+       #define AR7240_SPI_CONTROL      MAKE_AR9331_SPI_CONTROL_VAL(8)
+
+       #define CFG_HZ_FALLBACK (475000000LU/2)
+
+#elif (CFG_PLL_FREQ == CFG_PLL_480_480_240)
 
        // CPU_DIV = 1, RAM_DIV = 1, AHB_DIV = 2
-       #define CPU_CLK_CONTROL_VAL1    0x00018004
-       #define CPU_CLK_CONTROL_VAL2    0x00008000
+       #define CPU_CLK_CONTROL_VAL             MAKE_AR9331_CPU_CLK_CONTROL_VAL(1, 1, 2)
+
+       #if CONFIG_40MHZ_XTAL_SUPPORT
+               // DIV_INT = 24 (40 MHz * 24/2 = 480 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 1
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(24, 1, 0, 1)
+       #else
+               #define FREQUENCY_NOT_SUPPORTED
+       #endif
 
-       // DIV_INT      = 38    (25 MHz * 38/2 = 475 MHz)
-       // REFDIV       = 1
-       // RANGE        = 0
-       // OUTDIV       = 1
-       #define CPU_PLL_CONFIG_VAL1             0x40819800
-       #define CPU_PLL_CONFIG_VAL2             0x00819800
+       // CLOCK_DIVIDER = 3 (SPI clock = 240 / 8 ~ 30 MHz)
+       #define AR7240_SPI_CONTROL      MAKE_AR9331_SPI_CONTROL_VAL(8)
 
-       // CLOCK_DIVIDER = 3 (SPI clock = 237,5 / 6 ~ 39,6 MHz)
-       #define AR7240_SPI_CONTROL              0x42
+       #define CFG_HZ_FALLBACK (480000000LU/2)
 
 #elif (CFG_PLL_FREQ == CFG_PLL_487_487_243)
 
-       #define CFG_HZ                                  (487500000LU/2)
-
        // CPU_DIV = 1, RAM_DIV = 1, AHB_DIV = 2
-       #define CPU_CLK_CONTROL_VAL1    0x00018004
-       #define CPU_CLK_CONTROL_VAL2    0x00008000
+       #define CPU_CLK_CONTROL_VAL             MAKE_AR9331_CPU_CLK_CONTROL_VAL(1, 1, 2)
 
-       // DIV_INT      = 39    (25 MHz * 39/2 = 487,5 MHz)
-       // REFDIV       = 1
-       // RANGE        = 0
-       // OUTDIV       = 1
-       #define CPU_PLL_CONFIG_VAL1             0x40819C00
-       #define CPU_PLL_CONFIG_VAL2             0x00819C00
+       #if CONFIG_40MHZ_XTAL_SUPPORT
+               #define FREQUENCY_NOT_SUPPORTED
+       #else
+               // DIV_INT = 39 (25 MHz * 39/2 = 487 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 1
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(39, 1, 0, 1)
+       #endif
 
-       // CLOCK_DIVIDER = 3 (SPI clock = 243,75 / 8 ~ 30,5 MHz)
-       #define AR7240_SPI_CONTROL              0x43
+       // CLOCK_DIVIDER = 3 (SPI clock = 243 / 8 ~ 30 MHz)
+       #define AR7240_SPI_CONTROL      MAKE_AR9331_SPI_CONTROL_VAL(8)
 
+       #define CFG_HZ_FALLBACK (487000000LU/2)
 
 #elif (CFG_PLL_FREQ == CFG_PLL_500_500_250)
 
-       #define CFG_HZ                                  (500000000LU/2)
-
        // CPU_DIV = 1, RAM_DIV = 1, AHB_DIV = 2
-       #define CPU_CLK_CONTROL_VAL1    0x00018004
-       #define CPU_CLK_CONTROL_VAL2    0x00008000
+       #define CPU_CLK_CONTROL_VAL             MAKE_AR9331_CPU_CLK_CONTROL_VAL(1, 1, 2)
+
+       #if CONFIG_40MHZ_XTAL_SUPPORT
+               // DIV_INT = 25 (40 MHz * 25/2 = 500 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 1
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(25, 1, 0, 1)
+       #else
+               // DIV_INT = 40 (25 MHz * 40/2 = 500 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 1
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(40, 1, 0, 1)
+       #endif
 
-       // DIV_INT      = 40    (25 MHz * 40/2 = 500 MHz)
-       // REFDIV       = 1
-       // RANGE        = 0
-       // OUTDIV       = 1
-       #define CPU_PLL_CONFIG_VAL1             0x4081A000
-       #define CPU_PLL_CONFIG_VAL2             0x0081A000
+       // CLOCK_DIVIDER = 3 (SPI clock = 250 / 8 ~ 31 MHz)
+       #define AR7240_SPI_CONTROL      MAKE_AR9331_SPI_CONTROL_VAL(8)
 
-       // CLOCK_DIVIDER = 3 (SPI clock = 250 / 8 ~ 31,3 MHz)
-       #define AR7240_SPI_CONTROL              0x43
+       #define CFG_HZ_FALLBACK (500000000LU/2)
 
 #elif (CFG_PLL_FREQ == CFG_PLL_500_250_250)
 
-       #define CFG_HZ                                  (500000000LU/2)
-
        // CPU_DIV = 1, RAM_DIV = 2, AHB_DIV = 2
-       #define CPU_CLK_CONTROL_VAL1    0x00018404
-       #define CPU_CLK_CONTROL_VAL2    0x00008400
+       #define CPU_CLK_CONTROL_VAL             MAKE_AR9331_CPU_CLK_CONTROL_VAL(1, 2, 2)
 
-       // DIV_INT      = 40    (25 MHz * 40/2 = 500 MHz)
-       // REFDIV       = 1
-       // RANGE        = 0
-       // OUTDIV       = 1
-       #define CPU_PLL_CONFIG_VAL1             0x4081A000
-       #define CPU_PLL_CONFIG_VAL2             0x0081A000
+       #if CONFIG_40MHZ_XTAL_SUPPORT
+               // DIV_INT = 25 (40 MHz * 25/2 = 500 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 1
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(25, 1, 0, 1)
+       #else
+               // DIV_INT = 40 (25 MHz * 40/2 = 500 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 1
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(40, 1, 0, 1)
+       #endif
 
-       // CLOCK_DIVIDER = 3 (SPI clock = 250 / 8 ~ 31,3 MHz)
-       #define AR7240_SPI_CONTROL              0x43
+       // CLOCK_DIVIDER = 3 (SPI clock = 250 / 8 ~ 31 MHz)
+       #define AR7240_SPI_CONTROL      MAKE_AR9331_SPI_CONTROL_VAL(8)
 
-#elif (CFG_PLL_FREQ == CFG_PLL_562_281_140)
+       #define CFG_HZ_FALLBACK (500000000LU/2)
 
-       #define CFG_HZ                                  (562500000LU/2)
+#elif (CFG_PLL_FREQ == CFG_PLL_520_520_260)
 
-       // CPU_DIV = 1, RAM_DIV = 2, AHB_DIV = 4
-       #define CPU_CLK_CONTROL_VAL1    0x00018404
-       #define CPU_CLK_CONTROL_VAL2    0x00018400
+       // CPU_DIV = 1, RAM_DIV = 1, AHB_DIV = 2
+       #define CPU_CLK_CONTROL_VAL             MAKE_AR9331_CPU_CLK_CONTROL_VAL(1, 1, 2)
 
-       // DIV_INT      = 45    (25 MHz * 45/2 = 562,5 MHz)
-       // REFDIV       = 1
-       // RANGE        = 0
-       // OUTDIV       = 1
-       #define CPU_PLL_CONFIG_VAL1             0x4081B400
-       #define CPU_PLL_CONFIG_VAL2             0x0081B400
+       #if CONFIG_40MHZ_XTAL_SUPPORT
+               // DIV_INT = 26 (40 MHz * 26/2 = 520 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 1
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(26, 1, 0, 1)
+       #else
+               #define FREQUENCY_NOT_SUPPORTED
+       #endif
 
-       // CLOCK_DIVIDER = 1 (SPI clock = 140,625 / 4 ~ 35,2 MHz)
-       #define AR7240_SPI_CONTROL              0x41
+       // CLOCK_DIVIDER = 3 (SPI clock = 260 / 8 ~ 32 MHz)
+       #define AR7240_SPI_CONTROL      MAKE_AR9331_SPI_CONTROL_VAL(8)
+
+       #define CFG_HZ_FALLBACK (520000000LU/2)
 
 #elif (CFG_PLL_FREQ == CFG_PLL_525_262_131)
 
-       #define CFG_HZ                                  (525000000LU/2)
+       // CPU_DIV = 1, RAM_DIV = 2, AHB_DIV = 4
+       #define CPU_CLK_CONTROL_VAL             MAKE_AR9331_CPU_CLK_CONTROL_VAL(1, 2, 4)
+
+       #if CONFIG_40MHZ_XTAL_SUPPORT
+               #define FREQUENCY_NOT_SUPPORTED
+       #else
+               // DIV_INT = 42 (25 MHz * 42/2 = 525 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 1
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(42, 1, 0, 1)
+       #endif
+
+       // CLOCK_DIVIDER = 1 (SPI clock = 131 / 4 ~ 33 MHz)
+       #define AR7240_SPI_CONTROL      MAKE_AR9331_SPI_CONTROL_VAL(4)
+
+       #define CFG_HZ_FALLBACK (525000000LU/2)
+
+#elif (CFG_PLL_FREQ == CFG_PLL_560_280_140)
 
        // CPU_DIV = 1, RAM_DIV = 2, AHB_DIV = 4
-       #define CPU_CLK_CONTROL_VAL1    0x00018404
-       #define CPU_CLK_CONTROL_VAL2    0x00018400
+       #define CPU_CLK_CONTROL_VAL             MAKE_AR9331_CPU_CLK_CONTROL_VAL(1, 2, 4)
+
+       #if CONFIG_40MHZ_XTAL_SUPPORT
+               // DIV_INT = 28 (40 MHz * 28/2 = 560 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 1
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(28, 1, 0, 1)
+       #else
+               // DIV_INT = 45 (25 MHz * 45/2 = 562 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 1
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(45, 1, 0, 1)
+       #endif
+
+       // CLOCK_DIVIDER = 1 (SPI clock = 140 / 4 ~ 35 MHz)
+       #define AR7240_SPI_CONTROL      MAKE_AR9331_SPI_CONTROL_VAL(4)
+
+       #define CFG_HZ_FALLBACK (560000000LU/2)
+
+#elif (CFG_PLL_FREQ == CFG_PLL_580_290_145)
+
+       // CPU_DIV = 1, RAM_DIV = 2, AHB_DIV = 4
+       #define CPU_CLK_CONTROL_VAL             MAKE_AR9331_CPU_CLK_CONTROL_VAL(1, 2, 4)
+
+       #if CONFIG_40MHZ_XTAL_SUPPORT
+               // DIV_INT = 29 (40 MHz * 29/2 = 580 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 1
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(29, 1, 0, 1)
+       #else
+               #define FREQUENCY_NOT_SUPPORTED
+       #endif
+
+       // CLOCK_DIVIDER = 1 (SPI clock = 145 / 4 ~ 36 MHz)
+       #define AR7240_SPI_CONTROL      MAKE_AR9331_SPI_CONTROL_VAL(4)
+
+       #define CFG_HZ_FALLBACK (580000000LU/2)
+
+#elif (CFG_PLL_FREQ == CFG_PLL_600_300_200)
+
+       // CPU_DIV = 1, RAM_DIV = 2, AHB_DIV = 3
+       #define CPU_CLK_CONTROL_VAL             MAKE_AR9331_CPU_CLK_CONTROL_VAL(1, 2, 3)
+
+       #if CONFIG_40MHZ_XTAL_SUPPORT
+               // DIV_INT = 30 (40 MHz * 30/2 = 600 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 1
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(30, 1, 0, 1)
+       #else
+               // DIV_INT = 48 (25 MHz * 48/2 = 600 MHz), REFDIV = 1, RANGE = 0, OUTDIV = 1
+               #define CPU_PLL_CONFIG_VAL      MAKE_AR9331_CPU_PLL_CONFIG_VAL(48, 1, 0, 1)
+       #endif
+
+       // CLOCK_DIVIDER = 2 (SPI clock = 200 / 6 ~ 33 MHz)
+       #define AR7240_SPI_CONTROL      MAKE_AR9331_SPI_CONTROL_VAL(6)
 
-       // DIV_INT      = 42    (25 MHz * 42/2 = 525 MHz)
-       // REFDIV       = 1
-       // RANGE        = 0
-       // OUTDIV       = 1
-       #define CPU_PLL_CONFIG_VAL1             0x4081A800
-       #define CPU_PLL_CONFIG_VAL2             0x0081A800
+       #define CFG_HZ_FALLBACK (600000000LU/2)
 
-       // CLOCK_DIVIDER = 1 (SPI clock = 131 / 4 ~ 32,8 MHz)
-       #define AR7240_SPI_CONTROL              0x41
+#elif defined(CFG_PLL_FREQ)
+       #error Unknown frequency setting!
+#endif
 
+/*
+ * Check if clocks configuration is valid
+ */
+#ifdef FREQUENCY_NOT_SUPPORTED
+       #error Selected frequency setting is not supported with your reference clock!
 #endif
 
 /*
 /*
  * Available commands
  */
-#if defined(CONFIG_FOR_8DEVICES_CARAMBOLA2)
-       #define CONFIG_COMMANDS (CFG_CMD_MEMORY | CFG_CMD_DHCP | CFG_CMD_PING | CFG_CMD_ENV | CFG_CMD_FLASH | CFG_CMD_NET | CFG_CMD_RUN | CFG_CMD_DATE | CFG_CMD_IMI | CFG_CMD_SNTP)
+#if defined(CONFIG_FOR_DLINK_DIR505_A1)
+       #define CONFIG_COMMANDS (CFG_CMD_MEMORY | CFG_CMD_DHCP | CFG_CMD_PING | CFG_CMD_FLASH | CFG_CMD_NET | CFG_CMD_RUN | CFG_CMD_DATE | CFG_CMD_IMI | CFG_CMD_SNTP )
+#elif defined(CONFIG_FOR_8DEVICES_CARAMBOLA2)
+       #define CONFIG_COMMANDS (CFG_CMD_MEMORY | CFG_CMD_DHCP | CFG_CMD_PING | CFG_CMD_ENV | CFG_CMD_FLASH | CFG_CMD_NET | CFG_CMD_RUN | CFG_CMD_DATE | CFG_CMD_IMI | CFG_CMD_SNTP)
 #else
-       #define CONFIG_COMMANDS (CFG_CMD_MEMORY | CFG_CMD_FLASH | CFG_CMD_NET | CFG_CMD_PING )
+       #define CONFIG_COMMANDS (CFG_CMD_MEMORY | CFG_CMD_DHCP | CFG_CMD_PING | CFG_CMD_FLASH | CFG_CMD_NET | CFG_CMD_RUN | CFG_CMD_DATE | CFG_CMD_SNTP )
 #endif
 
 // Enable NetConsole and custom NetConsole port
  * Web Failsafe configuration
  */
 #define WEBFAILSAFE_UPLOAD_RAM_ADDRESS                                 CONFIG_LOADADDR
+
+// U-Boot partition size and offset
 #define WEBFAILSAFE_UPLOAD_UBOOT_ADDRESS                               CFG_FLASH_BASE
 
+#if defined(CONFIG_FOR_DLINK_DIR505_A1)
+       #define WEBFAILSAFE_UPLOAD_UBOOT_SIZE_IN_BYTES          (64 * 1024)
+#elif defined(CONFIG_FOR_8DEVICES_CARAMBOLA2)
+       #define WEBFAILSAFE_UPLOAD_UBOOT_SIZE_IN_BYTES          (256 * 1024)
+#else
+       #define WEBFAILSAFE_UPLOAD_UBOOT_SIZE_IN_BYTES          (64 * 1024)
+#endif
+
 // Firmware partition offset
-#if defined(CONFIG_FOR_8DEVICES_CARAMBOLA2)
+#if defined(CONFIG_FOR_DLINK_DIR505_A1)
+       #define WEBFAILSAFE_UPLOAD_KERNEL_ADDRESS                       WEBFAILSAFE_UPLOAD_UBOOT_ADDRESS + 0x80000
+#elif defined(CONFIG_FOR_8DEVICES_CARAMBOLA2)
        #define WEBFAILSAFE_UPLOAD_KERNEL_ADDRESS                       WEBFAILSAFE_UPLOAD_UBOOT_ADDRESS + 0x50000
 #else
        #define WEBFAILSAFE_UPLOAD_KERNEL_ADDRESS                       WEBFAILSAFE_UPLOAD_UBOOT_ADDRESS + 0x20000
 #endif
 
-// U-Boot partition size
-#if defined(CONFIG_FOR_8DEVICES_CARAMBOLA2)
-       #define WEBFAILSAFE_UPLOAD_UBOOT_SIZE_IN_BYTES          (256 * 1024)
-#else
-       #define WEBFAILSAFE_UPLOAD_UBOOT_SIZE_IN_BYTES          (64 * 1024)
+// ART partition size and offset
+#if defined(CONFIG_FOR_DLINK_DIR505_A1)
+       #define WEBFAILSAFE_UPLOAD_ART_ADDRESS                          WEBFAILSAFE_UPLOAD_UBOOT_ADDRESS + 0x10000
 #endif
 
-// ART partition size
 #define WEBFAILSAFE_UPLOAD_ART_SIZE_IN_BYTES                   (64 * 1024)
 
 // max. firmware size <= (FLASH_SIZE -  WEBFAILSAFE_UPLOAD_LIMITED_AREA_IN_BYTES)
-#if defined(CONFIG_FOR_8DEVICES_CARAMBOLA2)
+#if defined(CONFIG_FOR_DLINK_DIR505_A1)
+       // D-Link DIR-505: 64k(U-Boot),64k(ART),64k(MAC),64k(NVRAM),256k(Language)
+       #define WEBFAILSAFE_UPLOAD_LIMITED_AREA_IN_BYTES        (512 * 1024)
+#elif defined(CONFIG_FOR_8DEVICES_CARAMBOLA2)
        // Carambola 2: 256k(U-Boot),64k(U-Boot env),64k(ART)
        #define WEBFAILSAFE_UPLOAD_LIMITED_AREA_IN_BYTES        (384 * 1024)
 #else
 #define milisecdelay(_x)                       udelay((_x) * 1000)
 
 /* MAC address, model and PIN number offsets in FLASH */
-#if defined(CONFIG_FOR_8DEVICES_CARAMBOLA2)
+#if defined(CONFIG_FOR_DLINK_DIR505_A1)
+       // DIR-505 has two MAC addresses inside dedicated MAC partition
+       // They are stored in plain text... TODO: read/write MAC stored as plain text
+       //#define OFFSET_MAC_DATA_BLOCK                 0x020000
+       //#define OFFSET_MAC_DATA_BLOCK_LENGTH  0x010000
+       //#define OFFSET_MAC_ADDRESS                            0x000004
+       //#define OFFSET_MAC_ADDRESS2                           0x000016
+#elif defined(CONFIG_FOR_8DEVICES_CARAMBOLA2)
        #define OFFSET_MAC_DATA_BLOCK                   0xFF0000
        #define OFFSET_MAC_DATA_BLOCK_LENGTH    0x010000
        #define OFFSET_MAC_ADDRESS                              0x000000        // Carambola 2 has two MAC addresses at the beginning of ART partition
        #define OFFSET_MAC_ADDRESS                              0x00FC00
 #endif
 
-#if !defined(CONFIG_FOR_8DEVICES_CARAMBOLA2)
+#if !defined(CONFIG_FOR_8DEVICES_CARAMBOLA2) && \
+       !defined(CONFIG_FOR_DLINK_DIR505_A1)
 #define OFFSET_ROUTER_MODEL                                    0x00FD00
 #endif
 
        #define OFFSET_PIN_NUMBER                               0x00FE00
 #endif
 
+/*
+ * PLL and clocks configurations from FLASH
+ *
+ * We need space for 4x 32-bit variables:
+ * - PLL_MAGIC_VARIABLE
+ * - values of registers:
+ *   - CPU_PLL_CONFIG (page 70 in datasheet)
+ *   - CLOCK_CONTROL  (page 71)
+ *   - SPI_CONTROL    (page 261)
+ */
+#if defined(CONFIG_FOR_DLINK_DIR505_A1)
+       /*
+        * We will store PLL and CLOCK registers
+        * configuration at the end of MAC data
+        * partition (3rd 64 KiB block)
+        */
+       #define PLL_IN_FLASH_MAGIC                              0x504C4C73
+       #define PLL_IN_FLASH_DATA_BLOCK_OFFSET  0x00020000
+       #define PLL_IN_FLASH_DATA_BLOCK_LENGTH  0x00010000
+       #define PLL_IN_FLASH_MAGIC_OFFSET               0x0000FFF0      // last 16 bytes
+#elif defined(CONFIG_FOR_8DEVICES_CARAMBOLA2)
+       /*
+        * We will store PLL and CLOCK registers
+        * configuration at the end of U-Boot
+        * image (4th 64 KiB block)
+        * It implies that binary image can't
+        * be bigger than 192 KiB!
+        *
+        * TODO: fix me
+        */
+       #define PLL_IN_FLASH_MAGIC                              0x504C4C73
+       #define PLL_IN_FLASH_DATA_BLOCK_OFFSET  0x00030000
+       #define PLL_IN_FLASH_DATA_BLOCK_LENGTH  0x00010000
+       #define PLL_IN_FLASH_MAGIC_OFFSET               0x0000FFF0      // last 16 bytes
+#else
+       /*
+        * All TP-Link routers have a lot of unused space
+        * in FLASH, in second 64 KiB block.
+        * We will store there PLL and CLOCK
+        * registers configuration.
+        */
+       #define PLL_IN_FLASH_MAGIC                              0x504C4C73
+       #define PLL_IN_FLASH_DATA_BLOCK_OFFSET  0x00010000
+       #define PLL_IN_FLASH_DATA_BLOCK_LENGTH  0x00010000
+       #define PLL_IN_FLASH_MAGIC_OFFSET               0x0000FFF0      // last 16 bytes
+#endif
+
 #include <cmd_confdefs.h>
 
 #endif /* __CONFIG_H */