Lines Matching refs:cfi

39 #include <linux/mtd/cfi.h>
121 static int cfi_use_status_reg(struct cfi_private *cfi)
123 struct cfi_pri_amdstd *extp = cfi->cmdset_priv;
133 struct cfi_private *cfi = map->fldrv_priv;
136 if (!cfi_use_status_reg(cfi))
139 cfi_send_gen_cmd(0x70, cfi->addr_unlock1, chip->start, map, cfi,
140 cfi->device_type, NULL);
228 struct cfi_private *cfi = map->fldrv_priv;
229 struct cfi_pri_amdstd *extp = cfi->cmdset_priv;
237 map->name, cfi->mfr, cfi->id);
244 if (((cfi->id == 0xBA) || (cfi->id == 0x22BA)) &&
255 (cfi->mfr == CFI_MFR_MACRONIX)) {
260 if (cfi->id & 0x80) {
261 printk(KERN_WARNING "%s: JEDEC Device ID is 0x%02X. Assuming broken CFI table.\n", map->name, cfi->id);
278 struct cfi_private *cfi = map->fldrv_priv;
279 if (cfi->cfiq->BufWriteTimeoutTyp) {
290 struct cfi_private *cfi = map->fldrv_priv;
291 struct cfi_pri_amdstd *extp = cfi->cmdset_priv;
301 if (cfi->id == AT49BV6416) {
314 cfi->cfiq->BufWriteTimeoutTyp = 0;
315 cfi->cfiq->BufWriteTimeoutMax = 0;
328 struct cfi_private *cfi = map->fldrv_priv;
329 if ((cfi->cfiq->NumEraseRegions == 1) &&
330 ((cfi->cfiq->EraseRegionInfo[0] & 0xffff) == 0)) {
350 struct cfi_private *cfi = map->fldrv_priv;
358 cfi->cfiq->NumEraseRegions = 1;
364 struct cfi_private *cfi = map->fldrv_priv;
368 cfi->addr_unlock1 = 0x5555;
369 cfi->addr_unlock2 = 0x2AAA;
375 struct cfi_private *cfi = map->fldrv_priv;
379 cfi->addr_unlock1 = 0x555;
380 cfi->addr_unlock2 = 0x2AA;
382 cfi->sector_erase_cmd = CMD(0x50);
388 struct cfi_private *cfi = map->fldrv_priv;
396 cfi->cfiq->EraseRegionInfo[0] = 0x002003ff;
404 struct cfi_private *cfi = map->fldrv_priv;
406 if ((cfi->cfiq->EraseRegionInfo[0] & 0xffff) == 0x003f) {
407 cfi->cfiq->EraseRegionInfo[0] |= 0x0040;
416 struct cfi_private *cfi = map->fldrv_priv;
418 if ((cfi->cfiq->EraseRegionInfo[1] & 0xffff) == 0x007e) {
419 cfi->cfiq->EraseRegionInfo[1] &= ~0x0040;
428 struct cfi_private *cfi = map->fldrv_priv;
434 cfi->cfiq->EraseRegionInfo[0] = 0x020001ff;
442 struct cfi_private *cfi = map->fldrv_priv;
444 if (cfi->mfr == CFI_MFR_AMD && cfi->id == 0x0c01)
445 cfi->quirks |= CFI_QUIRK_DQ_TRUE_DATA;
508 static void cfi_fixup_major_minor(struct cfi_private *cfi,
511 if (cfi->mfr == CFI_MFR_SAMSUNG) {
529 if (cfi->mfr == CFI_MFR_SST && (cfi->id >> 4) == 0x0536) {
535 static int is_m29ew(struct cfi_private *cfi)
537 if (cfi->mfr == CFI_MFR_INTEL &&
538 ((cfi->device_type == CFI_DEVICETYPE_X8 && (cfi->id & 0xff) == 0x7e) ||
539 (cfi->device_type == CFI_DEVICETYPE_X16 && cfi->id == 0x227e)))
557 struct cfi_private *cfi = map->fldrv_priv;
559 if (is_m29ew(cfi))
587 static void cfi_fixup_m29ew_delay_after_resume(struct cfi_private *cfi)
593 if (is_m29ew(cfi))
599 struct cfi_private *cfi = map->fldrv_priv;
626 mtd->writebufsize = cfi_interleave(cfi) << cfi->cfiq->MaxBufWriteSize;
634 if (cfi->cfi_mode==CFI_MODE_CFI){
636 __u16 adr = primary?cfi->cfiq->P_ADR:cfi->cfiq->A_ADR;
645 cfi_fixup_major_minor(cfi, extp);
669 cfi->cmdset_priv = extp;
671 /* Apply cfi device specific fixups */
698 if (bootloc == 3 && cfi->cfiq->NumEraseRegions > 1) {
701 for (i=0; i<cfi->cfiq->NumEraseRegions / 2; i++) {
702 int j = (cfi->cfiq->NumEraseRegions-1)-i;
704 swap(cfi->cfiq->EraseRegionInfo[i],
705 cfi->cfiq->EraseRegionInfo[j]);
709 cfi->addr_unlock1 = 0x555;
710 cfi->addr_unlock2 = 0x2aa;
714 if (!cfi->addr_unlock1 || !cfi->addr_unlock2) {
720 else if (cfi->cfi_mode == CFI_MODE_JEDEC) {
727 for (i=0; i< cfi->numchips; i++) {
728 cfi->chips[i].word_write_time = 1<<cfi->cfiq->WordWriteTimeoutTyp;
729 cfi->chips[i].buffer_write_time = 1<<cfi->cfiq->BufWriteTimeoutTyp;
730 cfi->chips[i].erase_time = 1<<cfi->cfiq->BlockEraseTimeoutTyp;
737 if (cfi->cfiq->BufWriteTimeoutTyp &&
738 cfi->cfiq->BufWriteTimeoutMax)
739 cfi->chips[i].buffer_write_time_max =
740 1 << (cfi->cfiq->BufWriteTimeoutTyp +
741 cfi->cfiq->BufWriteTimeoutMax);
743 cfi->chips[i].buffer_write_time_max = 0;
745 cfi->chips[i].buffer_write_time_max =
746 max(cfi->chips[i].buffer_write_time_max, 2000);
748 cfi->chips[i].ref_point_counter = 0;
749 init_waitqueue_head(&(cfi->chips[i].wq));
765 struct cfi_private *cfi = map->fldrv_priv;
766 unsigned long devsize = (1<<cfi->cfiq->DevSize) * cfi->interleave;
771 (cfi->cfi_mode == CFI_MODE_CFI)?"CFI":"JEDEC",cfi->numchips);
773 mtd->size = devsize * cfi->numchips;
775 mtd->numeraseregions = cfi->cfiq->NumEraseRegions * cfi->numchips;
782 for (i=0; i<cfi->cfiq->NumEraseRegions; i++) {
784 ersize = ((cfi->cfiq->EraseRegionInfo[i] >> 8) & ~0xff) * cfi->interleave;
785 ernum = (cfi->cfiq->EraseRegionInfo[i] & 0xffff) + 1;
790 for (j=0; j<cfi->numchips; j++) {
791 mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].offset = (j*devsize)+offset;
792 mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].erasesize = ersize;
793 mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].numblocks = ernum;
810 kfree(cfi->cmdset_priv);
831 struct cfi_private *cfi = map->fldrv_priv;
835 if (cfi_use_status_reg(cfi)) {
841 cfi_send_gen_cmd(0x70, cfi->addr_unlock1, chip->start, map, cfi,
842 cfi->device_type, NULL);
862 struct cfi_private *cfi = map->fldrv_priv;
865 if (cfi->quirks & CFI_QUIRK_DQ_TRUE_DATA)
874 struct cfi_private *cfi = map->fldrv_priv;
876 struct cfi_pri_amdstd *cfip = (struct cfi_pri_amdstd *)cfi->cmdset_priv;
978 struct cfi_private *cfi = map->fldrv_priv;
984 map_write(map, cfi->sector_erase_cmd, chip->in_progress_block_addr);
985 cfi_fixup_m29ew_delay_after_resume(cfi);
1028 struct cfi_private *cfi = map->fldrv_priv;
1055 struct cfi_private *cfi = map->fldrv_priv;
1056 struct cfi_pri_amdstd *extp = cfi->cmdset_priv;
1065 (cfi_interleave_is_1(cfi) || chip->oldstate == FL_READY)) {
1128 map_write(map, cfi->sector_erase_cmd, adr);
1202 struct cfi_private *cfi = map->fldrv_priv;
1234 struct cfi_private *cfi = map->fldrv_priv;
1240 chipnum = (from >> cfi->chipshift);
1241 ofs = from - (chipnum << cfi->chipshift);
1246 if (chipnum >= cfi->numchips)
1249 if ((len + ofs -1) >> cfi->chipshift)
1250 thislen = (1<<cfi->chipshift) - ofs;
1254 ret = do_read_onechip(map, &cfi->chips[chipnum], ofs, thislen, buf);
1274 struct cfi_private *cfi = map->fldrv_priv;
1276 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi,
1277 cfi->device_type, NULL);
1278 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi,
1279 cfi->device_type, NULL);
1280 cfi_send_gen_cmd(0x88, cfi->addr_unlock1, chip->start, map, cfi,
1281 cfi->device_type, NULL);
1289 struct cfi_private *cfi = map->fldrv_priv;
1291 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi,
1292 cfi->device_type, NULL);
1293 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi,
1294 cfi->device_type, NULL);
1295 cfi_send_gen_cmd(0x90, cfi->addr_unlock1, chip->start, map, cfi,
1296 cfi->device_type, NULL);
1297 cfi_send_gen_cmd(0x00, cfi->addr_unlock1, chip->start, map, cfi,
1298 cfi->device_type, NULL);
1342 struct cfi_private *cfi = map->fldrv_priv;
1355 if (chipnum >= cfi->numchips)
1363 ret = do_read_secsi_onechip(map, &cfi->chips[chipnum], ofs,
1415 struct cfi_private *cfi = map->fldrv_priv;
1433 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi,
1434 cfi->device_type, NULL);
1435 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi,
1436 cfi->device_type, NULL);
1437 cfi_send_gen_cmd(0x40, cfi->addr_unlock1, chip->start, map, cfi,
1438 cfi->device_type, NULL);
1481 struct cfi_private *cfi = map->fldrv_priv;
1482 int ofs_factor = cfi->interleave * cfi->device_type;
1495 for (chipnum = 0; chipnum < cfi->numchips; chipnum++) {
1496 chip = &cfi->chips[chipnum];
1501 if (is_m29ew(cfi)) {
1512 cfi_qry_mode_on(base, map, cfi);
1514 cfi_qry_mode_off(base, map, cfi);
1535 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1,
1536 chip->start, map, cfi,
1537 cfi->device_type, NULL);
1538 cfi_send_gen_cmd(0x55, cfi->addr_unlock2,
1539 chip->start, map, cfi,
1540 cfi->device_type, NULL);
1541 cfi_send_gen_cmd(0x40, cfi->addr_unlock1,
1542 chip->start, map, cfi,
1543 cfi->device_type, NULL);
1643 int mode, struct cfi_private *cfi)
1658 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
1659 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL);
1660 cfi_send_gen_cmd(0xA0, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
1750 struct cfi_private *cfi = map->fldrv_priv;
1772 ret = do_write_oneword_once(map, chip, adr, datum, mode, cfi);
1815 struct cfi_private *cfi = map->fldrv_priv;
1821 chipnum = to >> cfi->chipshift;
1822 ofs = to - (chipnum << cfi->chipshift);
1823 chipstart = cfi->chips[chipnum].start;
1833 mutex_lock(&cfi->chips[chipnum].mutex);
1835 if (cfi->chips[chipnum].state != FL_READY) {
1837 add_wait_queue(&cfi->chips[chipnum].wq, &wait);
1839 mutex_unlock(&cfi->chips[chipnum].mutex);
1842 remove_wait_queue(&cfi->chips[chipnum].wq, &wait);
1849 mutex_unlock(&cfi->chips[chipnum].mutex);
1856 ret = do_write_oneword(map, &cfi->chips[chipnum],
1866 if (ofs >> cfi->chipshift) {
1869 if (chipnum == cfi->numchips)
1880 ret = do_write_oneword(map, &cfi->chips[chipnum],
1890 if (ofs >> cfi->chipshift) {
1893 if (chipnum == cfi->numchips)
1895 chipstart = cfi->chips[chipnum].start;
1904 mutex_lock(&cfi->chips[chipnum].mutex);
1906 if (cfi->chips[chipnum].state != FL_READY) {
1908 add_wait_queue(&cfi->chips[chipnum].wq, &wait);
1910 mutex_unlock(&cfi->chips[chipnum].mutex);
1913 remove_wait_queue(&cfi->chips[chipnum].wq, &wait);
1919 mutex_unlock(&cfi->chips[chipnum].mutex);
1923 ret = do_write_oneword(map, &cfi->chips[chipnum],
1992 struct cfi_private *cfi)
2002 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi,
2003 cfi->device_type, NULL);
2004 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi,
2005 cfi->device_type, NULL);
2006 cfi_send_gen_cmd(0xF0, cfi->addr_unlock1, chip->start, map, cfi,
2007 cfi->device_type, NULL);
2019 struct cfi_private *cfi = map->fldrv_priv;
2044 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
2045 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL);
2078 do_write_buffer_reset(map, chip, cfi);
2095 struct cfi_private *cfi = map->fldrv_priv;
2096 int wbufsize = cfi_interleave(cfi) << cfi->cfiq->MaxBufWriteSize;
2101 chipnum = to >> cfi->chipshift;
2102 ofs = to - (chipnum << cfi->chipshift);
2109 ret = cfi_amdstd_write_words(mtd, ofs + (chipnum<<cfi->chipshift),
2117 if (ofs >> cfi->chipshift) {
2120 if (chipnum == cfi->numchips)
2135 ret = do_write_buffer(map, &cfi->chips[chipnum],
2145 if (ofs >> cfi->chipshift) {
2148 if (chipnum == cfi->numchips)
2156 ret = cfi_amdstd_write_words(mtd, ofs + (chipnum<<cfi->chipshift),
2178 struct cfi_private *cfi = map->fldrv_priv;
2231 struct cfi_private *cfi = map->fldrv_priv;
2261 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
2262 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL);
2263 cfi_send_gen_cmd(0xA0, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
2307 struct cfi_private *cfi = map->fldrv_priv;
2312 chipnum = to >> cfi->chipshift;
2313 ofs = to - (chipnum << cfi->chipshift);
2314 chipstart = cfi->chips[chipnum].start;
2323 ret = cfi_amdstd_panic_wait(map, &cfi->chips[chipnum], bus_ofs);
2335 ret = do_panic_write_oneword(map, &cfi->chips[chipnum],
2345 if (ofs >> cfi->chipshift) {
2348 if (chipnum == cfi->numchips)
2359 ret = do_panic_write_oneword(map, &cfi->chips[chipnum],
2369 if (ofs >> cfi->chipshift) {
2372 if (chipnum == cfi->numchips)
2375 chipstart = cfi->chips[chipnum].start;
2383 ret = cfi_amdstd_panic_wait(map, &cfi->chips[chipnum], ofs);
2391 ret = do_panic_write_oneword(map, &cfi->chips[chipnum],
2409 struct cfi_private *cfi = map->fldrv_priv;
2417 adr = cfi->addr_unlock1;
2434 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
2435 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL);
2436 cfi_send_gen_cmd(0x80, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
2437 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
2438 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL);
2439 cfi_send_gen_cmd(0x10, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
2510 struct cfi_private *cfi = map->fldrv_priv;
2534 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
2535 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL);
2536 cfi_send_gen_cmd(0x80, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
2537 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
2538 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL);
2539 map_write(map, cfi->sector_erase_cmd, adr);
2617 struct cfi_private *cfi = map->fldrv_priv;
2625 return do_erase_chip(map, &cfi->chips[0]);
2631 struct cfi_private *cfi = map->fldrv_priv;
2642 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi,
2643 cfi->device_type, NULL);
2644 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi,
2645 cfi->device_type, NULL);
2646 cfi_send_gen_cmd(0x80, cfi->addr_unlock1, chip->start, map, cfi,
2647 cfi->device_type, NULL);
2648 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi,
2649 cfi->device_type, NULL);
2650 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi,
2651 cfi->device_type, NULL);
2666 struct cfi_private *cfi = map->fldrv_priv;
2677 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi,
2678 cfi->device_type, NULL);
2718 struct cfi_private *cfi = map->fldrv_priv;
2732 cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi,
2733 cfi->device_type, NULL);
2734 cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi,
2735 cfi->device_type, NULL);
2737 cfi_send_gen_cmd(0xC0, cfi->addr_unlock1, chip->start, map, cfi,
2738 cfi->device_type, NULL);
2799 struct cfi_private *cfi = map->fldrv_priv;
2844 sect[sectors].chip = &cfi->chips[chipnum];
2847 map, &cfi->chips[chipnum], adr, 0,
2858 if (adr >> cfi->chipshift) {
2864 if (chipnum >= cfi->numchips)
2909 struct cfi_private *cfi = map->fldrv_priv;
2915 for (i=0; !ret && i<cfi->numchips; i++) {
2916 chip = &cfi->chips[i];
2955 chip = &cfi->chips[i];
2971 struct cfi_private *cfi = map->fldrv_priv;
2976 for (i=0; !ret && i<cfi->numchips; i++) {
2977 chip = &cfi->chips[i];
3006 chip = &cfi->chips[i];
3025 struct cfi_private *cfi = map->fldrv_priv;
3029 for (i=0; i<cfi->numchips; i++) {
3031 chip = &cfi->chips[i];
3057 struct cfi_private *cfi = map->fldrv_priv;
3061 for (i = 0; i < cfi->numchips; i++) {
3063 chip = &cfi->chips[i];
3095 struct cfi_private *cfi = map->fldrv_priv;
3099 kfree(cfi->cmdset_priv);
3100 kfree(cfi->cfiq);
3101 kfree(cfi);