]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - board/snmc/qs860t/flash.c
imported Freescale specific U-Boot additions for i.MX28,... release L2.6.31_10.08.01
[karo-tx-uboot.git] / board / snmc / qs860t / flash.c
index c84d08d6289fbf791a461053b6d4f5d38e3a50e5..2cb8dcb9d803ddad27b15549ac05957f18e883a5 100755 (executable)
 #include <asm/u-boot.h>
 #include <asm/processor.h>
 
-flash_info_t flash_info[CFG_MAX_FLASH_BANKS]; /* info for FLASH chips */
+flash_info_t flash_info[CONFIG_SYS_MAX_FLASH_BANKS]; /* info for FLASH chips */
 
 
-#ifdef CFG_FLASH_16BIT
+#ifdef CONFIG_SYS_FLASH_16BIT
 #define FLASH_WORD_SIZE        unsigned short
 #define FLASH_ID_MASK  0xFFFF
 #else
@@ -46,7 +46,7 @@ flash_info_t flash_info[CFG_MAX_FLASH_BANKS]; /* info for FLASH chips */
 /* stolen from esteem192e/flash.c */
 ulong flash_get_size (volatile FLASH_WORD_SIZE *addr, flash_info_t *info);
 
-#ifndef CFG_FLASH_16BIT
+#ifndef CONFIG_SYS_FLASH_16BIT
 static int write_word (flash_info_t *info, ulong dest, ulong data);
 #else
 static int write_short (flash_info_t *info, ulong dest, ushort data);
@@ -65,7 +65,7 @@ unsigned long flash_init (void)
        unsigned long base_b0, base_b1;
 
        /* Init: no FLASHes known */
-       for (i=0; i<CFG_MAX_FLASH_BANKS; ++i) {
+       for (i=0; i<CONFIG_SYS_MAX_FLASH_BANKS; ++i) {
                flash_info[i].flash_id = FLASH_UNKNOWN;
        }
 
@@ -79,34 +79,29 @@ unsigned long flash_init (void)
        }
 
        /* Only one bank */
