PM520: add missing enable_interrupts()
authorWolfgang Denk <wd@denx.de>
Fri, 4 Nov 2011 15:55:16 +0000 (15:55 +0000)
committerWolfgang Denk <wd@denx.de>
Mon, 7 Nov 2011 21:11:24 +0000 (22:11 +0100)
The code disabled interrupts in several locations, without re-enabling
them again.  Fix this.

While we are at it, also fix a GCC 4.6 build warning:
flash.c: In function 'flash_erase':
flash.c:373:21: warning: variable 'last' set but not used
[-Wunused-but-set-variable]

Signed-off-by: Wolfgang Denk <wd@denx.de>
Cc: Josef Wagner <Wagner@Microsys.de>
board/pm520/flash.c

index 64c8624..01dcd56 100644 (file)
@@ -370,7 +370,7 @@ static unsigned char intel_sector_protected (flash_info_t *info, ushort sector)
 int flash_erase (flash_info_t *info, int s_first, int s_last)
 {
        int flag, prot, sect;
-       ulong type, start, last;
+       ulong type, start;
        int rcode = 0;
 
        if ((s_first < 0) || (s_first > s_last)) {
@@ -404,7 +404,6 @@ int flash_erase (flash_info_t *info, int s_first, int s_last)
        }
 
        start = get_timer (0);
-       last = start;
 
        /* Disable interrupts which might cause a timeout here */
        flag = disable_interrupts ();
@@ -440,6 +439,10 @@ int flash_erase (flash_info_t *info, int s_first, int s_last)
                        printf (" done\n");
                }
        }
+
+       if (flag)
+               enable_interrupts();
+
        return rcode;
 }
 
@@ -543,6 +546,7 @@ static int write_data (flash_info_t *info, ulong dest, FPW data)
        ulong status;
        ulong start;
        int flag;
+       int rcode = 0;
 
        /* Check if Flash is (sufficiently) erased */
        if ((*addr & data) != data) {
@@ -561,14 +565,17 @@ static int write_data (flash_info_t *info, ulong dest, FPW data)
        /* wait while polling the status register */
        while (((status = *addr) & (FPW) 0x00800080) != (FPW) 0x00800080) {
                if (get_timer(start) > CONFIG_SYS_FLASH_WRITE_TOUT) {
-                       *addr = (FPW) 0x00FF00FF;       /* restore read mode */
-                       return (1);
+                       rcode = 1;
+                       break;
                }
        }
 
        *addr = (FPW) 0x00FF00FF;       /* restore read mode */
 
-       return (0);
+       if (flag)
+               enable_interrupts();
+
+       return rcode;
 }
 
 void inline spin_wheel (void)