Carl asked me to double check as many as i could. Sorry for the somewhat funny notation, but it helped me keep track of where i was. There are only a few not mentioned.. i worked that out with Sean on IRC.
Also, major sorry for the delay.. this was a little tougher than i expected.
The features quoted are the features i have checked. Comments are above. Legend: (C) = Checks out (W) = Warning, sheet says otherwise. (U) = Unsure, please double check and comment. (N) = No datasheet available. (S) = Skipped in this review because $REASON
[AMD Section] (W)(U) I can't find evidence of anything other than write_jedec_1 in the sheet. Please verify. .name = "Am29F010A/B", .feature_bits = FEATURE_ADDR_2AA|FEATURE_EITHER_RESET, .write = write_jedec,
(W)(U) Uhm, the N versions do not support reset at all, but I don't think we can tell them apart with out a runtime test. Also they are ADDR_2AA I think. .name = "Am29F002(N)BB" / "Am29F002(N)BT" .feature_bits = FEATURE_SHORT_RESET, .write = write_jedec_1,
(C) No comments. .name = "Am29F016D", .feature_bits = FEATURE_ADDR_2AA|FEATURE_SHORT_RESET, .write = write_jedec_1,
.name = "Am29F040B", .feature_bits = FEATURE_ADDR_2AA|FEATURE_SHORT_RESET, .write = write_jedec_1,
.name = "Am29F080B", .feature_bits = FEATURE_ADDR_2AA|FEATURE_SHORT_RESET, .write = write_jedec_1,
.name = "Am29LV040B", .feature_bits = FEATURE_ADDR_2AA|FEATURE_SHORT_RESET, .write = write_jedec_1,
(C) Strictly speaking it doesn't need ADDR_2AA as it has "Don't care" for all addresses (except the last in ID detection) [weird freakin' chip!, red] .name = "Am29LV081B", .feature_bits = FEATURE_ADDR_2AA|FEATURE_SHORT_RESET, .write = write_jedec_1,
[ASD Section] (N) Also has strange comments in flashchips.h .name = "AE49F2008",
[Atmel Section] (C) No comments. .name = "AT29C512", .feature_bits = FEATURE_LONG_RESET, .write = write_jedec,
.name = "AT29C010A", .feature_bits = FEATURE_LONG_RESET, .write = write_jedec,
.name = "AT29C020", .feature_bits = FEATURE_LONG_RESET, .write = write_jedec,
.name = "AT29C040A", .feature_bits = FEATURE_LONG_RESET, .write = write_jedec,
.name = "AT49BV512", .feature_bits = FEATURE_EITHER_RESET, .write = write_jedec_1,
(W) N-version does not support reset. .name = "AT49F002(N)" / "AT49F002(N)T" .feature_bits = FEATURE_EITHER_RESET, .write = write_jedec_1,
[AMIC Section] (C) No remarks. .name = "A29002B" / "A29002T" .feature_bits = FEATURE_ADDR_2AA|FEATURE_SHORT_RESET, .write = write_jedec_1,
.name = "A29040B", .feature_bits = FEATURE_ADDR_2AA|FEATURE_SHORT_RESET, .write = write_jedec_1,
(C)(U) This one should do write_jedec_1 if that function understands registermap. .name = "A49LF040A", .feature_bits = FEATURE_REGISTERMAP|FEATURE_EITHER_RESET, .write = write_49fl00x,
[EMST Section] (C) No comments. .name = "F49B002UA", .feature_bits = FEATURE_EITHER_RESET, .write = write_jedec_1,
[EON Section] (W) Oops, ADDR_555 only. .name = "EN29F002(A)(N)B" / "EN29F002(A)(N)T" .feature_bits = FEATURE_EITHER_RESET, .write = write_jedec_1,
[Fujitsu Section] (C)(U) *Looks like* it supports write_jedec_1. .name = "MBM29F004BC" / "MBM29F004TC" .feature_bits = FEATURE_ADDR_2AA|FEATURE_EITHER_RESET, .write = NULL,
(U) I have no idea... /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */ .name = "MBM29F400BC" / "MBM29F400TC" .feature_bits = FEATURE_ADDR_SHIFTED|FEATURE_EITHER_RESET, .write = write_coreboot_m29f400bt,
[Intel Section] (S) These datasheets are scary. .name = "28F001BX-B" / "28F001BX-T" / "82802AB"
[Macronix Section] (C) These check out: .name = "MX29F001B" / "MX29F001T" .feature_bits = FEATURE_ADDR_2AA|FEATURE_SHORT_RESET, .write = write_jedec_1,
.name = "MX29F002B" / "MX29F002T" .feature_bits = FEATURE_ADDR_2AA|FEATURE_SHORT_RESET, .write = write_jedec_1,
.name = "MX29LV040", .feature_bits = FEATURE_ADDR_2AA|FEATURE_SHORT_RESET, .write = write_jedec_1,
[PMC Section] (W)(U) Looks like write_jedec_1 only. .name = "Pm29F002T" / "Pm29F002B", .feature_bits = FEATURE_ADDR_2AA|FEATURE_EITHER_RESET, .write = write_jedec,
(W) Is ADDR_2AA .name = "Pm39LV010", .feature_bits = FEATURE_EITHER_RESET, .write = write_jedec_1,
(W)(U) This looks like plain write_jedec_1 to me .name = "Pm49FL002" / "Pm49FL004" .feature_bits = FEATURE_REGISTERMAP|FEATURE_EITHER_RESET, .write = write_49fl00x
[Sharp Section] (S) Can't read that sheet. Silly people... .name = "LHF00L04",
[SST Section] (W)(U) Can only find short reset in sheet. .name = "SST28SF040A", .feature_bits = FEATURE_EITHER_RESET,
(C) No comment. .name = "SST29EE010" / "SST29LE010", .feature_bits = FEATURE_LONG_RESET, .write = write_jedec
.name = "SST29EE020A" / "SST29LE020", .feature_bits = FEATURE_LONG_RESET, .write = write_jedec
.name = "SST39SF512" / "SST39SF010A" / "SST39SF020A" / "SST39SF040" "SST39VF512" / "SST39VF010" / "SST39VF020" / "SST39VF040" "SST39VF080" / .feature_bits = FEATURE_EITHER_RESET, .write = write_jedec_1,
.name = "SST49LF002A/B" / "SST49LF003A/B" / "SST49LF004A/B" "SST49LF008A" .feature_bits = FEATURE_REGISTERMAP|FEATURE_EITHER_RESET
(W) This one is REGISTERMAP (ds page 22) and SHORT_RESET (ds page 14) .name = "SST49LF004C" / "SST49LF008C" .feature_bits = 0,
(W) This one is REGISTERMAP (ds page 19) and SHORT_RESET (ds page 17) .name = "SST49LF016C", .feature_bits = 0,
(W) REGISTERMAP and (ds page 23) and SHORT_RESET (ds page 16) .name = "SST49LF160C", .feature_bits = 0,
(C) No comments. .name = "SST49LF020" / "SST49LF040" .feature_bits = FEATURE_EITHER_RESET, .write = write_jedec_1,
.name = "SST49LF020A" / "SST49LF080A" .feature_bits = FEATURE_EITHER_RESET, .write = write_jedec_1,
.name = "SST49LF040B", .feature_bits = FEATURE_EITHER_RESET, .write = write_jedec_1,
[ST Section] (U) Generally i have a hard time with ST and write_jedec vs write_jedec_1, so someone else should look over this... (C) Checks out. .name = "M29F002B", .feature_bits = FEATURE_ADDR_AAA|FEATURE_EITHER_RESET, .write = write_jedec,
(W) And once again the N version does not support reset. .name = "M29F002T/NT", .feature_bits = FEATURE_ADDR_AAA|FEATURE_EITHER_RESET, .write = write_jedec,
.name = "M29F040B", .feature_bits = FEATURE_ADDR_2AA|FEATURE_EITHER_RESET, .write = write_jedec_1,
(C) No comment /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */ .name = "M29F400BT", .feature_bits = FEATURE_ADDR_SHIFTED|FEATURE_EITHER_RESET,
(W) Is ADDR_2AA .name = "M29W010B" / "M29W040B" .feature_bits = FEATURE_EITHER_RESET, .write = write_jedec,
[SyncMOS Section] (C) Home run baby. .name = "S29C31004T" / "S29C51001T" / "S29C51002T" / "S29C51004T" .feature_bits = FEATURE_EITHER_RESET, .write = write_jedec_1,
[TI Section] (W) Looks ADDR_2AA to me. .name = "TMS29F002RB" / "TMS29F002RT" .feature_bits = FEATURE_EITHER_RESET,
[Winbond Section] (C) No remarks. .name = "W29C011" / "W29C020C" / "W29C040P" / "W29EE011" .feature_bits = FEATURE_LONG_RESET, .write = write_jedec,
.name = "W39V040A" / "W39V040B" / "W39V040C" / "W39V040FA" "W39V080A" / "W49F002U" / "W49V002A" / "W49V002FA" .feature_bits = FEATURE_EITHER_RESET, .write = write_jedec_1,
(W) Is EITHER_RESET (ds page 11) .name = "W39V080FA" / "W39V080FA (dual mode)" .feature_bits = FEATURE_REGISTERMAP|FEATURE_LONG_RESET,
Have a nice day! /Anders