Lines Matching +full:factory +full:- +full:otp

1 // SPDX-License-Identifier: GPL-2.0
118 * CFI Primary Vendor-Specific Extended Query table 1.5
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()
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()
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()
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()
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()
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()
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()
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()
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()
357 * sector_erase-size and block_erase-size, although they both operate on 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()
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()
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()
399 cfi->cfiq->EraseRegionInfo[0] = 0x002003ff; 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()
409 if ((cfi->cfiq->EraseRegionInfo[0] & 0xffff) == 0x003f) { in fixup_s29gl064n_sectors()
410 cfi->cfiq->EraseRegionInfo[0] |= 0x0040; 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()
421 if ((cfi->cfiq->EraseRegionInfo[1] & 0xffff) == 0x007e) { in fixup_s29gl032n_sectors()
422 cfi->cfiq->EraseRegionInfo[1] &= ~0x0040; 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()
437 cfi->cfiq->EraseRegionInfo[0] = 0x020001ff; 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()
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 */
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()
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()
567 * From TN-13-07: Patching the Linux Kernel and U-Boot for M29 Flash, page 22:
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()
602 struct cfi_private *cfi = map->fldrv_priv; in cfi_cmdset_0002()
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()
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()
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()
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()
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()
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()
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()
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()
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()
868 if (cfi->quirks & CFI_QUIRK_DQ_TRUE_DATA) in chip_good()
877 struct cfi_private *cfi = map->fldrv_priv; in get_chip()
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()
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()
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()
1032 struct cfi_private *cfi = map->fldrv_priv; in xip_enable()
1034 if (chip->state != FL_POINT && chip->state != FL_READY) { in xip_enable()
1036 chip->state = FL_READY; in xip_enable()
1059 struct cfi_private *cfi = map->fldrv_priv; in xip_udelay()
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()
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()
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()
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()
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()
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()
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()
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()
1486 int ofs_factor = cfi->interleave * cfi->device_type; in cfi_amdstd_otp_walk()
1490 uint8_t otp, lockreg; in cfi_amdstd_otp_walk() local
1499 for (chipnum = 0; chipnum < cfi->numchips; chipnum++) { in cfi_amdstd_otp_walk()
1500 chip = &cfi->chips[chipnum]; in cfi_amdstd_otp_walk()
1506 base = chip->start; in cfi_amdstd_otp_walk()
1508 /* check whether secsi area is factory locked 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()
1517 otp = cfi_read_query(map, base + 0x3 * ofs_factor); in cfi_amdstd_otp_walk()
1520 mutex_unlock(&chip->mutex); in cfi_amdstd_otp_walk()
1522 if (otp & 0x80) { in cfi_amdstd_otp_walk()
1523 /* factory locked */ 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()
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()
1761 * present - it saves time and works around buggy chips that corrupt 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()
1796 adr += chip->start; in do_write_oneword()
1816 struct map_info *map = mtd->priv; in cfi_amdstd_write_words()
1817 struct cfi_private *cfi = map->fldrv_priv; in cfi_amdstd_write_words()
1823 chipnum = to >> cfi->chipshift; in cfi_amdstd_write_words()
1824 ofs = to - (chipnum << cfi->chipshift); in cfi_amdstd_write_words()
1825 chipstart = cfi->chips[chipnum].start; in cfi_amdstd_write_words()
1827 /* If it's not bus-aligned, do the first byte write */ in cfi_amdstd_write_words()
1828 if (ofs & (map_bankwidth(map)-1)) { in cfi_amdstd_write_words()
1829 unsigned long bus_ofs = ofs & ~(map_bankwidth(map)-1); in cfi_amdstd_write_words()
1830 int i = ofs - bus_ofs; in cfi_amdstd_write_words()
1835 mutex_lock(&cfi->chips[chipnum].mutex); in cfi_amdstd_write_words()
1837 if (cfi->chips[chipnum].state != FL_READY) { in cfi_amdstd_write_words()
1839 add_wait_queue(&cfi->chips[chipnum].wq, &wait); in cfi_amdstd_write_words()
1841 mutex_unlock(&cfi->chips[chipnum].mutex); in cfi_amdstd_write_words()
1844 remove_wait_queue(&cfi->chips[chipnum].wq, &wait); in cfi_amdstd_write_words()
1851 mutex_unlock(&cfi->chips[chipnum].mutex); in cfi_amdstd_write_words()
1854 n = min_t(int, len, map_bankwidth(map)-i); in cfi_amdstd_write_words()
1858 ret = do_write_oneword(map, &cfi->chips[chipnum], in cfi_amdstd_write_words()
1866 len -= n; in cfi_amdstd_write_words()
1868 if (ofs >> cfi->chipshift) { in cfi_amdstd_write_words()
1871 if (chipnum == cfi->numchips) in cfi_amdstd_write_words()
1882 ret = do_write_oneword(map, &cfi->chips[chipnum], in cfi_amdstd_write_words()
1890 len -= map_bankwidth(map); in cfi_amdstd_write_words()
1892 if (ofs >> cfi->chipshift) { in cfi_amdstd_write_words()
1895 if (chipnum == cfi->numchips) in cfi_amdstd_write_words()
1897 chipstart = cfi->chips[chipnum].start; in cfi_amdstd_write_words()
1902 if (len & (map_bankwidth(map)-1)) { in cfi_amdstd_write_words()
1906 mutex_lock(&cfi->chips[chipnum].mutex); in cfi_amdstd_write_words()
1908 if (cfi->chips[chipnum].state != FL_READY) { in cfi_amdstd_write_words()
1910 add_wait_queue(&cfi->chips[chipnum].wq, &wait); in cfi_amdstd_write_words()
1912 mutex_unlock(&cfi->chips[chipnum].mutex); in cfi_amdstd_write_words()
1915 remove_wait_queue(&cfi->chips[chipnum].wq, &wait); in cfi_amdstd_write_words()
1921 mutex_unlock(&cfi->chips[chipnum].mutex); in cfi_amdstd_write_words()
1925 ret = do_write_oneword(map, &cfi->chips[chipnum], in cfi_amdstd_write_words()
1949 u_write_timeout = usecs_to_jiffies(chip->buffer_write_time_max); in do_write_buffer_wait()
1953 if (chip->state != FL_WRITING) { in do_write_buffer_wait()
1958 add_wait_queue(&chip->wq, &wait); in do_write_buffer_wait()
1959 mutex_unlock(&chip->mutex); in do_write_buffer_wait()
1961 remove_wait_queue(&chip->wq, &wait); in do_write_buffer_wait()
1963 mutex_lock(&chip->mutex); in do_write_buffer_wait()
1975 ret = -EIO; in do_write_buffer_wait()
1981 ret = -EIO; in do_write_buffer_wait()
1997 * Recovery from write-buffer programming failures requires in do_write_buffer_reset()
1998 * the write-to-buffer-reset sequence. Since the last part in do_write_buffer_reset()
2004 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, in do_write_buffer_reset()
2005 cfi->device_type, NULL); in do_write_buffer_reset()
2006 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, in do_write_buffer_reset()
2007 cfi->device_type, NULL); in do_write_buffer_reset()
2008 cfi_send_gen_cmd(0xF0, cfi->addr_unlock1, chip->start, map, cfi, in do_write_buffer_reset()
2009 cfi->device_type, NULL); in do_write_buffer_reset()
2011 /* FIXME - should have reset delay before continuing */ in do_write_buffer_reset()
2021 struct cfi_private *cfi = map->fldrv_priv; in do_write_buffer()
2027 adr += chip->start; in do_write_buffer()
2030 mutex_lock(&chip->mutex); in do_write_buffer()
2033 mutex_unlock(&chip->mutex); in do_write_buffer()
2046 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL); in do_write_buffer()
2047 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL); in do_write_buffer()
2052 chip->state = FL_WRITING_TO_BUFFER; in do_write_buffer()
2056 map_write(map, CMD(words - 1), cmd_adr); in do_write_buffer()
2066 z -= map_bankwidth(map); in do_write_buffer()
2072 chip->state = FL_WRITING; in do_write_buffer()
2076 chip->word_write_time); in do_write_buffer()
2084 chip->state = FL_READY; in do_write_buffer()
2087 mutex_unlock(&chip->mutex); in do_write_buffer()
2096 struct map_info *map = mtd->priv; in cfi_amdstd_write_buffers()
2097 struct cfi_private *cfi = map->fldrv_priv; in cfi_amdstd_write_buffers()
2098 int wbufsize = cfi_interleave(cfi) << cfi->cfiq->MaxBufWriteSize; in cfi_amdstd_write_buffers()
2103 chipnum = to >> cfi->chipshift; in cfi_amdstd_write_buffers()
2104 ofs = to - (chipnum << cfi->chipshift); in cfi_amdstd_write_buffers()
2106 /* If it's not bus-aligned, do the first word write */ in cfi_amdstd_write_buffers()
2107 if (ofs & (map_bankwidth(map)-1)) { in cfi_amdstd_write_buffers()
2108 size_t local_len = (-ofs)&(map_bankwidth(map)-1); in cfi_amdstd_write_buffers()
2111 ret = cfi_amdstd_write_words(mtd, ofs + (chipnum<<cfi->chipshift), in cfi_amdstd_write_buffers()
2117 len -= local_len; in cfi_amdstd_write_buffers()
2119 if (ofs >> cfi->chipshift) { in cfi_amdstd_write_buffers()
2122 if (chipnum == cfi->numchips) in cfi_amdstd_write_buffers()
2130 int size = wbufsize - (ofs & (wbufsize-1)); in cfi_amdstd_write_buffers()
2135 size -= size % map_bankwidth(map); in cfi_amdstd_write_buffers()
2137 ret = do_write_buffer(map, &cfi->chips[chipnum], in cfi_amdstd_write_buffers()
2145 len -= size; in cfi_amdstd_write_buffers()
2147 if (ofs >> cfi->chipshift) { in cfi_amdstd_write_buffers()
2150 if (chipnum == cfi->numchips) in cfi_amdstd_write_buffers()
2158 ret = cfi_amdstd_write_words(mtd, ofs + (chipnum<<cfi->chipshift), in cfi_amdstd_write_buffers()
2180 struct cfi_private *cfi = map->fldrv_priv; in cfi_amdstd_panic_wait()
2188 if (chip->state == FL_READY && chip_ready(map, chip, adr, NULL)) in cfi_amdstd_panic_wait()
2201 map_write(map, CMD(0xF0), chip->start); in cfi_amdstd_panic_wait()
2211 retries--; in cfi_amdstd_panic_wait()
2215 return -EBUSY; in cfi_amdstd_panic_wait()
2233 struct cfi_private *cfi = map->fldrv_priv; in do_panic_write_oneword()
2239 adr += chip->start; in do_panic_write_oneword()
2250 * present - it saves time and works around buggy chips that corrupt in do_panic_write_oneword()
2263 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL); in do_panic_write_oneword()
2264 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL); in do_panic_write_oneword()
2265 cfi_send_gen_cmd(0xA0, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL); in do_panic_write_oneword()
2278 map_write(map, CMD(0xF0), chip->start); in do_panic_write_oneword()
2279 /* FIXME - should have reset delay before continuing */ in do_panic_write_oneword()
2284 ret = -EIO; in do_panic_write_oneword()
2308 struct map_info *map = mtd->priv; in cfi_amdstd_panic_write()
2309 struct cfi_private *cfi = map->fldrv_priv; in cfi_amdstd_panic_write()
2314 chipnum = to >> cfi->chipshift; in cfi_amdstd_panic_write()
2315 ofs = to - (chipnum << cfi->chipshift); in cfi_amdstd_panic_write()
2316 chipstart = cfi->chips[chipnum].start; in cfi_amdstd_panic_write()
2319 if (ofs & (map_bankwidth(map) - 1)) { in cfi_amdstd_panic_write()
2320 unsigned long bus_ofs = ofs & ~(map_bankwidth(map) - 1); in cfi_amdstd_panic_write()
2321 int i = ofs - bus_ofs; in cfi_amdstd_panic_write()
2325 ret = cfi_amdstd_panic_wait(map, &cfi->chips[chipnum], bus_ofs); in cfi_amdstd_panic_write()
2333 n = min_t(int, len, map_bankwidth(map) - i); in cfi_amdstd_panic_write()
2337 ret = do_panic_write_oneword(map, &cfi->chips[chipnum], in cfi_amdstd_panic_write()
2345 len -= n; in cfi_amdstd_panic_write()
2347 if (ofs >> cfi->chipshift) { in cfi_amdstd_panic_write()
2350 if (chipnum == cfi->numchips) in cfi_amdstd_panic_write()
2361 ret = do_panic_write_oneword(map, &cfi->chips[chipnum], in cfi_amdstd_panic_write()
2369 len -= map_bankwidth(map); in cfi_amdstd_panic_write()
2371 if (ofs >> cfi->chipshift) { in cfi_amdstd_panic_write()
2374 if (chipnum == cfi->numchips) in cfi_amdstd_panic_write()
2377 chipstart = cfi->chips[chipnum].start; in cfi_amdstd_panic_write()
2382 if (len & (map_bankwidth(map) - 1)) { in cfi_amdstd_panic_write()
2385 ret = cfi_amdstd_panic_wait(map, &cfi->chips[chipnum], ofs); in cfi_amdstd_panic_write()
2393 ret = do_panic_write_oneword(map, &cfi->chips[chipnum], in cfi_amdstd_panic_write()
2411 struct cfi_private *cfi = map->fldrv_priv; in do_erase_chip()
2419 adr = cfi->addr_unlock1; in do_erase_chip()
2421 mutex_lock(&chip->mutex); in do_erase_chip()
2424 mutex_unlock(&chip->mutex); in do_erase_chip()
2429 __func__, chip->start); in do_erase_chip()
2431 XIP_INVAL_CACHED_RANGE(map, adr, map->size); in do_erase_chip()
2436 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL); in do_erase_chip()
2437 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL); in do_erase_chip()
2438 cfi_send_gen_cmd(0x80, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL); in do_erase_chip()
2439 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL); in do_erase_chip()
2440 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL); in do_erase_chip()
2441 cfi_send_gen_cmd(0x10, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL); in do_erase_chip()
2443 chip->state = FL_ERASING; in do_erase_chip()
2444 chip->erase_suspended = 0; in do_erase_chip()
2445 chip->in_progress_block_addr = adr; in do_erase_chip()
2446 chip->in_progress_block_mask = ~(map->size - 1); in do_erase_chip()
2449 adr, map->size, in do_erase_chip()
2450 chip->erase_time*500); in do_erase_chip()
2455 if (chip->state != FL_ERASING) { in do_erase_chip()
2458 add_wait_queue(&chip->wq, &wait); in do_erase_chip()
2459 mutex_unlock(&chip->mutex); in do_erase_chip()
2461 remove_wait_queue(&chip->wq, &wait); in do_erase_chip()
2462 mutex_lock(&chip->mutex); in do_erase_chip()
2465 if (chip->erase_suspended) { in do_erase_chip()
2469 chip->erase_suspended = 0; in do_erase_chip()
2474 ret = -EIO; in do_erase_chip()
2481 ret = -EIO; in do_erase_chip()
2491 map_write(map, CMD(0xF0), chip->start); in do_erase_chip()
2492 /* FIXME - should have reset delay before continuing */ in do_erase_chip()
2500 chip->state = FL_READY; in do_erase_chip()
2504 mutex_unlock(&chip->mutex); in do_erase_chip()
2512 struct cfi_private *cfi = map->fldrv_priv; in do_erase_oneblock()
2519 adr += chip->start; in do_erase_oneblock()
2521 mutex_lock(&chip->mutex); in do_erase_oneblock()
2524 mutex_unlock(&chip->mutex); in do_erase_oneblock()
2536 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL); in do_erase_oneblock()
2537 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL); in do_erase_oneblock()
2538 cfi_send_gen_cmd(0x80, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL); in do_erase_oneblock()
2539 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL); in do_erase_oneblock()
2540 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL); in do_erase_oneblock()
2541 map_write(map, cfi->sector_erase_cmd, adr); in do_erase_oneblock()
2543 chip->state = FL_ERASING; in do_erase_oneblock()
2544 chip->erase_suspended = 0; in do_erase_oneblock()
2545 chip->in_progress_block_addr = adr; in do_erase_oneblock()
2546 chip->in_progress_block_mask = ~(len - 1); in do_erase_oneblock()
2550 chip->erase_time*500); in do_erase_oneblock()
2555 if (chip->state != FL_ERASING) { in do_erase_oneblock()
2558 add_wait_queue(&chip->wq, &wait); in do_erase_oneblock()
2559 mutex_unlock(&chip->mutex); in do_erase_oneblock()
2561 remove_wait_queue(&chip->wq, &wait); in do_erase_oneblock()
2562 mutex_lock(&chip->mutex); in do_erase_oneblock()
2565 if (chip->erase_suspended) { in do_erase_oneblock()
2569 chip->erase_suspended = 0; in do_erase_oneblock()
2574 ret = -EIO; in do_erase_oneblock()
2581 ret = -EIO; in do_erase_oneblock()
2591 map_write(map, CMD(0xF0), chip->start); in do_erase_oneblock()
2592 /* FIXME - should have reset delay before continuing */ in do_erase_oneblock()
2600 chip->state = FL_READY; in do_erase_oneblock()
2604 mutex_unlock(&chip->mutex); in do_erase_oneblock()
2611 return cfi_varsize_frob(mtd, do_erase_oneblock, instr->addr, in cfi_amdstd_erase_varsize()
2612 instr->len, NULL); in cfi_amdstd_erase_varsize()
2618 struct map_info *map = mtd->priv; in cfi_amdstd_erase_chip()
2619 struct cfi_private *cfi = map->fldrv_priv; in cfi_amdstd_erase_chip()
2621 if (instr->addr != 0) in cfi_amdstd_erase_chip()
2622 return -EINVAL; in cfi_amdstd_erase_chip()
2624 if (instr->len != mtd->size) in cfi_amdstd_erase_chip()
2625 return -EINVAL; in cfi_amdstd_erase_chip()
2627 return do_erase_chip(map, &cfi->chips[0]); in cfi_amdstd_erase_chip()
2633 struct cfi_private *cfi = map->fldrv_priv; in do_atmel_lock()
2636 mutex_lock(&chip->mutex); in do_atmel_lock()
2637 ret = get_chip(map, chip, adr + chip->start, FL_LOCKING); in do_atmel_lock()
2640 chip->state = FL_LOCKING; in do_atmel_lock()
2644 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, in do_atmel_lock()
2645 cfi->device_type, NULL); in do_atmel_lock()
2646 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, in do_atmel_lock()
2647 cfi->device_type, NULL); in do_atmel_lock()
2648 cfi_send_gen_cmd(0x80, cfi->addr_unlock1, chip->start, map, cfi, in do_atmel_lock()
2649 cfi->device_type, NULL); in do_atmel_lock()
2650 cfi_send_gen_cmd(0xAA, 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(0x55, cfi->addr_unlock2, chip->start, map, cfi, in do_atmel_lock()
2653 cfi->device_type, NULL); in do_atmel_lock()
2654 map_write(map, CMD(0x40), chip->start + adr); in do_atmel_lock()
2656 chip->state = FL_READY; in do_atmel_lock()
2657 put_chip(map, chip, adr + chip->start); in do_atmel_lock()
2661 mutex_unlock(&chip->mutex); in do_atmel_lock()
2668 struct cfi_private *cfi = map->fldrv_priv; in do_atmel_unlock()
2671 mutex_lock(&chip->mutex); in do_atmel_unlock()
2672 ret = get_chip(map, chip, adr + chip->start, FL_UNLOCKING); in do_atmel_unlock()
2675 chip->state = FL_UNLOCKING; in do_atmel_unlock()
2679 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, in do_atmel_unlock()
2680 cfi->device_type, NULL); in do_atmel_unlock()
2683 chip->state = FL_READY; in do_atmel_unlock()
2684 put_chip(map, chip, adr + chip->start); in do_atmel_unlock()
2688 mutex_unlock(&chip->mutex); in do_atmel_unlock()
2703 * Advanced Sector Protection - PPB (Persistent Protection Bit) locking
2720 struct cfi_private *cfi = map->fldrv_priv; in do_ppb_xxlock()
2724 adr += chip->start; in do_ppb_xxlock()
2725 mutex_lock(&chip->mutex); in do_ppb_xxlock()
2728 mutex_unlock(&chip->mutex); in do_ppb_xxlock()
2734 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, in do_ppb_xxlock()
2735 cfi->device_type, NULL); in do_ppb_xxlock()
2736 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, in do_ppb_xxlock()
2737 cfi->device_type, NULL); in do_ppb_xxlock()
2739 cfi_send_gen_cmd(0xC0, cfi->addr_unlock1, chip->start, map, cfi, in do_ppb_xxlock()
2740 cfi->device_type, NULL); in do_ppb_xxlock()
2743 chip->state = FL_LOCKING; in do_ppb_xxlock()
2751 chip->state = FL_UNLOCKING; in do_ppb_xxlock()
2752 map_write(map, CMD(0x80), chip->start); in do_ppb_xxlock()
2753 map_write(map, CMD(0x30), chip->start); in do_ppb_xxlock()
2755 chip->state = FL_JEDEC_QUERY; in do_ppb_xxlock()
2756 /* Return locked status: 0->locked, 1->unlocked */ in do_ppb_xxlock()
2771 ret = -EIO; in do_ppb_xxlock()
2779 map_write(map, CMD(0x90), chip->start); in do_ppb_xxlock()
2780 map_write(map, CMD(0x00), chip->start); in do_ppb_xxlock()
2782 chip->state = FL_READY; in do_ppb_xxlock()
2784 mutex_unlock(&chip->mutex); in do_ppb_xxlock()
2799 struct mtd_erase_region_info *regions = mtd->eraseregions; in cfi_ppb_unlock()
2800 struct map_info *map = mtd->priv; in cfi_ppb_unlock()
2801 struct cfi_private *cfi = map->fldrv_priv; in cfi_ppb_unlock()
2814 * We need to re-lock all previously locked sectors. So lets in cfi_ppb_unlock()
2819 for (i = 0; i < mtd->numeraseregions; i++) in cfi_ppb_unlock()
2824 return -ENOMEM; in cfi_ppb_unlock()
2835 length = mtd->size; in cfi_ppb_unlock()
2843 * status at "unlocked" (locked=0) for the final re-locking. in cfi_ppb_unlock()
2846 sect[sectors].chip = &cfi->chips[chipnum]; in cfi_ppb_unlock()
2849 map, &cfi->chips[chipnum], adr, 0, in cfi_ppb_unlock()
2855 length -= size; in cfi_ppb_unlock()
2860 if (adr >> cfi->chipshift) { in cfi_ppb_unlock()
2866 if (chipnum >= cfi->numchips) in cfi_ppb_unlock()
2875 return -EINVAL; in cfi_ppb_unlock()
2889 * We need to re-lock all previously locked sectors. in cfi_ppb_unlock()
2910 struct map_info *map = mtd->priv; in cfi_amdstd_sync()
2911 struct cfi_private *cfi = map->fldrv_priv; in cfi_amdstd_sync()
2917 for (i=0; !ret && i<cfi->numchips; i++) { in cfi_amdstd_sync()
2918 chip = &cfi->chips[i]; in cfi_amdstd_sync()
2921 mutex_lock(&chip->mutex); in cfi_amdstd_sync()
2923 switch(chip->state) { in cfi_amdstd_sync()
2928 chip->oldstate = chip->state; in cfi_amdstd_sync()
2929 chip->state = FL_SYNCING; in cfi_amdstd_sync()
2930 /* No need to wake_up() on this state change - in cfi_amdstd_sync()
2936 mutex_unlock(&chip->mutex); in cfi_amdstd_sync()
2942 add_wait_queue(&chip->wq, &wait); in cfi_amdstd_sync()
2944 mutex_unlock(&chip->mutex); in cfi_amdstd_sync()
2948 remove_wait_queue(&chip->wq, &wait); in cfi_amdstd_sync()
2956 for (i--; i >=0; i--) { in cfi_amdstd_sync()
2957 chip = &cfi->chips[i]; in cfi_amdstd_sync()
2959 mutex_lock(&chip->mutex); in cfi_amdstd_sync()
2961 if (chip->state == FL_SYNCING) { in cfi_amdstd_sync()
2962 chip->state = chip->oldstate; in cfi_amdstd_sync()
2963 wake_up(&chip->wq); in cfi_amdstd_sync()
2965 mutex_unlock(&chip->mutex); in cfi_amdstd_sync()
2972 struct map_info *map = mtd->priv; in cfi_amdstd_suspend()
2973 struct cfi_private *cfi = map->fldrv_priv; in cfi_amdstd_suspend()
2978 for (i=0; !ret && i<cfi->numchips; i++) { in cfi_amdstd_suspend()
2979 chip = &cfi->chips[i]; in cfi_amdstd_suspend()
2981 mutex_lock(&chip->mutex); in cfi_amdstd_suspend()
2983 switch(chip->state) { in cfi_amdstd_suspend()
2988 chip->oldstate = chip->state; in cfi_amdstd_suspend()
2989 chip->state = FL_PM_SUSPENDED; in cfi_amdstd_suspend()
2990 /* No need to wake_up() on this state change - in cfi_amdstd_suspend()
2999 ret = -EAGAIN; in cfi_amdstd_suspend()
3002 mutex_unlock(&chip->mutex); in cfi_amdstd_suspend()
3008 for (i--; i >=0; i--) { in cfi_amdstd_suspend()
3009 chip = &cfi->chips[i]; in cfi_amdstd_suspend()
3011 mutex_lock(&chip->mutex); in cfi_amdstd_suspend()
3013 if (chip->state == FL_PM_SUSPENDED) { in cfi_amdstd_suspend()
3014 chip->state = chip->oldstate; in cfi_amdstd_suspend()
3015 wake_up(&chip->wq); in cfi_amdstd_suspend()
3017 mutex_unlock(&chip->mutex); in cfi_amdstd_suspend()
3027 struct map_info *map = mtd->priv; in cfi_amdstd_resume()
3028 struct cfi_private *cfi = map->fldrv_priv; in cfi_amdstd_resume()
3032 for (i=0; i<cfi->numchips; i++) { in cfi_amdstd_resume()
3034 chip = &cfi->chips[i]; in cfi_amdstd_resume()
3036 mutex_lock(&chip->mutex); in cfi_amdstd_resume()
3038 if (chip->state == FL_PM_SUSPENDED) { in cfi_amdstd_resume()
3039 chip->state = FL_READY; in cfi_amdstd_resume()
3040 map_write(map, CMD(0xF0), chip->start); in cfi_amdstd_resume()
3041 wake_up(&chip->wq); in cfi_amdstd_resume()
3046 mutex_unlock(&chip->mutex); in cfi_amdstd_resume()
3059 struct map_info *map = mtd->priv; in cfi_amdstd_reset()
3060 struct cfi_private *cfi = map->fldrv_priv; in cfi_amdstd_reset()
3064 for (i = 0; i < cfi->numchips; i++) { in cfi_amdstd_reset()
3066 chip = &cfi->chips[i]; in cfi_amdstd_reset()
3068 mutex_lock(&chip->mutex); in cfi_amdstd_reset()
3070 ret = get_chip(map, chip, chip->start, FL_SHUTDOWN); in cfi_amdstd_reset()
3072 map_write(map, CMD(0xF0), chip->start); in cfi_amdstd_reset()
3073 chip->state = FL_SHUTDOWN; in cfi_amdstd_reset()
3074 put_chip(map, chip, chip->start); in cfi_amdstd_reset()
3077 mutex_unlock(&chip->mutex); in cfi_amdstd_reset()
3097 struct map_info *map = mtd->priv; in cfi_amdstd_destroy()
3098 struct cfi_private *cfi = map->fldrv_priv; in cfi_amdstd_destroy()
3101 unregister_reboot_notifier(&mtd->reboot_notifier); in cfi_amdstd_destroy()
3102 kfree(cfi->cmdset_priv); in cfi_amdstd_destroy()
3103 kfree(cfi->cfiq); in cfi_amdstd_destroy()
3105 kfree(mtd->eraseregions); in cfi_amdstd_destroy()