Convert CONFIG_SYS_FLASH_CFI_WIDTH to Kconfig
[platform/kernel/u-boot.git] / drivers / mtd / cfi_flash.c
index b4512e3..4950410 100644 (file)
@@ -68,13 +68,6 @@ static uint flash_verbose = 1;
 
 flash_info_t flash_info[CFI_MAX_FLASH_BANKS];  /* FLASH chips info */
 
-/*
- * Check if chip width is defined. If not, start detecting with 8bit.
- */
-#ifndef CONFIG_SYS_FLASH_CFI_WIDTH
-#define CONFIG_SYS_FLASH_CFI_WIDTH     FLASH_CFI_8BIT
-#endif
-
 #ifdef CONFIG_CFI_FLASH_USE_WEAK_ACCESSORS
 #define __maybe_weak __weak
 #else
@@ -96,7 +89,7 @@ static u16 cfi_flash_config_reg(int i)
 }
 
 #if defined(CONFIG_SYS_MAX_FLASH_BANKS_DETECT)
-int cfi_flash_num_flash_banks = CONFIG_SYS_MAX_FLASH_BANKS_DETECT;
+int cfi_flash_num_flash_banks = CFI_MAX_FLASH_BANKS;
 #else
 int cfi_flash_num_flash_banks;
 #endif
@@ -191,7 +184,7 @@ static flash_info_t *flash_get_info(ulong base)
        int i;
        flash_info_t *info;
 
-       for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; i++) {
+       for (i = 0; i < CFI_FLASH_BANKS; i++) {
                info = &flash_info[i];
                if (info->size && info->start[0] <= base &&
                    base <= info->start[0] + info->size - 1)
@@ -218,7 +211,7 @@ flash_map(flash_info_t *info, flash_sect_t sect, uint offset)
 {
        unsigned int byte_offset = offset * info->portwidth;
 
-       return (void *)(info->start[sect] + byte_offset);
+       return (void *)(info->start[sect] + (byte_offset << info->chip_lsb));
 }
 
 static inline void flash_unmap(flash_info_t *info, flash_sect_t sect,
@@ -1918,12 +1911,27 @@ static int __flash_detect_cfi(flash_info_t *info, struct cfi_qry *qry)
                        flash_read_cfi(info, qry, FLASH_OFFSET_CFI_RESP,
                                       sizeof(struct cfi_qry));
                        info->interface = le16_to_cpu(qry->interface_desc);
+                       /* Some flash chips can support multiple bus widths.
+                        * In this case, override the interface width and
+                        * limit it to the port width.
+                        */
+                       if ((info->interface == FLASH_CFI_X8X16) &&
+                                       (info->portwidth == FLASH_CFI_8BIT)) {
+                               debug("Overriding 16-bit interface width to"
+                                               " 8-bit port width\n");
+                               info->interface = FLASH_CFI_X8;
+                       } else if ((info->interface == FLASH_CFI_X16X32) &&
+                                       (info->portwidth == FLASH_CFI_16BIT)) {
+                               debug("Overriding 16-bit interface width to"
+                                               " 16-bit port width\n");
+                               info->interface = FLASH_CFI_X16;
+                       }
 
                        info->cfi_offset = flash_offset_cfi[cfi_offset];
                        debug("device interface is %d\n",
                              info->interface);
-                       debug("found port %d chip %d ",
-                             info->portwidth, info->chipwidth);
+                       debug("found port %d chip %d chip_lsb %d ",
+                             info->portwidth, info->chipwidth, info->chip_lsb);
                        debug("port %d bits chip %d bits\n",
                              info->portwidth << CFI_FLASH_SHIFT_WIDTH,
                              info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
@@ -1962,9 +1970,23 @@ static int flash_detect_cfi(flash_info_t *info, struct cfi_qry *qry)
             info->portwidth <= FLASH_CFI_64BIT; info->portwidth <<= 1) {
                for (info->chipwidth = FLASH_CFI_BY8;
                     info->chipwidth <= info->portwidth;
-                    info->chipwidth <<= 1)
+                    info->chipwidth <<= 1) {
+                       /*
+                        * First, try detection without shifting the addresses
+                        * for 8bit devices (16bit wide connection)
+                        */
+                       info->chip_lsb = 0;
                        if (__flash_detect_cfi(info, qry))
                                return 1;
+
+                       /*
+                        * Not detected, so let's try with shifting
+                        * for 8bit devices
+                        */
+                       info->chip_lsb = 1;
+                       if (__flash_detect_cfi(info, qry))
+                               return 1;
+               }
        }
        debug("not found\n");
        return 0;
@@ -2247,12 +2269,12 @@ ulong flash_get_size(phys_addr_t base, int banknum)
                                        flash_unlock_seq(info, 0);
                                        flash_write_cmd(info, 0,
                                                        info->addr_unlock1,
-                                                       FLASH_CMD_READ_ID);
+                                                       AMD_CMD_SET_PPB_ENTRY);
                                        info->protect[sect_cnt] =
-                                               flash_isset(
-                                                       info, sect_cnt,
-                                                       FLASH_OFFSET_PROTECT,
-                                                       FLASH_STATUS_PROTECT);
+                                               !flash_isset(info, sect_cnt,
+                                                            0, 0x01);
+                                       flash_write_cmd(info, 0, 0,
+                                                       info->cmd_reset);
                                        break;
                                default:
                                        /* default: not protected */
@@ -2390,7 +2412,7 @@ unsigned long flash_init(void)
 #endif
 
        /* Init: no FLASHes known */
-       for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; ++i) {
+       for (i = 0; i < CFI_FLASH_BANKS; ++i) {
                flash_info[i].flash_id = FLASH_UNKNOWN;
 
                /* Optionally write flash configuration register */