-       if (CFG_MAX_FLASH_BANKS == 1)
-       {
+       if (CONFIG_SYS_MAX_FLASH_BANKS == 1) {
                /* Setup offsets */
                flash_get_offsets (FLASH_BASE1_PRELIM, &flash_info[0]);
 
                /* Monitor protection ON by default */
 #if 0  /* sand: */
                (void)flash_protect(FLAG_PROTECT_SET,
-                       FLASH_BASE1_PRELIM-CFG_MONITOR_LEN+size_b0,
+                       FLASH_BASE1_PRELIM-CONFIG_SYS_MONITOR_LEN+size_b0,
                        FLASH_BASE1_PRELIM-1+size_b0,
                        &flash_info[0]);
 #else
                (void)flash_protect(FLAG_PROTECT_SET,
-                       CFG_MONITOR_BASE,
-                       CFG_MONITOR_BASE+CFG_MONITOR_LEN-1,
+                       CONFIG_SYS_MONITOR_BASE,
+                       CONFIG_SYS_MONITOR_BASE+CONFIG_SYS_MONITOR_LEN-1,
                        &flash_info[0]);
 #endif
                size_b1 = 0 ;
                flash_info[0].size = size_b0;
-       }
-       /* 2 banks */
-       else
-       {
+       } else {        /* 2 banks */
                size_b1 = flash_get_size((volatile FLASH_WORD_SIZE *)FLASH_BASE1_PRELIM, &flash_info[1]);
 
                /* Re-do sizing to get full correct info */
-               if (size_b1)
-               {
+               if (size_b1) {
                        mtdcr(ebccfga, pb0cr);
                        pbcr = mfdcr(ebccfgd);
                        mtdcr(ebccfga, pb0cr);
@@ -115,8 +110,7 @@ unsigned long flash_init (void)
                        mtdcr(ebccfgd, pbcr);
                }
 
-               if (size_b0)
-               {
+               if (size_b0) {
                        mtdcr(ebccfga, pb1cr);
                        pbcr = mfdcr(ebccfgd);
                        mtdcr(ebccfga, pb1cr);
@@ -132,13 +126,13 @@ unsigned long flash_init (void)
                /* monitor protection ON by default */
 #if 0  /* sand: */
                (void)flash_protect(FLAG_PROTECT_SET,
-                       FLASH_BASE1_PRELIM-CFG_MONITOR_LEN+size_b0,
+                       FLASH_BASE1_PRELIM-CONFIG_SYS_MONITOR_LEN+size_b0,
                        FLASH_BASE1_PRELIM-1+size_b0,
                        &flash_info[0]);
 #else
                (void)flash_protect(FLAG_PROTECT_SET,
-                       CFG_MONITOR_BASE,
-                       CFG_MONITOR_BASE+CFG_MONITOR_LEN-1,
+                       CONFIG_SYS_MONITOR_BASE,
+                       CONFIG_SYS_MONITOR_BASE+CONFIG_SYS_MONITOR_LEN-1,
                        &flash_info[0]);
 #endif
 
@@ -150,12 +144,12 @@ unsigned long flash_init (void)
 
                        /* monitor protection ON by default */
                        (void)flash_protect(FLAG_PROTECT_SET,
-                               base_b1+size_b1-CFG_MONITOR_LEN,
+                               base_b1+size_b1-CONFIG_SYS_MONITOR_LEN,
                                base_b1+size_b1-1,
                                &flash_info[1]);
                        /* monitor protection OFF by default (one is enough) */
                        (void)flash_protect(FLAG_PROTECT_CLEAR,
-                               base_b0+size_b0-CFG_MONITOR_LEN,
+                               base_b0+size_b0-CONFIG_SYS_MONITOR_LEN,
                                base_b0+size_b0-1,
                                &flash_info[0]);
                } else {
@@ -188,7 +182,7 @@ static void flash_get_offsets (ulong base, flash_info_t *info)
        else if (info->flash_id & FLASH_BTYPE) {
                if ((info->flash_id & FLASH_VENDMASK) == FLASH_MAN_INTEL) {
 
-#ifndef CFG_FLASH_16BIT
+#ifndef CONFIG_SYS_FLASH_16BIT
                        /* set sector offsets for bottom boot block type */
                        info->start[0] = base + 0x00000000;
                        info->start[1] = base + 0x00004000;
@@ -240,7 +234,7 @@ static void flash_get_offsets (ulong base, flash_info_t *info)
                i = info->sector_count - 1;
                if ((info->flash_id & FLASH_VENDMASK) == FLASH_MAN_INTEL) {
 
-#ifndef CFG_FLASH_16BIT
+#ifndef CONFIG_SYS_FLASH_16BIT
                        info->start[i--] = base + info->size - 0x00004000;
                        info->start[i--] = base + info->size - 0x00008000;
                        info->start[i--] = base + info->size - 0x0000C000;
@@ -399,7 +393,7 @@ ulong flash_get_size (volatile FLASH_WORD_SIZE *addr, flash_info_t *info)
        /* Write auto select command: read Manufacturer ID */
 
 
-#ifndef CFG_FLASH_16BIT
+#ifndef CONFIG_SYS_FLASH_16BIT
 
        /*
         * Note: if it is an AMD flash and the word at addr[0000]
@@ -566,17 +560,17 @@ ulong flash_get_size (volatile FLASH_WORD_SIZE *addr, flash_info_t *info)
                info->flash_id += FLASH_28F320J3A;
                info->sector_count = 32;
                info->size = 0x00400000;
-               break;                          /* => 32 MBit   */
+               break;                          /* => 32 MBit   */
        case (INTEL_ID_28F640J3A & FLASH_ID_MASK):
                info->flash_id += FLASH_28F640J3A;
                info->sector_count = 64;
                info->size = 0x00800000;
-               break;                          /* => 64 MBit   */
+               break;                          /* => 64 MBit   */
        case (INTEL_ID_28F128J3A & FLASH_ID_MASK):
                info->flash_id += FLASH_28F128J3A;
                info->sector_count = 128;
                info->size = 0x01000000;
-               break;                          /* => 128 MBit          */
+               break;                          /* => 128 MBit  */
 
        default:
                /* FIXME*/
@@ -613,10 +607,11 @@ ulong flash_get_size (volatile FLASH_WORD_SIZE *addr, flash_info_t *info)
 /*-----------------------------------------------------------------------
  */
 
-int flash_erase (flash_info_t *info, int s_first, int s_last)
+int flash_erase (flash_info_t * info, int s_first, int s_last)
 {
 
-       volatile FLASH_WORD_SIZE *addr=(volatile FLASH_WORD_SIZE*)(info->start[0]);
+       volatile FLASH_WORD_SIZE *addr =
+               (volatile FLASH_WORD_SIZE *) (info->start[0]);
        int flag, prot, sect, l_sect, barf;
        ulong start, now, last;
        int rcode = 0;
@@ -631,22 +626,21 @@ int flash_erase (flash_info_t *info, int s_first, int s_last)
        }
 
        if ((info->flash_id == FLASH_UNKNOWN) ||
-               ((info->flash_id > FLASH_AMD_COMP) &&
-               ( (info->flash_id & FLASH_VENDMASK) != FLASH_MAN_INTEL ) ) ){
+           ((info->flash_id > FLASH_AMD_COMP) &&
+            ((info->flash_id & FLASH_VENDMASK) != FLASH_MAN_INTEL))) {
                printf ("Can't erase unknown flash type - aborted\n");
                return 1;
        }
 
        prot = 0;
-       for (sect=s_first; sect<=s_last; ++sect) {
+       for (sect = s_first; sect <= s_last; ++sect) {
                if (info->protect[sect]) {
                        prot++;
                }
        }
 
        if (prot) {
-               printf ("- Warning: %d protected sectors will not be erased!\n",
-                       prot);
+               printf ("- Warning: %d protected sectors will not be erased!\n", prot);
        } else {
                printf ("\n");
        }
@@ -654,109 +648,112 @@ int flash_erase (flash_info_t *info, int s_first, int s_last)
        l_sect = -1;
 
        /* Disable interrupts which might cause a timeout here */
-       flag = disable_interrupts();
-    if(info->flash_id < FLASH_AMD_COMP) {
-#ifndef CFG_FLASH_16BIT
-       addr[0x0555] = 0x00AA00AA;
-       addr[0x02AA] = 0x00550055;
-       addr[0x0555] = 0x00800080;
-       addr[0x0555] = 0x00AA00AA;
-       addr[0x02AA] = 0x00550055;
+       flag = disable_interrupts ();
+       if (info->flash_id < FLASH_AMD_COMP) {
+#ifndef CONFIG_SYS_FLASH_16BIT
+               addr[0x0555] = 0x00AA00AA;
+               addr[0x02AA] = 0x00550055;
+               addr[0x0555] = 0x00800080;
+               addr[0x0555] = 0x00AA00AA;
+               addr[0x02AA] = 0x00550055;
 #else
-       addr[0x0555] = 0x00AA;
-       addr[0x02AA] = 0x0055;
-       addr[0x0555] = 0x0080;
-       addr[0x0555] = 0x00AA;
-       addr[0x02AA] = 0x0055;
+               addr[0x0555] = 0x00AA;
+               addr[0x02AA] = 0x0055;
+               addr[0x0555] = 0x0080;
+               addr[0x0555] = 0x00AA;
+               addr[0x02AA] = 0x0055;
 #endif
-       /* Start erase on unprotected sectors */
-       for (sect = s_first; sect<=s_last; sect++) {
-               if (info->protect[sect] == 0) { /* not protected */
-                       addr = (volatile FLASH_WORD_SIZE *)(info->start[sect]);
-                       addr[0] = (0x00300030 & FLASH_ID_MASK);
-                       l_sect = sect;
+               /* Start erase on unprotected sectors */
+               for (sect = s_first; sect <= s_last; sect++) {
+                       if (info->protect[sect] == 0) { /* not protected */
+                               addr = (volatile FLASH_WORD_SIZE *) (info->start[sect]);
+                               addr[0] = (0x00300030 & FLASH_ID_MASK);
+                               l_sect = sect;
+                       }
                }
-       }
-
-       /* re-enable interrupts if necessary */
-       if (flag)
-               enable_interrupts();
 
-       /* wait at least 80us - let's wait 1 ms */
-       udelay (1000);
+               /* re-enable interrupts if necessary */
+               if (flag)
+                       enable_interrupts ();
+
+               /* wait at least 80us - let's wait 1 ms */
+               udelay (1000);
+
+               /*
+                * We wait for the last triggered sector
+                */
+               if (l_sect < 0)
+                       goto DONE;
+
+               start = get_timer (0);
+               last = start;
+               addr = (volatile FLASH_WORD_SIZE *) (info->start[l_sect]);
+               while ((addr[0] & (0x00800080 & FLASH_ID_MASK)) !=
+                      (0x00800080 & FLASH_ID_MASK)) {
+                       if ((now = get_timer (start)) > CONFIG_SYS_FLASH_ERASE_TOUT) {
+                               printf ("Timeout\n");
+                               return 1;
+                       }
+                       /* show that we're waiting */
+                       if ((now - last) > 1000) {      /* every second */
+                               serial_putc ('.');
+                               last = now;
+                       }
+               }
 
-       /*
-        * We wait for the last triggered sector
-        */
-       if (l_sect < 0)
-               goto DONE;
+             DONE:
+               /* reset to read mode */
+               addr = (volatile FLASH_WORD_SIZE *) info->start[0];
+               addr[0] = (0x00F000F0 & FLASH_ID_MASK); /* reset bank */
+       } else {
 
-       start = get_timer (0);
-       last  = start;
-       addr = (volatile FLASH_WORD_SIZE*)(info->start[l_sect]);
-       while ((addr[0] & (0x00800080&FLASH_ID_MASK)) !=
-               (0x00800080&FLASH_ID_MASK)  )
-       {
-               if ((now = get_timer(start)) > CFG_FLASH_ERASE_TOUT) {
-                       printf ("Timeout\n");
-                       return 1;
-               }
-               /* show that we're waiting */
-               if ((now - last) > 1000) {      /* every second */
-                       serial_putc ('.');
-                       last = now;
-               }
-       }
 
-DONE:
-       /* reset to read mode */
-       addr = (volatile FLASH_WORD_SIZE *)info->start[0];
-       addr[0] = (0x00F000F0 & FLASH_ID_MASK); /* reset bank */
-    } else {
-
-
-       for (sect = s_first; sect<=s_last; sect++) {
-               if (info->protect[sect] == 0) { /* not protected */
-                       barf = 0;
-#ifndef CFG_FLASH_16BIT
-                       addr = (vu_long*)(info->start[sect]);
-                       addr[0] = 0x00200020;
-                       addr[0] = 0x00D000D0;
-                       while(!(addr[0] & 0x00800080)); /* wait for error or finish */
-                       if( addr[0] & 0x003A003A) {     /* check for error */
-                               barf = addr[0] & 0x003A0000;
-                               if( barf ) {
-                                       barf >>=16;
-                               } else {
-                                       barf = addr[0] & 0x0000003A;
+               for (sect = s_first; sect <= s_last; sect++) {
+                       if (info->protect[sect] == 0) { /* not protected */
+                               barf = 0;
+#ifndef CONFIG_SYS_FLASH_16BIT
+                               addr = (vu_long *) (info->start[sect]);
+                               addr[0] = 0x00200020;
+                               addr[0] = 0x00D000D0;
+                               while (!(addr[0] & 0x00800080));        /* wait for error or finish */
+                               if (addr[0] & 0x003A003A) {     /* check for error */
+                                       barf = addr[0] & 0x003A0000;
+                                       if (barf) {
+                                               barf >>= 16;
+                                       } else {
+                                               barf = addr[0] & 0x0000003A;
+                                       }
                                }
-                       }
 #else
-                       addr = (vu_short*)(info->start[sect]);
-                       addr[0] = 0x0020;
-                       addr[0] = 0x00D0;
-                       while(!(addr[0] & 0x0080));     /* wait for error or finish */
-                       if( addr[0] & 0x003A)   /* check for error */
-                               barf = addr[0] & 0x003A;
+                               addr = (vu_short *) (info->start[sect]);
+                               addr[0] = 0x0020;
+                               addr[0] = 0x00D0;
+                               while (!(addr[0] & 0x0080));    /* wait for error or finish */
+                               if (addr[0] & 0x003A)   /* check for error */
+                                       barf = addr[0] & 0x003A;
 #endif
-                       if(barf) {
-                               printf("\nFlash error in sector at %lx\n",(unsigned long)addr);
-                               if(barf & 0x0002) printf("Block locked, not erased.\n");
-                               if((barf & 0x0030) == 0x0030)
-                                       printf("Command Sequence error.\n");
-                               if((barf & 0x0030) == 0x0020)
-                                       printf("Block Erase error.\n");
-                               if(barf & 0x0008) printf("Vpp Low error.\n");
-                               rcode = 1;
-                       } else printf(".");
-                       l_sect = sect;
+                               if (barf) {
+                                       printf ("\nFlash error in sector at %lx\n",
+                                               (unsigned long) addr);
+                                       if (barf & 0x0002)
+                                               printf ("Block locked, not erased.\n");
+                                       if ((barf & 0x0030) == 0x0030)
+                                               printf ("Command Sequence error.\n");
+                                       if ((barf & 0x0030) == 0x0020)
+                                               printf ("Block Erase error.\n");
+                                       if (barf & 0x0008)
+                                               printf ("Vpp Low error.\n");
+                                       rcode = 1;
+                               } else
+                                       printf (".");
+                               l_sect = sect;
+                       }
+                       addr = (volatile FLASH_WORD_SIZE *) info->start[0];
+                       addr[0] = (0x00FF00FF & FLASH_ID_MASK); /* reset bank */
+
                }
-       addr = (volatile FLASH_WORD_SIZE *)info->start[0];
-       addr[0] = (0x00FF00FF & FLASH_ID_MASK); /* reset bank */
 
        }
-
-    }
        printf (" done\n");
        return rcode;
 }
@@ -769,7 +766,7 @@ DONE:
        flash_info_t *info;
        int i;
 
-       for (i=0, info=&flash_info[0]; i<CFG_MAX_FLASH_BANKS; ++i, ++info) {
+       for (i=0, info=&flash_info[0]; i<CONFIG_SYS_MAX_FLASH_BANKS; ++i, ++info) {
                if ((addr >= info->start[0]) &&
                    (addr < (info->start[0] + info->size)) ) {
                        return (info);
@@ -846,7 +843,7 @@ DONE:
 
 int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt)
 {
-#ifndef CFG_FLASH_16BIT
+#ifndef CONFIG_SYS_FLASH_16BIT
        ulong cp, wp, data;
        int l;
 #else
@@ -855,7 +852,7 @@ int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt)
 #endif
        int i, rc;
 
-#ifndef CFG_FLASH_16BIT
+#ifndef CONFIG_SYS_FLASH_16BIT
 
 
        wp = (addr & ~3);       /* get lower word aligned address */
@@ -982,7 +979,7 @@ int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt)
  * 1 - write timeout
  * 2 - Flash not erased
  */
-#ifndef CFG_FLASH_16BIT
+#ifndef CONFIG_SYS_FLASH_16BIT
 static int write_word (flash_info_t *info, ulong dest, ulong data)
 {
        vu_long *addr = (vu_long*)(info->start[0]);
@@ -1018,13 +1015,13 @@ static int write_word (flash_info_t *info, ulong dest, ulong data)
 
        if(info->flash_id > FLASH_AMD_COMP) {
                while ((*((vu_long *)dest) & 0x00800080) != (data & 0x00800080)) {
-                       if (get_timer(start) > CFG_FLASH_WRITE_TOUT) {
+                       if (get_timer(start) > CONFIG_SYS_FLASH_WRITE_TOUT) {
                                return (1);
                        }
                }
        } else {
-               while(!(addr[0] & 0x00800080)) {        /* wait for error or finish */
-                       if (get_timer(start) > CFG_FLASH_WRITE_TOUT) {
+               while(!(addr[0] & 0x00800080)) {        /* wait for error or finish */
+                       if (get_timer(start) > CONFIG_SYS_FLASH_WRITE_TOUT) {
                                return (1);
                        }
 
@@ -1084,15 +1081,15 @@ static int write_short (flash_info_t *info, ulong dest, ushort data)
        if(info->flash_id < FLASH_AMD_COMP) {
                /* AMD stuff */
                while ((*((vu_short *)dest) & 0x0080) != (data & 0x0080)) {
-                       if (get_timer(start) > CFG_FLASH_WRITE_TOUT) {
+                       if (get_timer(start) > CONFIG_SYS_FLASH_WRITE_TOUT) {
                                return (1);
                        }
                }
 
        } else {
                /* intel stuff */
-               while(!(addr[0] & 0x0080)){     /* wait for error or finish */
-                       if (get_timer(start) > CFG_FLASH_WRITE_TOUT) return (1);
+               while(!(addr[0] & 0x0080)){     /* wait for error or finish */
+                       if (get_timer(start) > CONFIG_SYS_FLASH_WRITE_TOUT) return (1);
                }
 
                if( addr[0] & 0x003A) { /* check for error */
@@ -1105,16 +1102,14 @@ static int write_short (flash_info_t *info, ulong dest, ushort data)
                }
                *addr = 0x00B0;
                *addr = 0x0070;
-               while(!(addr[0] & 0x0080)){     /* wait for error or finish */
-                       if (get_timer(start) > CFG_FLASH_WRITE_TOUT) return (1);
+               while(!(addr[0] & 0x0080)){     /* wait for error or finish */
+                       if (get_timer(start) > CONFIG_SYS_FLASH_WRITE_TOUT) return (1);
                }
                *addr = 0x00FF;
        }
        return (0);
 }
 
-
 #endif
 
-/*-----------------------------------------------------------------------
- */
+/*-----------------------------------------------------------------------*/