Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mtd: cfi_cmdset_0001.c: add support for Sharp LH28F640BF NOR

This family of chips was long ago supported by the pre-cfi driver.
CFI code tested on several Zaurus SL-5500 (Collie) 2x16 on 32 bit bus.

Function is_LH28F640BF() mimics is_m29ew() from cmdset_0002.c

Buffer write fixes as seen in 2007 patch c/o
Anti Sullin <anti.sullin <at> artecdesign.ee>
http://comments.gmane.org/gmane.linux.ports.arm.kernel/36733

[Brian: this patch is semi-urgent, because the following patch switches
to using CFI detection for a chip which (until now) is unsupported by
the CFI driver

9218310 ARM: 8084/1: sa1100: collie: revert back to cfi_probe
]

Signed-off-by: Andrea Adami <andrea.adami@gmail.com>
Signed-off-by: Brian Norris <computersforpeace@gmail.com>

authored by

Andrea Adami and committed by
Brian Norris
812c5fa8 54c39e9b

+43
+43
drivers/mtd/chips/cfi_cmdset_0001.c
··· 52 52 /* Atmel chips */ 53 53 #define AT49BV640D 0x02de 54 54 #define AT49BV640DT 0x02db 55 + /* Sharp chips */ 56 + #define LH28F640BFHE_PTTL90 0x00b0 57 + #define LH28F640BFHE_PBTL90 0x00b1 58 + #define LH28F640BFHE_PTTL70A 0x00b2 59 + #define LH28F640BFHE_PBTL70A 0x00b3 55 60 56 61 static int cfi_intelext_read (struct mtd_info *, loff_t, size_t, size_t *, u_char *); 57 62 static int cfi_intelext_write_words(struct mtd_info *, loff_t, size_t, size_t *, const u_char *); ··· 263 258 (cfi->cfiq->EraseRegionInfo[1] & 0xffff0000) | 0x3e; 264 259 }; 265 260 261 + static int is_LH28F640BF(struct cfi_private *cfi) 262 + { 263 + /* Sharp LH28F640BF Family */ 264 + if (cfi->mfr == CFI_MFR_SHARP && ( 265 + cfi->id == LH28F640BFHE_PTTL90 || cfi->id == LH28F640BFHE_PBTL90 || 266 + cfi->id == LH28F640BFHE_PTTL70A || cfi->id == LH28F640BFHE_PBTL70A)) 267 + return 1; 268 + return 0; 269 + } 270 + 271 + static void fixup_LH28F640BF(struct mtd_info *mtd) 272 + { 273 + struct map_info *map = mtd->priv; 274 + struct cfi_private *cfi = map->fldrv_priv; 275 + struct cfi_pri_intelext *extp = cfi->cmdset_priv; 276 + 277 + /* Reset the Partition Configuration Register on LH28F640BF 278 + * to a single partition (PCR = 0x000): PCR is embedded into A0-A15. */ 279 + if (is_LH28F640BF(cfi)) { 280 + printk(KERN_INFO "Reset Partition Config. Register: 1 Partition of 4 planes\n"); 281 + map_write(map, CMD(0x60), 0); 282 + map_write(map, CMD(0x04), 0); 283 + 284 + /* We have set one single partition thus 285 + * Simultaneous Operations are not allowed */ 286 + printk(KERN_INFO "cfi_cmdset_0001: Simultaneous Operations disabled\n"); 287 + extp->FeatureSupport &= ~512; 288 + } 289 + } 290 + 266 291 static void fixup_use_point(struct mtd_info *mtd) 267 292 { 268 293 struct map_info *map = mtd->priv; ··· 344 309 { CFI_MFR_ST, 0x00ba, /* M28W320CT */ fixup_st_m28w320ct }, 345 310 { CFI_MFR_ST, 0x00bb, /* M28W320CB */ fixup_st_m28w320cb }, 346 311 { CFI_MFR_INTEL, CFI_ID_ANY, fixup_unlock_powerup_lock }, 312 + { CFI_MFR_SHARP, CFI_ID_ANY, fixup_unlock_powerup_lock }, 313 + { CFI_MFR_SHARP, CFI_ID_ANY, fixup_LH28F640BF }, 347 314 { 0, 0, NULL } 348 315 }; 349 316 ··· 1685 1648 adr += chip->start; 1686 1649 initial_adr = adr; 1687 1650 cmd_adr = adr & ~(wbufsize-1); 1651 + 1652 + /* Sharp LH28F640BF chips need the first address for the 1653 + * Page Buffer Program command. See Table 5 of 1654 + * LH28F320BF, LH28F640BF, LH28F128BF Series (Appendix FUM00701) */ 1655 + if (is_LH28F640BF(cfi)) 1656 + cmd_adr = adr; 1688 1657 1689 1658 /* Let's determine this according to the interleave only once */ 1690 1659 write_cmd = (cfi->cfiq->P_ID != P_ID_INTEL_PERFORMANCE) ? CMD(0xe8) : CMD(0xe9);