PLL/clocks settings in FLASH and O/C recovery for AR9331, other minor changes, AR9344...
[oweals/u-boot_mod.git] / u-boot / lib_mips / board.c
index 790fcfeadc79041dd44cc68c53183e9f09405ba2..eebff3c4a69f51e534ac326005764c0be8671a72 100755 (executable)
 
 #include <common.h>
 #include <command.h>
+#include <asm/mipsregs.h>
+#include <asm/addrspace.h>
 #include <malloc.h>
 #include <devices.h>
 #include <version.h>
 #include <net.h>
 #include <environment.h>
+#include "ar7240_soc.h"
+#include "../board/ar7240/common/ar7240_flash.h"
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -46,6 +50,8 @@ extern int timer_init(void);
 
 extern void all_led_on(void);
 extern void all_led_off(void);
+extern const char* print_mem_type(void);
+extern void ar7240_sys_frequency(u32 *cpu_freq, u32 *ddr_freq, u32 *ahb_freq);
 
 ulong monitor_flash_len;
 
@@ -79,7 +85,7 @@ void *sbrk(ptrdiff_t increment){
 }
 
 static int display_banner(void){
-       printf("\n\n*****************************************\n*      %s      *\n*****************************************\n\n", version_string);
+       printf("\n\n*********************************************\n*        %s        *\n*********************************************\n\n", version_string);
        return(0);
 }
 
@@ -90,11 +96,11 @@ static int init_baudrate(void){
 
 #ifndef COMPRESSED_UBOOT
 static int init_func_ram(void){
-       puts("DRAM:  ");
+       puts("DRAM:   ");
 
        if((gd->ram_size = initdram()) > 0){
-               print_size (gd->ram_size, "\n");
-
+               print_size(gd->ram_size, print_mem_type());
+               puts("\n");
                return(0);
        }
 
@@ -176,8 +182,9 @@ void board_init_f(ulong bootflag){
 
        // count ram size and print it
        gd->ram_size = bootflag;
-       puts("DRAM:  ");
-       print_size(gd->ram_size, "\n");
+       puts("DRAM:   ");
+       print_size(gd->ram_size, print_mem_type());
+       puts("\n");
 #endif
 
        /*
@@ -297,10 +304,20 @@ void board_init_r(gd_t *id, ulong dest_addr){
        int i;
        char *s;
        unsigned char buffer[6];
+       unsigned int ahb_freq, ddr_freq, cpu_freq, spi_freq;
 
        gd = id;
        gd->flags |= GD_FLG_RELOC; /* tell others: relocation done */
 
+       /* bd -> board data */
+       bd = gd->bd;
+
+       /* get CPU/RAM/AHB clocks */
+       ar7240_sys_frequency(&cpu_freq, &ddr_freq, &ahb_freq);
+
+       /* set bi_cfg_hz */
+       bd->bi_cfg_hz = (unsigned long)(cpu_freq >> 1);
+
 #ifdef BOARD_DEBUG
        printf("Now running in RAM - U-Boot at: %08lX\n", dest_addr);
 #endif
@@ -342,12 +359,23 @@ void board_init_r(gd_t *id, ulong dest_addr){
        /* configure available FLASH banks */
        size = flash_init();
 
-       puts("\n\n");
-
-       bd = gd->bd;
        bd->bi_flashstart = CFG_FLASH_BASE;
        bd->bi_flashsize = size;
 
+       // calculate SPI clock (we need to set bit 0 to 1 in SPI_FUNC_SELECT to access SPI registers)
+       ar7240_reg_wr(AR7240_SPI_FS, 0x01);
+       spi_freq = ahb_freq / (((ar7240_reg_rd(AR7240_SPI_CLOCK) & 0x3F) + 1) * 2);
+       ar7240_reg_wr(AR7240_SPI_FS, 0x0);
+
+       // make MHz from Hz
+       cpu_freq /= 1000000;
+       ddr_freq /= 1000000;
+       ahb_freq /= 1000000;
+       spi_freq /= 1000000;
+
+       printf("CLOCKS: %d/%d/%d/%d MHz (CPU/RAM/AHB/SPI)\n", cpu_freq, ddr_freq, ahb_freq, spi_freq);
+       puts("\n");
+
 #if CFG_MONITOR_BASE == CFG_FLASH_BASE
        bd->bi_flashoffset = monitor_flash_len; /* reserved area for U-Boot */
 #else
@@ -362,7 +390,18 @@ void board_init_r(gd_t *id, ulong dest_addr){
        env_relocate();
 
        /* board MAC address */
+#if defined(OFFSET_MAC_ADDRESS)
        memcpy(buffer, (void *)(CFG_FLASH_BASE + OFFSET_MAC_DATA_BLOCK + OFFSET_MAC_ADDRESS), 6);
+#else
+       // fake MAC
+       // 00-03-7F (Atheros Communications, Inc.)
+       buffer[0] = 0x00;
+       buffer[1] = 0x03;
+       buffer[2] = 0x7f;
+       buffer[3] = 0x09;
+       buffer[4] = 0x0b;
+       buffer[5] = 0xad;
+#endif
 
        for(i = 0; i < 6; ++i){
                bd->bi_enetaddr[i] = buffer[i];