Lines Matching refs:cfi

37 #include <linux/mtd/cfi.h>
120 static int cfi_use_status_reg(struct cfi_private *cfi)
122 struct cfi_pri_amdstd *extp = cfi->cmdset_priv;
132 struct cfi_private *cfi = map->fldrv_priv;
135 if (!cfi_use_status_reg(cfi))
138 cfi_send_gen_cmd(0x70, cfi->addr_unlock1, chip->start, map, cfi,
139 cfi->device_type, NULL);
227 struct cfi_private *cfi = map->fldrv_priv;
228 struct cfi_pri_amdstd *extp = cfi->cmdset_priv;
236 map->name, cfi->mfr, cfi->id);
243 if (((cfi->id == 0xBA) || (cfi->id == 0x22BA)) &&
254 (cfi->mfr == CFI_MFR_MACRONIX)) {
259 if (cfi->id & 0x80) {
260 printk(KERN_WARNING "%s: JEDEC Device ID is 0x%02X. Assuming broken CFI table.\n", map->name, cfi->id);
277 struct cfi_private *cfi = map->fldrv_priv;
279 if (cfi->mfr == CFI_MFR_AMD && cfi->id == 0x2201)
282 if (cfi->cfiq->BufWriteTimeoutTyp) {
293 struct cfi_private *cfi = map->fldrv_priv;
294 struct cfi_pri_amdstd *extp = cfi->cmdset_priv;
304 if (cfi->id == AT49BV6416) {
317 cfi->cfiq->BufWriteTimeoutTyp = 0;
318 cfi->cfiq->BufWriteTimeoutMax = 0;
331 struct cfi_private *cfi = map->fldrv_priv;
332 if ((cfi->cfiq->NumEraseRegions == 1) &&
333 ((cfi->cfiq->EraseRegionInfo[0] & 0xffff) == 0)) {
353 struct cfi_private *cfi = map->fldrv_priv;
361 cfi->cfiq->NumEraseRegions = 1;
367 struct cfi_private *cfi = map->fldrv_priv;
371 cfi->addr_unlock1 = 0x5555;
372 cfi->addr_unlock2 = 0x2AAA;
378 struct cfi_private *cfi = map->fldrv_priv;
382 cfi->addr_unlock1 = 0x555;
383 cfi->addr_unlock2 = 0x2AA;
385 cfi->sector_erase_cmd = CMD(0x50);
391 struct cfi_private *cfi = map->fldrv_priv;
399 cfi->cfiq->EraseRegionInfo[0] = 0x002003ff;
407 struct cfi_private *cfi = map->fldrv_priv;
409 if ((cfi->cfiq->EraseRegionInfo[0] & 0xffff) == 0x003f) {
410 cfi->cfiq->EraseRegionInfo[0] |= 0x0040;
419 struct cfi_private *cfi = map->fldrv_priv;
421 if ((cfi->cfiq->EraseRegionInfo[1] & 0xffff) == 0x007e) {
422 cfi->cfiq->EraseRegionInfo[1] &= ~0x0040;
431 struct cfi_private *cfi = map->fldrv_priv;
437 cfi->cfiq->EraseRegionInfo[0] = 0x020001ff;
445 struct cfi_private *cfi = map->fldrv_priv;
447 if (cfi->mfr == CFI_MFR_AMD && cfi->id == S29GL064N_MN12)
448 cfi->quirks |= CFI_QUIRK_DQ_TRUE_DATA;
511 static void cfi_fixup_major_minor(struct cfi_private *cfi,
514 if (cfi->mfr == CFI_MFR_SAMSUNG) {
532 if (cfi->mfr == CFI_MFR_SST && (cfi->id >> 4) == 0x0536) {
538 static int is_m29ew(struct cfi_private *cfi)
540 if (cfi->mfr == CFI_MFR_INTEL &&
541 ((cfi->device_type == CFI_DEVICETYPE_X8 && (cfi->id & 0xff) == 0x7e) ||
542 (cfi->device_type == CFI_DEVICETYPE_X16 && cfi->id == 0x227e)))
560 struct cfi_private *cfi = map->fldrv_priv;
562 if (is_m29ew(cfi))
590 static void cfi_fixup_m29ew_delay_after_resume(struct cfi_private *cfi)
596 if (is_m29ew(cfi))
602 struct cfi_private *cfi = map->fldrv_priv;
629 mtd->writebufsize = cfi_interleave(cfi) << cfi->cfiq->MaxBufWriteSize;
637 if (cfi->cfi_mode==CFI_MODE_CFI){
639 __u16 adr = primary?cfi->cfiq->P_ADR:cfi->cfiq->A_ADR;
648 cfi_fixup_major_minor(cfi, extp);
672 cfi->cmdset_priv = extp;
674 /* Apply cfi device specific fixups */
701 if (bootloc == 3 && cfi->cfiq->NumEraseRegions > 1) {
704 for (i=0; i<cfi->cfiq->NumEraseRegions / 2; i++) {
705 int j = (cfi->cfiq->NumEraseRegions-1)-i;
707 swap(cfi->cfiq->EraseRegionInfo[i],
708 cfi->cfiq->EraseRegionInfo[j]);
712 cfi->addr_unlock1 = 0x555;
713 cfi->addr_unlock2 = 0x2aa;
717 if (!cfi->addr_unlock1 || !cfi->addr_unlock2) {
723 else if (cfi->cfi_mode == CFI_MODE_JEDEC) {
730 for (i=0; i< cfi->numchips; i++) {
731 cfi->chips[i].word_write_time = 1<<cfi->cfiq->WordWriteTimeoutTyp;
732 cfi->chips[i].buffer_write_time = 1<<cfi->cfiq->BufWriteTimeoutTyp;
733 cfi->chips[i].erase_time = 1<<cfi->cfiq->BlockEraseTimeoutTyp;
740 if (cfi->cfiq->BufWriteTimeoutTyp &&
741 cfi->cfiq->BufWriteTimeoutMax)
742 cfi->chips[i].buffer_write_time_max =
743 1 << (cfi->cfiq->BufWriteTimeoutTyp +
744 cfi->cfiq->BufWriteTimeoutMax);
746 cfi->chips[i].buffer_write_time_max = 0;
748 cfi->chips[i].buffer_write_time_max =
749 max(cfi->chips[i].buffer_write_time_max, 2000);
751 cfi->chips[i].ref_point_counter = 0;
752 init_waitqueue_head(&(cfi->chips[i].wq));
768 struct cfi_private *cfi = map->fldrv_priv;
769 unsigned long devsize = (1<<cfi->cfiq->DevSize) * cfi->interleave;
774 (cfi->cfi_mode == CFI_MODE_CFI)?"CFI":"JEDEC",cfi->numchips);
776 mtd->size = devsize * cfi->numchips;
778 mtd->numeraseregions = cfi->cfiq->NumEraseRegions * cfi->numchips;
785 for (i=0; i<cfi->cfiq->NumEraseRegions; i++) {
787 ersize = ((cfi->cfiq->EraseRegionInfo[i] >> 8) & ~0xff) * cfi->interleave;
788 ernum = (cfi->cfiq->EraseRegionInfo[i] & 0xffff) + 1;
793 for (j=0; j<cfi->numchips; j++) {
794 mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].offset = (j*devsize)+offset;
795 mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].erasesize = ersize;
796 mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].numblocks = ernum;
813 kfree(cfi->cmdset_priv);
834 struct cfi_private *cfi = map->fldrv_priv;
838 if (cfi_use_status_reg(cfi)) {
844 cfi_send_gen_cmd(0x70, cfi->addr_unlock1, chip->start, map, cfi,
845 cfi->device_type, NULL);
865 struct cfi_private *cfi = map->fldrv_priv;
868 if (cfi->quirks & CFI_QUIRK_DQ_TRUE_DATA)
877 struct cfi_private *cfi = map->fldrv_priv;
879 struct cfi_pri_amdstd *cfip = (struct cfi_pri_amdstd *)cfi->cmdset_priv;
982 struct cfi_private *cfi = map->fldrv_priv;
988 map_write(map, cfi->sector_erase_cmd, chip->in_progress_block_addr);
989 cfi_fixup_m29ew_delay_after_resume(cfi);
1032 struct cfi_private *cfi = map->fldrv_priv;
1059 struct cfi_private *cfi = map->fldrv_priv;
1060 struct cfi_pri_amdstd *extp = cfi->cmdset_priv;
1069 (cfi_interleave_is_1(cfi) || chip->oldstate == FL_READY)) {
1132 map_write(map, cfi->sector_erase_cmd, adr);
1206 struct cfi_private *cfi = map->fldrv_priv;
1238 struct cfi_private *cfi = map->fldrv_priv;
1244 chipnum = (from >> cfi->chipshift);
1245 ofs = from - (chipnum << cfi->chipshift);
1250 if (chipnum >= cfi->numchips)
1253 if ((len + ofs -1) >> cfi->chipshift)
1254 thislen = (1<<cfi->chipshift) - ofs;
1258 ret = do_read_onechip(map, &cfi->chips[chipnum], ofs, thislen, buf);
1278 struct cfi_private *cfi = map->fldrv_priv;
1280 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi,
1281 cfi->device_type, NULL);
1282 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi,
1283 cfi->device_type, NULL);
1284 cfi_send_gen_cmd(0x88, cfi->addr_unlock1, chip->start, map, cfi,
1285 cfi->device_type, NULL);
1293 struct cfi_private *cfi = map->fldrv_priv;
1295 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi,
1296 cfi->device_type, NULL);
1297 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi,
1298 cfi->device_type, NULL);
1299 cfi_send_gen_cmd(0x90, cfi->addr_unlock1, chip->start, map, cfi,
1300 cfi->device_type, NULL);
1301 cfi_send_gen_cmd(0x00, cfi->addr_unlock1, chip->start, map, cfi,
1302 cfi->device_type, NULL);
1346 struct cfi_private *cfi = map->fldrv_priv;
1359 if (chipnum >= cfi->numchips)
1367 ret = do_read_secsi_onechip(map, &cfi->chips[chipnum], ofs,
1419 struct cfi_private *cfi = map->fldrv_priv;
1437 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi,
1438 cfi->device_type, NULL);
1439 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi,
1440 cfi->device_type, NULL);
1441 cfi_send_gen_cmd(0x40, cfi->addr_unlock1, chip->start, map, cfi,
1442 cfi->device_type, NULL);
1485 struct cfi_private *cfi = map->fldrv_priv;
1486 int ofs_factor = cfi->interleave * cfi->device_type;
1499 for (chipnum = 0; chipnum < cfi->numchips; chipnum++) {
1500 chip = &cfi->chips[chipnum];
1505 if (is_m29ew(cfi)) {
1516 cfi_qry_mode_on(base, map, cfi);
1518 cfi_qry_mode_off(base, map, cfi);
1539 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1,
1540 chip->start, map, cfi,
1541 cfi->device_type, NULL);
1542 cfi_send_gen_cmd(0x55, cfi->addr_unlock2,
1543 chip->start, map, cfi,
1544 cfi->device_type, NULL);
1545 cfi_send_gen_cmd(0x40, cfi->addr_unlock1,
1546 chip->start, map, cfi,
1547 cfi->device_type, NULL);
1647 int mode, struct cfi_private *cfi)
1662 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
1663 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL);
1664 cfi_send_gen_cmd(0xA0, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
1754 struct cfi_private *cfi = map->fldrv_priv;
1776 ret = do_write_oneword_once(map, chip, adr, datum, mode, cfi);
1819 struct cfi_private *cfi = map->fldrv_priv;
1825 chipnum = to >> cfi->chipshift;
1826 ofs = to - (chipnum << cfi->chipshift);
1827 chipstart = cfi->chips[chipnum].start;
1837 mutex_lock(&cfi->chips[chipnum].mutex);
1839 if (cfi->chips[chipnum].state != FL_READY) {
1841 add_wait_queue(&cfi->chips[chipnum].wq, &wait);
1843 mutex_unlock(&cfi->chips[chipnum].mutex);
1846 remove_wait_queue(&cfi->chips[chipnum].wq, &wait);
1853 mutex_unlock(&cfi->chips[chipnum].mutex);
1860 ret = do_write_oneword(map, &cfi->chips[chipnum],
1870 if (ofs >> cfi->chipshift) {
1873 if (chipnum == cfi->numchips)
1884 ret = do_write_oneword(map, &cfi->chips[chipnum],
1894 if (ofs >> cfi->chipshift) {
1897 if (chipnum == cfi->numchips)
1899 chipstart = cfi->chips[chipnum].start;
1908 mutex_lock(&cfi->chips[chipnum].mutex);
1910 if (cfi->chips[chipnum].state != FL_READY) {
1912 add_wait_queue(&cfi->chips[chipnum].wq, &wait);
1914 mutex_unlock(&cfi->chips[chipnum].mutex);
1917 remove_wait_queue(&cfi->chips[chipnum].wq, &wait);
1923 mutex_unlock(&cfi->chips[chipnum].mutex);
1927 ret = do_write_oneword(map, &cfi->chips[chipnum],
1996 struct cfi_private *cfi)
2006 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi,
2007 cfi->device_type, NULL);
2008 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi,
2009 cfi->device_type, NULL);
2010 cfi_send_gen_cmd(0xF0, cfi->addr_unlock1, chip->start, map, cfi,
2011 cfi->device_type, NULL);
2023 struct cfi_private *cfi = map->fldrv_priv;
2048 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
2049 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL);
2082 do_write_buffer_reset(map, chip, cfi);
2099 struct cfi_private *cfi = map->fldrv_priv;
2100 int wbufsize = cfi_interleave(cfi) << cfi->cfiq->MaxBufWriteSize;
2105 chipnum = to >> cfi->chipshift;
2106 ofs = to - (chipnum << cfi->chipshift);
2113 ret = cfi_amdstd_write_words(mtd, ofs + (chipnum<<cfi->chipshift),
2121 if (ofs >> cfi->chipshift) {
2124 if (chipnum == cfi->numchips)
2139 ret = do_write_buffer(map, &cfi->chips[chipnum],
2149 if (ofs >> cfi->chipshift) {
2152 if (chipnum == cfi->numchips)
2160 ret = cfi_amdstd_write_words(mtd, ofs + (chipnum<<cfi->chipshift),
2182 struct cfi_private *cfi = map->fldrv_priv;
2235 struct cfi_private *cfi = map->fldrv_priv;
2265 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
2266 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL);
2267 cfi_send_gen_cmd(0xA0, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
2311 struct cfi_private *cfi = map->fldrv_priv;
2316 chipnum = to >> cfi->chipshift;
2317 ofs = to - (chipnum << cfi->chipshift);
2318 chipstart = cfi->chips[chipnum].start;
2327 ret = cfi_amdstd_panic_wait(map, &cfi->chips[chipnum], bus_ofs);
2339 ret = do_panic_write_oneword(map, &cfi->chips[chipnum],
2349 if (ofs >> cfi->chipshift) {
2352 if (chipnum == cfi->numchips)
2363 ret = do_panic_write_oneword(map, &cfi->chips[chipnum],
2373 if (ofs >> cfi->chipshift) {
2376 if (chipnum == cfi->numchips)
2379 chipstart = cfi->chips[chipnum].start;
2387 ret = cfi_amdstd_panic_wait(map, &cfi->chips[chipnum], ofs);
2395 ret = do_panic_write_oneword(map, &cfi->chips[chipnum],
2413 struct cfi_private *cfi = map->fldrv_priv;
2421 adr = cfi->addr_unlock1;
2438 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
2439 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL);
2440 cfi_send_gen_cmd(0x80, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
2441 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
2442 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL);
2443 cfi_send_gen_cmd(0x10, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
2514 struct cfi_private *cfi = map->fldrv_priv;
2538 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
2539 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL);
2540 cfi_send_gen_cmd(0x80, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
2541 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
2542 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL);
2543 map_write(map, cfi->sector_erase_cmd, adr);
2621 struct cfi_private *cfi = map->fldrv_priv;
2629 return do_erase_chip(map, &cfi->chips[0]);
2635 struct cfi_private *cfi = map->fldrv_priv;
2646 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi,
2647 cfi->device_type, NULL);
2648 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi,
2649 cfi->device_type, NULL);
2650 cfi_send_gen_cmd(0x80, cfi->addr_unlock1, chip->start, map, cfi,
2651 cfi->device_type, NULL);
2652 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi,
2653 cfi->device_type, NULL);
2654 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi,
2655 cfi->device_type, NULL);
2670 struct cfi_private *cfi = map->fldrv_priv;
2681 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi,
2682 cfi->device_type, NULL);
2722 struct cfi_private *cfi = map->fldrv_priv;
2736 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi,
2737 cfi->device_type, NULL);
2738 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi,
2739 cfi->device_type, NULL);
2741 cfi_send_gen_cmd(0xC0, cfi->addr_unlock1, chip->start, map, cfi,
2742 cfi->device_type, NULL);
2803 struct cfi_private *cfi = map->fldrv_priv;
2848 sect[sectors].chip = &cfi->chips[chipnum];
2851 map, &cfi->chips[chipnum], adr, 0,
2862 if (adr >> cfi->chipshift) {
2868 if (chipnum >= cfi->numchips)
2913 struct cfi_private *cfi = map->fldrv_priv;
2919 for (i=0; !ret && i<cfi->numchips; i++) {
2920 chip = &cfi->chips[i];
2959 chip = &cfi->chips[i];
2975 struct cfi_private *cfi = map->fldrv_priv;
2980 for (i=0; !ret && i<cfi->numchips; i++) {
2981 chip = &cfi->chips[i];
3011 chip = &cfi->chips[i];
3030 struct cfi_private *cfi = map->fldrv_priv;
3034 for (i=0; i<cfi->numchips; i++) {
3036 chip = &cfi->chips[i];
3062 struct cfi_private *cfi = map->fldrv_priv;
3066 for (i = 0; i < cfi->numchips; i++) {
3068 chip = &cfi->chips[i];
3100 struct cfi_private *cfi = map->fldrv_priv;
3104 kfree(cfi->cmdset_priv);
3105 kfree(cfi->cfiq);
3106 kfree(cfi);