]> git.sur5r.net Git - u-boot/blobdiff - drivers/mtd/cfi_flash.c
Merge branch 'master' of git://git.denx.de/u-boot-nand-flash
[u-boot] / drivers / mtd / cfi_flash.c
index 24e9b9fa2e52c0affd3bd12b0fd09e0a7032da23..e8afe9985c8c5598763e9a863914ca9d92be4fcb 100644 (file)
@@ -158,6 +158,7 @@ typedef union {
 #define NUM_ERASE_REGIONS      4 /* max. number of erase regions */
 
 static uint flash_offset_cfi[2] = { FLASH_OFFSET_CFI, FLASH_OFFSET_CFI_ALT };
+static uint flash_verbose = 1;
 
 /* use CONFIG_SYS_MAX_FLASH_BANKS_DETECT if defined */
 #ifdef CONFIG_SYS_MAX_FLASH_BANKS_DETECT
@@ -175,8 +176,6 @@ flash_info_t flash_info[CFI_MAX_FLASH_BANKS];       /* FLASH chips info */
 #define CONFIG_SYS_FLASH_CFI_WIDTH     FLASH_CFI_8BIT
 #endif
 
-typedef unsigned long flash_sect_t;
-
 /* CFI standard query structure */
 struct cfi_qry {
        u8      qry[3];
@@ -209,38 +208,38 @@ struct cfi_pri_hdr {
        u8      minor_version;
 } __attribute__((packed));
 
-static void flash_write8(u8 value, void *addr)
+static void __flash_write8(u8 value, void *addr)
 {
        __raw_writeb(value, addr);
 }
 
-static void flash_write16(u16 value, void *addr)
+static void __flash_write16(u16 value, void *addr)
 {
        __raw_writew(value, addr);
 }
 
-static void flash_write32(u32 value, void *addr)
+static void __flash_write32(u32 value, void *addr)
 {
        __raw_writel(value, addr);
 }
 
-static void flash_write64(u64 value, void *addr)
+static void __flash_write64(u64 value, void *addr)
 {
        /* No architectures currently implement __raw_writeq() */
        *(volatile u64 *)addr = value;
 }
 
-static u8 flash_read8(void *addr)
+static u8 __flash_read8(void *addr)
 {
        return __raw_readb(addr);
 }
 
-static u16 flash_read16(void *addr)
+static u16 __flash_read16(void *addr)
 {
        return __raw_readw(addr);
 }
 
-static u32 flash_read32(void *addr)
+static u32 __flash_read32(void *addr)
 {
        return __raw_readl(addr);
 }
@@ -251,7 +250,25 @@ static u64 __flash_read64(void *addr)
        return *(volatile u64 *)addr;
 }
 
+#ifdef CONFIG_CFI_FLASH_USE_WEAK_ACCESSORS
+void flash_write8(u8 value, void *addr)__attribute__((weak, alias("__flash_write8")));
+void flash_write16(u16 value, void *addr)__attribute__((weak, alias("__flash_write16")));
+void flash_write32(u32 value, void *addr)__attribute__((weak, alias("__flash_write32")));
+void flash_write64(u64 value, void *addr)__attribute__((weak, alias("__flash_write64")));
+u8 flash_read8(void *addr)__attribute__((weak, alias("__flash_read8")));
+u16 flash_read16(void *addr)__attribute__((weak, alias("__flash_read16")));
+u32 flash_read32(void *addr)__attribute__((weak, alias("__flash_read32")));
 u64 flash_read64(void *addr)__attribute__((weak, alias("__flash_read64")));
+#else
+#define flash_write8   __flash_write8
+#define flash_write16  __flash_write16
+#define flash_write32  __flash_write32
+#define flash_write64  __flash_write64
+#define flash_read8    __flash_read8
+#define flash_read16   __flash_read16
+#define flash_read32   __flash_read32
+#define flash_read64   __flash_read64
+#endif
 
 /*-----------------------------------------------------------------------
  */
@@ -1054,7 +1071,7 @@ int flash_erase (flash_info_t * info, int s_first, int s_last)
        if (prot) {
                printf ("- Warning: %d protected sectors will not be erased!\n",
                        prot);
-       } else {
+       } else if (flash_verbose) {
                putc ('\n');
        }
 
@@ -1101,11 +1118,14 @@ int flash_erase (flash_info_t * info, int s_first, int s_last)
                        if (flash_full_status_check
                            (info, sect, info->erase_blk_tout, "erase")) {
                                rcode = 1;
-                       } else
+                       } else if (flash_verbose)
                                putc ('.');
                }
        }
-       puts (" done\n");
+
+       if (flash_verbose)
+               puts (" done\n");
+
        return rcode;
 }
 
@@ -1217,14 +1237,16 @@ void flash_print_info (flash_info_t * info)
  */
 #ifdef CONFIG_FLASH_SHOW_PROGRESS
 #define FLASH_SHOW_PROGRESS(scale, dots, digit, dots_sub) \
-       dots -= dots_sub; \
-       if ((scale > 0) && (dots <= 0)) { \
-               if ((digit % 5) == 0) \
-                       printf ("%d", digit / 5); \
-               else \
-                       putc ('.'); \
-               digit--; \
-               dots += scale; \
+       if (flash_verbose) { \
+               dots -= dots_sub; \
+               if ((scale > 0) && (dots <= 0)) { \
+                       if ((digit % 5) == 0) \
+                               printf ("%d", digit / 5); \
+                       else \
+                               putc ('.'); \
+                       digit--; \
+                       dots += scale; \
+               } \
        }
 #else
 #define FLASH_SHOW_PROGRESS(scale, dots, digit, dots_sub)
@@ -1942,6 +1964,11 @@ ulong flash_get_size (ulong base, int banknum)
        return (info->size);
 }
 
+void flash_set_verbose(uint v)
+{
+       flash_verbose = v;
+}
+
 /*-----------------------------------------------------------------------
  */
 unsigned long flash_init (void)
@@ -2060,5 +2087,10 @@ unsigned long flash_init (void)
                               flash_get_info(apl[i].start));
        }
 #endif
+
+#ifdef CONFIG_FLASH_CFI_MTD
+       cfi_mtd_init();
+#endif
+
        return (size);
 }