summaryrefslogtreecommitdiffstats
path: root/drivers/nor/cfi_flash_intel.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/nor/cfi_flash_intel.c')
-rw-r--r--drivers/nor/cfi_flash_intel.c52
1 files changed, 40 insertions, 12 deletions
diff --git a/drivers/nor/cfi_flash_intel.c b/drivers/nor/cfi_flash_intel.c
index 43447609d8..c3cbad55f9 100644
--- a/drivers/nor/cfi_flash_intel.c
+++ b/drivers/nor/cfi_flash_intel.c
@@ -9,18 +9,19 @@
*/
static void intel_read_jedec_ids (struct flash_info *info)
{
+ info->cmd_reset = FLASH_CMD_RESET;
info->manufacturer_id = 0;
info->device_id = 0;
info->device_id2 = 0;
- flash_write_cmd(info, 0, 0, FLASH_CMD_RESET);
+ flash_write_cmd(info, 0, 0, info->cmd_reset);
flash_write_cmd(info, 0, 0, FLASH_CMD_READ_ID);
udelay(1000); /* some flash are slow to respond */
- info->manufacturer_id = flash_read_uchar (info,
- FLASH_OFFSET_MANUFACTURER_ID);
+
+ info->manufacturer_id = jedec_read_mfr(info);
info->device_id = flash_read_uchar (info,
FLASH_OFFSET_DEVICE_ID);
- flash_write_cmd(info, 0, 0, FLASH_CMD_RESET);
+ flash_write_cmd(info, 0, 0, info->cmd_reset);
}
/*
@@ -54,11 +55,9 @@ static int intel_flash_write_cfibuffer (struct flash_info *info, ulong dest, con
flash_sect_t sector;
int cnt;
int retcode;
- volatile cfiptr_t src;
- volatile cfiptr_t dst;
+ void *src = (void*)cp;
+ void *dst = (void *)dest;
- src.cp = (uchar *)cp;
- dst.cp = (uchar *) dest;
sector = find_sector (info, dest);
flash_write_cmd (info, sector, 0, FLASH_CMD_CLEAR_STATUS);
flash_write_cmd (info, sector, 0, FLASH_CMD_WRITE_TO_BUFFER);
@@ -74,13 +73,17 @@ static int intel_flash_write_cfibuffer (struct flash_info *info, ulong dest, con
flash_write_cmd (info, sector, 0, (uchar) cnt - 1);
while (cnt-- > 0) {
if (bankwidth_is_1(info)) {
- *dst.cp++ = *src.cp++;
+ flash_write8(flash_read8(src), dst);
+ src += 1, dst += 1;
} else if (bankwidth_is_2(info)) {
- *dst.wp++ = *src.wp++;
+ flash_write16(flash_read16(src), dst);
+ src += 2, dst += 2;
} else if (bankwidth_is_4(info)) {
- *dst.lp++ = *src.lp++;
+ flash_write32(flash_read32(src), dst);
+ src += 4, dst += 4;
} else if (bankwidth_is_8(info)) {
- *dst.llp++ = *src.llp++;
+ flash_write64(flash_read64(src), dst);
+ src += 8, dst += 8;
}
}
@@ -126,6 +129,29 @@ static int intel_flash_status_check (struct flash_info *info, flash_sect_t secto
return retcode;
}
+static int intel_flash_real_protect (struct flash_info *info, long sector, int prot)
+{
+ 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
+ flash_write_cmd (info, sector, 0, FLASH_CMD_PROTECT_CLEAR);
+
+ return 0;
+}
+
+static void intel_flash_fixup (struct flash_info *info, struct cfi_qry *qry)
+{
+#ifdef CFG_FLASH_PROTECTION
+ /* read legacy lock/unlock bit from intel flash */
+ if (info->ext_addr) {
+ info->legacy_unlock = flash_read_uchar (info,
+ info->ext_addr + 5) & 0x08;
+ }
+#endif
+}
+
struct cfi_cmd_set cfi_cmd_set_intel = {
.flash_write_cfibuffer = intel_flash_write_cfibuffer,
.flash_erase_one = intel_flash_erase_one,
@@ -133,5 +159,7 @@ struct cfi_cmd_set cfi_cmd_set_intel = {
.flash_read_jedec_ids = intel_read_jedec_ids,
.flash_prepare_write = intel_flash_prepare_write,
.flash_status_check = intel_flash_status_check,
+ .flash_real_protect = intel_flash_real_protect,
+ .flash_fixup = intel_flash_fixup,
};