jedec_probe.c 52 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153
  1. /*
  2. Common Flash Interface probe code.
  3. (C) 2000 Red Hat. GPL'd.
  4. $Id: jedec_probe.c,v 1.66 2005/11/07 11:14:23 gleixner Exp $
  5. See JEDEC (http://www.jedec.org/) standard JESD21C (section 3.5)
  6. for the standard this probe goes back to.
  7. Occasionally maintained by Thayne Harbaugh tharbaugh at lnxi dot com
  8. */
  9. #include <linux/config.h>
  10. #include <linux/module.h>
  11. #include <linux/init.h>
  12. #include <linux/types.h>
  13. #include <linux/kernel.h>
  14. #include <asm/io.h>
  15. #include <asm/byteorder.h>
  16. #include <linux/errno.h>
  17. #include <linux/slab.h>
  18. #include <linux/interrupt.h>
  19. #include <linux/init.h>
  20. #include <linux/mtd/mtd.h>
  21. #include <linux/mtd/map.h>
  22. #include <linux/mtd/cfi.h>
  23. #include <linux/mtd/gen_probe.h>
  24. /* Manufacturers */
  25. #define MANUFACTURER_AMD 0x0001
  26. #define MANUFACTURER_ATMEL 0x001f
  27. #define MANUFACTURER_FUJITSU 0x0004
  28. #define MANUFACTURER_HYUNDAI 0x00AD
  29. #define MANUFACTURER_INTEL 0x0089
  30. #define MANUFACTURER_MACRONIX 0x00C2
  31. #define MANUFACTURER_NEC 0x0010
  32. #define MANUFACTURER_PMC 0x009D
  33. #define MANUFACTURER_SST 0x00BF
  34. #define MANUFACTURER_ST 0x0020
  35. #define MANUFACTURER_TOSHIBA 0x0098
  36. #define MANUFACTURER_WINBOND 0x00da
  37. /* AMD */
  38. #define AM29DL800BB 0x22C8
  39. #define AM29DL800BT 0x224A
  40. #define AM29F800BB 0x2258
  41. #define AM29F800BT 0x22D6
  42. #define AM29LV400BB 0x22BA
  43. #define AM29LV400BT 0x22B9
  44. #define AM29LV800BB 0x225B
  45. #define AM29LV800BT 0x22DA
  46. #define AM29LV160DT 0x22C4
  47. #define AM29LV160DB 0x2249
  48. #define AM29F017D 0x003D
  49. #define AM29F016D 0x00AD
  50. #define AM29F080 0x00D5
  51. #define AM29F040 0x00A4
  52. #define AM29LV040B 0x004F
  53. #define AM29F032B 0x0041
  54. #define AM29F002T 0x00B0
  55. /* Atmel */
  56. #define AT49BV512 0x0003
  57. #define AT29LV512 0x003d
  58. #define AT49BV16X 0x00C0
  59. #define AT49BV16XT 0x00C2
  60. #define AT49BV32X 0x00C8
  61. #define AT49BV32XT 0x00C9
  62. /* Fujitsu */
  63. #define MBM29F040C 0x00A4
  64. #define MBM29LV650UE 0x22D7
  65. #define MBM29LV320TE 0x22F6
  66. #define MBM29LV320BE 0x22F9
  67. #define MBM29LV160TE 0x22C4
  68. #define MBM29LV160BE 0x2249
  69. #define MBM29LV800BA 0x225B
  70. #define MBM29LV800TA 0x22DA
  71. #define MBM29LV400TC 0x22B9
  72. #define MBM29LV400BC 0x22BA
  73. /* Hyundai */
  74. #define HY29F002T 0x00B0
  75. /* Intel */
  76. #define I28F004B3T 0x00d4
  77. #define I28F004B3B 0x00d5
  78. #define I28F400B3T 0x8894
  79. #define I28F400B3B 0x8895
  80. #define I28F008S5 0x00a6
  81. #define I28F016S5 0x00a0
  82. #define I28F008SA 0x00a2
  83. #define I28F008B3T 0x00d2
  84. #define I28F008B3B 0x00d3
  85. #define I28F800B3T 0x8892
  86. #define I28F800B3B 0x8893
  87. #define I28F016S3 0x00aa
  88. #define I28F016B3T 0x00d0
  89. #define I28F016B3B 0x00d1
  90. #define I28F160B3T 0x8890
  91. #define I28F160B3B 0x8891
  92. #define I28F320B3T 0x8896
  93. #define I28F320B3B 0x8897
  94. #define I28F640B3T 0x8898
  95. #define I28F640B3B 0x8899
  96. #define I82802AB 0x00ad
  97. #define I82802AC 0x00ac
  98. /* Macronix */
  99. #define MX29LV040C 0x004F
  100. #define MX29LV160T 0x22C4
  101. #define MX29LV160B 0x2249
  102. #define MX29F016 0x00AD
  103. #define MX29F002T 0x00B0
  104. #define MX29F004T 0x0045
  105. #define MX29F004B 0x0046
  106. /* NEC */
  107. #define UPD29F064115 0x221C
  108. /* PMC */
  109. #define PM49FL002 0x006D
  110. #define PM49FL004 0x006E
  111. #define PM49FL008 0x006A
  112. /* ST - www.st.com */
  113. #define M29W800DT 0x00D7
  114. #define M29W800DB 0x005B
  115. #define M29W160DT 0x22C4
  116. #define M29W160DB 0x2249
  117. #define M29W040B 0x00E3
  118. #define M50FW040 0x002C
  119. #define M50FW080 0x002D
  120. #define M50FW016 0x002E
  121. #define M50LPW080 0x002F
  122. /* SST */
  123. #define SST29EE020 0x0010
  124. #define SST29LE020 0x0012
  125. #define SST29EE512 0x005d
  126. #define SST29LE512 0x003d
  127. #define SST39LF800 0x2781
  128. #define SST39LF160 0x2782
  129. #define SST39VF1601 0x234b
  130. #define SST39LF512 0x00D4
  131. #define SST39LF010 0x00D5
  132. #define SST39LF020 0x00D6
  133. #define SST39LF040 0x00D7
  134. #define SST39SF010A 0x00B5
  135. #define SST39SF020A 0x00B6
  136. #define SST49LF004B 0x0060
  137. #define SST49LF008A 0x005a
  138. #define SST49LF030A 0x001C
  139. #define SST49LF040A 0x0051
  140. #define SST49LF080A 0x005B
  141. /* Toshiba */
  142. #define TC58FVT160 0x00C2
  143. #define TC58FVB160 0x0043
  144. #define TC58FVT321 0x009A
  145. #define TC58FVB321 0x009C
  146. #define TC58FVT641 0x0093
  147. #define TC58FVB641 0x0095
  148. /* Winbond */
  149. #define W49V002A 0x00b0
  150. /*
  151. * Unlock address sets for AMD command sets.
  152. * Intel command sets use the MTD_UADDR_UNNECESSARY.
  153. * Each identifier, except MTD_UADDR_UNNECESSARY, and
  154. * MTD_UADDR_NO_SUPPORT must be defined below in unlock_addrs[].
  155. * MTD_UADDR_NOT_SUPPORTED must be 0 so that structure
  156. * initialization need not require initializing all of the
  157. * unlock addresses for all bit widths.
  158. */
  159. enum uaddr {
  160. MTD_UADDR_NOT_SUPPORTED = 0, /* data width not supported */
  161. MTD_UADDR_0x0555_0x02AA,
  162. MTD_UADDR_0x0555_0x0AAA,
  163. MTD_UADDR_0x5555_0x2AAA,
  164. MTD_UADDR_0x0AAA_0x0555,
  165. MTD_UADDR_DONT_CARE, /* Requires an arbitrary address */
  166. MTD_UADDR_UNNECESSARY, /* Does not require any address */
  167. };
  168. struct unlock_addr {
  169. u32 addr1;
  170. u32 addr2;
  171. };
  172. /*
  173. * I don't like the fact that the first entry in unlock_addrs[]
  174. * exists, but is for MTD_UADDR_NOT_SUPPORTED - and, therefore,
  175. * should not be used. The problem is that structures with
  176. * initializers have extra fields initialized to 0. It is _very_
  177. * desireable to have the unlock address entries for unsupported
  178. * data widths automatically initialized - that means that
  179. * MTD_UADDR_NOT_SUPPORTED must be 0 and the first entry here
  180. * must go unused.
  181. */
  182. static const struct unlock_addr unlock_addrs[] = {
  183. [MTD_UADDR_NOT_SUPPORTED] = {
  184. .addr1 = 0xffff,
  185. .addr2 = 0xffff
  186. },
  187. [MTD_UADDR_0x0555_0x02AA] = {
  188. .addr1 = 0x0555,
  189. .addr2 = 0x02aa
  190. },
  191. [MTD_UADDR_0x0555_0x0AAA] = {
  192. .addr1 = 0x0555,
  193. .addr2 = 0x0aaa
  194. },
  195. [MTD_UADDR_0x5555_0x2AAA] = {
  196. .addr1 = 0x5555,
  197. .addr2 = 0x2aaa
  198. },
  199. [MTD_UADDR_0x0AAA_0x0555] = {
  200. .addr1 = 0x0AAA,
  201. .addr2 = 0x0555
  202. },
  203. [MTD_UADDR_DONT_CARE] = {
  204. .addr1 = 0x0000, /* Doesn't matter which address */
  205. .addr2 = 0x0000 /* is used - must be last entry */
  206. },
  207. [MTD_UADDR_UNNECESSARY] = {
  208. .addr1 = 0x0000,
  209. .addr2 = 0x0000
  210. }
  211. };
  212. struct amd_flash_info {
  213. const __u16 mfr_id;
  214. const __u16 dev_id;
  215. const char *name;
  216. const int DevSize;
  217. const int NumEraseRegions;
  218. const int CmdSet;
  219. const __u8 uaddr[4]; /* unlock addrs for 8, 16, 32, 64 */
  220. const ulong regions[6];
  221. };
  222. #define ERASEINFO(size,blocks) (size<<8)|(blocks-1)
  223. #define SIZE_64KiB 16
  224. #define SIZE_128KiB 17
  225. #define SIZE_256KiB 18
  226. #define SIZE_512KiB 19
  227. #define SIZE_1MiB 20
  228. #define SIZE_2MiB 21
  229. #define SIZE_4MiB 22
  230. #define SIZE_8MiB 23
  231. /*
  232. * Please keep this list ordered by manufacturer!
  233. * Fortunately, the list isn't searched often and so a
  234. * slow, linear search isn't so bad.
  235. */
  236. static const struct amd_flash_info jedec_table[] = {
  237. {
  238. .mfr_id = MANUFACTURER_AMD,
  239. .dev_id = AM29F032B,
  240. .name = "AMD AM29F032B",
  241. .uaddr = {
  242. [0] = MTD_UADDR_0x0555_0x02AA /* x8 */
  243. },
  244. .DevSize = SIZE_4MiB,
  245. .CmdSet = P_ID_AMD_STD,
  246. .NumEraseRegions= 1,
  247. .regions = {
  248. ERASEINFO(0x10000,64)
  249. }
  250. }, {
  251. .mfr_id = MANUFACTURER_AMD,
  252. .dev_id = AM29LV160DT,
  253. .name = "AMD AM29LV160DT",
  254. .uaddr = {
  255. [0] = MTD_UADDR_0x0AAA_0x0555, /* x8 */
  256. [1] = MTD_UADDR_0x0555_0x02AA /* x16 */
  257. },
  258. .DevSize = SIZE_2MiB,
  259. .CmdSet = P_ID_AMD_STD,
  260. .NumEraseRegions= 4,
  261. .regions = {
  262. ERASEINFO(0x10000,31),
  263. ERASEINFO(0x08000,1),
  264. ERASEINFO(0x02000,2),
  265. ERASEINFO(0x04000,1)
  266. }
  267. }, {
  268. .mfr_id = MANUFACTURER_AMD,
  269. .dev_id = AM29LV160DB,
  270. .name = "AMD AM29LV160DB",
  271. .uaddr = {
  272. [0] = MTD_UADDR_0x0AAA_0x0555, /* x8 */
  273. [1] = MTD_UADDR_0x0555_0x02AA /* x16 */
  274. },
  275. .DevSize = SIZE_2MiB,
  276. .CmdSet = P_ID_AMD_STD,
  277. .NumEraseRegions= 4,
  278. .regions = {
  279. ERASEINFO(0x04000,1),
  280. ERASEINFO(0x02000,2),
  281. ERASEINFO(0x08000,1),
  282. ERASEINFO(0x10000,31)
  283. }
  284. }, {
  285. .mfr_id = MANUFACTURER_AMD,
  286. .dev_id = AM29LV400BB,
  287. .name = "AMD AM29LV400BB",
  288. .uaddr = {
  289. [0] = MTD_UADDR_0x0AAA_0x0555, /* x8 */
  290. [1] = MTD_UADDR_0x0555_0x02AA, /* x16 */
  291. },
  292. .DevSize = SIZE_512KiB,
  293. .CmdSet = P_ID_AMD_STD,
  294. .NumEraseRegions= 4,
  295. .regions = {
  296. ERASEINFO(0x04000,1),
  297. ERASEINFO(0x02000,2),
  298. ERASEINFO(0x08000,1),
  299. ERASEINFO(0x10000,7)
  300. }
  301. }, {
  302. .mfr_id = MANUFACTURER_AMD,
  303. .dev_id = AM29LV400BT,
  304. .name = "AMD AM29LV400BT",
  305. .uaddr = {
  306. [0] = MTD_UADDR_0x0AAA_0x0555, /* x8 */
  307. [1] = MTD_UADDR_0x0555_0x02AA, /* x16 */
  308. },
  309. .DevSize = SIZE_512KiB,
  310. .CmdSet = P_ID_AMD_STD,
  311. .NumEraseRegions= 4,
  312. .regions = {
  313. ERASEINFO(0x10000,7),
  314. ERASEINFO(0x08000,1),
  315. ERASEINFO(0x02000,2),
  316. ERASEINFO(0x04000,1)
  317. }
  318. }, {
  319. .mfr_id = MANUFACTURER_AMD,
  320. .dev_id = AM29LV800BB,
  321. .name = "AMD AM29LV800BB",
  322. .uaddr = {
  323. [0] = MTD_UADDR_0x0AAA_0x0555, /* x8 */
  324. [1] = MTD_UADDR_0x0555_0x02AA, /* x16 */
  325. },
  326. .DevSize = SIZE_1MiB,
  327. .CmdSet = P_ID_AMD_STD,
  328. .NumEraseRegions= 4,
  329. .regions = {
  330. ERASEINFO(0x04000,1),
  331. ERASEINFO(0x02000,2),
  332. ERASEINFO(0x08000,1),
  333. ERASEINFO(0x10000,15),
  334. }
  335. }, {
  336. /* add DL */
  337. .mfr_id = MANUFACTURER_AMD,
  338. .dev_id = AM29DL800BB,
  339. .name = "AMD AM29DL800BB",
  340. .uaddr = {
  341. [0] = MTD_UADDR_0x0AAA_0x0555, /* x8 */
  342. [1] = MTD_UADDR_0x0555_0x02AA, /* x16 */
  343. },
  344. .DevSize = SIZE_1MiB,
  345. .CmdSet = P_ID_AMD_STD,
  346. .NumEraseRegions= 6,
  347. .regions = {
  348. ERASEINFO(0x04000,1),
  349. ERASEINFO(0x08000,1),
  350. ERASEINFO(0x02000,4),
  351. ERASEINFO(0x08000,1),
  352. ERASEINFO(0x04000,1),
  353. ERASEINFO(0x10000,14)
  354. }
  355. }, {
  356. .mfr_id = MANUFACTURER_AMD,
  357. .dev_id = AM29DL800BT,
  358. .name = "AMD AM29DL800BT",
  359. .uaddr = {
  360. [0] = MTD_UADDR_0x0AAA_0x0555, /* x8 */
  361. [1] = MTD_UADDR_0x0555_0x02AA, /* x16 */
  362. },
  363. .DevSize = SIZE_1MiB,
  364. .CmdSet = P_ID_AMD_STD,
  365. .NumEraseRegions= 6,
  366. .regions = {
  367. ERASEINFO(0x10000,14),
  368. ERASEINFO(0x04000,1),
  369. ERASEINFO(0x08000,1),
  370. ERASEINFO(0x02000,4),
  371. ERASEINFO(0x08000,1),
  372. ERASEINFO(0x04000,1)
  373. }
  374. }, {
  375. .mfr_id = MANUFACTURER_AMD,
  376. .dev_id = AM29F800BB,
  377. .name = "AMD AM29F800BB",
  378. .uaddr = {
  379. [0] = MTD_UADDR_0x0AAA_0x0555, /* x8 */
  380. [1] = MTD_UADDR_0x0555_0x02AA, /* x16 */
  381. },
  382. .DevSize = SIZE_1MiB,
  383. .CmdSet = P_ID_AMD_STD,
  384. .NumEraseRegions= 4,
  385. .regions = {
  386. ERASEINFO(0x04000,1),
  387. ERASEINFO(0x02000,2),
  388. ERASEINFO(0x08000,1),
  389. ERASEINFO(0x10000,15),
  390. }
  391. }, {
  392. .mfr_id = MANUFACTURER_AMD,
  393. .dev_id = AM29LV800BT,
  394. .name = "AMD AM29LV800BT",
  395. .uaddr = {
  396. [0] = MTD_UADDR_0x0AAA_0x0555, /* x8 */
  397. [1] = MTD_UADDR_0x0555_0x02AA, /* x16 */
  398. },
  399. .DevSize = SIZE_1MiB,
  400. .CmdSet = P_ID_AMD_STD,
  401. .NumEraseRegions= 4,
  402. .regions = {
  403. ERASEINFO(0x10000,15),
  404. ERASEINFO(0x08000,1),
  405. ERASEINFO(0x02000,2),
  406. ERASEINFO(0x04000,1)
  407. }
  408. }, {
  409. .mfr_id = MANUFACTURER_AMD,
  410. .dev_id = AM29F800BT,
  411. .name = "AMD AM29F800BT",
  412. .uaddr = {
  413. [0] = MTD_UADDR_0x0AAA_0x0555, /* x8 */
  414. [1] = MTD_UADDR_0x0555_0x02AA, /* x16 */
  415. },
  416. .DevSize = SIZE_1MiB,
  417. .CmdSet = P_ID_AMD_STD,
  418. .NumEraseRegions= 4,
  419. .regions = {
  420. ERASEINFO(0x10000,15),
  421. ERASEINFO(0x08000,1),
  422. ERASEINFO(0x02000,2),
  423. ERASEINFO(0x04000,1)
  424. }
  425. }, {
  426. .mfr_id = MANUFACTURER_AMD,
  427. .dev_id = AM29F017D,
  428. .name = "AMD AM29F017D",
  429. .uaddr = {
  430. [0] = MTD_UADDR_DONT_CARE /* x8 */
  431. },
  432. .DevSize = SIZE_2MiB,
  433. .CmdSet = P_ID_AMD_STD,
  434. .NumEraseRegions= 1,
  435. .regions = {
  436. ERASEINFO(0x10000,32),
  437. }
  438. }, {
  439. .mfr_id = MANUFACTURER_AMD,
  440. .dev_id = AM29F016D,
  441. .name = "AMD AM29F016D",
  442. .uaddr = {
  443. [0] = MTD_UADDR_0x0555_0x02AA /* x8 */
  444. },
  445. .DevSize = SIZE_2MiB,
  446. .CmdSet = P_ID_AMD_STD,
  447. .NumEraseRegions= 1,
  448. .regions = {
  449. ERASEINFO(0x10000,32),
  450. }
  451. }, {
  452. .mfr_id = MANUFACTURER_AMD,
  453. .dev_id = AM29F080,
  454. .name = "AMD AM29F080",
  455. .uaddr = {
  456. [0] = MTD_UADDR_0x0555_0x02AA /* x8 */
  457. },
  458. .DevSize = SIZE_1MiB,
  459. .CmdSet = P_ID_AMD_STD,
  460. .NumEraseRegions= 1,
  461. .regions = {
  462. ERASEINFO(0x10000,16),
  463. }
  464. }, {
  465. .mfr_id = MANUFACTURER_AMD,
  466. .dev_id = AM29F040,
  467. .name = "AMD AM29F040",
  468. .uaddr = {
  469. [0] = MTD_UADDR_0x0555_0x02AA /* x8 */
  470. },
  471. .DevSize = SIZE_512KiB,
  472. .CmdSet = P_ID_AMD_STD,
  473. .NumEraseRegions= 1,
  474. .regions = {
  475. ERASEINFO(0x10000,8),
  476. }
  477. }, {
  478. .mfr_id = MANUFACTURER_AMD,
  479. .dev_id = AM29LV040B,
  480. .name = "AMD AM29LV040B",
  481. .uaddr = {
  482. [0] = MTD_UADDR_0x0555_0x02AA /* x8 */
  483. },
  484. .DevSize = SIZE_512KiB,
  485. .CmdSet = P_ID_AMD_STD,
  486. .NumEraseRegions= 1,
  487. .regions = {
  488. ERASEINFO(0x10000,8),
  489. }
  490. }, {
  491. .mfr_id = MANUFACTURER_AMD,
  492. .dev_id = AM29F002T,
  493. .name = "AMD AM29F002T",
  494. .uaddr = {
  495. [0] = MTD_UADDR_0x0555_0x02AA /* x8 */
  496. },
  497. .DevSize = SIZE_256KiB,
  498. .CmdSet = P_ID_AMD_STD,
  499. .NumEraseRegions= 4,
  500. .regions = {
  501. ERASEINFO(0x10000,3),
  502. ERASEINFO(0x08000,1),
  503. ERASEINFO(0x02000,2),
  504. ERASEINFO(0x04000,1),
  505. }
  506. }, {
  507. .mfr_id = MANUFACTURER_ATMEL,
  508. .dev_id = AT49BV512,
  509. .name = "Atmel AT49BV512",
  510. .uaddr = {
  511. [0] = MTD_UADDR_0x5555_0x2AAA /* x8 */
  512. },
  513. .DevSize = SIZE_64KiB,
  514. .CmdSet = P_ID_AMD_STD,
  515. .NumEraseRegions= 1,
  516. .regions = {
  517. ERASEINFO(0x10000,1)
  518. }
  519. }, {
  520. .mfr_id = MANUFACTURER_ATMEL,
  521. .dev_id = AT29LV512,
  522. .name = "Atmel AT29LV512",
  523. .uaddr = {
  524. [0] = MTD_UADDR_0x5555_0x2AAA /* x8 */
  525. },
  526. .DevSize = SIZE_64KiB,
  527. .CmdSet = P_ID_AMD_STD,
  528. .NumEraseRegions= 1,
  529. .regions = {
  530. ERASEINFO(0x80,256),
  531. ERASEINFO(0x80,256)
  532. }
  533. }, {
  534. .mfr_id = MANUFACTURER_ATMEL,
  535. .dev_id = AT49BV16X,
  536. .name = "Atmel AT49BV16X",
  537. .uaddr = {
  538. [0] = MTD_UADDR_0x0555_0x0AAA, /* x8 */
  539. [1] = MTD_UADDR_0x0555_0x0AAA /* x16 */
  540. },
  541. .DevSize = SIZE_2MiB,
  542. .CmdSet = P_ID_AMD_STD,
  543. .NumEraseRegions= 2,
  544. .regions = {
  545. ERASEINFO(0x02000,8),
  546. ERASEINFO(0x10000,31)
  547. }
  548. }, {
  549. .mfr_id = MANUFACTURER_ATMEL,
  550. .dev_id = AT49BV16XT,
  551. .name = "Atmel AT49BV16XT",
  552. .uaddr = {
  553. [0] = MTD_UADDR_0x0555_0x0AAA, /* x8 */
  554. [1] = MTD_UADDR_0x0555_0x0AAA /* x16 */
  555. },
  556. .DevSize = SIZE_2MiB,
  557. .CmdSet = P_ID_AMD_STD,
  558. .NumEraseRegions= 2,
  559. .regions = {
  560. ERASEINFO(0x10000,31),
  561. ERASEINFO(0x02000,8)
  562. }
  563. }, {
  564. .mfr_id = MANUFACTURER_ATMEL,
  565. .dev_id = AT49BV32X,
  566. .name = "Atmel AT49BV32X",
  567. .uaddr = {
  568. [0] = MTD_UADDR_0x0555_0x0AAA, /* x8 */
  569. [1] = MTD_UADDR_0x0555_0x0AAA /* x16 */
  570. },
  571. .DevSize = SIZE_4MiB,
  572. .CmdSet = P_ID_AMD_STD,
  573. .NumEraseRegions= 2,
  574. .regions = {
  575. ERASEINFO(0x02000,8),
  576. ERASEINFO(0x10000,63)
  577. }
  578. }, {
  579. .mfr_id = MANUFACTURER_ATMEL,
  580. .dev_id = AT49BV32XT,
  581. .name = "Atmel AT49BV32XT",
  582. .uaddr = {
  583. [0] = MTD_UADDR_0x0555_0x0AAA, /* x8 */
  584. [1] = MTD_UADDR_0x0555_0x0AAA /* x16 */
  585. },
  586. .DevSize = SIZE_4MiB,
  587. .CmdSet = P_ID_AMD_STD,
  588. .NumEraseRegions= 2,
  589. .regions = {
  590. ERASEINFO(0x10000,63),
  591. ERASEINFO(0x02000,8)
  592. }
  593. }, {
  594. .mfr_id = MANUFACTURER_FUJITSU,
  595. .dev_id = MBM29F040C,
  596. .name = "Fujitsu MBM29F040C",
  597. .uaddr = {
  598. [0] = MTD_UADDR_0x0AAA_0x0555, /* x8 */
  599. },
  600. .DevSize = SIZE_512KiB,
  601. .CmdSet = P_ID_AMD_STD,
  602. .NumEraseRegions= 1,
  603. .regions = {
  604. ERASEINFO(0x10000,8)
  605. }
  606. }, {
  607. .mfr_id = MANUFACTURER_FUJITSU,
  608. .dev_id = MBM29LV650UE,
  609. .name = "Fujitsu MBM29LV650UE",
  610. .uaddr = {
  611. [0] = MTD_UADDR_DONT_CARE /* x16 */
  612. },
  613. .DevSize = SIZE_8MiB,
  614. .CmdSet = P_ID_AMD_STD,
  615. .NumEraseRegions= 1,
  616. .regions = {
  617. ERASEINFO(0x10000,128)
  618. }
  619. }, {
  620. .mfr_id = MANUFACTURER_FUJITSU,
  621. .dev_id = MBM29LV320TE,
  622. .name = "Fujitsu MBM29LV320TE",
  623. .uaddr = {
  624. [0] = MTD_UADDR_0x0AAA_0x0555, /* x8 */
  625. [1] = MTD_UADDR_0x0555_0x02AA, /* x16 */
  626. },
  627. .DevSize = SIZE_4MiB,
  628. .CmdSet = P_ID_AMD_STD,
  629. .NumEraseRegions= 2,
  630. .regions = {
  631. ERASEINFO(0x10000,63),
  632. ERASEINFO(0x02000,8)
  633. }
  634. }, {
  635. .mfr_id = MANUFACTURER_FUJITSU,
  636. .dev_id = MBM29LV320BE,
  637. .name = "Fujitsu MBM29LV320BE",
  638. .uaddr = {
  639. [0] = MTD_UADDR_0x0AAA_0x0555, /* x8 */
  640. [1] = MTD_UADDR_0x0555_0x02AA, /* x16 */
  641. },
  642. .DevSize = SIZE_4MiB,
  643. .CmdSet = P_ID_AMD_STD,
  644. .NumEraseRegions= 2,
  645. .regions = {
  646. ERASEINFO(0x02000,8),
  647. ERASEINFO(0x10000,63)
  648. }
  649. }, {
  650. .mfr_id = MANUFACTURER_FUJITSU,
  651. .dev_id = MBM29LV160TE,
  652. .name = "Fujitsu MBM29LV160TE",
  653. .uaddr = {
  654. [0] = MTD_UADDR_0x0AAA_0x0555, /* x8 */
  655. [1] = MTD_UADDR_0x0555_0x02AA, /* x16 */
  656. },
  657. .DevSize = SIZE_2MiB,
  658. .CmdSet = P_ID_AMD_STD,
  659. .NumEraseRegions= 4,
  660. .regions = {
  661. ERASEINFO(0x10000,31),
  662. ERASEINFO(0x08000,1),
  663. ERASEINFO(0x02000,2),
  664. ERASEINFO(0x04000,1)
  665. }
  666. }, {
  667. .mfr_id = MANUFACTURER_FUJITSU,
  668. .dev_id = MBM29LV160BE,
  669. .name = "Fujitsu MBM29LV160BE",
  670. .uaddr = {
  671. [0] = MTD_UADDR_0x0AAA_0x0555, /* x8 */
  672. [1] = MTD_UADDR_0x0555_0x02AA, /* x16 */
  673. },
  674. .DevSize = SIZE_2MiB,
  675. .CmdSet = P_ID_AMD_STD,
  676. .NumEraseRegions= 4,
  677. .regions = {
  678. ERASEINFO(0x04000,1),
  679. ERASEINFO(0x02000,2),
  680. ERASEINFO(0x08000,1),
  681. ERASEINFO(0x10000,31)
  682. }
  683. }, {
  684. .mfr_id = MANUFACTURER_FUJITSU,
  685. .dev_id = MBM29LV800BA,
  686. .name = "Fujitsu MBM29LV800BA",
  687. .uaddr = {
  688. [0] = MTD_UADDR_0x0AAA_0x0555, /* x8 */
  689. [1] = MTD_UADDR_0x0555_0x02AA, /* x16 */
  690. },
  691. .DevSize = SIZE_1MiB,
  692. .CmdSet = P_ID_AMD_STD,
  693. .NumEraseRegions= 4,
  694. .regions = {
  695. ERASEINFO(0x04000,1),
  696. ERASEINFO(0x02000,2),
  697. ERASEINFO(0x08000,1),
  698. ERASEINFO(0x10000,15)
  699. }
  700. }, {
  701. .mfr_id = MANUFACTURER_FUJITSU,
  702. .dev_id = MBM29LV800TA,
  703. .name = "Fujitsu MBM29LV800TA",
  704. .uaddr = {
  705. [0] = MTD_UADDR_0x0AAA_0x0555, /* x8 */
  706. [1] = MTD_UADDR_0x0555_0x02AA, /* x16 */
  707. },
  708. .DevSize = SIZE_1MiB,
  709. .CmdSet = P_ID_AMD_STD,
  710. .NumEraseRegions= 4,
  711. .regions = {
  712. ERASEINFO(0x10000,15),
  713. ERASEINFO(0x08000,1),
  714. ERASEINFO(0x02000,2),
  715. ERASEINFO(0x04000,1)
  716. }
  717. }, {
  718. .mfr_id = MANUFACTURER_FUJITSU,
  719. .dev_id = MBM29LV400BC,
  720. .name = "Fujitsu MBM29LV400BC",
  721. .uaddr = {
  722. [0] = MTD_UADDR_0x0AAA_0x0555, /* x8 */
  723. [1] = MTD_UADDR_0x0555_0x02AA, /* x16 */
  724. },
  725. .DevSize = SIZE_512KiB,
  726. .CmdSet = P_ID_AMD_STD,
  727. .NumEraseRegions= 4,
  728. .regions = {
  729. ERASEINFO(0x04000,1),
  730. ERASEINFO(0x02000,2),
  731. ERASEINFO(0x08000,1),
  732. ERASEINFO(0x10000,7)
  733. }
  734. }, {
  735. .mfr_id = MANUFACTURER_FUJITSU,
  736. .dev_id = MBM29LV400TC,
  737. .name = "Fujitsu MBM29LV400TC",
  738. .uaddr = {
  739. [0] = MTD_UADDR_0x0AAA_0x0555, /* x8 */
  740. [1] = MTD_UADDR_0x0555_0x02AA, /* x16 */
  741. },
  742. .DevSize = SIZE_512KiB,
  743. .CmdSet = P_ID_AMD_STD,
  744. .NumEraseRegions= 4,
  745. .regions = {
  746. ERASEINFO(0x10000,7),
  747. ERASEINFO(0x08000,1),
  748. ERASEINFO(0x02000,2),
  749. ERASEINFO(0x04000,1)
  750. }
  751. }, {
  752. .mfr_id = MANUFACTURER_HYUNDAI,
  753. .dev_id = HY29F002T,
  754. .name = "Hyundai HY29F002T",
  755. .uaddr = {
  756. [0] = MTD_UADDR_0x0555_0x02AA /* x8 */
  757. },
  758. .DevSize = SIZE_256KiB,
  759. .CmdSet = P_ID_AMD_STD,
  760. .NumEraseRegions= 4,
  761. .regions = {
  762. ERASEINFO(0x10000,3),
  763. ERASEINFO(0x08000,1),
  764. ERASEINFO(0x02000,2),
  765. ERASEINFO(0x04000,1),
  766. }
  767. }, {
  768. .mfr_id = MANUFACTURER_INTEL,
  769. .dev_id = I28F004B3B,
  770. .name = "Intel 28F004B3B",
  771. .uaddr = {
  772. [0] = MTD_UADDR_UNNECESSARY, /* x8 */
  773. },
  774. .DevSize = SIZE_512KiB,
  775. .CmdSet = P_ID_INTEL_STD,
  776. .NumEraseRegions= 2,
  777. .regions = {
  778. ERASEINFO(0x02000, 8),
  779. ERASEINFO(0x10000, 7),
  780. }
  781. }, {
  782. .mfr_id = MANUFACTURER_INTEL,
  783. .dev_id = I28F004B3T,
  784. .name = "Intel 28F004B3T",
  785. .uaddr = {
  786. [0] = MTD_UADDR_UNNECESSARY, /* x8 */
  787. },
  788. .DevSize = SIZE_512KiB,
  789. .CmdSet = P_ID_INTEL_STD,
  790. .NumEraseRegions= 2,
  791. .regions = {
  792. ERASEINFO(0x10000, 7),
  793. ERASEINFO(0x02000, 8),
  794. }
  795. }, {
  796. .mfr_id = MANUFACTURER_INTEL,
  797. .dev_id = I28F400B3B,
  798. .name = "Intel 28F400B3B",
  799. .uaddr = {
  800. [0] = MTD_UADDR_UNNECESSARY, /* x8 */
  801. [1] = MTD_UADDR_UNNECESSARY, /* x16 */
  802. },
  803. .DevSize = SIZE_512KiB,
  804. .CmdSet = P_ID_INTEL_STD,
  805. .NumEraseRegions= 2,
  806. .regions = {
  807. ERASEINFO(0x02000, 8),
  808. ERASEINFO(0x10000, 7),
  809. }
  810. }, {
  811. .mfr_id = MANUFACTURER_INTEL,
  812. .dev_id = I28F400B3T,
  813. .name = "Intel 28F400B3T",
  814. .uaddr = {
  815. [0] = MTD_UADDR_UNNECESSARY, /* x8 */
  816. [1] = MTD_UADDR_UNNECESSARY, /* x16 */
  817. },
  818. .DevSize = SIZE_512KiB,
  819. .CmdSet = P_ID_INTEL_STD,
  820. .NumEraseRegions= 2,
  821. .regions = {
  822. ERASEINFO(0x10000, 7),
  823. ERASEINFO(0x02000, 8),
  824. }
  825. }, {
  826. .mfr_id = MANUFACTURER_INTEL,
  827. .dev_id = I28F008B3B,
  828. .name = "Intel 28F008B3B",
  829. .uaddr = {
  830. [0] = MTD_UADDR_UNNECESSARY, /* x8 */
  831. },
  832. .DevSize = SIZE_1MiB,
  833. .CmdSet = P_ID_INTEL_STD,
  834. .NumEraseRegions= 2,
  835. .regions = {
  836. ERASEINFO(0x02000, 8),
  837. ERASEINFO(0x10000, 15),
  838. }
  839. }, {
  840. .mfr_id = MANUFACTURER_INTEL,
  841. .dev_id = I28F008B3T,
  842. .name = "Intel 28F008B3T",
  843. .uaddr = {
  844. [0] = MTD_UADDR_UNNECESSARY, /* x8 */
  845. },
  846. .DevSize = SIZE_1MiB,
  847. .CmdSet = P_ID_INTEL_STD,
  848. .NumEraseRegions= 2,
  849. .regions = {
  850. ERASEINFO(0x10000, 15),
  851. ERASEINFO(0x02000, 8),
  852. }
  853. }, {
  854. .mfr_id = MANUFACTURER_INTEL,
  855. .dev_id = I28F008S5,
  856. .name = "Intel 28F008S5",
  857. .uaddr = {
  858. [0] = MTD_UADDR_UNNECESSARY, /* x8 */
  859. },
  860. .DevSize = SIZE_1MiB,
  861. .CmdSet = P_ID_INTEL_EXT,
  862. .NumEraseRegions= 1,
  863. .regions = {
  864. ERASEINFO(0x10000,16),
  865. }
  866. }, {
  867. .mfr_id = MANUFACTURER_INTEL,
  868. .dev_id = I28F016S5,
  869. .name = "Intel 28F016S5",
  870. .uaddr = {
  871. [0] = MTD_UADDR_UNNECESSARY, /* x8 */
  872. },
  873. .DevSize = SIZE_2MiB,
  874. .CmdSet = P_ID_INTEL_EXT,
  875. .NumEraseRegions= 1,
  876. .regions = {
  877. ERASEINFO(0x10000,32),
  878. }
  879. }, {
  880. .mfr_id = MANUFACTURER_INTEL,
  881. .dev_id = I28F008SA,
  882. .name = "Intel 28F008SA",
  883. .uaddr = {
  884. [0] = MTD_UADDR_UNNECESSARY, /* x8 */
  885. },
  886. .DevSize = SIZE_1MiB,
  887. .CmdSet = P_ID_INTEL_STD,
  888. .NumEraseRegions= 1,
  889. .regions = {
  890. ERASEINFO(0x10000, 16),
  891. }
  892. }, {
  893. .mfr_id = MANUFACTURER_INTEL,
  894. .dev_id = I28F800B3B,
  895. .name = "Intel 28F800B3B",
  896. .uaddr = {
  897. [1] = MTD_UADDR_UNNECESSARY, /* x16 */
  898. },
  899. .DevSize = SIZE_1MiB,
  900. .CmdSet = P_ID_INTEL_STD,
  901. .NumEraseRegions= 2,
  902. .regions = {
  903. ERASEINFO(0x02000, 8),
  904. ERASEINFO(0x10000, 15),
  905. }
  906. }, {
  907. .mfr_id = MANUFACTURER_INTEL,
  908. .dev_id = I28F800B3T,
  909. .name = "Intel 28F800B3T",
  910. .uaddr = {
  911. [1] = MTD_UADDR_UNNECESSARY, /* x16 */
  912. },
  913. .DevSize = SIZE_1MiB,
  914. .CmdSet = P_ID_INTEL_STD,
  915. .NumEraseRegions= 2,
  916. .regions = {
  917. ERASEINFO(0x10000, 15),
  918. ERASEINFO(0x02000, 8),
  919. }
  920. }, {
  921. .mfr_id = MANUFACTURER_INTEL,
  922. .dev_id = I28F016B3B,
  923. .name = "Intel 28F016B3B",
  924. .uaddr = {
  925. [0] = MTD_UADDR_UNNECESSARY, /* x8 */
  926. },
  927. .DevSize = SIZE_2MiB,
  928. .CmdSet = P_ID_INTEL_STD,
  929. .NumEraseRegions= 2,
  930. .regions = {
  931. ERASEINFO(0x02000, 8),
  932. ERASEINFO(0x10000, 31),
  933. }
  934. }, {
  935. .mfr_id = MANUFACTURER_INTEL,
  936. .dev_id = I28F016S3,
  937. .name = "Intel I28F016S3",
  938. .uaddr = {
  939. [0] = MTD_UADDR_UNNECESSARY, /* x8 */
  940. },
  941. .DevSize = SIZE_2MiB,
  942. .CmdSet = P_ID_INTEL_STD,
  943. .NumEraseRegions= 1,
  944. .regions = {
  945. ERASEINFO(0x10000, 32),
  946. }
  947. }, {
  948. .mfr_id = MANUFACTURER_INTEL,
  949. .dev_id = I28F016B3T,
  950. .name = "Intel 28F016B3T",
  951. .uaddr = {
  952. [0] = MTD_UADDR_UNNECESSARY, /* x8 */
  953. },
  954. .DevSize = SIZE_2MiB,
  955. .CmdSet = P_ID_INTEL_STD,
  956. .NumEraseRegions= 2,
  957. .regions = {
  958. ERASEINFO(0x10000, 31),
  959. ERASEINFO(0x02000, 8),
  960. }
  961. }, {
  962. .mfr_id = MANUFACTURER_INTEL,
  963. .dev_id = I28F160B3B,
  964. .name = "Intel 28F160B3B",
  965. .uaddr = {
  966. [1] = MTD_UADDR_UNNECESSARY, /* x16 */
  967. },
  968. .DevSize = SIZE_2MiB,
  969. .CmdSet = P_ID_INTEL_STD,
  970. .NumEraseRegions= 2,
  971. .regions = {
  972. ERASEINFO(0x02000, 8),
  973. ERASEINFO(0x10000, 31),
  974. }
  975. }, {
  976. .mfr_id = MANUFACTURER_INTEL,
  977. .dev_id = I28F160B3T,
  978. .name = "Intel 28F160B3T",
  979. .uaddr = {
  980. [1] = MTD_UADDR_UNNECESSARY, /* x16 */
  981. },
  982. .DevSize = SIZE_2MiB,
  983. .CmdSet = P_ID_INTEL_STD,
  984. .NumEraseRegions= 2,
  985. .regions = {
  986. ERASEINFO(0x10000, 31),
  987. ERASEINFO(0x02000, 8),
  988. }
  989. }, {
  990. .mfr_id = MANUFACTURER_INTEL,
  991. .dev_id = I28F320B3B,
  992. .name = "Intel 28F320B3B",
  993. .uaddr = {
  994. [1] = MTD_UADDR_UNNECESSARY, /* x16 */
  995. },
  996. .DevSize = SIZE_4MiB,
  997. .CmdSet = P_ID_INTEL_STD,
  998. .NumEraseRegions= 2,
  999. .regions = {
  1000. ERASEINFO(0x02000, 8),
  1001. ERASEINFO(0x10000, 63),
  1002. }
  1003. }, {
  1004. .mfr_id = MANUFACTURER_INTEL,
  1005. .dev_id = I28F320B3T,
  1006. .name = "Intel 28F320B3T",
  1007. .uaddr = {
  1008. [1] = MTD_UADDR_UNNECESSARY, /* x16 */
  1009. },
  1010. .DevSize = SIZE_4MiB,
  1011. .CmdSet = P_ID_INTEL_STD,
  1012. .NumEraseRegions= 2,
  1013. .regions = {
  1014. ERASEINFO(0x10000, 63),
  1015. ERASEINFO(0x02000, 8),
  1016. }
  1017. }, {
  1018. .mfr_id = MANUFACTURER_INTEL,
  1019. .dev_id = I28F640B3B,
  1020. .name = "Intel 28F640B3B",
  1021. .uaddr = {
  1022. [1] = MTD_UADDR_UNNECESSARY, /* x16 */
  1023. },
  1024. .DevSize = SIZE_8MiB,
  1025. .CmdSet = P_ID_INTEL_STD,
  1026. .NumEraseRegions= 2,
  1027. .regions = {
  1028. ERASEINFO(0x02000, 8),
  1029. ERASEINFO(0x10000, 127),
  1030. }
  1031. }, {
  1032. .mfr_id = MANUFACTURER_INTEL,
  1033. .dev_id = I28F640B3T,
  1034. .name = "Intel 28F640B3T",
  1035. .uaddr = {
  1036. [1] = MTD_UADDR_UNNECESSARY, /* x16 */
  1037. },
  1038. .DevSize = SIZE_8MiB,
  1039. .CmdSet = P_ID_INTEL_STD,
  1040. .NumEraseRegions= 2,
  1041. .regions = {
  1042. ERASEINFO(0x10000, 127),
  1043. ERASEINFO(0x02000, 8),
  1044. }
  1045. }, {
  1046. .mfr_id = MANUFACTURER_INTEL,
  1047. .dev_id = I82802AB,
  1048. .name = "Intel 82802AB",
  1049. .uaddr = {
  1050. [0] = MTD_UADDR_UNNECESSARY, /* x8 */
  1051. },
  1052. .DevSize = SIZE_512KiB,
  1053. .CmdSet = P_ID_INTEL_EXT,
  1054. .NumEraseRegions= 1,
  1055. .regions = {
  1056. ERASEINFO(0x10000,8),
  1057. }
  1058. }, {
  1059. .mfr_id = MANUFACTURER_INTEL,
  1060. .dev_id = I82802AC,
  1061. .name = "Intel 82802AC",
  1062. .uaddr = {
  1063. [0] = MTD_UADDR_UNNECESSARY, /* x8 */
  1064. },
  1065. .DevSize = SIZE_1MiB,
  1066. .CmdSet = P_ID_INTEL_EXT,
  1067. .NumEraseRegions= 1,
  1068. .regions = {
  1069. ERASEINFO(0x10000,16),
  1070. }
  1071. }, {
  1072. .mfr_id = MANUFACTURER_MACRONIX,
  1073. .dev_id = MX29LV040C,
  1074. .name = "Macronix MX29LV040C",
  1075. .uaddr = {
  1076. [0] = MTD_UADDR_0x0555_0x02AA, /* x8 */
  1077. },
  1078. .DevSize = SIZE_512KiB,
  1079. .CmdSet = P_ID_AMD_STD,
  1080. .NumEraseRegions= 1,
  1081. .regions = {
  1082. ERASEINFO(0x10000,8),
  1083. }
  1084. }, {
  1085. .mfr_id = MANUFACTURER_MACRONIX,
  1086. .dev_id = MX29LV160T,
  1087. .name = "MXIC MX29LV160T",
  1088. .uaddr = {
  1089. [0] = MTD_UADDR_0x0AAA_0x0555, /* x8 */
  1090. [1] = MTD_UADDR_0x0555_0x02AA, /* x16 */
  1091. },
  1092. .DevSize = SIZE_2MiB,
  1093. .CmdSet = P_ID_AMD_STD,
  1094. .NumEraseRegions= 4,
  1095. .regions = {
  1096. ERASEINFO(0x10000,31),
  1097. ERASEINFO(0x08000,1),
  1098. ERASEINFO(0x02000,2),
  1099. ERASEINFO(0x04000,1)
  1100. }
  1101. }, {
  1102. .mfr_id = MANUFACTURER_NEC,
  1103. .dev_id = UPD29F064115,
  1104. .name = "NEC uPD29F064115",
  1105. .uaddr = {
  1106. [0] = MTD_UADDR_0x0555_0x02AA, /* x8 */
  1107. [1] = MTD_UADDR_0x0555_0x02AA, /* x16 */
  1108. },
  1109. .DevSize = SIZE_8MiB,
  1110. .CmdSet = P_ID_AMD_STD,
  1111. .NumEraseRegions= 3,
  1112. .regions = {
  1113. ERASEINFO(0x2000,8),
  1114. ERASEINFO(0x10000,126),
  1115. ERASEINFO(0x2000,8),
  1116. }
  1117. }, {
  1118. .mfr_id = MANUFACTURER_MACRONIX,
  1119. .dev_id = MX29LV160B,
  1120. .name = "MXIC MX29LV160B",
  1121. .uaddr = {
  1122. [0] = MTD_UADDR_0x0AAA_0x0555, /* x8 */
  1123. [1] = MTD_UADDR_0x0555_0x02AA, /* x16 */
  1124. },
  1125. .DevSize = SIZE_2MiB,
  1126. .CmdSet = P_ID_AMD_STD,
  1127. .NumEraseRegions= 4,
  1128. .regions = {
  1129. ERASEINFO(0x04000,1),
  1130. ERASEINFO(0x02000,2),
  1131. ERASEINFO(0x08000,1),
  1132. ERASEINFO(0x10000,31)
  1133. }
  1134. }, {
  1135. .mfr_id = MANUFACTURER_MACRONIX,
  1136. .dev_id = MX29F016,
  1137. .name = "Macronix MX29F016",
  1138. .uaddr = {
  1139. [0] = MTD_UADDR_0x0555_0x02AA /* x8 */
  1140. },
  1141. .DevSize = SIZE_2MiB,
  1142. .CmdSet = P_ID_AMD_STD,
  1143. .NumEraseRegions= 1,
  1144. .regions = {
  1145. ERASEINFO(0x10000,32),
  1146. }
  1147. }, {
  1148. .mfr_id = MANUFACTURER_MACRONIX,
  1149. .dev_id = MX29F004T,
  1150. .name = "Macronix MX29F004T",
  1151. .uaddr = {
  1152. [0] = MTD_UADDR_0x0555_0x02AA /* x8 */
  1153. },
  1154. .DevSize = SIZE_512KiB,
  1155. .CmdSet = P_ID_AMD_STD,
  1156. .NumEraseRegions= 4,
  1157. .regions = {
  1158. ERASEINFO(0x10000,7),
  1159. ERASEINFO(0x08000,1),
  1160. ERASEINFO(0x02000,2),
  1161. ERASEINFO(0x04000,1),
  1162. }
  1163. }, {
  1164. .mfr_id = MANUFACTURER_MACRONIX,
  1165. .dev_id = MX29F004B,
  1166. .name = "Macronix MX29F004B",
  1167. .uaddr = {
  1168. [0] = MTD_UADDR_0x0555_0x02AA /* x8 */
  1169. },
  1170. .DevSize = SIZE_512KiB,
  1171. .CmdSet = P_ID_AMD_STD,
  1172. .NumEraseRegions= 4,
  1173. .regions = {
  1174. ERASEINFO(0x04000,1),
  1175. ERASEINFO(0x02000,2),
  1176. ERASEINFO(0x08000,1),
  1177. ERASEINFO(0x10000,7),
  1178. }
  1179. }, {
  1180. .mfr_id = MANUFACTURER_MACRONIX,
  1181. .dev_id = MX29F002T,
  1182. .name = "Macronix MX29F002T",
  1183. .uaddr = {
  1184. [0] = MTD_UADDR_0x0555_0x02AA /* x8 */
  1185. },
  1186. .DevSize = SIZE_256KiB,
  1187. .CmdSet = P_ID_AMD_STD,
  1188. .NumEraseRegions= 4,
  1189. .regions = {
  1190. ERASEINFO(0x10000,3),
  1191. ERASEINFO(0x08000,1),
  1192. ERASEINFO(0x02000,2),
  1193. ERASEINFO(0x04000,1),
  1194. }
  1195. }, {
  1196. .mfr_id = MANUFACTURER_PMC,
  1197. .dev_id = PM49FL002,
  1198. .name = "PMC Pm49FL002",
  1199. .uaddr = {
  1200. [0] = MTD_UADDR_0x5555_0x2AAA /* x8 */
  1201. },
  1202. .DevSize = SIZE_256KiB,
  1203. .CmdSet = P_ID_AMD_STD,
  1204. .NumEraseRegions= 1,
  1205. .regions = {
  1206. ERASEINFO( 0x01000, 64 )
  1207. }
  1208. }, {
  1209. .mfr_id = MANUFACTURER_PMC,
  1210. .dev_id = PM49FL004,
  1211. .name = "PMC Pm49FL004",
  1212. .uaddr = {
  1213. [0] = MTD_UADDR_0x5555_0x2AAA /* x8 */
  1214. },
  1215. .DevSize = SIZE_512KiB,
  1216. .CmdSet = P_ID_AMD_STD,
  1217. .NumEraseRegions= 1,
  1218. .regions = {
  1219. ERASEINFO( 0x01000, 128 )
  1220. }
  1221. }, {
  1222. .mfr_id = MANUFACTURER_PMC,
  1223. .dev_id = PM49FL008,
  1224. .name = "PMC Pm49FL008",
  1225. .uaddr = {
  1226. [0] = MTD_UADDR_0x5555_0x2AAA /* x8 */
  1227. },
  1228. .DevSize = SIZE_1MiB,
  1229. .CmdSet = P_ID_AMD_STD,
  1230. .NumEraseRegions= 1,
  1231. .regions = {
  1232. ERASEINFO( 0x01000, 256 )
  1233. }
  1234. }, {
  1235. .mfr_id = MANUFACTURER_SST,
  1236. .dev_id = SST39LF512,
  1237. .name = "SST 39LF512",
  1238. .uaddr = {
  1239. [0] = MTD_UADDR_0x5555_0x2AAA /* x8 */
  1240. },
  1241. .DevSize = SIZE_64KiB,
  1242. .CmdSet = P_ID_AMD_STD,
  1243. .NumEraseRegions= 1,
  1244. .regions = {
  1245. ERASEINFO(0x01000,16),
  1246. }
  1247. }, {
  1248. .mfr_id = MANUFACTURER_SST,
  1249. .dev_id = SST39LF010,
  1250. .name = "SST 39LF010",
  1251. .uaddr = {
  1252. [0] = MTD_UADDR_0x5555_0x2AAA /* x8 */
  1253. },
  1254. .DevSize = SIZE_128KiB,
  1255. .CmdSet = P_ID_AMD_STD,
  1256. .NumEraseRegions= 1,
  1257. .regions = {
  1258. ERASEINFO(0x01000,32),
  1259. }
  1260. }, {
  1261. .mfr_id = MANUFACTURER_SST,
  1262. .dev_id = SST29EE020,
  1263. .name = "SST 29EE020",
  1264. .uaddr = {
  1265. [0] = MTD_UADDR_0x5555_0x2AAA /* x8 */
  1266. },
  1267. .DevSize = SIZE_256KiB,
  1268. .CmdSet = P_ID_SST_PAGE,
  1269. .NumEraseRegions= 1,
  1270. .regions = {ERASEINFO(0x01000,64),
  1271. }
  1272. }, {
  1273. .mfr_id = MANUFACTURER_SST,
  1274. .dev_id = SST29LE020,
  1275. .name = "SST 29LE020",
  1276. .uaddr = {
  1277. [0] = MTD_UADDR_0x5555_0x2AAA /* x8 */
  1278. },
  1279. .DevSize = SIZE_256KiB,
  1280. .CmdSet = P_ID_SST_PAGE,
  1281. .NumEraseRegions= 1,
  1282. .regions = {ERASEINFO(0x01000,64),
  1283. }
  1284. }, {
  1285. .mfr_id = MANUFACTURER_SST,
  1286. .dev_id = SST39LF020,
  1287. .name = "SST 39LF020",
  1288. .uaddr = {
  1289. [0] = MTD_UADDR_0x5555_0x2AAA /* x8 */
  1290. },
  1291. .DevSize = SIZE_256KiB,
  1292. .CmdSet = P_ID_AMD_STD,
  1293. .NumEraseRegions= 1,
  1294. .regions = {
  1295. ERASEINFO(0x01000,64),
  1296. }
  1297. }, {
  1298. .mfr_id = MANUFACTURER_SST,
  1299. .dev_id = SST39LF040,
  1300. .name = "SST 39LF040",
  1301. .uaddr = {
  1302. [0] = MTD_UADDR_0x5555_0x2AAA /* x8 */
  1303. },
  1304. .DevSize = SIZE_512KiB,
  1305. .CmdSet = P_ID_AMD_STD,
  1306. .NumEraseRegions= 1,
  1307. .regions = {
  1308. ERASEINFO(0x01000,128),
  1309. }
  1310. }, {
  1311. .mfr_id = MANUFACTURER_SST,
  1312. .dev_id = SST39SF010A,
  1313. .name = "SST 39SF010A",
  1314. .uaddr = {
  1315. [0] = MTD_UADDR_0x5555_0x2AAA /* x8 */
  1316. },
  1317. .DevSize = SIZE_128KiB,
  1318. .CmdSet = P_ID_AMD_STD,
  1319. .NumEraseRegions= 1,
  1320. .regions = {
  1321. ERASEINFO(0x01000,32),
  1322. }
  1323. }, {
  1324. .mfr_id = MANUFACTURER_SST,
  1325. .dev_id = SST39SF020A,
  1326. .name = "SST 39SF020A",
  1327. .uaddr = {
  1328. [0] = MTD_UADDR_0x5555_0x2AAA /* x8 */
  1329. },
  1330. .DevSize = SIZE_256KiB,
  1331. .CmdSet = P_ID_AMD_STD,
  1332. .NumEraseRegions= 1,
  1333. .regions = {
  1334. ERASEINFO(0x01000,64),
  1335. }
  1336. }, {
  1337. .mfr_id = MANUFACTURER_SST,
  1338. .dev_id = SST49LF004B,
  1339. .name = "SST 49LF004B",
  1340. .uaddr = {
  1341. [0] = MTD_UADDR_0x5555_0x2AAA /* x8 */
  1342. },
  1343. .DevSize = SIZE_512KiB,
  1344. .CmdSet = P_ID_AMD_STD,
  1345. .NumEraseRegions= 1,
  1346. .regions = {
  1347. ERASEINFO(0x01000,128),
  1348. }
  1349. }, {
  1350. .mfr_id = MANUFACTURER_SST,
  1351. .dev_id = SST49LF008A,
  1352. .name = "SST 49LF008A",
  1353. .uaddr = {
  1354. [0] = MTD_UADDR_0x5555_0x2AAA /* x8 */
  1355. },
  1356. .DevSize = SIZE_1MiB,
  1357. .CmdSet = P_ID_AMD_STD,
  1358. .NumEraseRegions= 1,
  1359. .regions = {
  1360. ERASEINFO(0x01000,256),
  1361. }
  1362. }, {
  1363. .mfr_id = MANUFACTURER_SST,
  1364. .dev_id = SST49LF030A,
  1365. .name = "SST 49LF030A",
  1366. .uaddr = {
  1367. [0] = MTD_UADDR_0x5555_0x2AAA /* x8 */
  1368. },
  1369. .DevSize = SIZE_512KiB,
  1370. .CmdSet = P_ID_AMD_STD,
  1371. .NumEraseRegions= 1,
  1372. .regions = {
  1373. ERASEINFO(0x01000,96),
  1374. }
  1375. }, {
  1376. .mfr_id = MANUFACTURER_SST,
  1377. .dev_id = SST49LF040A,
  1378. .name = "SST 49LF040A",
  1379. .uaddr = {
  1380. [0] = MTD_UADDR_0x5555_0x2AAA /* x8 */
  1381. },
  1382. .DevSize = SIZE_512KiB,
  1383. .CmdSet = P_ID_AMD_STD,
  1384. .NumEraseRegions= 1,
  1385. .regions = {
  1386. ERASEINFO(0x01000,128),
  1387. }
  1388. }, {
  1389. .mfr_id = MANUFACTURER_SST,
  1390. .dev_id = SST49LF080A,
  1391. .name = "SST 49LF080A",
  1392. .uaddr = {
  1393. [0] = MTD_UADDR_0x5555_0x2AAA /* x8 */
  1394. },
  1395. .DevSize = SIZE_1MiB,
  1396. .CmdSet = P_ID_AMD_STD,
  1397. .NumEraseRegions= 1,
  1398. .regions = {
  1399. ERASEINFO(0x01000,256),
  1400. }
  1401. }, {
  1402. .mfr_id = MANUFACTURER_SST, /* should be CFI */
  1403. .dev_id = SST39LF160,
  1404. .name = "SST 39LF160",
  1405. .uaddr = {
  1406. [0] = MTD_UADDR_0x5555_0x2AAA, /* x8 */
  1407. [1] = MTD_UADDR_0x5555_0x2AAA /* x16 */
  1408. },
  1409. .DevSize = SIZE_2MiB,
  1410. .CmdSet = P_ID_AMD_STD,
  1411. .NumEraseRegions= 2,
  1412. .regions = {
  1413. ERASEINFO(0x1000,256),
  1414. ERASEINFO(0x1000,256)
  1415. }
  1416. }, {
  1417. .mfr_id = MANUFACTURER_SST, /* should be CFI */
  1418. .dev_id = SST39VF1601,
  1419. .name = "SST 39VF1601",
  1420. .uaddr = {
  1421. [0] = MTD_UADDR_0x5555_0x2AAA, /* x8 */
  1422. [1] = MTD_UADDR_0x5555_0x2AAA /* x16 */
  1423. },
  1424. .DevSize = SIZE_2MiB,
  1425. .CmdSet = P_ID_AMD_STD,
  1426. .NumEraseRegions= 2,
  1427. .regions = {
  1428. ERASEINFO(0x1000,256),
  1429. ERASEINFO(0x1000,256)
  1430. }
  1431. }, {
  1432. .mfr_id = MANUFACTURER_ST, /* FIXME - CFI device? */
  1433. .dev_id = M29W800DT,
  1434. .name = "ST M29W800DT",
  1435. .uaddr = {
  1436. [0] = MTD_UADDR_0x5555_0x2AAA, /* x8 */
  1437. [1] = MTD_UADDR_0x5555_0x2AAA /* x16 */
  1438. },
  1439. .DevSize = SIZE_1MiB,
  1440. .CmdSet = P_ID_AMD_STD,
  1441. .NumEraseRegions= 4,
  1442. .regions = {
  1443. ERASEINFO(0x10000,15),
  1444. ERASEINFO(0x08000,1),
  1445. ERASEINFO(0x02000,2),
  1446. ERASEINFO(0x04000,1)
  1447. }
  1448. }, {
  1449. .mfr_id = MANUFACTURER_ST, /* FIXME - CFI device? */
  1450. .dev_id = M29W800DB,
  1451. .name = "ST M29W800DB",
  1452. .uaddr = {
  1453. [0] = MTD_UADDR_0x5555_0x2AAA, /* x8 */
  1454. [1] = MTD_UADDR_0x5555_0x2AAA /* x16 */
  1455. },
  1456. .DevSize = SIZE_1MiB,
  1457. .CmdSet = P_ID_AMD_STD,
  1458. .NumEraseRegions= 4,
  1459. .regions = {
  1460. ERASEINFO(0x04000,1),
  1461. ERASEINFO(0x02000,2),
  1462. ERASEINFO(0x08000,1),
  1463. ERASEINFO(0x10000,15)
  1464. }
  1465. }, {
  1466. .mfr_id = MANUFACTURER_ST, /* FIXME - CFI device? */
  1467. .dev_id = M29W160DT,
  1468. .name = "ST M29W160DT",
  1469. .uaddr = {
  1470. [0] = MTD_UADDR_0x0555_0x02AA, /* x8 */
  1471. [1] = MTD_UADDR_0x0555_0x02AA, /* x16 */
  1472. },
  1473. .DevSize = SIZE_2MiB,
  1474. .CmdSet = P_ID_AMD_STD,
  1475. .NumEraseRegions= 4,
  1476. .regions = {
  1477. ERASEINFO(0x10000,31),
  1478. ERASEINFO(0x08000,1),
  1479. ERASEINFO(0x02000,2),
  1480. ERASEINFO(0x04000,1)
  1481. }
  1482. }, {
  1483. .mfr_id = MANUFACTURER_ST, /* FIXME - CFI device? */
  1484. .dev_id = M29W160DB,
  1485. .name = "ST M29W160DB",
  1486. .uaddr = {
  1487. [0] = MTD_UADDR_0x0555_0x02AA, /* x8 */
  1488. [1] = MTD_UADDR_0x0555_0x02AA, /* x16 */
  1489. },
  1490. .DevSize = SIZE_2MiB,
  1491. .CmdSet = P_ID_AMD_STD,
  1492. .NumEraseRegions= 4,
  1493. .regions = {
  1494. ERASEINFO(0x04000,1),
  1495. ERASEINFO(0x02000,2),
  1496. ERASEINFO(0x08000,1),
  1497. ERASEINFO(0x10000,31)
  1498. }
  1499. }, {
  1500. .mfr_id = MANUFACTURER_ST,
  1501. .dev_id = M29W040B,
  1502. .name = "ST M29W040B",
  1503. .uaddr = {
  1504. [0] = MTD_UADDR_0x0555_0x02AA /* x8 */
  1505. },
  1506. .DevSize = SIZE_512KiB,
  1507. .CmdSet = P_ID_AMD_STD,
  1508. .NumEraseRegions= 1,
  1509. .regions = {
  1510. ERASEINFO(0x10000,8),
  1511. }
  1512. }, {
  1513. .mfr_id = MANUFACTURER_ST,
  1514. .dev_id = M50FW040,
  1515. .name = "ST M50FW040",
  1516. .uaddr = {
  1517. [0] = MTD_UADDR_UNNECESSARY, /* x8 */
  1518. },
  1519. .DevSize = SIZE_512KiB,
  1520. .CmdSet = P_ID_INTEL_EXT,
  1521. .NumEraseRegions= 1,
  1522. .regions = {
  1523. ERASEINFO(0x10000,8),
  1524. }
  1525. }, {
  1526. .mfr_id = MANUFACTURER_ST,
  1527. .dev_id = M50FW080,
  1528. .name = "ST M50FW080",
  1529. .uaddr = {
  1530. [0] = MTD_UADDR_UNNECESSARY, /* x8 */
  1531. },
  1532. .DevSize = SIZE_1MiB,
  1533. .CmdSet = P_ID_INTEL_EXT,
  1534. .NumEraseRegions= 1,
  1535. .regions = {
  1536. ERASEINFO(0x10000,16),
  1537. }
  1538. }, {
  1539. .mfr_id = MANUFACTURER_ST,
  1540. .dev_id = M50FW016,
  1541. .name = "ST M50FW016",
  1542. .uaddr = {
  1543. [0] = MTD_UADDR_UNNECESSARY, /* x8 */
  1544. },
  1545. .DevSize = SIZE_2MiB,
  1546. .CmdSet = P_ID_INTEL_EXT,
  1547. .NumEraseRegions= 1,
  1548. .regions = {
  1549. ERASEINFO(0x10000,32),
  1550. }
  1551. }, {
  1552. .mfr_id = MANUFACTURER_ST,
  1553. .dev_id = M50LPW080,
  1554. .name = "ST M50LPW080",
  1555. .uaddr = {
  1556. [0] = MTD_UADDR_UNNECESSARY, /* x8 */
  1557. },
  1558. .DevSize = SIZE_1MiB,
  1559. .CmdSet = P_ID_INTEL_EXT,
  1560. .NumEraseRegions= 1,
  1561. .regions = {
  1562. ERASEINFO(0x10000,16),
  1563. }
  1564. }, {
  1565. .mfr_id = MANUFACTURER_TOSHIBA,
  1566. .dev_id = TC58FVT160,
  1567. .name = "Toshiba TC58FVT160",
  1568. .uaddr = {
  1569. [0] = MTD_UADDR_0x0AAA_0x0555, /* x8 */
  1570. [1] = MTD_UADDR_0x0555_0x02AA /* x16 */
  1571. },
  1572. .DevSize = SIZE_2MiB,
  1573. .CmdSet = P_ID_AMD_STD,
  1574. .NumEraseRegions= 4,
  1575. .regions = {
  1576. ERASEINFO(0x10000,31),
  1577. ERASEINFO(0x08000,1),
  1578. ERASEINFO(0x02000,2),
  1579. ERASEINFO(0x04000,1)
  1580. }
  1581. }, {
  1582. .mfr_id = MANUFACTURER_TOSHIBA,
  1583. .dev_id = TC58FVB160,
  1584. .name = "Toshiba TC58FVB160",
  1585. .uaddr = {
  1586. [0] = MTD_UADDR_0x0AAA_0x0555, /* x8 */
  1587. [1] = MTD_UADDR_0x0555_0x02AA /* x16 */
  1588. },
  1589. .DevSize = SIZE_2MiB,
  1590. .CmdSet = P_ID_AMD_STD,
  1591. .NumEraseRegions= 4,
  1592. .regions = {
  1593. ERASEINFO(0x04000,1),
  1594. ERASEINFO(0x02000,2),
  1595. ERASEINFO(0x08000,1),
  1596. ERASEINFO(0x10000,31)
  1597. }
  1598. }, {
  1599. .mfr_id = MANUFACTURER_TOSHIBA,
  1600. .dev_id = TC58FVB321,
  1601. .name = "Toshiba TC58FVB321",
  1602. .uaddr = {
  1603. [0] = MTD_UADDR_0x0AAA_0x0555, /* x8 */
  1604. [1] = MTD_UADDR_0x0555_0x02AA /* x16 */
  1605. },
  1606. .DevSize = SIZE_4MiB,
  1607. .CmdSet = P_ID_AMD_STD,
  1608. .NumEraseRegions= 2,
  1609. .regions = {
  1610. ERASEINFO(0x02000,8),
  1611. ERASEINFO(0x10000,63)
  1612. }
  1613. }, {
  1614. .mfr_id = MANUFACTURER_TOSHIBA,
  1615. .dev_id = TC58FVT321,
  1616. .name = "Toshiba TC58FVT321",
  1617. .uaddr = {
  1618. [0] = MTD_UADDR_0x0AAA_0x0555, /* x8 */
  1619. [1] = MTD_UADDR_0x0555_0x02AA /* x16 */
  1620. },
  1621. .DevSize = SIZE_4MiB,
  1622. .CmdSet = P_ID_AMD_STD,
  1623. .NumEraseRegions= 2,
  1624. .regions = {
  1625. ERASEINFO(0x10000,63),
  1626. ERASEINFO(0x02000,8)
  1627. }
  1628. }, {
  1629. .mfr_id = MANUFACTURER_TOSHIBA,
  1630. .dev_id = TC58FVB641,
  1631. .name = "Toshiba TC58FVB641",
  1632. .uaddr = {
  1633. [0] = MTD_UADDR_0x0AAA_0x0555, /* x8 */
  1634. [1] = MTD_UADDR_0x0555_0x02AA, /* x16 */
  1635. },
  1636. .DevSize = SIZE_8MiB,
  1637. .CmdSet = P_ID_AMD_STD,
  1638. .NumEraseRegions= 2,
  1639. .regions = {
  1640. ERASEINFO(0x02000,8),
  1641. ERASEINFO(0x10000,127)
  1642. }
  1643. }, {
  1644. .mfr_id = MANUFACTURER_TOSHIBA,
  1645. .dev_id = TC58FVT641,
  1646. .name = "Toshiba TC58FVT641",
  1647. .uaddr = {
  1648. [0] = MTD_UADDR_0x0AAA_0x0555, /* x8 */
  1649. [1] = MTD_UADDR_0x0555_0x02AA, /* x16 */
  1650. },
  1651. .DevSize = SIZE_8MiB,
  1652. .CmdSet = P_ID_AMD_STD,
  1653. .NumEraseRegions= 2,
  1654. .regions = {
  1655. ERASEINFO(0x10000,127),
  1656. ERASEINFO(0x02000,8)
  1657. }
  1658. }, {
  1659. .mfr_id = MANUFACTURER_WINBOND,
  1660. .dev_id = W49V002A,
  1661. .name = "Winbond W49V002A",
  1662. .uaddr = {
  1663. [0] = MTD_UADDR_0x5555_0x2AAA /* x8 */
  1664. },
  1665. .DevSize = SIZE_256KiB,
  1666. .CmdSet = P_ID_AMD_STD,
  1667. .NumEraseRegions= 4,
  1668. .regions = {
  1669. ERASEINFO(0x10000, 3),
  1670. ERASEINFO(0x08000, 1),
  1671. ERASEINFO(0x02000, 2),
  1672. ERASEINFO(0x04000, 1),
  1673. }
  1674. }
  1675. };
  1676. static int cfi_jedec_setup(struct cfi_private *p_cfi, int index);
  1677. static int jedec_probe_chip(struct map_info *map, __u32 base,
  1678. unsigned long *chip_map, struct cfi_private *cfi);
  1679. static struct mtd_info *jedec_probe(struct map_info *map);
  1680. static inline u32 jedec_read_mfr(struct map_info *map, __u32 base,
  1681. struct cfi_private *cfi)
  1682. {
  1683. map_word result;
  1684. unsigned long mask;
  1685. u32 ofs = cfi_build_cmd_addr(0, cfi_interleave(cfi), cfi->device_type);
  1686. mask = (1 << (cfi->device_type * 8)) -1;
  1687. result = map_read(map, base + ofs);
  1688. return result.x[0] & mask;
  1689. }
  1690. static inline u32 jedec_read_id(struct map_info *map, __u32 base,
  1691. struct cfi_private *cfi)
  1692. {
  1693. map_word result;
  1694. unsigned long mask;
  1695. u32 ofs = cfi_build_cmd_addr(1, cfi_interleave(cfi), cfi->device_type);
  1696. mask = (1 << (cfi->device_type * 8)) -1;
  1697. result = map_read(map, base + ofs);
  1698. return result.x[0] & mask;
  1699. }
  1700. static inline void jedec_reset(u32 base, struct map_info *map,
  1701. struct cfi_private *cfi)
  1702. {
  1703. /* Reset */
  1704. /* after checking the datasheets for SST, MACRONIX and ATMEL
  1705. * (oh and incidentaly the jedec spec - 3.5.3.3) the reset
  1706. * sequence is *supposed* to be 0xaa at 0x5555, 0x55 at
  1707. * 0x2aaa, 0xF0 at 0x5555 this will not affect the AMD chips
  1708. * as they will ignore the writes and dont care what address
  1709. * the F0 is written to */
  1710. if(cfi->addr_unlock1) {
  1711. DEBUG( MTD_DEBUG_LEVEL3,
  1712. "reset unlock called %x %x \n",
  1713. cfi->addr_unlock1,cfi->addr_unlock2);
  1714. cfi_send_gen_cmd(0xaa, cfi->addr_unlock1, base, map, cfi, cfi->device_type, NULL);
  1715. cfi_send_gen_cmd(0x55, cfi->addr_unlock2, base, map, cfi, cfi->device_type, NULL);
  1716. }
  1717. cfi_send_gen_cmd(0xF0, cfi->addr_unlock1, base, map, cfi, cfi->device_type, NULL);
  1718. /* Some misdesigned intel chips do not respond for 0xF0 for a reset,
  1719. * so ensure we're in read mode. Send both the Intel and the AMD command
  1720. * for this. Intel uses 0xff for this, AMD uses 0xff for NOP, so
  1721. * this should be safe.
  1722. */
  1723. cfi_send_gen_cmd(0xFF, 0, base, map, cfi, cfi->device_type, NULL);
  1724. /* FIXME - should have reset delay before continuing */
  1725. }
  1726. static inline __u8 finfo_uaddr(const struct amd_flash_info *finfo, int device_type)
  1727. {
  1728. int uaddr_idx;
  1729. __u8 uaddr = MTD_UADDR_NOT_SUPPORTED;
  1730. switch ( device_type ) {
  1731. case CFI_DEVICETYPE_X8: uaddr_idx = 0; break;
  1732. case CFI_DEVICETYPE_X16: uaddr_idx = 1; break;
  1733. case CFI_DEVICETYPE_X32: uaddr_idx = 2; break;
  1734. default:
  1735. printk(KERN_NOTICE "MTD: %s(): unknown device_type %d\n",
  1736. __func__, device_type);
  1737. goto uaddr_done;
  1738. }
  1739. uaddr = finfo->uaddr[uaddr_idx];
  1740. if (uaddr != MTD_UADDR_NOT_SUPPORTED ) {
  1741. /* ASSERT("The unlock addresses for non-8-bit mode
  1742. are bollocks. We don't really need an array."); */
  1743. uaddr = finfo->uaddr[0];
  1744. }
  1745. uaddr_done:
  1746. return uaddr;
  1747. }
  1748. static int cfi_jedec_setup(struct cfi_private *p_cfi, int index)
  1749. {
  1750. int i,num_erase_regions;
  1751. __u8 uaddr;
  1752. printk("Found: %s\n",jedec_table[index].name);
  1753. num_erase_regions = jedec_table[index].NumEraseRegions;
  1754. p_cfi->cfiq = kmalloc(sizeof(struct cfi_ident) + num_erase_regions * 4, GFP_KERNEL);
  1755. if (!p_cfi->cfiq) {
  1756. //xx printk(KERN_WARNING "%s: kmalloc failed for CFI ident structure\n", map->name);
  1757. return 0;
  1758. }
  1759. memset(p_cfi->cfiq,0,sizeof(struct cfi_ident));
  1760. p_cfi->cfiq->P_ID = jedec_table[index].CmdSet;
  1761. p_cfi->cfiq->NumEraseRegions = jedec_table[index].NumEraseRegions;
  1762. p_cfi->cfiq->DevSize = jedec_table[index].DevSize;
  1763. p_cfi->cfi_mode = CFI_MODE_JEDEC;
  1764. for (i=0; i<num_erase_regions; i++){
  1765. p_cfi->cfiq->EraseRegionInfo[i] = jedec_table[index].regions[i];
  1766. }
  1767. p_cfi->cmdset_priv = NULL;
  1768. /* This may be redundant for some cases, but it doesn't hurt */
  1769. p_cfi->mfr = jedec_table[index].mfr_id;
  1770. p_cfi->id = jedec_table[index].dev_id;
  1771. uaddr = finfo_uaddr(&jedec_table[index], p_cfi->device_type);
  1772. if ( uaddr == MTD_UADDR_NOT_SUPPORTED ) {
  1773. kfree( p_cfi->cfiq );
  1774. return 0;
  1775. }
  1776. p_cfi->addr_unlock1 = unlock_addrs[uaddr].addr1;
  1777. p_cfi->addr_unlock2 = unlock_addrs[uaddr].addr2;
  1778. return 1; /* ok */
  1779. }
  1780. /*
  1781. * There is a BIG problem properly ID'ing the JEDEC devic and guaranteeing
  1782. * the mapped address, unlock addresses, and proper chip ID. This function
  1783. * attempts to minimize errors. It is doubtfull that this probe will ever
  1784. * be perfect - consequently there should be some module parameters that
  1785. * could be manually specified to force the chip info.
  1786. */
  1787. static inline int jedec_match( __u32 base,
  1788. struct map_info *map,
  1789. struct cfi_private *cfi,
  1790. const struct amd_flash_info *finfo )
  1791. {
  1792. int rc = 0; /* failure until all tests pass */
  1793. u32 mfr, id;
  1794. __u8 uaddr;
  1795. /*
  1796. * The IDs must match. For X16 and X32 devices operating in
  1797. * a lower width ( X8 or X16 ), the device ID's are usually just
  1798. * the lower byte(s) of the larger device ID for wider mode. If
  1799. * a part is found that doesn't fit this assumption (device id for
  1800. * smaller width mode is completely unrealated to full-width mode)
  1801. * then the jedec_table[] will have to be augmented with the IDs
  1802. * for different widths.
  1803. */
  1804. switch (cfi->device_type) {
  1805. case CFI_DEVICETYPE_X8:
  1806. mfr = (__u8)finfo->mfr_id;
  1807. id = (__u8)finfo->dev_id;
  1808. /* bjd: it seems that if we do this, we can end up
  1809. * detecting 16bit flashes as an 8bit device, even though
  1810. * there aren't.
  1811. */
  1812. if (finfo->dev_id > 0xff) {
  1813. DEBUG( MTD_DEBUG_LEVEL3, "%s(): ID is not 8bit\n",
  1814. __func__);
  1815. goto match_done;
  1816. }
  1817. break;
  1818. case CFI_DEVICETYPE_X16:
  1819. mfr = (__u16)finfo->mfr_id;
  1820. id = (__u16)finfo->dev_id;
  1821. break;
  1822. case CFI_DEVICETYPE_X32:
  1823. mfr = (__u16)finfo->mfr_id;
  1824. id = (__u32)finfo->dev_id;
  1825. break;
  1826. default:
  1827. printk(KERN_WARNING
  1828. "MTD %s(): Unsupported device type %d\n",
  1829. __func__, cfi->device_type);
  1830. goto match_done;
  1831. }
  1832. if ( cfi->mfr != mfr || cfi->id != id ) {
  1833. goto match_done;
  1834. }
  1835. /* the part size must fit in the memory window */
  1836. DEBUG( MTD_DEBUG_LEVEL3,
  1837. "MTD %s(): Check fit 0x%.8x + 0x%.8x = 0x%.8x\n",
  1838. __func__, base, 1 << finfo->DevSize, base + (1 << finfo->DevSize) );
  1839. if ( base + cfi_interleave(cfi) * ( 1 << finfo->DevSize ) > map->size ) {
  1840. DEBUG( MTD_DEBUG_LEVEL3,
  1841. "MTD %s(): 0x%.4x 0x%.4x %dKiB doesn't fit\n",
  1842. __func__, finfo->mfr_id, finfo->dev_id,
  1843. 1 << finfo->DevSize );
  1844. goto match_done;
  1845. }
  1846. uaddr = finfo_uaddr(finfo, cfi->device_type);
  1847. if ( uaddr == MTD_UADDR_NOT_SUPPORTED ) {
  1848. goto match_done;
  1849. }
  1850. DEBUG( MTD_DEBUG_LEVEL3, "MTD %s(): check unlock addrs 0x%.4x 0x%.4x\n",
  1851. __func__, cfi->addr_unlock1, cfi->addr_unlock2 );
  1852. if ( MTD_UADDR_UNNECESSARY != uaddr && MTD_UADDR_DONT_CARE != uaddr
  1853. && ( unlock_addrs[uaddr].addr1 != cfi->addr_unlock1 ||
  1854. unlock_addrs[uaddr].addr2 != cfi->addr_unlock2 ) ) {
  1855. DEBUG( MTD_DEBUG_LEVEL3,
  1856. "MTD %s(): 0x%.4x 0x%.4x did not match\n",
  1857. __func__,
  1858. unlock_addrs[uaddr].addr1,
  1859. unlock_addrs[uaddr].addr2);
  1860. goto match_done;
  1861. }
  1862. /*
  1863. * Make sure the ID's dissappear when the device is taken out of
  1864. * ID mode. The only time this should fail when it should succeed
  1865. * is when the ID's are written as data to the same
  1866. * addresses. For this rare and unfortunate case the chip
  1867. * cannot be probed correctly.
  1868. * FIXME - write a driver that takes all of the chip info as
  1869. * module parameters, doesn't probe but forces a load.
  1870. */
  1871. DEBUG( MTD_DEBUG_LEVEL3,
  1872. "MTD %s(): check ID's disappear when not in ID mode\n",
  1873. __func__ );
  1874. jedec_reset( base, map, cfi );
  1875. mfr = jedec_read_mfr( map, base, cfi );
  1876. id = jedec_read_id( map, base, cfi );
  1877. if ( mfr == cfi->mfr && id == cfi->id ) {
  1878. DEBUG( MTD_DEBUG_LEVEL3,
  1879. "MTD %s(): ID 0x%.2x:0x%.2x did not change after reset:\n"
  1880. "You might need to manually specify JEDEC parameters.\n",
  1881. __func__, cfi->mfr, cfi->id );
  1882. goto match_done;
  1883. }
  1884. /* all tests passed - mark as success */
  1885. rc = 1;
  1886. /*
  1887. * Put the device back in ID mode - only need to do this if we
  1888. * were truly frobbing a real device.
  1889. */
  1890. DEBUG( MTD_DEBUG_LEVEL3, "MTD %s(): return to ID mode\n", __func__ );
  1891. if(cfi->addr_unlock1) {
  1892. cfi_send_gen_cmd(0xaa, cfi->addr_unlock1, base, map, cfi, cfi->device_type, NULL);
  1893. cfi_send_gen_cmd(0x55, cfi->addr_unlock2, base, map, cfi, cfi->device_type, NULL);
  1894. }
  1895. cfi_send_gen_cmd(0x90, cfi->addr_unlock1, base, map, cfi, cfi->device_type, NULL);
  1896. /* FIXME - should have a delay before continuing */
  1897. match_done:
  1898. return rc;
  1899. }
  1900. static int jedec_probe_chip(struct map_info *map, __u32 base,
  1901. unsigned long *chip_map, struct cfi_private *cfi)
  1902. {
  1903. int i;
  1904. enum uaddr uaddr_idx = MTD_UADDR_NOT_SUPPORTED;
  1905. u32 probe_offset1, probe_offset2;
  1906. retry:
  1907. if (!cfi->numchips) {
  1908. uaddr_idx++;
  1909. if (MTD_UADDR_UNNECESSARY == uaddr_idx)
  1910. return 0;
  1911. cfi->addr_unlock1 = unlock_addrs[uaddr_idx].addr1;
  1912. cfi->addr_unlock2 = unlock_addrs[uaddr_idx].addr2;
  1913. }
  1914. /* Make certain we aren't probing past the end of map */
  1915. if (base >= map->size) {
  1916. printk(KERN_NOTICE
  1917. "Probe at base(0x%08x) past the end of the map(0x%08lx)\n",
  1918. base, map->size -1);
  1919. return 0;
  1920. }
  1921. /* Ensure the unlock addresses we try stay inside the map */
  1922. probe_offset1 = cfi_build_cmd_addr(
  1923. cfi->addr_unlock1,
  1924. cfi_interleave(cfi),
  1925. cfi->device_type);
  1926. probe_offset2 = cfi_build_cmd_addr(
  1927. cfi->addr_unlock1,
  1928. cfi_interleave(cfi),
  1929. cfi->device_type);
  1930. if ( ((base + probe_offset1 + map_bankwidth(map)) >= map->size) ||
  1931. ((base + probe_offset2 + map_bankwidth(map)) >= map->size))
  1932. {
  1933. goto retry;
  1934. }
  1935. /* Reset */
  1936. jedec_reset(base, map, cfi);
  1937. /* Autoselect Mode */
  1938. if(cfi->addr_unlock1) {
  1939. cfi_send_gen_cmd(0xaa, cfi->addr_unlock1, base, map, cfi, cfi->device_type, NULL);
  1940. cfi_send_gen_cmd(0x55, cfi->addr_unlock2, base, map, cfi, cfi->device_type, NULL);
  1941. }
  1942. cfi_send_gen_cmd(0x90, cfi->addr_unlock1, base, map, cfi, cfi->device_type, NULL);
  1943. /* FIXME - should have a delay before continuing */
  1944. if (!cfi->numchips) {
  1945. /* This is the first time we're called. Set up the CFI
  1946. stuff accordingly and return */
  1947. cfi->mfr = jedec_read_mfr(map, base, cfi);
  1948. cfi->id = jedec_read_id(map, base, cfi);
  1949. DEBUG(MTD_DEBUG_LEVEL3,
  1950. "Search for id:(%02x %02x) interleave(%d) type(%d)\n",
  1951. cfi->mfr, cfi->id, cfi_interleave(cfi), cfi->device_type);
  1952. for (i=0; i<sizeof(jedec_table)/sizeof(jedec_table[0]); i++) {
  1953. if ( jedec_match( base, map, cfi, &jedec_table[i] ) ) {
  1954. DEBUG( MTD_DEBUG_LEVEL3,
  1955. "MTD %s(): matched device 0x%x,0x%x unlock_addrs: 0x%.4x 0x%.4x\n",
  1956. __func__, cfi->mfr, cfi->id,
  1957. cfi->addr_unlock1, cfi->addr_unlock2 );
  1958. if (!cfi_jedec_setup(cfi, i))
  1959. return 0;
  1960. goto ok_out;
  1961. }
  1962. }
  1963. goto retry;
  1964. } else {
  1965. __u16 mfr;
  1966. __u16 id;
  1967. /* Make sure it is a chip of the same manufacturer and id */
  1968. mfr = jedec_read_mfr(map, base, cfi);
  1969. id = jedec_read_id(map, base, cfi);
  1970. if ((mfr != cfi->mfr) || (id != cfi->id)) {
  1971. printk(KERN_DEBUG "%s: Found different chip or no chip at all (mfr 0x%x, id 0x%x) at 0x%x\n",
  1972. map->name, mfr, id, base);
  1973. jedec_reset(base, map, cfi);
  1974. return 0;
  1975. }
  1976. }
  1977. /* Check each previous chip locations to see if it's an alias */
  1978. for (i=0; i < (base >> cfi->chipshift); i++) {
  1979. unsigned long start;
  1980. if(!test_bit(i, chip_map)) {
  1981. continue; /* Skip location; no valid chip at this address */
  1982. }
  1983. start = i << cfi->chipshift;
  1984. if (jedec_read_mfr(map, start, cfi) == cfi->mfr &&
  1985. jedec_read_id(map, start, cfi) == cfi->id) {
  1986. /* Eep. This chip also looks like it's in autoselect mode.
  1987. Is it an alias for the new one? */
  1988. jedec_reset(start, map, cfi);
  1989. /* If the device IDs go away, it's an alias */
  1990. if (jedec_read_mfr(map, base, cfi) != cfi->mfr ||
  1991. jedec_read_id(map, base, cfi) != cfi->id) {
  1992. printk(KERN_DEBUG "%s: Found an alias at 0x%x for the chip at 0x%lx\n",
  1993. map->name, base, start);
  1994. return 0;
  1995. }
  1996. /* Yes, it's actually got the device IDs as data. Most
  1997. * unfortunate. Stick the new chip in read mode
  1998. * too and if it's the same, assume it's an alias. */
  1999. /* FIXME: Use other modes to do a proper check */
  2000. jedec_reset(base, map, cfi);
  2001. if (jedec_read_mfr(map, base, cfi) == cfi->mfr &&
  2002. jedec_read_id(map, base, cfi) == cfi->id) {
  2003. printk(KERN_DEBUG "%s: Found an alias at 0x%x for the chip at 0x%lx\n",
  2004. map->name, base, start);
  2005. return 0;
  2006. }
  2007. }
  2008. }
  2009. /* OK, if we got to here, then none of the previous chips appear to
  2010. be aliases for the current one. */
  2011. set_bit((base >> cfi->chipshift), chip_map); /* Update chip map */
  2012. cfi->numchips++;
  2013. ok_out:
  2014. /* Put it back into Read Mode */
  2015. jedec_reset(base, map, cfi);
  2016. printk(KERN_INFO "%s: Found %d x%d devices at 0x%x in %d-bit bank\n",
  2017. map->name, cfi_interleave(cfi), cfi->device_type*8, base,
  2018. map->bankwidth*8);
  2019. return 1;
  2020. }
  2021. static struct chip_probe jedec_chip_probe = {
  2022. .name = "JEDEC",
  2023. .probe_chip = jedec_probe_chip
  2024. };
  2025. static struct mtd_info *jedec_probe(struct map_info *map)
  2026. {
  2027. /*
  2028. * Just use the generic probe stuff to call our CFI-specific
  2029. * chip_probe routine in all the possible permutations, etc.
  2030. */
  2031. return mtd_do_chip_probe(map, &jedec_chip_probe);
  2032. }
  2033. static struct mtd_chip_driver jedec_chipdrv = {
  2034. .probe = jedec_probe,
  2035. .name = "jedec_probe",
  2036. .module = THIS_MODULE
  2037. };
  2038. static int __init jedec_probe_init(void)
  2039. {
  2040. register_mtd_chip_driver(&jedec_chipdrv);
  2041. return 0;
  2042. }
  2043. static void __exit jedec_probe_exit(void)
  2044. {
  2045. unregister_mtd_chip_driver(&jedec_chipdrv);
  2046. }
  2047. module_init(jedec_probe_init);
  2048. module_exit(jedec_probe_exit);
  2049. MODULE_LICENSE("GPL");
  2050. MODULE_AUTHOR("Erwin Authried <eauth@softsys.co.at> et al.");
  2051. MODULE_DESCRIPTION("Probe code for JEDEC-compliant flash chips");