diff options
Diffstat (limited to 'drivers/mtd/cfi_flash.c')
| -rw-r--r-- | drivers/mtd/cfi_flash.c | 52 | 
1 files changed, 52 insertions, 0 deletions
| diff --git a/drivers/mtd/cfi_flash.c b/drivers/mtd/cfi_flash.c index 35294bc8c..50df9b0dd 100644 --- a/drivers/mtd/cfi_flash.c +++ b/drivers/mtd/cfi_flash.c @@ -1447,6 +1447,47 @@ int flash_real_protect (flash_info_t * info, long sector, int prot)  							0, ATM_CMD_UNLOCK_SECT);  				}  			} +			if (info->manufacturer_id == (uchar)AMD_MANUFACT) { +				int flag = disable_interrupts(); +				int lock_flag; + +				flash_unlock_seq(info, 0); +				flash_write_cmd(info, 0, info->addr_unlock1, +						AMD_CMD_SET_PPB_ENTRY); +				lock_flag = flash_isset(info, sector, 0, 0x01); +				if (prot) { +					if (lock_flag) { +						flash_write_cmd(info, sector, 0, +							AMD_CMD_PPB_LOCK_BC1); +						flash_write_cmd(info, sector, 0, +							AMD_CMD_PPB_LOCK_BC2); +					} +					debug("sector %ld %slocked\n", sector, +						lock_flag ? "" : "already "); +				} else { +					if (!lock_flag) { +						debug("unlock %ld\n", sector); +						flash_write_cmd(info, 0, 0, +							AMD_CMD_PPB_UNLOCK_BC1); +						flash_write_cmd(info, 0, 0, +							AMD_CMD_PPB_UNLOCK_BC2); +					} +					debug("sector %ld %sunlocked\n", sector, +						!lock_flag ? "" : "already "); +				} +				if (flag) +					enable_interrupts(); + +				if (flash_status_check(info, sector, +						info->erase_blk_tout, +						prot ? "protect" : "unprotect")) +					printf("status check error\n"); + +				flash_write_cmd(info, 0, 0, +						AMD_CMD_SET_PPB_EXIT_BC1); +				flash_write_cmd(info, 0, 0, +						AMD_CMD_SET_PPB_EXIT_BC2); +			}  			break;  #ifdef CONFIG_FLASH_CFI_LEGACY  		case CFI_CMDSET_AMD_LEGACY: @@ -1635,6 +1676,17 @@ static int cmdset_amd_init(flash_info_t *info, struct cfi_qry *qry)  	cmdset_amd_read_jedec_ids(info);  	flash_write_cmd(info, 0, info->cfi_offset, FLASH_CMD_CFI); +#ifdef CONFIG_SYS_FLASH_PROTECTION +	if (info->ext_addr && info->manufacturer_id == (uchar)AMD_MANUFACT) { +		ushort spus; + +		/* read sector protect/unprotect scheme */ +		spus = flash_read_uchar(info, info->ext_addr + 9); +		if (spus == 0x8) +			info->legacy_unlock = 1; +	} +#endif +  	return 0;  } |