diff options
Diffstat (limited to 'drivers/mtd/cfi_flash.c')
| -rw-r--r-- | drivers/mtd/cfi_flash.c | 33 | 
1 files changed, 25 insertions, 8 deletions
| diff --git a/drivers/mtd/cfi_flash.c b/drivers/mtd/cfi_flash.c index 1191ef02f..44ebb9d06 100644 --- a/drivers/mtd/cfi_flash.c +++ b/drivers/mtd/cfi_flash.c @@ -1355,15 +1355,32 @@ int flash_real_protect (flash_info_t * info, long sector, int prot)  		case CFI_CMDSET_INTEL_PROG_REGIONS:  		case CFI_CMDSET_INTEL_STANDARD:  		case CFI_CMDSET_INTEL_EXTENDED: -			flash_write_cmd (info, sector, 0, -					 FLASH_CMD_CLEAR_STATUS); -			flash_write_cmd (info, sector, 0, FLASH_CMD_PROTECT); -			if (prot) -				flash_write_cmd (info, sector, 0, -					FLASH_CMD_PROTECT_SET); -			else +			/* +			 * see errata called +			 * "Numonyx Axcell P33/P30 Specification Update" :) +			 */ +			flash_write_cmd (info, sector, 0, FLASH_CMD_READ_ID); +			if (!flash_isequal (info, sector, FLASH_OFFSET_PROTECT, +					    prot)) { +				/* +				 * cmd must come before FLASH_CMD_PROTECT + 20us +				 * Disable interrupts which might cause a timeout here. +				 */ +				int flag = disable_interrupts (); +				unsigned short cmd; + +				if (prot) +					cmd = FLASH_CMD_PROTECT_SET; +				else +					cmd = FLASH_CMD_PROTECT_CLEAR; +  				flash_write_cmd (info, sector, 0, -					FLASH_CMD_PROTECT_CLEAR); +						  FLASH_CMD_PROTECT); +				flash_write_cmd (info, sector, 0, cmd); +				/* re-enable interrupts if necessary */ +				if (flag) +					enable_interrupts (); +			}  			break;  		case CFI_CMDSET_AMD_EXTENDED:  		case CFI_CMDSET_AMD_STANDARD: |