[PATCH v3] Add sync to ensure flash_write_cmd is fully finished
authorHaiying Wang <Haiying.Wang@freescale.com>
Wed, 21 Feb 2007 15:52:31 +0000 (16:52 +0100)
committerStefan Roese <sr@denx.de>
Wed, 21 Feb 2007 15:52:31 +0000 (16:52 +0100)
Some CPUs like PPC, BLACKFIN need sync() to ensure cfi flash write command
is fully finished. The sync() is defined in each CPU's io.h file. For
those CPUs which do not need sync for now, a dummy sync() is defined in
their io.h as well.

Signed-off-by: Haiying Wang <Haiying.Wang@freescale.com>
drivers/cfi_flash.c
include/asm-arm/io.h
include/asm-avr32/io.h
include/asm-blackfin/io.h
include/asm-i386/io.h
include/asm-m68k/io.h
include/asm-microblaze/io.h
include/asm-mips/io.h
include/asm-nios/io.h
include/asm-nios2/io.h
include/asm-ppc/io.h

index 696f9a47ada93a25b65a918adf7d32da720945f0..5579a1efc155e3cb9d488af81d5262b2d2b19c95 100644 (file)
@@ -36,6 +36,7 @@
 
 #include <common.h>
 #include <asm/processor.h>
+#include <asm/io.h>
 #include <asm/byteorder.h>
 #include <environment.h>
 #ifdef CFG_FLASH_CFI_DRIVER
