diff options
| -rw-r--r-- | drivers/mtd/cfi_flash.c | 25 | ||||
| -rw-r--r-- | include/flash.h | 1 | 
2 files changed, 25 insertions, 1 deletions
| diff --git a/drivers/mtd/cfi_flash.c b/drivers/mtd/cfi_flash.c index b2dfc5369..c8099db14 100644 --- a/drivers/mtd/cfi_flash.c +++ b/drivers/mtd/cfi_flash.c @@ -1128,7 +1128,7 @@ int flash_erase (flash_info_t * info, int s_first, int s_last)  						AMD_CMD_ERASE_START);  				flash_unlock_seq (info, sect);  				flash_write_cmd (info, sect, 0, -						 AMD_CMD_ERASE_SECTOR); +						 info->cmd_erase_sector);  				break;  #ifdef CONFIG_FLASH_CFI_LEGACY  			case CFI_CMDSET_AMD_LEGACY: @@ -1733,6 +1733,7 @@ static void cmdset_amd_read_jedec_ids(flash_info_t *info)  static int cmdset_amd_init(flash_info_t *info, struct cfi_qry *qry)  {  	info->cmd_reset = AMD_CMD_RESET; +	info->cmd_erase_sector = AMD_CMD_ERASE_SECTOR;  	cmdset_amd_read_jedec_ids(info);  	flash_write_cmd(info, 0, info->cfi_offset, FLASH_CMD_CFI); @@ -2003,6 +2004,25 @@ static void flash_fixup_stm(flash_info_t *info, struct cfi_qry *qry)  	}  } +static void flash_fixup_sst(flash_info_t *info, struct cfi_qry *qry) +{ +	/* +	 * SST, for many recent nor parallel flashes, says they are +	 * CFI-conformant. This is not true, since qry struct. +	 * reports a std. AMD command set (0x0002), while SST allows to +	 * erase two different sector sizes for the same memory. +	 * 64KB sector (SST call it block)  needs 0x30 to be erased. +	 * 4KB  sector (SST call it sector) needs 0x50 to be erased. +	 * Since CFI query detect the 4KB number of sectors, users expects +	 * a sector granularity of 4KB, and it is here set. +	 */ +	if (info->device_id == 0x5D23 || /* SST39VF3201B */ +	    info->device_id == 0x5C23) { /* SST39VF3202B */ +		/* set sector granularity to 4KB */ +		info->cmd_erase_sector=0x50; +	} +} +  /*   * The following code cannot be run from FLASH!   * @@ -2081,6 +2101,9 @@ ulong flash_get_size (phys_addr_t base, int banknum)  		case 0x0020:  			flash_fixup_stm(info, &qry);  			break; +		case 0x00bf: /* SST */ +			flash_fixup_sst(info, &qry); +			break;  		}  		debug ("manufacturer is %d\n", info->vendor); diff --git a/include/flash.h b/include/flash.h index 7db599e78..c7acc977e 100644 --- a/include/flash.h +++ b/include/flash.h @@ -44,6 +44,7 @@ typedef struct {  	ulong	buffer_write_tout;	/* maximum buffer write timeout		*/  	ushort	vendor;			/* the primary vendor id		*/  	ushort	cmd_reset;		/* vendor specific reset command	*/ +	uchar   cmd_erase_sector;	/* vendor specific erase sect. command	*/  	ushort	interface;		/* used for x8/x16 adjustments		*/  	ushort	legacy_unlock;		/* support Intel legacy (un)locking	*/  	ushort	manufacturer_id;	/* manufacturer id			*/ |