Lines Matching +full:cfi +full:- +full:flash
1 // SPDX-License-Identifier: GPL-2.0
3 * Common Flash Interface support:
14 * XIP support hooks by Vitaly Wool (based on code for Intel flash
17 * 25/09/2008 Christopher Moore: TopBottom fixup for many Macronix with CFI V1.0
37 #include <linux/mtd/cfi.h>
52 * Status Register bit description. Used by flash devices that don't
118 * CFI Primary Vendor-Specific Extended Query table 1.5
120 static int cfi_use_status_reg(struct cfi_private *cfi) in cfi_use_status_reg() argument
122 struct cfi_pri_amdstd *extp = cfi->cmdset_priv; in cfi_use_status_reg()
125 return extp && extp->MinorVersion >= '5' && in cfi_use_status_reg()
126 (extp->SoftwareFeatures & poll_mask) == CFI_POLL_STATUS_REG; in cfi_use_status_reg()
132 struct cfi_private *cfi = map->fldrv_priv; in cfi_check_err_status() local
135 if (!cfi_use_status_reg(cfi)) in cfi_check_err_status()
138 cfi_send_gen_cmd(0x70, cfi->addr_unlock1, chip->start, map, cfi, in cfi_check_err_status()
139 cfi->device_type, NULL); in cfi_check_err_status()
151 map->name, chipstatus); in cfi_check_err_status()
154 map->name, chipstatus); in cfi_check_err_status()
157 map->name, chipstatus); in cfi_check_err_status()
160 map->name, chipstatus); in cfi_check_err_status()
184 printk(" Silicon revision: %d\n", extp->SiliconRevision >> 1); in cfi_tell_features()
186 (extp->SiliconRevision & 1) ? "Not required" : "Required"); in cfi_tell_features()
188 if (extp->EraseSuspend < ARRAY_SIZE(erase_suspend)) in cfi_tell_features()
189 printk(" Erase Suspend: %s\n", erase_suspend[extp->EraseSuspend]); in cfi_tell_features()
191 printk(" Erase Suspend: Unknown value %d\n", extp->EraseSuspend); in cfi_tell_features()
193 if (extp->BlkProt == 0) in cfi_tell_features()
196 printk(" Block protection: %d sectors per group\n", extp->BlkProt); in cfi_tell_features()
200 extp->TmpBlkUnprotect ? "Supported" : "Not supported"); in cfi_tell_features()
201 printk(" Block protect/unprotect scheme: %d\n", extp->BlkProtUnprot); in cfi_tell_features()
202 printk(" Number of simultaneous operations: %d\n", extp->SimultaneousOps); in cfi_tell_features()
204 extp->BurstMode ? "Supported" : "Not supported"); in cfi_tell_features()
205 if (extp->PageMode == 0) in cfi_tell_features()
208 printk(" Page mode: %d word page\n", extp->PageMode << 2); in cfi_tell_features()
211 extp->VppMin >> 4, extp->VppMin & 0xf); in cfi_tell_features()
213 extp->VppMax >> 4, extp->VppMax & 0xf); in cfi_tell_features()
215 if (extp->TopBottom < ARRAY_SIZE(top_bottom)) in cfi_tell_features()
216 printk(" Top/Bottom Boot Block: %s\n", top_bottom[extp->TopBottom]); in cfi_tell_features()
218 printk(" Top/Bottom Boot Block: Unknown value %d\n", extp->TopBottom); in cfi_tell_features()
226 struct map_info *map = mtd->priv; in fixup_amd_bootblock()
227 struct cfi_private *cfi = map->fldrv_priv; in fixup_amd_bootblock() local
228 struct cfi_pri_amdstd *extp = cfi->cmdset_priv; in fixup_amd_bootblock()
229 __u8 major = extp->MajorVersion; in fixup_amd_bootblock()
230 __u8 minor = extp->MinorVersion; in fixup_amd_bootblock()
233 /* CFI version 1.0 => don't trust bootloc */ in fixup_amd_bootblock()
236 map->name, cfi->mfr, cfi->id); in fixup_amd_bootblock()
239 * of 0x22BA in 16-bit mode and 0xBA in 8-bit mode. in fixup_amd_bootblock()
243 if (((cfi->id == 0xBA) || (cfi->id == 0x22BA)) && in fixup_amd_bootblock()
245 /* Macronix added CFI to their 2nd generation in fixup_amd_bootblock()
248 * has CFI. in fixup_amd_bootblock()
252 * the 8-bit device ID. in fixup_amd_bootblock()
254 (cfi->mfr == CFI_MFR_MACRONIX)) { in fixup_amd_bootblock()
256 " detected\n", map->name); in fixup_amd_bootblock()
257 extp->TopBottom = 2; /* bottom boot */ in fixup_amd_bootblock()
259 if (cfi->id & 0x80) { in fixup_amd_bootblock()
260 …tk(KERN_WARNING "%s: JEDEC Device ID is 0x%02X. Assuming broken CFI table.\n", map->name, cfi->id); in fixup_amd_bootblock()
261 extp->TopBottom = 3; /* top boot */ in fixup_amd_bootblock()
263 extp->TopBottom = 2; /* bottom boot */ in fixup_amd_bootblock()
266 pr_debug("%s: AMD CFI PRI V%c.%c has no boot block field;" in fixup_amd_bootblock()
267 " deduced %s from Device ID\n", map->name, major, minor, in fixup_amd_bootblock()
268 extp->TopBottom == 2 ? "bottom" : "top"); in fixup_amd_bootblock()
276 struct map_info *map = mtd->priv; in fixup_use_write_buffers()
277 struct cfi_private *cfi = map->fldrv_priv; in fixup_use_write_buffers() local
279 if (cfi->mfr == CFI_MFR_AMD && cfi->id == 0x2201) in fixup_use_write_buffers()
282 if (cfi->cfiq->BufWriteTimeoutTyp) { in fixup_use_write_buffers()
284 mtd->_write = cfi_amdstd_write_buffers; in fixup_use_write_buffers()
292 struct map_info *map = mtd->priv; in fixup_convert_atmel_pri()
293 struct cfi_private *cfi = map->fldrv_priv; in fixup_convert_atmel_pri() local
294 struct cfi_pri_amdstd *extp = cfi->cmdset_priv; in fixup_convert_atmel_pri()
298 memset((char *)extp + 5, 0, sizeof(*extp) - 5); in fixup_convert_atmel_pri()
301 extp->EraseSuspend = 2; in fixup_convert_atmel_pri()
304 if (cfi->id == AT49BV6416) { in fixup_convert_atmel_pri()
306 extp->TopBottom = 3; in fixup_convert_atmel_pri()
308 extp->TopBottom = 2; in fixup_convert_atmel_pri()
311 extp->TopBottom = 2; in fixup_convert_atmel_pri()
313 extp->TopBottom = 3; in fixup_convert_atmel_pri()
317 cfi->cfiq->BufWriteTimeoutTyp = 0; in fixup_convert_atmel_pri()
318 cfi->cfiq->BufWriteTimeoutMax = 0; in fixup_convert_atmel_pri()
324 mtd->_read_user_prot_reg = cfi_amdstd_secsi_read; in fixup_use_secsi()
325 mtd->_read_fact_prot_reg = cfi_amdstd_secsi_read; in fixup_use_secsi()
330 struct map_info *map = mtd->priv; in fixup_use_erase_chip()
331 struct cfi_private *cfi = map->fldrv_priv; in fixup_use_erase_chip() local
332 if ((cfi->cfiq->NumEraseRegions == 1) && in fixup_use_erase_chip()
333 ((cfi->cfiq->EraseRegionInfo[0] & 0xffff) == 0)) { in fixup_use_erase_chip()
334 mtd->_erase = cfi_amdstd_erase_chip; in fixup_use_erase_chip()
340 * Some Atmel chips (e.g. the AT49BV6416) power-up with all sectors
345 mtd->_lock = cfi_atmel_lock; in fixup_use_atmel_lock()
346 mtd->_unlock = cfi_atmel_unlock; in fixup_use_atmel_lock()
347 mtd->flags |= MTD_POWERUP_LOCK; in fixup_use_atmel_lock()
352 struct map_info *map = mtd->priv; in fixup_old_sst_eraseregion()
353 struct cfi_private *cfi = map->fldrv_priv; in fixup_old_sst_eraseregion() local
357 * sector_erase-size and block_erase-size, although they both operate on the in fixup_old_sst_eraseregion()
358 * same memory. This is not allowed according to CFI, so we just pick the in fixup_old_sst_eraseregion()
359 * sector_erase-size. in fixup_old_sst_eraseregion()
361 cfi->cfiq->NumEraseRegions = 1; in fixup_old_sst_eraseregion()
366 struct map_info *map = mtd->priv; in fixup_sst39vf()
367 struct cfi_private *cfi = map->fldrv_priv; in fixup_sst39vf() local
371 cfi->addr_unlock1 = 0x5555; in fixup_sst39vf()
372 cfi->addr_unlock2 = 0x2AAA; in fixup_sst39vf()
377 struct map_info *map = mtd->priv; in fixup_sst39vf_rev_b()
378 struct cfi_private *cfi = map->fldrv_priv; in fixup_sst39vf_rev_b() local
382 cfi->addr_unlock1 = 0x555; in fixup_sst39vf_rev_b()
383 cfi->addr_unlock2 = 0x2AA; in fixup_sst39vf_rev_b()
385 cfi->sector_erase_cmd = CMD(0x50); in fixup_sst39vf_rev_b()
390 struct map_info *map = mtd->priv; in fixup_sst38vf640x_sectorsize()
391 struct cfi_private *cfi = map->fldrv_priv; in fixup_sst38vf640x_sectorsize() local
396 * CFI reports 1024 sectors (0x03ff+1) of 64KBytes (0x0100*256) where in fixup_sst38vf640x_sectorsize()
399 cfi->cfiq->EraseRegionInfo[0] = 0x002003ff; in fixup_sst38vf640x_sectorsize()
400 pr_warn("%s: Bad 38VF640x CFI data; adjusting sector size from 64 to 8KiB\n", in fixup_sst38vf640x_sectorsize()
401 mtd->name); in fixup_sst38vf640x_sectorsize()
406 struct map_info *map = mtd->priv; in fixup_s29gl064n_sectors()
407 struct cfi_private *cfi = map->fldrv_priv; in fixup_s29gl064n_sectors() local
409 if ((cfi->cfiq->EraseRegionInfo[0] & 0xffff) == 0x003f) { in fixup_s29gl064n_sectors()
410 cfi->cfiq->EraseRegionInfo[0] |= 0x0040; in fixup_s29gl064n_sectors()
411 pr_warn("%s: Bad S29GL064N CFI data; adjust from 64 to 128 sectors\n", in fixup_s29gl064n_sectors()
412 mtd->name); in fixup_s29gl064n_sectors()
418 struct map_info *map = mtd->priv; in fixup_s29gl032n_sectors()
419 struct cfi_private *cfi = map->fldrv_priv; in fixup_s29gl032n_sectors() local
421 if ((cfi->cfiq->EraseRegionInfo[1] & 0xffff) == 0x007e) { in fixup_s29gl032n_sectors()
422 cfi->cfiq->EraseRegionInfo[1] &= ~0x0040; in fixup_s29gl032n_sectors()
423 pr_warn("%s: Bad S29GL032N CFI data; adjust from 127 to 63 sectors\n", in fixup_s29gl032n_sectors()
424 mtd->name); in fixup_s29gl032n_sectors()
430 struct map_info *map = mtd->priv; in fixup_s29ns512p_sectors()
431 struct cfi_private *cfi = map->fldrv_priv; in fixup_s29ns512p_sectors() local
434 * S29NS512P flash uses more than 8bits to report number of sectors, in fixup_s29ns512p_sectors()
435 * which is not permitted by CFI. in fixup_s29ns512p_sectors()
437 cfi->cfiq->EraseRegionInfo[0] = 0x020001ff; in fixup_s29ns512p_sectors()
438 pr_warn("%s: Bad S29NS512P CFI data; adjust to 512 sectors\n", in fixup_s29ns512p_sectors()
439 mtd->name); in fixup_s29ns512p_sectors()
444 struct map_info *map = mtd->priv; in fixup_quirks()
445 struct cfi_private *cfi = map->fldrv_priv; in fixup_quirks() local
447 if (cfi->mfr == CFI_MFR_AMD && cfi->id == S29GL064N_MN12) in fixup_quirks()
448 cfi->quirks |= CFI_QUIRK_DQ_TRUE_DATA; in fixup_quirks()
451 /* Used to fix CFI-Tables of chips without Extended Query Tables */
500 /* The CFI vendor ids and the JEDEC vendor IDs appear
511 static void cfi_fixup_major_minor(struct cfi_private *cfi, in cfi_fixup_major_minor() argument
514 if (cfi->mfr == CFI_MFR_SAMSUNG) { in cfi_fixup_major_minor()
515 if ((extp->MajorVersion == '0' && extp->MinorVersion == '0') || in cfi_fixup_major_minor()
516 (extp->MajorVersion == '3' && extp->MinorVersion == '3')) { in cfi_fixup_major_minor()
524 extp->MinorVersion); in cfi_fixup_major_minor()
525 extp->MajorVersion = '1'; in cfi_fixup_major_minor()
532 if (cfi->mfr == CFI_MFR_SST && (cfi->id >> 4) == 0x0536) { in cfi_fixup_major_minor()
533 extp->MajorVersion = '1'; in cfi_fixup_major_minor()
534 extp->MinorVersion = '0'; in cfi_fixup_major_minor()
538 static int is_m29ew(struct cfi_private *cfi) in is_m29ew() argument
540 if (cfi->mfr == CFI_MFR_INTEL && in is_m29ew()
541 ((cfi->device_type == CFI_DEVICETYPE_X8 && (cfi->id & 0xff) == 0x7e) || in is_m29ew()
542 (cfi->device_type == CFI_DEVICETYPE_X16 && cfi->id == 0x227e))) in is_m29ew()
548 * From TN-13-07: Patching the Linux Kernel and U-Boot for M29 Flash, page 20:
551 * Erase Confirm -> Suspend -> Program -> Resume
554 * and prior to resuming. [...] The work-around is to issue a dummy write cycle
560 struct cfi_private *cfi = map->fldrv_priv; in cfi_fixup_m29ew_erase_suspend() local
562 if (is_m29ew(cfi)) in cfi_fixup_m29ew_erase_suspend()
567 * From TN-13-07: Patching the Linux Kernel and U-Boot for M29 Flash, page 22:
573 * (no bits are toggling), the contents of the Flash memory block on which
578 * operations on the Flash are intensive. As a result, it is recommended
580 * calls to the garbage routine to free Flash space (also by erasing physical
581 * Flash blocks) and as a result, many consecutive SUSPEND and RESUME
590 static void cfi_fixup_m29ew_delay_after_resume(struct cfi_private *cfi) in cfi_fixup_m29ew_delay_after_resume() argument
593 * Resolving the Delay After Resume Issue see Micron TN-13-07 in cfi_fixup_m29ew_delay_after_resume()
594 * Worst case delay must be 500µs but 30-50µs should be ok as well in cfi_fixup_m29ew_delay_after_resume()
596 if (is_m29ew(cfi)) in cfi_fixup_m29ew_delay_after_resume()
602 struct cfi_private *cfi = map->fldrv_priv; in cfi_cmdset_0002() local
603 struct device_node __maybe_unused *np = map->device_node; in cfi_cmdset_0002()
610 mtd->priv = map; in cfi_cmdset_0002()
611 mtd->type = MTD_NORFLASH; in cfi_cmdset_0002()
614 mtd->_erase = cfi_amdstd_erase_varsize; in cfi_cmdset_0002()
615 mtd->_write = cfi_amdstd_write_words; in cfi_cmdset_0002()
616 mtd->_read = cfi_amdstd_read; in cfi_cmdset_0002()
617 mtd->_sync = cfi_amdstd_sync; in cfi_cmdset_0002()
618 mtd->_suspend = cfi_amdstd_suspend; in cfi_cmdset_0002()
619 mtd->_resume = cfi_amdstd_resume; in cfi_cmdset_0002()
620 mtd->_read_user_prot_reg = cfi_amdstd_read_user_prot_reg; in cfi_cmdset_0002()
621 mtd->_read_fact_prot_reg = cfi_amdstd_read_fact_prot_reg; in cfi_cmdset_0002()
622 mtd->_get_fact_prot_info = cfi_amdstd_get_fact_prot_info; in cfi_cmdset_0002()
623 mtd->_get_user_prot_info = cfi_amdstd_get_user_prot_info; in cfi_cmdset_0002()
624 mtd->_write_user_prot_reg = cfi_amdstd_write_user_prot_reg; in cfi_cmdset_0002()
625 mtd->_lock_user_prot_reg = cfi_amdstd_lock_user_prot_reg; in cfi_cmdset_0002()
626 mtd->flags = MTD_CAP_NORFLASH; in cfi_cmdset_0002()
627 mtd->name = map->name; in cfi_cmdset_0002()
628 mtd->writesize = 1; in cfi_cmdset_0002()
629 mtd->writebufsize = cfi_interleave(cfi) << cfi->cfiq->MaxBufWriteSize; in cfi_cmdset_0002()
632 mtd->writebufsize); in cfi_cmdset_0002()
634 mtd->_panic_write = cfi_amdstd_panic_write; in cfi_cmdset_0002()
635 mtd->reboot_notifier.notifier_call = cfi_amdstd_reboot; in cfi_cmdset_0002()
637 if (cfi->cfi_mode==CFI_MODE_CFI){ in cfi_cmdset_0002()
639 __u16 adr = primary?cfi->cfiq->P_ADR:cfi->cfiq->A_ADR; in cfi_cmdset_0002()
645 * It's a real CFI chip, not one for which the probe in cfi_cmdset_0002()
646 * routine faked a CFI structure. in cfi_cmdset_0002()
648 cfi_fixup_major_minor(cfi, extp); in cfi_cmdset_0002()
652 * see: http://cs.ozerki.net/zap/pub/axim-x5/docs/cfi_r20.pdf, page 19 in cfi_cmdset_0002()
654 * http://www.spansion.com/Support/Datasheets/s29ws-p_00_a12_e.pdf in cfi_cmdset_0002()
657 if (extp->MajorVersion != '1' || in cfi_cmdset_0002()
658 (extp->MajorVersion == '1' && (extp->MinorVersion < '0' || extp->MinorVersion > '5'))) { in cfi_cmdset_0002()
661 extp->MajorVersion, extp->MinorVersion, in cfi_cmdset_0002()
662 extp->MajorVersion, extp->MinorVersion); in cfi_cmdset_0002()
669 extp->MajorVersion, extp->MinorVersion); in cfi_cmdset_0002()
672 cfi->cmdset_priv = extp; in cfi_cmdset_0002()
674 /* Apply cfi device specific fixups */ in cfi_cmdset_0002()
684 np, "use-advanced-sector-protection") in cfi_cmdset_0002()
685 && extp->BlkProtUnprot == 8) { in cfi_cmdset_0002()
687 mtd->_lock = cfi_ppb_lock; in cfi_cmdset_0002()
688 mtd->_unlock = cfi_ppb_unlock; in cfi_cmdset_0002()
689 mtd->_is_locked = cfi_ppb_is_locked; in cfi_cmdset_0002()
693 bootloc = extp->TopBottom; in cfi_cmdset_0002()
695 printk(KERN_WARNING "%s: CFI contains unrecognised boot " in cfi_cmdset_0002()
697 map->name, bootloc); in cfi_cmdset_0002()
701 if (bootloc == 3 && cfi->cfiq->NumEraseRegions > 1) { in cfi_cmdset_0002()
702 printk(KERN_WARNING "%s: Swapping erase regions for top-boot CFI table.\n", map->name); in cfi_cmdset_0002()
704 for (i=0; i<cfi->cfiq->NumEraseRegions / 2; i++) { in cfi_cmdset_0002()
705 int j = (cfi->cfiq->NumEraseRegions-1)-i; in cfi_cmdset_0002()
707 swap(cfi->cfiq->EraseRegionInfo[i], in cfi_cmdset_0002()
708 cfi->cfiq->EraseRegionInfo[j]); in cfi_cmdset_0002()
711 /* Set the default CFI lock/unlock addresses */ in cfi_cmdset_0002()
712 cfi->addr_unlock1 = 0x555; in cfi_cmdset_0002()
713 cfi->addr_unlock2 = 0x2aa; in cfi_cmdset_0002()
717 if (!cfi->addr_unlock1 || !cfi->addr_unlock2) { in cfi_cmdset_0002()
722 } /* CFI mode */ in cfi_cmdset_0002()
723 else if (cfi->cfi_mode == CFI_MODE_JEDEC) { in cfi_cmdset_0002()
730 for (i=0; i< cfi->numchips; i++) { in cfi_cmdset_0002()
731 cfi->chips[i].word_write_time = 1<<cfi->cfiq->WordWriteTimeoutTyp; in cfi_cmdset_0002()
732 cfi->chips[i].buffer_write_time = 1<<cfi->cfiq->BufWriteTimeoutTyp; in cfi_cmdset_0002()
733 cfi->chips[i].erase_time = 1<<cfi->cfiq->BlockEraseTimeoutTyp; in cfi_cmdset_0002()
736 * of struct cfi_ident that probed from chip's CFI aera, if in cfi_cmdset_0002()
737 * available. Specify a minimum of 2000us, in case the CFI data in cfi_cmdset_0002()
740 if (cfi->cfiq->BufWriteTimeoutTyp && in cfi_cmdset_0002()
741 cfi->cfiq->BufWriteTimeoutMax) in cfi_cmdset_0002()
742 cfi->chips[i].buffer_write_time_max = in cfi_cmdset_0002()
743 1 << (cfi->cfiq->BufWriteTimeoutTyp + in cfi_cmdset_0002()
744 cfi->cfiq->BufWriteTimeoutMax); in cfi_cmdset_0002()
746 cfi->chips[i].buffer_write_time_max = 0; in cfi_cmdset_0002()
748 cfi->chips[i].buffer_write_time_max = in cfi_cmdset_0002()
749 max(cfi->chips[i].buffer_write_time_max, 2000); in cfi_cmdset_0002()
751 cfi->chips[i].ref_point_counter = 0; in cfi_cmdset_0002()
752 init_waitqueue_head(&(cfi->chips[i].wq)); in cfi_cmdset_0002()
755 map->fldrv = &cfi_amdstd_chipdrv; in cfi_cmdset_0002()
767 struct map_info *map = mtd->priv; in cfi_amdstd_setup()
768 struct cfi_private *cfi = map->fldrv_priv; in cfi_amdstd_setup() local
769 unsigned long devsize = (1<<cfi->cfiq->DevSize) * cfi->interleave; in cfi_amdstd_setup()
774 (cfi->cfi_mode == CFI_MODE_CFI)?"CFI":"JEDEC",cfi->numchips); in cfi_amdstd_setup()
776 mtd->size = devsize * cfi->numchips; in cfi_amdstd_setup()
778 mtd->numeraseregions = cfi->cfiq->NumEraseRegions * cfi->numchips; in cfi_amdstd_setup()
779 mtd->eraseregions = kmalloc_array(mtd->numeraseregions, in cfi_amdstd_setup()
782 if (!mtd->eraseregions) in cfi_amdstd_setup()
785 for (i=0; i<cfi->cfiq->NumEraseRegions; i++) { in cfi_amdstd_setup()
787 ersize = ((cfi->cfiq->EraseRegionInfo[i] >> 8) & ~0xff) * cfi->interleave; in cfi_amdstd_setup()
788 ernum = (cfi->cfiq->EraseRegionInfo[i] & 0xffff) + 1; in cfi_amdstd_setup()
790 if (mtd->erasesize < ersize) { in cfi_amdstd_setup()
791 mtd->erasesize = ersize; in cfi_amdstd_setup()
793 for (j=0; j<cfi->numchips; j++) { in cfi_amdstd_setup()
794 mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].offset = (j*devsize)+offset; in cfi_amdstd_setup()
795 mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].erasesize = ersize; in cfi_amdstd_setup()
796 mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].numblocks = ernum; in cfi_amdstd_setup()
807 register_reboot_notifier(&mtd->reboot_notifier); in cfi_amdstd_setup()
811 kfree(mtd->eraseregions); in cfi_amdstd_setup()
813 kfree(cfi->cmdset_priv); in cfi_amdstd_setup()
820 * Ready is one of: read mode, query mode, erase-suspend-read mode (in any
821 * non-suspended sector) and is indicated by no toggle bits toggling.
834 struct cfi_private *cfi = map->fldrv_priv; in chip_ready() local
838 if (cfi_use_status_reg(cfi)) { in chip_ready()
844 cfi_send_gen_cmd(0x70, cfi->addr_unlock1, chip->start, map, cfi, in chip_ready()
845 cfi->device_type, NULL); in chip_ready()
865 struct cfi_private *cfi = map->fldrv_priv; in chip_good() local
868 if (cfi->quirks & CFI_QUIRK_DQ_TRUE_DATA) in chip_good()
877 struct cfi_private *cfi = map->fldrv_priv; in get_chip() local
879 struct cfi_pri_amdstd *cfip = (struct cfi_pri_amdstd *)cfi->cmdset_priv; in get_chip()
884 switch (chip->state) { in get_chip()
893 return -EIO; in get_chip()
895 mutex_unlock(&chip->mutex); in get_chip()
897 mutex_lock(&chip->mutex); in get_chip()
909 if (!cfip || !(cfip->EraseSuspend & (0x1|0x2)) || in get_chip()
911 (mode == FL_WRITING && (cfip->EraseSuspend & 0x2)))) in get_chip()
915 if ((adr & chip->in_progress_block_mask) == in get_chip()
916 chip->in_progress_block_addr) in get_chip()
920 /* It's harmless to issue the Erase-Suspend and Erase-Resume in get_chip()
922 map_write(map, CMD(0xB0), chip->in_progress_block_addr); in get_chip()
923 chip->oldstate = FL_ERASING; in get_chip()
924 chip->state = FL_ERASE_SUSPENDING; in get_chip()
925 chip->erase_suspended = 1; in get_chip()
932 * Send an Erase-Resume command as either in get_chip()
935 * use the erase-in-progress sector. */ in get_chip()
938 return -EIO; in get_chip()
941 mutex_unlock(&chip->mutex); in get_chip()
943 mutex_lock(&chip->mutex); in get_chip()
947 chip->state = FL_READY; in get_chip()
952 (!cfip || !(cfip->EraseSuspend&2))) in get_chip()
954 chip->oldstate = chip->state; in get_chip()
955 chip->state = FL_READY; in get_chip()
960 return -EIO; in get_chip()
964 if (mode == FL_READY && chip->oldstate == FL_READY) in get_chip()
970 add_wait_queue(&chip->wq, &wait); in get_chip()
971 mutex_unlock(&chip->mutex); in get_chip()
973 remove_wait_queue(&chip->wq, &wait); in get_chip()
974 mutex_lock(&chip->mutex); in get_chip()
982 struct cfi_private *cfi = map->fldrv_priv; in put_chip() local
984 switch(chip->oldstate) { in put_chip()
987 chip->in_progress_block_addr); in put_chip()
988 map_write(map, cfi->sector_erase_cmd, chip->in_progress_block_addr); in put_chip()
989 cfi_fixup_m29ew_delay_after_resume(cfi); in put_chip()
990 chip->oldstate = FL_READY; in put_chip()
991 chip->state = FL_ERASING; in put_chip()
995 chip->state = chip->oldstate; in put_chip()
996 chip->oldstate = FL_READY; in put_chip()
1003 printk(KERN_ERR "MTD: put_chip() called with oldstate %d!!\n", chip->oldstate); in put_chip()
1005 wake_up(&chip->wq); in put_chip()
1011 * No interrupt what so ever can be serviced while the flash isn't in array
1013 * enclosing any code path where the flash is known not to be in array mode.
1017 * didn't emit calls to its own support functions). Also configuring MTD CFI
1032 struct cfi_private *cfi = map->fldrv_priv; in xip_enable() local
1034 if (chip->state != FL_POINT && chip->state != FL_READY) { in xip_enable()
1036 chip->state = FL_READY; in xip_enable()
1044 * When a delay is required for the flash operation to complete, the
1047 * pending then the flash erase operation is suspended, array mode restored
1050 * schedule() and the suspended flash operation is resumed for the remaining
1059 struct cfi_private *cfi = map->fldrv_priv; in xip_udelay() local
1060 struct cfi_pri_amdstd *extp = cfi->cmdset_priv; in xip_udelay()
1068 ((chip->state == FL_ERASING && (extp->EraseSuspend & 2))) && in xip_udelay()
1069 (cfi_interleave_is_1(cfi) || chip->oldstate == FL_READY)) { in xip_udelay()
1081 usec -= xip_elapsed_since(start); in xip_udelay()
1097 oldstate = chip->state; in xip_udelay()
1100 chip->state = FL_XIP_WHILE_ERASING; in xip_udelay()
1101 chip->erase_suspended = 1; in xip_udelay()
1106 mutex_unlock(&chip->mutex); in xip_udelay()
1116 mutex_lock(&chip->mutex); in xip_udelay()
1117 while (chip->state != FL_XIP_WHILE_ERASING) { in xip_udelay()
1120 add_wait_queue(&chip->wq, &wait); in xip_udelay()
1121 mutex_unlock(&chip->mutex); in xip_udelay()
1123 remove_wait_queue(&chip->wq, &wait); in xip_udelay()
1124 mutex_lock(&chip->mutex); in xip_udelay()
1132 map_write(map, cfi->sector_erase_cmd, adr); in xip_udelay()
1133 chip->state = oldstate; in xip_udelay()
1152 * the flash is actively programming or erasing since we have to poll for
1154 * a XIP setup so do it before the actual flash operation in this case
1175 * with chip->state set to FL_READY (or FL_XIP_WHILE_*) where flash state
1188 mutex_unlock(&chip->mutex); \
1190 mutex_lock(&chip->mutex); \
1195 mutex_unlock(&chip->mutex); \
1198 mutex_lock(&chip->mutex); \
1206 struct cfi_private *cfi = map->fldrv_priv; in do_read_onechip() local
1209 adr += chip->start; in do_read_onechip()
1212 cmd_addr = adr & ~(map_bankwidth(map)-1); in do_read_onechip()
1214 mutex_lock(&chip->mutex); in do_read_onechip()
1217 mutex_unlock(&chip->mutex); in do_read_onechip()
1221 if (chip->state != FL_POINT && chip->state != FL_READY) { in do_read_onechip()
1223 chip->state = FL_READY; in do_read_onechip()
1230 mutex_unlock(&chip->mutex); in do_read_onechip()
1237 struct map_info *map = mtd->priv; in cfi_amdstd_read()
1238 struct cfi_private *cfi = map->fldrv_priv; in cfi_amdstd_read() local
1244 chipnum = (from >> cfi->chipshift); in cfi_amdstd_read()
1245 ofs = from - (chipnum << cfi->chipshift); in cfi_amdstd_read()
1250 if (chipnum >= cfi->numchips) in cfi_amdstd_read()
1253 if ((len + ofs -1) >> cfi->chipshift) in cfi_amdstd_read()
1254 thislen = (1<<cfi->chipshift) - ofs; in cfi_amdstd_read()
1258 ret = do_read_onechip(map, &cfi->chips[chipnum], ofs, thislen, buf); in cfi_amdstd_read()
1263 len -= thislen; in cfi_amdstd_read()
1278 struct cfi_private *cfi = map->fldrv_priv; in otp_enter() local
1280 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, in otp_enter()
1281 cfi->device_type, NULL); in otp_enter()
1282 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, in otp_enter()
1283 cfi->device_type, NULL); in otp_enter()
1284 cfi_send_gen_cmd(0x88, cfi->addr_unlock1, chip->start, map, cfi, in otp_enter()
1285 cfi->device_type, NULL); in otp_enter()
1287 INVALIDATE_CACHED_RANGE(map, chip->start + adr, len); in otp_enter()
1293 struct cfi_private *cfi = map->fldrv_priv; in otp_exit() local
1295 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, in otp_exit()
1296 cfi->device_type, NULL); in otp_exit()
1297 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, in otp_exit()
1298 cfi->device_type, NULL); in otp_exit()
1299 cfi_send_gen_cmd(0x90, cfi->addr_unlock1, chip->start, map, cfi, in otp_exit()
1300 cfi->device_type, NULL); in otp_exit()
1301 cfi_send_gen_cmd(0x00, cfi->addr_unlock1, chip->start, map, cfi, in otp_exit()
1302 cfi->device_type, NULL); in otp_exit()
1304 INVALIDATE_CACHED_RANGE(map, chip->start + adr, len); in otp_exit()
1315 mutex_lock(&chip->mutex); in do_read_secsi_onechip()
1317 if (chip->state != FL_READY){ in do_read_secsi_onechip()
1319 add_wait_queue(&chip->wq, &wait); in do_read_secsi_onechip()
1321 mutex_unlock(&chip->mutex); in do_read_secsi_onechip()
1324 remove_wait_queue(&chip->wq, &wait); in do_read_secsi_onechip()
1329 adr += chip->start; in do_read_secsi_onechip()
1331 chip->state = FL_READY; in do_read_secsi_onechip()
1337 wake_up(&chip->wq); in do_read_secsi_onechip()
1338 mutex_unlock(&chip->mutex); in do_read_secsi_onechip()
1345 struct map_info *map = mtd->priv; in cfi_amdstd_secsi_read()
1346 struct cfi_private *cfi = map->fldrv_priv; in cfi_amdstd_secsi_read() local
1359 if (chipnum >= cfi->numchips) in cfi_amdstd_secsi_read()
1362 if ((len + ofs -1) >> 3) in cfi_amdstd_secsi_read()
1363 thislen = (1<<3) - ofs; in cfi_amdstd_secsi_read()
1367 ret = do_read_secsi_onechip(map, &cfi->chips[chipnum], ofs, in cfi_amdstd_secsi_read()
1373 len -= thislen; in cfi_amdstd_secsi_read()
1391 unsigned long bus_ofs = adr & ~(map_bankwidth(map)-1); in do_otp_write()
1392 int gap = adr - bus_ofs; in do_otp_write()
1393 int n = min_t(int, len, map_bankwidth(map) - gap); in do_otp_write()
1410 len -= n; in do_otp_write()
1419 struct cfi_private *cfi = map->fldrv_priv; in do_otp_lock() local
1426 return -EINVAL; in do_otp_lock()
1428 mutex_lock(&chip->mutex); in do_otp_lock()
1429 ret = get_chip(map, chip, chip->start, FL_LOCKING); in do_otp_lock()
1431 mutex_unlock(&chip->mutex); in do_otp_lock()
1434 chip->state = FL_LOCKING; in do_otp_lock()
1437 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, in do_otp_lock()
1438 cfi->device_type, NULL); in do_otp_lock()
1439 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, in do_otp_lock()
1440 cfi->device_type, NULL); in do_otp_lock()
1441 cfi_send_gen_cmd(0x40, cfi->addr_unlock1, chip->start, map, cfi, in do_otp_lock()
1442 cfi->device_type, NULL); in do_otp_lock()
1452 map_write(map, CMD(0xA0), chip->start); in do_otp_lock()
1453 map_write(map, CMD(lockreg), chip->start); in do_otp_lock()
1463 ret = -EIO; in do_otp_lock()
1470 map_write(map, CMD(0x90), chip->start); in do_otp_lock()
1471 map_write(map, CMD(0x00), chip->start); in do_otp_lock()
1473 chip->state = FL_READY; in do_otp_lock()
1474 put_chip(map, chip, chip->start); in do_otp_lock()
1475 mutex_unlock(&chip->mutex); in do_otp_lock()
1484 struct map_info *map = mtd->priv; in cfi_amdstd_otp_walk()
1485 struct cfi_private *cfi = map->fldrv_priv; in cfi_amdstd_otp_walk() local
1486 int ofs_factor = cfi->interleave * cfi->device_type; in cfi_amdstd_otp_walk()
1499 for (chipnum = 0; chipnum < cfi->numchips; chipnum++) { in cfi_amdstd_otp_walk()
1500 chip = &cfi->chips[chipnum]; in cfi_amdstd_otp_walk()
1505 if (is_m29ew(cfi)) { in cfi_amdstd_otp_walk()
1506 base = chip->start; in cfi_amdstd_otp_walk()
1510 mutex_lock(&chip->mutex); in cfi_amdstd_otp_walk()
1513 mutex_unlock(&chip->mutex); in cfi_amdstd_otp_walk()
1516 cfi_qry_mode_on(base, map, cfi); in cfi_amdstd_otp_walk()
1518 cfi_qry_mode_off(base, map, cfi); in cfi_amdstd_otp_walk()
1520 mutex_unlock(&chip->mutex); in cfi_amdstd_otp_walk()
1531 mutex_lock(&chip->mutex); in cfi_amdstd_otp_walk()
1534 mutex_unlock(&chip->mutex); in cfi_amdstd_otp_walk()
1539 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, in cfi_amdstd_otp_walk()
1540 chip->start, map, cfi, in cfi_amdstd_otp_walk()
1541 cfi->device_type, NULL); in cfi_amdstd_otp_walk()
1542 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, in cfi_amdstd_otp_walk()
1543 chip->start, map, cfi, in cfi_amdstd_otp_walk()
1544 cfi->device_type, NULL); in cfi_amdstd_otp_walk()
1545 cfi_send_gen_cmd(0x40, cfi->addr_unlock1, in cfi_amdstd_otp_walk()
1546 chip->start, map, cfi, in cfi_amdstd_otp_walk()
1547 cfi->device_type, NULL); in cfi_amdstd_otp_walk()
1551 map_write(map, CMD(0x90), chip->start); in cfi_amdstd_otp_walk()
1552 map_write(map, CMD(0x00), chip->start); in cfi_amdstd_otp_walk()
1553 put_chip(map, chip, chip->start); in cfi_amdstd_otp_walk()
1554 mutex_unlock(&chip->mutex); in cfi_amdstd_otp_walk()
1569 len -= sizeof(*otpinfo); in cfi_amdstd_otp_walk()
1571 return -ENOSPC; in cfi_amdstd_otp_walk()
1573 otpinfo->start = from; in cfi_amdstd_otp_walk()
1574 otpinfo->length = otpsize; in cfi_amdstd_otp_walk()
1575 otpinfo->locked = otplocked; in cfi_amdstd_otp_walk()
1581 size = (len < otpsize - from) ? len : otpsize - from; in cfi_amdstd_otp_walk()
1588 len -= size; in cfi_amdstd_otp_walk()
1592 from -= otpsize; in cfi_amdstd_otp_walk()
1647 int mode, struct cfi_private *cfi) in do_write_oneword_once() argument
1662 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL); in do_write_oneword_once()
1663 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL); in do_write_oneword_once()
1664 cfi_send_gen_cmd(0xA0, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL); in do_write_oneword_once()
1666 chip->state = mode; in do_write_oneword_once()
1670 chip->word_write_time); in do_write_oneword_once()
1675 if (chip->state != mode) { in do_write_oneword_once()
1680 add_wait_queue(&chip->wq, &wait); in do_write_oneword_once()
1681 mutex_unlock(&chip->mutex); in do_write_oneword_once()
1683 remove_wait_queue(&chip->wq, &wait); in do_write_oneword_once()
1685 mutex_lock(&chip->mutex); in do_write_oneword_once()
1698 ret = -EIO; in do_write_oneword_once()
1704 ret = -EIO; in do_write_oneword_once()
1721 mutex_lock(&chip->mutex); in do_write_oneword_start()
1725 mutex_unlock(&chip->mutex); in do_write_oneword_start()
1742 chip->state = FL_READY; in do_write_oneword_done()
1746 mutex_unlock(&chip->mutex); in do_write_oneword_done()
1754 struct cfi_private *cfi = map->fldrv_priv; in do_write_oneword_retry() local
1761 * present - it saves time and works around buggy chips that corrupt in do_write_oneword_retry()
1776 ret = do_write_oneword_once(map, chip, adr, datum, mode, cfi); in do_write_oneword_retry()
1779 map_write(map, CMD(0xF0), chip->start); in do_write_oneword_retry()
1780 /* FIXME - should have reset delay before continuing */ in do_write_oneword_retry()
1798 adr += chip->start; in do_write_oneword()
1818 struct map_info *map = mtd->priv; in cfi_amdstd_write_words()
1819 struct cfi_private *cfi = map->fldrv_priv; in cfi_amdstd_write_words() local
1825 chipnum = to >> cfi->chipshift; in cfi_amdstd_write_words()
1826 ofs = to - (chipnum << cfi->chipshift); in cfi_amdstd_write_words()
1827 chipstart = cfi->chips[chipnum].start; in cfi_amdstd_write_words()
1829 /* If it's not bus-aligned, do the first byte write */ in cfi_amdstd_write_words()
1830 if (ofs & (map_bankwidth(map)-1)) { in cfi_amdstd_write_words()
1831 unsigned long bus_ofs = ofs & ~(map_bankwidth(map)-1); in cfi_amdstd_write_words()
1832 int i = ofs - bus_ofs; in cfi_amdstd_write_words()
1837 mutex_lock(&cfi->chips[chipnum].mutex); in cfi_amdstd_write_words()
1839 if (cfi->chips[chipnum].state != FL_READY) { in cfi_amdstd_write_words()
1841 add_wait_queue(&cfi->chips[chipnum].wq, &wait); in cfi_amdstd_write_words()
1843 mutex_unlock(&cfi->chips[chipnum].mutex); in cfi_amdstd_write_words()
1846 remove_wait_queue(&cfi->chips[chipnum].wq, &wait); in cfi_amdstd_write_words()
1850 /* Load 'tmp_buf' with old contents of flash */ in cfi_amdstd_write_words()
1853 mutex_unlock(&cfi->chips[chipnum].mutex); in cfi_amdstd_write_words()
1856 n = min_t(int, len, map_bankwidth(map)-i); in cfi_amdstd_write_words()
1860 ret = do_write_oneword(map, &cfi->chips[chipnum], in cfi_amdstd_write_words()
1868 len -= n; in cfi_amdstd_write_words()
1870 if (ofs >> cfi->chipshift) { in cfi_amdstd_write_words()
1873 if (chipnum == cfi->numchips) in cfi_amdstd_write_words()
1884 ret = do_write_oneword(map, &cfi->chips[chipnum], in cfi_amdstd_write_words()
1892 len -= map_bankwidth(map); in cfi_amdstd_write_words()
1894 if (ofs >> cfi->chipshift) { in cfi_amdstd_write_words()
1897 if (chipnum == cfi->numchips) in cfi_amdstd_write_words()
1899 chipstart = cfi->chips[chipnum].start; in cfi_amdstd_write_words()
1904 if (len & (map_bankwidth(map)-1)) { in cfi_amdstd_write_words()
1908 mutex_lock(&cfi->chips[chipnum].mutex); in cfi_amdstd_write_words()
1910 if (cfi->chips[chipnum].state != FL_READY) { in cfi_amdstd_write_words()
1912 add_wait_queue(&cfi->chips[chipnum].wq, &wait); in cfi_amdstd_write_words()
1914 mutex_unlock(&cfi->chips[chipnum].mutex); in cfi_amdstd_write_words()
1917 remove_wait_queue(&cfi->chips[chipnum].wq, &wait); in cfi_amdstd_write_words()
1923 mutex_unlock(&cfi->chips[chipnum].mutex); in cfi_amdstd_write_words()
1927 ret = do_write_oneword(map, &cfi->chips[chipnum], in cfi_amdstd_write_words()
1948 * Timeout is calculated according to CFI data, if available. in do_write_buffer_wait()
1951 u_write_timeout = usecs_to_jiffies(chip->buffer_write_time_max); in do_write_buffer_wait()
1955 if (chip->state != FL_WRITING) { in do_write_buffer_wait()
1960 add_wait_queue(&chip->wq, &wait); in do_write_buffer_wait()
1961 mutex_unlock(&chip->mutex); in do_write_buffer_wait()
1963 remove_wait_queue(&chip->wq, &wait); in do_write_buffer_wait()
1965 mutex_lock(&chip->mutex); in do_write_buffer_wait()
1977 ret = -EIO; in do_write_buffer_wait()
1983 ret = -EIO; in do_write_buffer_wait()
1996 struct cfi_private *cfi) in do_write_buffer_reset() argument
1999 * Recovery from write-buffer programming failures requires in do_write_buffer_reset()
2000 * the write-to-buffer-reset sequence. Since the last part in do_write_buffer_reset()
2006 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, in do_write_buffer_reset()
2007 cfi->device_type, NULL); in do_write_buffer_reset()
2008 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, in do_write_buffer_reset()
2009 cfi->device_type, NULL); in do_write_buffer_reset()
2010 cfi_send_gen_cmd(0xF0, cfi->addr_unlock1, chip->start, map, cfi, in do_write_buffer_reset()
2011 cfi->device_type, NULL); in do_write_buffer_reset()
2013 /* FIXME - should have reset delay before continuing */ in do_write_buffer_reset()
2023 struct cfi_private *cfi = map->fldrv_priv; in do_write_buffer() local
2029 adr += chip->start; in do_write_buffer()
2032 mutex_lock(&chip->mutex); in do_write_buffer()
2035 mutex_unlock(&chip->mutex); in do_write_buffer()
2048 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL); in do_write_buffer()
2049 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL); in do_write_buffer()
2054 chip->state = FL_WRITING_TO_BUFFER; in do_write_buffer()
2058 map_write(map, CMD(words - 1), cmd_adr); in do_write_buffer()
2068 z -= map_bankwidth(map); in do_write_buffer()
2074 chip->state = FL_WRITING; in do_write_buffer()
2078 chip->word_write_time); in do_write_buffer()
2082 do_write_buffer_reset(map, chip, cfi); in do_write_buffer()
2086 chip->state = FL_READY; in do_write_buffer()
2089 mutex_unlock(&chip->mutex); in do_write_buffer()
2098 struct map_info *map = mtd->priv; in cfi_amdstd_write_buffers()
2099 struct cfi_private *cfi = map->fldrv_priv; in cfi_amdstd_write_buffers() local
2100 int wbufsize = cfi_interleave(cfi) << cfi->cfiq->MaxBufWriteSize; in cfi_amdstd_write_buffers()
2105 chipnum = to >> cfi->chipshift; in cfi_amdstd_write_buffers()
2106 ofs = to - (chipnum << cfi->chipshift); in cfi_amdstd_write_buffers()
2108 /* If it's not bus-aligned, do the first word write */ in cfi_amdstd_write_buffers()
2109 if (ofs & (map_bankwidth(map)-1)) { in cfi_amdstd_write_buffers()
2110 size_t local_len = (-ofs)&(map_bankwidth(map)-1); in cfi_amdstd_write_buffers()
2113 ret = cfi_amdstd_write_words(mtd, ofs + (chipnum<<cfi->chipshift), in cfi_amdstd_write_buffers()
2119 len -= local_len; in cfi_amdstd_write_buffers()
2121 if (ofs >> cfi->chipshift) { in cfi_amdstd_write_buffers()
2124 if (chipnum == cfi->numchips) in cfi_amdstd_write_buffers()
2132 int size = wbufsize - (ofs & (wbufsize-1)); in cfi_amdstd_write_buffers()
2137 size -= size % map_bankwidth(map); in cfi_amdstd_write_buffers()
2139 ret = do_write_buffer(map, &cfi->chips[chipnum], in cfi_amdstd_write_buffers()
2147 len -= size; in cfi_amdstd_write_buffers()
2149 if (ofs >> cfi->chipshift) { in cfi_amdstd_write_buffers()
2152 if (chipnum == cfi->numchips) in cfi_amdstd_write_buffers()
2160 ret = cfi_amdstd_write_words(mtd, ofs + (chipnum<<cfi->chipshift), in cfi_amdstd_write_buffers()
2172 * Wait for the flash chip to become ready to write data
2182 struct cfi_private *cfi = map->fldrv_priv; in cfi_amdstd_panic_wait() local
2190 if (chip->state == FL_READY && chip_ready(map, chip, adr, NULL)) in cfi_amdstd_panic_wait()
2203 map_write(map, CMD(0xF0), chip->start); in cfi_amdstd_panic_wait()
2213 retries--; in cfi_amdstd_panic_wait()
2217 return -EBUSY; in cfi_amdstd_panic_wait()
2221 * Write out one word of data to a single flash chip during a kernel panic
2235 struct cfi_private *cfi = map->fldrv_priv; in do_panic_write_oneword() local
2241 adr += chip->start; in do_panic_write_oneword()
2252 * present - it saves time and works around buggy chips that corrupt in do_panic_write_oneword()
2265 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL); in do_panic_write_oneword()
2266 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL); in do_panic_write_oneword()
2267 cfi_send_gen_cmd(0xA0, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL); in do_panic_write_oneword()
2280 map_write(map, CMD(0xF0), chip->start); in do_panic_write_oneword()
2281 /* FIXME - should have reset delay before continuing */ in do_panic_write_oneword()
2286 ret = -EIO; in do_panic_write_oneword()
2302 * state this driver (and the flash chip itself) was in when the kernel crashed.
2310 struct map_info *map = mtd->priv; in cfi_amdstd_panic_write()
2311 struct cfi_private *cfi = map->fldrv_priv; in cfi_amdstd_panic_write() local
2316 chipnum = to >> cfi->chipshift; in cfi_amdstd_panic_write()
2317 ofs = to - (chipnum << cfi->chipshift); in cfi_amdstd_panic_write()
2318 chipstart = cfi->chips[chipnum].start; in cfi_amdstd_panic_write()
2321 if (ofs & (map_bankwidth(map) - 1)) { in cfi_amdstd_panic_write()
2322 unsigned long bus_ofs = ofs & ~(map_bankwidth(map) - 1); in cfi_amdstd_panic_write()
2323 int i = ofs - bus_ofs; in cfi_amdstd_panic_write()
2327 ret = cfi_amdstd_panic_wait(map, &cfi->chips[chipnum], bus_ofs); in cfi_amdstd_panic_write()
2331 /* Load 'tmp_buf' with old contents of flash */ in cfi_amdstd_panic_write()
2335 n = min_t(int, len, map_bankwidth(map) - i); in cfi_amdstd_panic_write()
2339 ret = do_panic_write_oneword(map, &cfi->chips[chipnum], in cfi_amdstd_panic_write()
2347 len -= n; in cfi_amdstd_panic_write()
2349 if (ofs >> cfi->chipshift) { in cfi_amdstd_panic_write()
2352 if (chipnum == cfi->numchips) in cfi_amdstd_panic_write()
2363 ret = do_panic_write_oneword(map, &cfi->chips[chipnum], in cfi_amdstd_panic_write()
2371 len -= map_bankwidth(map); in cfi_amdstd_panic_write()
2373 if (ofs >> cfi->chipshift) { in cfi_amdstd_panic_write()
2376 if (chipnum == cfi->numchips) in cfi_amdstd_panic_write()
2379 chipstart = cfi->chips[chipnum].start; in cfi_amdstd_panic_write()
2384 if (len & (map_bankwidth(map) - 1)) { in cfi_amdstd_panic_write()
2387 ret = cfi_amdstd_panic_wait(map, &cfi->chips[chipnum], ofs); in cfi_amdstd_panic_write()
2395 ret = do_panic_write_oneword(map, &cfi->chips[chipnum], in cfi_amdstd_panic_write()
2413 struct cfi_private *cfi = map->fldrv_priv; in do_erase_chip() local
2421 adr = cfi->addr_unlock1; in do_erase_chip()
2423 mutex_lock(&chip->mutex); in do_erase_chip()
2426 mutex_unlock(&chip->mutex); in do_erase_chip()
2431 __func__, chip->start); in do_erase_chip()
2433 XIP_INVAL_CACHED_RANGE(map, adr, map->size); in do_erase_chip()
2438 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL); in do_erase_chip()
2439 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL); in do_erase_chip()
2440 cfi_send_gen_cmd(0x80, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL); in do_erase_chip()
2441 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL); in do_erase_chip()
2442 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL); in do_erase_chip()
2443 cfi_send_gen_cmd(0x10, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL); in do_erase_chip()
2445 chip->state = FL_ERASING; in do_erase_chip()
2446 chip->erase_suspended = 0; in do_erase_chip()
2447 chip->in_progress_block_addr = adr; in do_erase_chip()
2448 chip->in_progress_block_mask = ~(map->size - 1); in do_erase_chip()
2451 adr, map->size, in do_erase_chip()
2452 chip->erase_time*500); in do_erase_chip()
2457 if (chip->state != FL_ERASING) { in do_erase_chip()
2460 add_wait_queue(&chip->wq, &wait); in do_erase_chip()
2461 mutex_unlock(&chip->mutex); in do_erase_chip()
2463 remove_wait_queue(&chip->wq, &wait); in do_erase_chip()
2464 mutex_lock(&chip->mutex); in do_erase_chip()
2467 if (chip->erase_suspended) { in do_erase_chip()
2471 chip->erase_suspended = 0; in do_erase_chip()
2476 ret = -EIO; in do_erase_chip()
2483 ret = -EIO; in do_erase_chip()
2493 map_write(map, CMD(0xF0), chip->start); in do_erase_chip()
2494 /* FIXME - should have reset delay before continuing */ in do_erase_chip()
2502 chip->state = FL_READY; in do_erase_chip()
2506 mutex_unlock(&chip->mutex); in do_erase_chip()
2514 struct cfi_private *cfi = map->fldrv_priv; in do_erase_oneblock() local
2521 adr += chip->start; in do_erase_oneblock()
2523 mutex_lock(&chip->mutex); in do_erase_oneblock()
2526 mutex_unlock(&chip->mutex); in do_erase_oneblock()
2538 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL); in do_erase_oneblock()
2539 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL); in do_erase_oneblock()
2540 cfi_send_gen_cmd(0x80, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL); in do_erase_oneblock()
2541 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL); in do_erase_oneblock()
2542 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL); in do_erase_oneblock()
2543 map_write(map, cfi->sector_erase_cmd, adr); in do_erase_oneblock()
2545 chip->state = FL_ERASING; in do_erase_oneblock()
2546 chip->erase_suspended = 0; in do_erase_oneblock()
2547 chip->in_progress_block_addr = adr; in do_erase_oneblock()
2548 chip->in_progress_block_mask = ~(len - 1); in do_erase_oneblock()
2552 chip->erase_time*500); in do_erase_oneblock()
2557 if (chip->state != FL_ERASING) { in do_erase_oneblock()
2560 add_wait_queue(&chip->wq, &wait); in do_erase_oneblock()
2561 mutex_unlock(&chip->mutex); in do_erase_oneblock()
2563 remove_wait_queue(&chip->wq, &wait); in do_erase_oneblock()
2564 mutex_lock(&chip->mutex); in do_erase_oneblock()
2567 if (chip->erase_suspended) { in do_erase_oneblock()
2571 chip->erase_suspended = 0; in do_erase_oneblock()
2576 ret = -EIO; in do_erase_oneblock()
2583 ret = -EIO; in do_erase_oneblock()
2593 map_write(map, CMD(0xF0), chip->start); in do_erase_oneblock()
2594 /* FIXME - should have reset delay before continuing */ in do_erase_oneblock()
2602 chip->state = FL_READY; in do_erase_oneblock()
2606 mutex_unlock(&chip->mutex); in do_erase_oneblock()
2613 return cfi_varsize_frob(mtd, do_erase_oneblock, instr->addr, in cfi_amdstd_erase_varsize()
2614 instr->len, NULL); in cfi_amdstd_erase_varsize()
2620 struct map_info *map = mtd->priv; in cfi_amdstd_erase_chip()
2621 struct cfi_private *cfi = map->fldrv_priv; in cfi_amdstd_erase_chip() local
2623 if (instr->addr != 0) in cfi_amdstd_erase_chip()
2624 return -EINVAL; in cfi_amdstd_erase_chip()
2626 if (instr->len != mtd->size) in cfi_amdstd_erase_chip()
2627 return -EINVAL; in cfi_amdstd_erase_chip()
2629 return do_erase_chip(map, &cfi->chips[0]); in cfi_amdstd_erase_chip()
2635 struct cfi_private *cfi = map->fldrv_priv; in do_atmel_lock() local
2638 mutex_lock(&chip->mutex); in do_atmel_lock()
2639 ret = get_chip(map, chip, adr + chip->start, FL_LOCKING); in do_atmel_lock()
2642 chip->state = FL_LOCKING; in do_atmel_lock()
2646 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, in do_atmel_lock()
2647 cfi->device_type, NULL); in do_atmel_lock()
2648 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, in do_atmel_lock()
2649 cfi->device_type, NULL); in do_atmel_lock()
2650 cfi_send_gen_cmd(0x80, cfi->addr_unlock1, chip->start, map, cfi, in do_atmel_lock()
2651 cfi->device_type, NULL); in do_atmel_lock()
2652 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, in do_atmel_lock()
2653 cfi->device_type, NULL); in do_atmel_lock()
2654 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, in do_atmel_lock()
2655 cfi->device_type, NULL); in do_atmel_lock()
2656 map_write(map, CMD(0x40), chip->start + adr); in do_atmel_lock()
2658 chip->state = FL_READY; in do_atmel_lock()
2659 put_chip(map, chip, adr + chip->start); in do_atmel_lock()
2663 mutex_unlock(&chip->mutex); in do_atmel_lock()
2670 struct cfi_private *cfi = map->fldrv_priv; in do_atmel_unlock() local
2673 mutex_lock(&chip->mutex); in do_atmel_unlock()
2674 ret = get_chip(map, chip, adr + chip->start, FL_UNLOCKING); in do_atmel_unlock()
2677 chip->state = FL_UNLOCKING; in do_atmel_unlock()
2681 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, in do_atmel_unlock()
2682 cfi->device_type, NULL); in do_atmel_unlock()
2685 chip->state = FL_READY; in do_atmel_unlock()
2686 put_chip(map, chip, adr + chip->start); in do_atmel_unlock()
2690 mutex_unlock(&chip->mutex); in do_atmel_unlock()
2705 * Advanced Sector Protection - PPB (Persistent Protection Bit) locking
2722 struct cfi_private *cfi = map->fldrv_priv; in do_ppb_xxlock() local
2726 adr += chip->start; in do_ppb_xxlock()
2727 mutex_lock(&chip->mutex); in do_ppb_xxlock()
2730 mutex_unlock(&chip->mutex); in do_ppb_xxlock()
2736 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, in do_ppb_xxlock()
2737 cfi->device_type, NULL); in do_ppb_xxlock()
2738 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, in do_ppb_xxlock()
2739 cfi->device_type, NULL); in do_ppb_xxlock()
2741 cfi_send_gen_cmd(0xC0, cfi->addr_unlock1, chip->start, map, cfi, in do_ppb_xxlock()
2742 cfi->device_type, NULL); in do_ppb_xxlock()
2745 chip->state = FL_LOCKING; in do_ppb_xxlock()
2753 chip->state = FL_UNLOCKING; in do_ppb_xxlock()
2754 map_write(map, CMD(0x80), chip->start); in do_ppb_xxlock()
2755 map_write(map, CMD(0x30), chip->start); in do_ppb_xxlock()
2757 chip->state = FL_JEDEC_QUERY; in do_ppb_xxlock()
2758 /* Return locked status: 0->locked, 1->unlocked */ in do_ppb_xxlock()
2773 ret = -EIO; in do_ppb_xxlock()
2781 map_write(map, CMD(0x90), chip->start); in do_ppb_xxlock()
2782 map_write(map, CMD(0x00), chip->start); in do_ppb_xxlock()
2784 chip->state = FL_READY; in do_ppb_xxlock()
2786 mutex_unlock(&chip->mutex); in do_ppb_xxlock()
2801 struct mtd_erase_region_info *regions = mtd->eraseregions; in cfi_ppb_unlock()
2802 struct map_info *map = mtd->priv; in cfi_ppb_unlock()
2803 struct cfi_private *cfi = map->fldrv_priv; in cfi_ppb_unlock() local
2815 * PPB unlocking always unlocks all sectors of the flash chip. in cfi_ppb_unlock()
2816 * We need to re-lock all previously locked sectors. So lets in cfi_ppb_unlock()
2821 for (i = 0; i < mtd->numeraseregions; i++) in cfi_ppb_unlock()
2826 return -ENOMEM; in cfi_ppb_unlock()
2837 length = mtd->size; in cfi_ppb_unlock()
2845 * status at "unlocked" (locked=0) for the final re-locking. in cfi_ppb_unlock()
2848 sect[sectors].chip = &cfi->chips[chipnum]; in cfi_ppb_unlock()
2851 map, &cfi->chips[chipnum], adr, 0, in cfi_ppb_unlock()
2857 length -= size; in cfi_ppb_unlock()
2862 if (adr >> cfi->chipshift) { in cfi_ppb_unlock()
2868 if (chipnum >= cfi->numchips) in cfi_ppb_unlock()
2877 return -EINVAL; in cfi_ppb_unlock()
2890 * PPB unlocking always unlocks all sectors of the flash chip. in cfi_ppb_unlock()
2891 * We need to re-lock all previously locked sectors. in cfi_ppb_unlock()
2912 struct map_info *map = mtd->priv; in cfi_amdstd_sync()
2913 struct cfi_private *cfi = map->fldrv_priv; in cfi_amdstd_sync() local
2919 for (i=0; !ret && i<cfi->numchips; i++) { in cfi_amdstd_sync()
2920 chip = &cfi->chips[i]; in cfi_amdstd_sync()
2923 mutex_lock(&chip->mutex); in cfi_amdstd_sync()
2925 switch(chip->state) { in cfi_amdstd_sync()
2930 chip->oldstate = chip->state; in cfi_amdstd_sync()
2931 chip->state = FL_SYNCING; in cfi_amdstd_sync()
2932 /* No need to wake_up() on this state change - in cfi_amdstd_sync()
2938 mutex_unlock(&chip->mutex); in cfi_amdstd_sync()
2944 add_wait_queue(&chip->wq, &wait); in cfi_amdstd_sync()
2946 mutex_unlock(&chip->mutex); in cfi_amdstd_sync()
2950 remove_wait_queue(&chip->wq, &wait); in cfi_amdstd_sync()
2958 for (i--; i >=0; i--) { in cfi_amdstd_sync()
2959 chip = &cfi->chips[i]; in cfi_amdstd_sync()
2961 mutex_lock(&chip->mutex); in cfi_amdstd_sync()
2963 if (chip->state == FL_SYNCING) { in cfi_amdstd_sync()
2964 chip->state = chip->oldstate; in cfi_amdstd_sync()
2965 wake_up(&chip->wq); in cfi_amdstd_sync()
2967 mutex_unlock(&chip->mutex); in cfi_amdstd_sync()
2974 struct map_info *map = mtd->priv; in cfi_amdstd_suspend()
2975 struct cfi_private *cfi = map->fldrv_priv; in cfi_amdstd_suspend() local
2980 for (i=0; !ret && i<cfi->numchips; i++) { in cfi_amdstd_suspend()
2981 chip = &cfi->chips[i]; in cfi_amdstd_suspend()
2983 mutex_lock(&chip->mutex); in cfi_amdstd_suspend()
2985 switch(chip->state) { in cfi_amdstd_suspend()
2990 chip->oldstate = chip->state; in cfi_amdstd_suspend()
2991 chip->state = FL_PM_SUSPENDED; in cfi_amdstd_suspend()
2992 /* No need to wake_up() on this state change - in cfi_amdstd_suspend()
3001 ret = -EAGAIN; in cfi_amdstd_suspend()
3004 mutex_unlock(&chip->mutex); in cfi_amdstd_suspend()
3010 for (i--; i >=0; i--) { in cfi_amdstd_suspend()
3011 chip = &cfi->chips[i]; in cfi_amdstd_suspend()
3013 mutex_lock(&chip->mutex); in cfi_amdstd_suspend()
3015 if (chip->state == FL_PM_SUSPENDED) { in cfi_amdstd_suspend()
3016 chip->state = chip->oldstate; in cfi_amdstd_suspend()
3017 wake_up(&chip->wq); in cfi_amdstd_suspend()
3019 mutex_unlock(&chip->mutex); in cfi_amdstd_suspend()
3029 struct map_info *map = mtd->priv; in cfi_amdstd_resume()
3030 struct cfi_private *cfi = map->fldrv_priv; in cfi_amdstd_resume() local
3034 for (i=0; i<cfi->numchips; i++) { in cfi_amdstd_resume()
3036 chip = &cfi->chips[i]; in cfi_amdstd_resume()
3038 mutex_lock(&chip->mutex); in cfi_amdstd_resume()
3040 if (chip->state == FL_PM_SUSPENDED) { in cfi_amdstd_resume()
3041 chip->state = FL_READY; in cfi_amdstd_resume()
3042 map_write(map, CMD(0xF0), chip->start); in cfi_amdstd_resume()
3043 wake_up(&chip->wq); in cfi_amdstd_resume()
3048 mutex_unlock(&chip->mutex); in cfi_amdstd_resume()
3054 * Ensure that the flash device is put back into read array mode before
3056 * the flash is in query/program/erase mode will prevent the CPU from
3061 struct map_info *map = mtd->priv; in cfi_amdstd_reset()
3062 struct cfi_private *cfi = map->fldrv_priv; in cfi_amdstd_reset() local
3066 for (i = 0; i < cfi->numchips; i++) { in cfi_amdstd_reset()
3068 chip = &cfi->chips[i]; in cfi_amdstd_reset()
3070 mutex_lock(&chip->mutex); in cfi_amdstd_reset()
3072 ret = get_chip(map, chip, chip->start, FL_SHUTDOWN); in cfi_amdstd_reset()
3074 map_write(map, CMD(0xF0), chip->start); in cfi_amdstd_reset()
3075 chip->state = FL_SHUTDOWN; in cfi_amdstd_reset()
3076 put_chip(map, chip, chip->start); in cfi_amdstd_reset()
3079 mutex_unlock(&chip->mutex); in cfi_amdstd_reset()
3099 struct map_info *map = mtd->priv; in cfi_amdstd_destroy()
3100 struct cfi_private *cfi = map->fldrv_priv; in cfi_amdstd_destroy() local
3103 unregister_reboot_notifier(&mtd->reboot_notifier); in cfi_amdstd_destroy()
3104 kfree(cfi->cmdset_priv); in cfi_amdstd_destroy()
3105 kfree(cfi->cfiq); in cfi_amdstd_destroy()
3106 kfree(cfi); in cfi_amdstd_destroy()
3107 kfree(mtd->eraseregions); in cfi_amdstd_destroy()
3112 MODULE_DESCRIPTION("MTD chip driver for AMD/Fujitsu flash chips");