@@ -931,27 +932,18 @@ static void flash_write_cmd (flash_info_t * info, flash_sect_t sect, uint offset
                debug ("fwc addr %p cmd %x %x 8bit x %d bit\n", addr.cp, cmd,
                       cword.c, info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
                *addr.cp = cword.c;
-#ifdef CONFIG_BLACKFIN
-               asm("ssync;");
-#endif
                break;
        case FLASH_CFI_16BIT:
                debug ("fwc addr %p cmd %x %4.4x 16bit x %d bit\n", addr.wp,
                       cmd, cword.w,
                       info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
                *addr.wp = cword.w;
-#ifdef CONFIG_BLACKFIN
-               asm("ssync;");
-#endif
                break;
        case FLASH_CFI_32BIT:
                debug ("fwc addr %p cmd %x %8.8lx 32bit x %d bit\n", addr.lp,
                       cmd, cword.l,
                       info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
                *addr.lp = cword.l;
-#ifdef CONFIG_BLACKFIN
-               asm("ssync;");
-#endif
                break;
        case FLASH_CFI_64BIT:
 #ifdef DEBUG
@@ -966,11 +958,11 @@ static void flash_write_cmd (flash_info_t * info, flash_sect_t sect, uint offset
                }
 #endif
                *addr.llp = cword.ll;
-#ifdef CONFIG_BLACKFIN
-               asm("ssync;");
-#endif
                break;
        }
+
+       /* Ensure all the instructions are fully finished */
+       sync();
 }
 
 static void flash_unlock_seq (flash_info_t * info, flash_sect_t sect)
index 648a10dd92368745e2529c73fb0ff12604ac451e..47c18e7e86965defdf8500c739bffe4dc1424a19 100644 (file)
 #include <asm/arch/hardware.h>
 #endif /* XXX###XXX */
 
+static inline void sync(void)
+{
+}
+
 /*
  * Generic virtual read/write.  Note that we don't support half-word
  * read/writes.  We define __arch_*[bl] here, and leave __arch_*w
index e86c456ae1e48b30584b2100a0795e8cee304169..3c0d569233e2693933ea667075a362fe7535e3ec 100644 (file)
@@ -89,4 +89,8 @@ static __inline__ void * phys_to_virt(unsigned long address)
 
 #endif /* __KERNEL__ */
 
+static inline void sync(void)
+{
+}
+
 #endif /* __ASM_AVR32_IO_H */
index e5b388e262b87f2411677c14e7aac7a5b6bc30bb..fc27194a42e99796fea0fc43941046e96f6d13c8 100644 (file)
 #ifndef _BLACKFIN_IO_H
 #define _BLACKFIN_IO_H
 
+static inline void sync(void)
+{
+       __asm__ __volatile__ asm("ssync" : : : "memory");
+}
+
 #ifdef __KERNEL__
 
 #include <linux/config.h>
index 85d44aaa15b71fe3092526ae6782fed63b4699c9..e64d788fa758cbba566688e22a967765a7252a18 100644 (file)
@@ -201,4 +201,8 @@ __OUTS(b)
 __OUTS(w)
 __OUTS(l)
 
+static inline void sync(void)
+{
+}
+
 #endif
index 79a9626b5500c171eaa6dbeef1681e91f922e9dc..7bbdefba7603151e794a9486fb1a1b44f8390796 100644 (file)
@@ -1 +1,8 @@
-/* */
+#ifndef __ASM_M68K_IO_H_
+#define __ASM_M68K_IO_H_
+
+static inline void sync(void)
+{
+}
+
+#endif /* __ASM_M68K_IO_H_ */
index 33590454cfd8de3b5dd2f014cab358a7b40ce9ff..1c77ade4f1a173bb1d0cd1325d9084f838aabf21 100644 (file)
@@ -125,4 +125,8 @@ io_outsl (unsigned long port, const void *src, unsigned long count)
 #define ioremap_writethrough(physaddr, size)   (physaddr)
 #define ioremap_fullcache(physaddr, size)      (physaddr)
 
+static inline void sync(void)
+{
+}
+
 #endif /* __MICROBLAZE_IO_H__ */
index 857fb0302ce2432e6b0173d096a14d5625deb2d3..cd4d5dc9d9e8e4ff158e18f89ceeb268d6e495e9 100644 (file)
@@ -447,4 +447,8 @@ extern void (*_dma_cache_inv)(unsigned long start, unsigned long size);
 #define dma_cache_wback(start,size)    _dma_cache_wback(start,size)
 #define dma_cache_inv(start,size)      _dma_cache_inv(start,size)
 
+static inline void sync(void)
+{
+}
+
 #endif /* _ASM_IO_H */
index 07499d966d5a6645daa61964e97b3941c197b787..d77695abb9e1ccd1c9ff30cb327c7f8bd0f31f95 100644 (file)
@@ -97,4 +97,8 @@ static inline void outsl (unsigned long port, const void *src, unsigned long cou
        while (count--) outl (*p++, port);
 }
 
+static inline void sync(void)
+{
+}
+
 #endif /* __ASM_NIOS_IO_H_ */
index 0fab53bf0e9ead5eb60825854f51e2d8bdf1c07f..5bb5322952f86884b0b8efe86afe659f9edce66e 100644 (file)
 #ifndef __ASM_NIOS2_IO_H_
 #define __ASM_NIOS2_IO_H_
 
-#define sync() asm volatile ("sync" : : : "memory");
+static inline void sync(void)
+{
+       __asm__ __volatile__ ("sync" : : : "memory");
+}
 
 extern unsigned char inb (unsigned char *port);
 extern unsigned short inw (unsigned short *port);
index 8e5fe113cb31b5e8f729ded45827d626b840b31f..bbc9ba0be655feb8a4f7d0edb1bac921c55ce19c 100644 (file)
@@ -95,8 +95,15 @@ extern void _outsl_ns(volatile u32 *port, const void *buf, int nl);
  * Acts as a barrier to ensure all previous I/O accesses have
  * completed before any further ones are issued.
  */
-#define eieio() __asm__ __volatile__ ("eieio" : : : "memory");
-#define sync()  __asm__ __volatile__ ("sync" : : : "memory");
+static inline void eieio(void)
+{
+       __asm__ __volatile__ ("eieio" : : : "memory");
+}
+
+static inline void sync(void)
+{
+       __asm__ __volatile__ ("sync" : : : "memory");
+}
 
 /* Enforce in-order execution of data I/O.
  * No distinction between read/write on PPC; use eieio for all three.