amd_flash.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:33k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * MTD map driver for AMD compatible flash chips (non-CFI)
  3.  *
  4.  * Author: Jonas Holmberg <jonas.holmberg@axis.com>
  5.  *
  6.  * $Id: amd_flash.c,v 1.17 2002/03/05 17:00:37 jonashg Exp $
  7.  *
  8.  * Copyright (c) 2001 Axis Communications AB
  9.  *
  10.  * This file is under GPL.
  11.  *
  12.  */
  13. #include <linux/module.h>
  14. #include <linux/types.h>
  15. #include <linux/kernel.h>
  16. #include <linux/sched.h>
  17. #include <linux/errno.h>
  18. #include <linux/slab.h>
  19. #include <linux/delay.h>
  20. #include <linux/interrupt.h>
  21. #include <linux/mtd/map.h>
  22. #include <linux/mtd/mtd.h>
  23. #include <linux/mtd/flashchip.h>
  24. /* There's no limit. It exists only to avoid realloc. */
  25. #define MAX_AMD_CHIPS 8
  26. #define DEVICE_TYPE_X8 (8 / 8)
  27. #define DEVICE_TYPE_X16 (16 / 8)
  28. #define DEVICE_TYPE_X32 (32 / 8)
  29. /* Addresses */
  30. #define ADDR_MANUFACTURER 0x0000
  31. #define ADDR_DEVICE_ID 0x0001
  32. #define ADDR_SECTOR_LOCK 0x0002
  33. #define ADDR_HANDSHAKE 0x0003
  34. #define ADDR_UNLOCK_1 0x0555
  35. #define ADDR_UNLOCK_2 0x02AA
  36. /* Commands */
  37. #define CMD_UNLOCK_DATA_1 0x00AA
  38. #define CMD_UNLOCK_DATA_2 0x0055
  39. #define CMD_MANUFACTURER_UNLOCK_DATA 0x0090
  40. #define CMD_UNLOCK_BYPASS_MODE 0x0020
  41. #define CMD_PROGRAM_UNLOCK_DATA 0x00A0
  42. #define CMD_RESET_DATA 0x00F0
  43. #define CMD_SECTOR_ERASE_UNLOCK_DATA 0x0080
  44. #define CMD_SECTOR_ERASE_UNLOCK_DATA_2 0x0030
  45. #define CMD_UNLOCK_SECTOR 0x0060
  46. /* Manufacturers */
  47. #define MANUFACTURER_AMD 0x0001
  48. #define MANUFACTURER_ATMEL 0x001F
  49. #define MANUFACTURER_FUJITSU 0x0004
  50. #define MANUFACTURER_ST 0x0020
  51. #define MANUFACTURER_SST 0x00BF
  52. #define MANUFACTURER_TOSHIBA 0x0098
  53. /* AMD */
  54. #define AM29F800BB 0x2258
  55. #define AM29F800BT 0x22D6
  56. #define AM29LV800BB 0x225B
  57. #define AM29LV800BT 0x22DA
  58. #define AM29LV160DT 0x22C4
  59. #define AM29LV160DB 0x2249
  60. #define AM29BDS323D     0x22D1
  61. #define AM29BDS643D 0x227E
  62. /* Atmel */
  63. #define AT49xV16x 0x00C0
  64. #define AT49xV16xT 0x00C2
  65. /* Fujitsu */
  66. #define MBM29LV160TE 0x22C4
  67. #define MBM29LV160BE 0x2249
  68. /* ST - www.st.com */
  69. #define M29W800T 0x00D7
  70. #define M29W160DT 0x22C4
  71. #define M29W160DB 0x2249
  72. /* SST */
  73. #define SST39LF800 0x2781
  74. #define SST39LF160 0x2782
  75. /* Toshiba */
  76. #define TC58FVT160 0x00C2
  77. #define TC58FVB160 0x0043
  78. #define D6_MASK 0x40
  79. struct amd_flash_private {
  80. int device_type;
  81. int interleave;
  82. int numchips;
  83. unsigned long chipshift;
  84. // const char *im_name;
  85. struct flchip chips[0];
  86. };
  87. struct amd_flash_info {
  88. const __u16 mfr_id;
  89. const __u16 dev_id;
  90. const char *name;
  91. const u_long size;
  92. const int numeraseregions;
  93. const struct mtd_erase_region_info regions[4];
  94. };
  95. static int amd_flash_read(struct mtd_info *, loff_t, size_t, size_t *,
  96.   u_char *);
  97. static int amd_flash_write(struct mtd_info *, loff_t, size_t, size_t *,
  98.    const u_char *);
  99. static int amd_flash_erase(struct mtd_info *, struct erase_info *);
  100. static void amd_flash_sync(struct mtd_info *);
  101. static int amd_flash_suspend(struct mtd_info *);
  102. static void amd_flash_resume(struct mtd_info *);
  103. static void amd_flash_destroy(struct mtd_info *);
  104. static struct mtd_info *amd_flash_probe(struct map_info *map);
  105. static struct mtd_chip_driver amd_flash_chipdrv = {
  106. probe: amd_flash_probe,
  107. destroy: amd_flash_destroy,
  108. name: "amd_flash",
  109. module: THIS_MODULE
  110. };
  111. static const char im_name[] = "amd_flash";
  112. static inline __u32 wide_read(struct map_info *map, __u32 addr)
  113. {
  114. if (map->buswidth == 1) {
  115. return map->read8(map, addr);
  116. } else if (map->buswidth == 2) {
  117. return map->read16(map, addr);
  118. } else if (map->buswidth == 4) {
  119. return map->read32(map, addr);
  120.         }
  121. return 0;
  122. }
  123. static inline void wide_write(struct map_info *map, __u32 val, __u32 addr)
  124. {
  125. if (map->buswidth == 1) {
  126. map->write8(map, val, addr);
  127. } else if (map->buswidth == 2) {
  128. map->write16(map, val, addr);
  129. } else if (map->buswidth == 4) {
  130. map->write32(map, val, addr);
  131. }
  132. }
  133. static inline __u32 make_cmd(struct map_info *map, __u32 cmd)
  134. {
  135. const struct amd_flash_private *private = map->fldrv_priv;
  136. if ((private->interleave == 2) &&
  137.     (private->device_type == DEVICE_TYPE_X16)) {
  138. cmd |= (cmd << 16);
  139. }
  140. return cmd;
  141. }
  142. static inline void send_unlock(struct map_info *map, unsigned long base)
  143. {
  144. wide_write(map, (CMD_UNLOCK_DATA_1 << 16) | CMD_UNLOCK_DATA_1,
  145.    base + (map->buswidth * ADDR_UNLOCK_1));
  146. wide_write(map, (CMD_UNLOCK_DATA_2 << 16) | CMD_UNLOCK_DATA_2,
  147.    base + (map->buswidth * ADDR_UNLOCK_2));
  148. }
  149. static inline void send_cmd(struct map_info *map, unsigned long base, __u32 cmd)
  150. {
  151. send_unlock(map, base);
  152. wide_write(map, make_cmd(map, cmd),
  153.    base + (map->buswidth * ADDR_UNLOCK_1));
  154. }
  155. static inline void send_cmd_to_addr(struct map_info *map, unsigned long base,
  156.     __u32 cmd, unsigned long addr)
  157. {
  158. send_unlock(map, base);
  159. wide_write(map, make_cmd(map, cmd), addr);
  160. }
  161. static inline int flash_is_busy(struct map_info *map, unsigned long addr,
  162. int interleave)
  163. {
  164. if ((interleave == 2) && (map->buswidth == 4)) {
  165. __u32 read1, read2;
  166. read1 = wide_read(map, addr);
  167. read2 = wide_read(map, addr);
  168. return (((read1 >> 16) & D6_MASK) !=
  169. ((read2 >> 16) & D6_MASK)) ||
  170.        (((read1 & 0xffff) & D6_MASK) !=
  171. ((read2 & 0xffff) & D6_MASK));
  172. }
  173. return ((wide_read(map, addr) & D6_MASK) !=
  174. (wide_read(map, addr) & D6_MASK));
  175. }
  176. static inline void unlock_sector(struct map_info *map, unsigned long sect_addr,
  177.  int unlock)
  178. {
  179. /* Sector lock address. A6 = 1 for unlock, A6 = 0 for lock */
  180. int SLA = unlock ?
  181. (sect_addr |  (0x40 * map->buswidth)) :
  182. (sect_addr & ~(0x40 * map->buswidth)) ;
  183. __u32 cmd = make_cmd(map, CMD_UNLOCK_SECTOR);
  184. wide_write(map, make_cmd(map, CMD_RESET_DATA), 0);
  185. wide_write(map, cmd, SLA); /* 1st cycle: write cmd to any address */
  186. wide_write(map, cmd, SLA); /* 2nd cycle: write cmd to any address */
  187. wide_write(map, cmd, SLA); /* 3rd cycle: write cmd to SLA */
  188. }
  189. static inline int is_sector_locked(struct map_info *map,
  190.    unsigned long sect_addr)
  191. {
  192. int status;
  193. wide_write(map, CMD_RESET_DATA, 0);
  194. send_cmd(map, sect_addr, CMD_MANUFACTURER_UNLOCK_DATA);
  195. /* status is 0x0000 for unlocked and 0x0001 for locked */
  196. status = wide_read(map, sect_addr + (map->buswidth * ADDR_SECTOR_LOCK));
  197. wide_write(map, CMD_RESET_DATA, 0);
  198. return status;
  199. }
  200. static int amd_flash_do_unlock(struct mtd_info *mtd, loff_t ofs, size_t len,
  201.        int is_unlock)
  202. {
  203. struct map_info *map;
  204. struct mtd_erase_region_info *merip;
  205. int eraseoffset, erasesize, eraseblocks;
  206. int i;
  207. int retval = 0;
  208. int lock_status;
  209.       
  210. map = mtd->priv;
  211. /* Pass the whole chip through sector by sector and check for each
  212.    sector if the sector and the given interval overlap */
  213. for(i = 0; i < mtd->numeraseregions; i++) {
  214. merip = &mtd->eraseregions[i];
  215. eraseoffset = merip->offset;
  216. erasesize = merip->erasesize;
  217. eraseblocks = merip->numblocks;
  218. if (ofs > eraseoffset + erasesize)
  219. continue;
  220. while (eraseblocks > 0) {
  221. if (ofs < eraseoffset + erasesize && ofs + len > eraseoffset) {
  222. unlock_sector(map, eraseoffset, is_unlock);
  223. lock_status = is_sector_locked(map, eraseoffset);
  224. if (is_unlock && lock_status) {
  225. printk("Cannot unlock sector at address %x length %xxn",
  226.        eraseoffset, merip->erasesize);
  227. retval = -1;
  228. } else if (!is_unlock && !lock_status) {
  229. printk("Cannot lock sector at address %x length %xn",
  230.        eraseoffset, merip->erasesize);
  231. retval = -1;
  232. }
  233. }
  234. eraseoffset += erasesize;
  235. eraseblocks --;
  236. }
  237. }
  238. return retval;
  239. }
  240. static int amd_flash_unlock(struct mtd_info *mtd, loff_t ofs, size_t len)
  241. {
  242. return amd_flash_do_unlock(mtd, ofs, len, 1);
  243. }
  244. static int amd_flash_lock(struct mtd_info *mtd, loff_t ofs, size_t len)
  245. {
  246. return amd_flash_do_unlock(mtd, ofs, len, 0);
  247. }
  248. /*
  249.  * Reads JEDEC manufacturer ID and device ID and returns the index of the first
  250.  * matching table entry (-1 if not found or alias for already found chip).
  251.  */ 
  252. static int probe_new_chip(struct mtd_info *mtd, __u32 base,
  253.   struct flchip *chips,
  254.   struct amd_flash_private *private,
  255.   const struct amd_flash_info *table, int table_size)
  256. {
  257. __u32 mfr_id;
  258. __u32 dev_id;
  259. struct map_info *map = mtd->priv;
  260. struct amd_flash_private temp;
  261. int i;
  262. temp.device_type = DEVICE_TYPE_X16; // Assume X16 (FIXME)
  263. temp.interleave = 2;
  264. map->fldrv_priv = &temp;
  265. /* Enter autoselect mode. */
  266. send_cmd(map, base, CMD_RESET_DATA);
  267. send_cmd(map, base, CMD_MANUFACTURER_UNLOCK_DATA);
  268. mfr_id = wide_read(map, base + (map->buswidth * ADDR_MANUFACTURER));
  269. dev_id = wide_read(map, base + (map->buswidth * ADDR_DEVICE_ID));
  270. if ((map->buswidth == 4) && ((mfr_id >> 16) == (mfr_id & 0xffff)) &&
  271.     ((dev_id >> 16) == (dev_id & 0xffff))) {
  272. mfr_id &= 0xffff;
  273. dev_id &= 0xffff;
  274. } else {
  275. temp.interleave = 1;
  276. }
  277. for (i = 0; i < table_size; i++) {
  278. if ((mfr_id == table[i].mfr_id) &&
  279.     (dev_id == table[i].dev_id)) {
  280. if (chips) {
  281. int j;
  282. /* Is this an alias for an already found chip?
  283.  * In that case that chip should be in
  284.  * autoselect mode now.
  285.  */
  286. for (j = 0; j < private->numchips; j++) {
  287. __u32 mfr_id_other;
  288. __u32 dev_id_other;
  289. mfr_id_other =
  290. wide_read(map, chips[j].start +
  291.        (map->buswidth *
  292. ADDR_MANUFACTURER
  293.        ));
  294. dev_id_other =
  295. wide_read(map, chips[j].start +
  296.             (map->buswidth *
  297.         ADDR_DEVICE_ID));
  298. if (temp.interleave == 2) {
  299. mfr_id_other &= 0xffff;
  300. dev_id_other &= 0xffff;
  301. }
  302. if ((mfr_id_other == mfr_id) &&
  303.     (dev_id_other == dev_id)) {
  304. /* Exit autoselect mode. */
  305. send_cmd(map, base,
  306.  CMD_RESET_DATA);
  307. return -1;
  308. }
  309. }
  310. if (private->numchips == MAX_AMD_CHIPS) {
  311. printk(KERN_WARNING
  312.        "%s: Too many flash chips "
  313.        "detected. Increase "
  314.        "MAX_AMD_CHIPS from %d.n",
  315.        map->name, MAX_AMD_CHIPS);
  316. return -1;
  317. }
  318. chips[private->numchips].start = base;
  319. chips[private->numchips].state = FL_READY;
  320. chips[private->numchips].mutex =
  321. &chips[private->numchips]._spinlock;
  322. private->numchips++;
  323. }
  324. printk("%s: Found %d x %ldMiB %s at 0x%xn", map->name,
  325.        temp.interleave, (table[i].size)/(1024*1024),
  326.        table[i].name, base);
  327. mtd->size += table[i].size * temp.interleave;
  328. mtd->numeraseregions += table[i].numeraseregions;
  329. break;
  330. }
  331. }
  332. /* Exit autoselect mode. */
  333. send_cmd(map, base, CMD_RESET_DATA);
  334. if (i == table_size) {
  335. printk(KERN_DEBUG "%s: unknown flash device at 0x%x, "
  336.        "mfr id 0x%x, dev id 0x%xn", map->name,
  337.        base, mfr_id, dev_id);
  338. map->fldrv_priv = NULL;
  339. return -1;
  340. }
  341. private->device_type = temp.device_type;
  342. private->interleave = temp.interleave;
  343. return i;
  344. }
  345. static struct mtd_info *amd_flash_probe(struct map_info *map)
  346. {
  347. /* Keep this table on the stack so that it gets deallocated after the
  348.  * probe is done.
  349.  */
  350. const struct amd_flash_info table[] = {
  351. {
  352. mfr_id: MANUFACTURER_AMD,
  353. dev_id: AM29LV160DT,
  354. name: "AMD AM29LV160DT",
  355. size: 0x00200000,
  356. numeraseregions: 4,
  357. regions: {
  358. { offset: 0x000000, erasesize: 0x10000, numblocks: 31 },
  359. { offset: 0x1F0000, erasesize: 0x08000, numblocks:  1 },
  360. { offset: 0x1F8000, erasesize: 0x02000, numblocks:  2 },
  361. { offset: 0x1FC000, erasesize: 0x04000, numblocks:  1 }
  362. }
  363. }, {
  364. mfr_id: MANUFACTURER_AMD,
  365. dev_id: AM29LV160DB,
  366. name: "AMD AM29LV160DB",
  367. size: 0x00200000,
  368. numeraseregions: 4,
  369. regions: {
  370. { offset: 0x000000, erasesize: 0x04000, numblocks:  1 },
  371. { offset: 0x004000, erasesize: 0x02000, numblocks:  2 },
  372. { offset: 0x008000, erasesize: 0x08000, numblocks:  1 },
  373. { offset: 0x010000, erasesize: 0x10000, numblocks: 31 }
  374. }
  375. }, {
  376. mfr_id: MANUFACTURER_TOSHIBA,
  377. dev_id: TC58FVT160,
  378. name: "Toshiba TC58FVT160",
  379. size: 0x00200000,
  380. numeraseregions: 4,
  381. regions: {
  382. { offset: 0x000000, erasesize: 0x10000, numblocks: 31 },
  383. { offset: 0x1F0000, erasesize: 0x08000, numblocks:  1 },
  384. { offset: 0x1F8000, erasesize: 0x02000, numblocks:  2 },
  385. { offset: 0x1FC000, erasesize: 0x04000, numblocks:  1 }
  386. }
  387. }, {
  388. mfr_id: MANUFACTURER_FUJITSU,
  389. dev_id: MBM29LV160TE,
  390. name: "Fujitsu MBM29LV160TE",
  391. size: 0x00200000,
  392. numeraseregions: 4,
  393. regions: {
  394. { offset: 0x000000, erasesize: 0x10000, numblocks: 31 },
  395. { offset: 0x1F0000, erasesize: 0x08000, numblocks:  1 },
  396. { offset: 0x1F8000, erasesize: 0x02000, numblocks:  2 },
  397. { offset: 0x1FC000, erasesize: 0x04000, numblocks:  1 }
  398. }
  399. }, {
  400. mfr_id: MANUFACTURER_TOSHIBA,
  401. dev_id: TC58FVB160,
  402. name: "Toshiba TC58FVB160",
  403. size: 0x00200000,
  404. numeraseregions: 4,
  405. regions: {
  406. { offset: 0x000000, erasesize: 0x04000, numblocks:  1 },
  407. { offset: 0x004000, erasesize: 0x02000, numblocks:  2 },
  408. { offset: 0x008000, erasesize: 0x08000, numblocks:  1 },
  409. { offset: 0x010000, erasesize: 0x10000, numblocks: 31 }
  410. }
  411. }, {
  412. mfr_id: MANUFACTURER_FUJITSU,
  413. dev_id: MBM29LV160BE,
  414. name: "Fujitsu MBM29LV160BE",
  415. size: 0x00200000,
  416. numeraseregions: 4,
  417. regions: {
  418. { offset: 0x000000, erasesize: 0x04000, numblocks:  1 },
  419. { offset: 0x004000, erasesize: 0x02000, numblocks:  2 },
  420. { offset: 0x008000, erasesize: 0x08000, numblocks:  1 },
  421. { offset: 0x010000, erasesize: 0x10000, numblocks: 31 }
  422. }
  423. }, {
  424. mfr_id: MANUFACTURER_AMD,
  425. dev_id: AM29LV800BB,
  426. name: "AMD AM29LV800BB",
  427. size: 0x00100000,
  428. numeraseregions: 4,
  429. regions: {
  430. { offset: 0x000000, erasesize: 0x04000, numblocks:  1 },
  431. { offset: 0x004000, erasesize: 0x02000, numblocks:  2 },
  432. { offset: 0x008000, erasesize: 0x08000, numblocks:  1 },
  433. { offset: 0x010000, erasesize: 0x10000, numblocks: 15 }
  434. }
  435. }, {
  436. mfr_id: MANUFACTURER_AMD,
  437. dev_id: AM29F800BB,
  438. name: "AMD AM29F800BB",
  439. size: 0x00100000,
  440. numeraseregions: 4,
  441. regions: {
  442. { offset: 0x000000, erasesize: 0x04000, numblocks:  1 },
  443. { offset: 0x004000, erasesize: 0x02000, numblocks:  2 },
  444. { offset: 0x008000, erasesize: 0x08000, numblocks:  1 },
  445. { offset: 0x010000, erasesize: 0x10000, numblocks: 15 }
  446. }
  447. }, {
  448. mfr_id: MANUFACTURER_AMD,
  449. dev_id: AM29LV800BT,
  450. name: "AMD AM29LV800BT",
  451. size: 0x00100000,
  452. numeraseregions: 4,
  453. regions: {
  454. { offset: 0x000000, erasesize: 0x10000, numblocks: 15 },
  455. { offset: 0x0F0000, erasesize: 0x08000, numblocks:  1 },
  456. { offset: 0x0F8000, erasesize: 0x02000, numblocks:  2 },
  457. { offset: 0x0FC000, erasesize: 0x04000, numblocks:  1 }
  458. }
  459. }, {
  460. mfr_id: MANUFACTURER_AMD,
  461. dev_id: AM29F800BT,
  462. name: "AMD AM29F800BT",
  463. size: 0x00100000,
  464. numeraseregions: 4,
  465. regions: {
  466. { offset: 0x000000, erasesize: 0x10000, numblocks: 15 },
  467. { offset: 0x0F0000, erasesize: 0x08000, numblocks:  1 },
  468. { offset: 0x0F8000, erasesize: 0x02000, numblocks:  2 },
  469. { offset: 0x0FC000, erasesize: 0x04000, numblocks:  1 }
  470. }
  471. }, {
  472. mfr_id: MANUFACTURER_AMD,
  473. dev_id: AM29LV800BB,
  474. name: "AMD AM29LV800BB",
  475. size: 0x00100000,
  476. numeraseregions: 4,
  477. regions: {
  478. { offset: 0x000000, erasesize: 0x10000, numblocks: 15 },
  479. { offset: 0x0F0000, erasesize: 0x08000, numblocks:  1 },
  480. { offset: 0x0F8000, erasesize: 0x02000, numblocks:  2 },
  481. { offset: 0x0FC000, erasesize: 0x04000, numblocks:  1 }
  482. }
  483. }, {
  484. mfr_id: MANUFACTURER_ST,
  485. dev_id: M29W800T,
  486. name: "ST M29W800T",
  487. size: 0x00100000,
  488. numeraseregions: 4,
  489. regions: {
  490. { offset: 0x000000, erasesize: 0x10000, numblocks: 15 },
  491. { offset: 0x0F0000, erasesize: 0x08000, numblocks:  1 },
  492. { offset: 0x0F8000, erasesize: 0x02000, numblocks:  2 },
  493. { offset: 0x0FC000, erasesize: 0x04000, numblocks:  1 }
  494. }
  495. }, {
  496. mfr_id: MANUFACTURER_ST,
  497. dev_id: M29W160DT,
  498. name: "ST M29W160DT",
  499. size: 0x00200000,
  500. numeraseregions: 4,
  501. regions: {
  502. { offset: 0x000000, erasesize: 0x10000, numblocks: 31 },
  503. { offset: 0x1F0000, erasesize: 0x08000, numblocks:  1 },
  504. { offset: 0x1F8000, erasesize: 0x02000, numblocks:  2 },
  505. { offset: 0x1FC000, erasesize: 0x04000, numblocks:  1 }
  506. }
  507. }, {
  508. mfr_id: MANUFACTURER_ST,
  509. dev_id: M29W160DB,
  510. name: "ST M29W160DB",
  511. size: 0x00200000,
  512. numeraseregions: 4,
  513. regions: {
  514. { offset: 0x000000, erasesize: 0x04000, numblocks:  1 },
  515. { offset: 0x004000, erasesize: 0x02000, numblocks:  2 },
  516. { offset: 0x008000, erasesize: 0x08000, numblocks:  1 },
  517. { offset: 0x010000, erasesize: 0x10000, numblocks: 31 }
  518. }
  519. }, {
  520. mfr_id: MANUFACTURER_AMD,
  521. dev_id: AM29BDS323D,
  522. name: "AMD AM29BDS323D",
  523. size: 0x00400000,
  524. numeraseregions: 3,
  525. regions: {
  526. { offset: 0x000000, erasesize: 0x10000, numblocks: 48 },
  527. { offset: 0x300000, erasesize: 0x10000, numblocks: 15 },
  528. { offset: 0x3f0000, erasesize: 0x02000, numblocks:  8 },
  529. }
  530. }, {
  531. mfr_id: MANUFACTURER_AMD,
  532. dev_id: AM29BDS643D,
  533. name: "AMD AM29BDS643D",
  534. size: 0x00800000,
  535. numeraseregions: 3,
  536. regions: {
  537. { offset: 0x000000, erasesize: 0x10000, numblocks: 96 },
  538. { offset: 0x600000, erasesize: 0x10000, numblocks: 31 },
  539. { offset: 0x7f0000, erasesize: 0x02000, numblocks:  8 },
  540. }
  541. }, {
  542. mfr_id: MANUFACTURER_ATMEL,
  543. dev_id: AT49xV16x,
  544. name: "Atmel AT49xV16x",
  545. size: 0x00200000,
  546. numeraseregions: 2,
  547. regions: {
  548. { offset: 0x000000, erasesize: 0x02000, numblocks:  8 },
  549. { offset: 0x010000, erasesize: 0x10000, numblocks: 31 }
  550. }
  551. }, {
  552. mfr_id: MANUFACTURER_ATMEL,
  553. dev_id: AT49xV16xT,
  554. name: "Atmel AT49xV16xT",
  555. size: 0x00200000,
  556. numeraseregions: 2,
  557. regions: {
  558. { offset: 0x000000, erasesize: 0x10000, numblocks: 31 },
  559. { offset: 0x1F0000, erasesize: 0x02000, numblocks:  8 }
  560. }
  561. };
  562. struct mtd_info *mtd;
  563. struct flchip chips[MAX_AMD_CHIPS];
  564. int table_pos[MAX_AMD_CHIPS];
  565. struct amd_flash_private temp;
  566. struct amd_flash_private *private;
  567. u_long size;
  568. unsigned long base;
  569. int i;
  570. int reg_idx;
  571. int offset;
  572. mtd = (struct mtd_info*)kmalloc(sizeof(*mtd), GFP_KERNEL);
  573. if (!mtd) {
  574. printk(KERN_WARNING
  575.        "%s: kmalloc failed for info structuren", map->name);
  576. return NULL;
  577. }
  578. memset(mtd, 0, sizeof(*mtd));
  579. mtd->priv = map;
  580. memset(&temp, 0, sizeof(temp));
  581. printk("%s: Probing for AMD compatible flash...n", map->name);
  582. if ((table_pos[0] = probe_new_chip(mtd, 0, NULL, &temp, table,
  583.    sizeof(table)/sizeof(table[0])))
  584.     == -1) {
  585. printk(KERN_WARNING
  586.        "%s: Found no AMD compatible device at location zeron",
  587.        map->name);
  588. kfree(mtd);
  589. return NULL;
  590. }
  591. chips[0].start = 0;
  592. chips[0].state = FL_READY;
  593. chips[0].mutex = &chips[0]._spinlock;
  594. temp.numchips = 1;
  595. for (size = mtd->size; size > 1; size >>= 1) {
  596. temp.chipshift++;
  597. }
  598. switch (temp.interleave) {
  599. case 2:
  600. temp.chipshift += 1;
  601. break;
  602. case 4:
  603. temp.chipshift += 2;
  604. break;
  605. }
  606. /* Find out if there are any more chips in the map. */
  607. for (base = (1 << temp.chipshift);
  608.      base < map->size;
  609.      base += (1 << temp.chipshift)) {
  610.       int numchips = temp.numchips;
  611. table_pos[numchips] = probe_new_chip(mtd, base, chips,
  612. &temp, table, sizeof(table)/sizeof(table[0]));
  613. }
  614. mtd->eraseregions = kmalloc(sizeof(struct mtd_erase_region_info) *
  615.     mtd->numeraseregions, GFP_KERNEL);
  616. if (!mtd->eraseregions) { 
  617. printk(KERN_WARNING "%s: Failed to allocate "
  618.        "memory for MTD erase region infon", map->name);
  619. kfree(mtd);
  620. map->fldrv_priv = NULL;
  621. return 0;
  622. }
  623. reg_idx = 0;
  624. offset = 0;
  625. for (i = 0; i < temp.numchips; i++) {
  626. int dev_size;
  627. int j;
  628. dev_size = 0;
  629. for (j = 0; j < table[table_pos[i]].numeraseregions; j++) {
  630. mtd->eraseregions[reg_idx].offset = offset +
  631. (table[table_pos[i]].regions[j].offset *
  632.  temp.interleave);
  633. mtd->eraseregions[reg_idx].erasesize =
  634. table[table_pos[i]].regions[j].erasesize *
  635. temp.interleave;
  636. mtd->eraseregions[reg_idx].numblocks =
  637. table[table_pos[i]].regions[j].numblocks;
  638. if (mtd->erasesize <
  639.     mtd->eraseregions[reg_idx].erasesize) {
  640. mtd->erasesize =
  641. mtd->eraseregions[reg_idx].erasesize;
  642. }
  643. dev_size += mtd->eraseregions[reg_idx].erasesize *
  644.     mtd->eraseregions[reg_idx].numblocks;
  645. reg_idx++;
  646. }
  647. offset += dev_size;
  648. }
  649. mtd->type = MTD_NORFLASH;
  650. mtd->flags = MTD_CAP_NORFLASH;
  651. mtd->name = map->name;
  652. mtd->erase = amd_flash_erase;
  653. mtd->read = amd_flash_read;
  654. mtd->write = amd_flash_write;
  655. mtd->sync = amd_flash_sync;
  656. mtd->suspend = amd_flash_suspend;
  657. mtd->resume = amd_flash_resume;
  658. mtd->lock = amd_flash_lock;
  659. mtd->unlock = amd_flash_unlock;
  660. private = kmalloc(sizeof(*private) + (sizeof(struct flchip) *
  661.       temp.numchips), GFP_KERNEL);
  662. if (!private) {
  663. printk(KERN_WARNING
  664.        "%s: kmalloc failed for private structuren", map->name);
  665. kfree(mtd);
  666. map->fldrv_priv = NULL;
  667. return NULL;
  668. }
  669. memcpy(private, &temp, sizeof(temp));
  670. memcpy(private->chips, chips,
  671.        sizeof(struct flchip) * private->numchips);
  672. for (i = 0; i < private->numchips; i++) {
  673. init_waitqueue_head(&private->chips[i].wq);
  674. spin_lock_init(&private->chips[i]._spinlock);
  675. }
  676. map->fldrv_priv = private;
  677. map->fldrv = &amd_flash_chipdrv;
  678. MOD_INC_USE_COUNT;
  679. return mtd;
  680. }
  681. static inline int read_one_chip(struct map_info *map, struct flchip *chip,
  682.        loff_t adr, size_t len, u_char *buf)
  683. {
  684. DECLARE_WAITQUEUE(wait, current);
  685. unsigned long timeo = jiffies + HZ;
  686. retry:
  687. spin_lock_bh(chip->mutex);
  688. if (chip->state != FL_READY){
  689. printk(KERN_INFO "%s: waiting for chip to read, state = %dn",
  690.        map->name, chip->state);
  691. set_current_state(TASK_UNINTERRUPTIBLE);
  692. add_wait_queue(&chip->wq, &wait);
  693.                 
  694. spin_unlock_bh(chip->mutex);
  695. schedule();
  696. remove_wait_queue(&chip->wq, &wait);
  697. if(signal_pending(current)) {
  698. return -EINTR;
  699. }
  700. timeo = jiffies + HZ;
  701. goto retry;
  702. }
  703. adr += chip->start;
  704. chip->state = FL_READY;
  705. map->copy_from(map, buf, adr, len);
  706. wake_up(&chip->wq);
  707. spin_unlock_bh(chip->mutex);
  708. return 0;
  709. }
  710. static int amd_flash_read(struct mtd_info *mtd, loff_t from, size_t len,
  711.   size_t *retlen, u_char *buf)
  712. {
  713. struct map_info *map = mtd->priv;
  714. struct amd_flash_private *private = map->fldrv_priv;
  715. unsigned long ofs;
  716. int chipnum;
  717. int ret = 0;
  718. if ((from + len) > mtd->size) {
  719. printk(KERN_WARNING "%s: read request past end of device "
  720.        "(0x%lx)n", map->name, (unsigned long)from + len);
  721. return -EINVAL;
  722. }
  723. /* Offset within the first chip that the first read should start. */
  724. chipnum = (from >> private->chipshift);
  725. ofs = from - (chipnum <<  private->chipshift);
  726. *retlen = 0;
  727. while (len) {
  728. unsigned long this_len;
  729. if (chipnum >= private->numchips) {
  730. break;
  731. }
  732. if ((len + ofs - 1) >> private->chipshift) {
  733. this_len = (1 << private->chipshift) - ofs;
  734. } else {
  735. this_len = len;
  736. }
  737. ret = read_one_chip(map, &private->chips[chipnum], ofs,
  738.     this_len, buf);
  739. if (ret) {
  740. break;
  741. }
  742. *retlen += this_len;
  743. len -= this_len;
  744. buf += this_len;
  745. ofs = 0;
  746. chipnum++;
  747. }
  748. return ret;
  749. }
  750. static int write_one_word(struct map_info *map, struct flchip *chip,
  751.   unsigned long adr, __u32 datum)
  752. {
  753. unsigned long timeo = jiffies + HZ;
  754. struct amd_flash_private *private = map->fldrv_priv;
  755. DECLARE_WAITQUEUE(wait, current);
  756. int ret = 0;
  757. int times_left;
  758. retry:
  759. spin_lock_bh(chip->mutex);
  760. if (chip->state != FL_READY){
  761. printk("%s: waiting for chip to write, state = %dn",
  762.        map->name, chip->state);
  763. set_current_state(TASK_UNINTERRUPTIBLE);
  764. add_wait_queue(&chip->wq, &wait);
  765.                 
  766. spin_unlock_bh(chip->mutex);
  767. schedule();
  768. remove_wait_queue(&chip->wq, &wait);
  769. printk(KERN_INFO "%s: woke up to writen", map->name);
  770. if(signal_pending(current))
  771. return -EINTR;
  772. timeo = jiffies + HZ;
  773. goto retry;
  774. }
  775. chip->state = FL_WRITING;
  776. adr += chip->start;
  777. ENABLE_VPP(map);
  778. send_cmd(map, chip->start, CMD_PROGRAM_UNLOCK_DATA);
  779. wide_write(map, datum, adr);
  780. times_left = 500000;
  781. while (times_left-- && flash_is_busy(map, adr, private->interleave)) { 
  782. if (current->need_resched) {
  783. spin_unlock_bh(chip->mutex);
  784. schedule();
  785. spin_lock_bh(chip->mutex);
  786. }
  787. }
  788. if (!times_left) {
  789. printk(KERN_WARNING "%s: write to 0x%lx timed out!n",
  790.        map->name, adr);
  791. ret = -EIO;
  792. } else {
  793. __u32 verify;
  794. if ((verify = wide_read(map, adr)) != datum) {
  795. printk(KERN_WARNING "%s: write to 0x%lx failed. "
  796.        "datum = %x, verify = %xn",
  797.        map->name, adr, datum, verify);
  798. ret = -EIO;
  799. }
  800. }
  801. DISABLE_VPP(map);
  802. chip->state = FL_READY;
  803. wake_up(&chip->wq);
  804. spin_unlock_bh(chip->mutex);
  805. return ret;
  806. }
  807. static int amd_flash_write(struct mtd_info *mtd, loff_t to , size_t len,
  808.    size_t *retlen, const u_char *buf)
  809. {
  810. struct map_info *map = mtd->priv;
  811. struct amd_flash_private *private = map->fldrv_priv;
  812. int ret = 0;
  813. int chipnum;
  814. unsigned long ofs;
  815. unsigned long chipstart;
  816. *retlen = 0;
  817. if (!len) {
  818. return 0;
  819. }
  820. chipnum = to >> private->chipshift;
  821. ofs = to  - (chipnum << private->chipshift);
  822. chipstart = private->chips[chipnum].start;
  823. /* If it's not bus-aligned, do the first byte write. */
  824. if (ofs & (map->buswidth - 1)) {
  825. unsigned long bus_ofs = ofs & ~(map->buswidth - 1);
  826. int i = ofs - bus_ofs;
  827. int n = 0;
  828. u_char tmp_buf[4];
  829. __u32 datum;
  830. map->copy_from(map, tmp_buf,
  831.        bus_ofs + private->chips[chipnum].start,
  832.        map->buswidth);
  833. while (len && i < map->buswidth)
  834. tmp_buf[i++] = buf[n++], len--;
  835. if (map->buswidth == 2) {
  836. datum = *(__u16*)tmp_buf;
  837. } else if (map->buswidth == 4) {
  838. datum = *(__u32*)tmp_buf;
  839. } else {
  840. return -EINVAL;  /* should never happen, but be safe */
  841. }
  842. ret = write_one_word(map, &private->chips[chipnum], bus_ofs,
  843.      datum);
  844. if (ret) {
  845. return ret;
  846. }
  847. ofs += n;
  848. buf += n;
  849. (*retlen) += n;
  850. if (ofs >> private->chipshift) {
  851. chipnum++;
  852. ofs = 0;
  853. if (chipnum == private->numchips) {
  854. return 0;
  855. }
  856. }
  857. }
  858. /* We are now aligned, write as much as possible. */
  859. while(len >= map->buswidth) {
  860. __u32 datum;
  861. if (map->buswidth == 1) {
  862. datum = *(__u8*)buf;
  863. } else if (map->buswidth == 2) {
  864. datum = *(__u16*)buf;
  865. } else if (map->buswidth == 4) {
  866. datum = *(__u32*)buf;
  867. } else {
  868. return -EINVAL;
  869. }
  870. ret = write_one_word(map, &private->chips[chipnum], ofs, datum);
  871. if (ret) {
  872. return ret;
  873. }
  874. ofs += map->buswidth;
  875. buf += map->buswidth;
  876. (*retlen) += map->buswidth;
  877. len -= map->buswidth;
  878. if (ofs >> private->chipshift) {
  879. chipnum++;
  880. ofs = 0;
  881. if (chipnum == private->numchips) {
  882. return 0;
  883. }
  884. chipstart = private->chips[chipnum].start;
  885. }
  886. }
  887. if (len & (map->buswidth - 1)) {
  888. int i = 0, n = 0;
  889. u_char tmp_buf[2];
  890. __u32 datum;
  891. map->copy_from(map, tmp_buf,
  892.        ofs + private->chips[chipnum].start,
  893.        map->buswidth);
  894. while (len--) {
  895. tmp_buf[i++] = buf[n++];
  896. }
  897. if (map->buswidth == 2) {
  898. datum = *(__u16*)tmp_buf;
  899. } else if (map->buswidth == 4) {
  900. datum = *(__u32*)tmp_buf;
  901. } else {
  902. return -EINVAL;  /* should never happen, but be safe */
  903. }
  904. ret = write_one_word(map, &private->chips[chipnum], ofs, datum);
  905. if (ret) {
  906. return ret;
  907. }
  908. (*retlen) += n;
  909. }
  910. return 0;
  911. }
  912. static inline int erase_one_block(struct map_info *map, struct flchip *chip,
  913.   unsigned long adr, u_long size)
  914. {
  915. unsigned long timeo = jiffies + HZ;
  916. struct amd_flash_private *private = map->fldrv_priv;
  917. DECLARE_WAITQUEUE(wait, current);
  918. retry:
  919. spin_lock_bh(chip->mutex);
  920. if (chip->state != FL_READY){
  921. set_current_state(TASK_UNINTERRUPTIBLE);
  922. add_wait_queue(&chip->wq, &wait);
  923.                 
  924. spin_unlock_bh(chip->mutex);
  925. schedule();
  926. remove_wait_queue(&chip->wq, &wait);
  927. if (signal_pending(current)) {
  928. return -EINTR;
  929. }
  930. timeo = jiffies + HZ;
  931. goto retry;
  932. }
  933. chip->state = FL_ERASING;
  934. adr += chip->start;
  935. ENABLE_VPP(map);
  936. send_cmd(map, chip->start, CMD_SECTOR_ERASE_UNLOCK_DATA);
  937. send_cmd_to_addr(map, chip->start, CMD_SECTOR_ERASE_UNLOCK_DATA_2, adr);
  938. timeo = jiffies + (HZ * 20);
  939. spin_unlock_bh(chip->mutex);
  940. schedule_timeout(HZ);
  941. spin_lock_bh(chip->mutex);
  942. while (flash_is_busy(map, adr, private->interleave)) {
  943. if (chip->state != FL_ERASING) {
  944. /* Someone's suspended the erase. Sleep */
  945. set_current_state(TASK_UNINTERRUPTIBLE);
  946. add_wait_queue(&chip->wq, &wait);
  947. spin_unlock_bh(chip->mutex);
  948. printk(KERN_INFO "%s: erase suspended. Sleepingn",
  949.        map->name);
  950. schedule();
  951. remove_wait_queue(&chip->wq, &wait);
  952. if (signal_pending(current)) {
  953. return -EINTR;
  954. }
  955. timeo = jiffies + (HZ*2); /* FIXME */
  956. spin_lock_bh(chip->mutex);
  957. continue;
  958. }
  959. /* OK Still waiting */
  960. if (time_after(jiffies, timeo)) {
  961. chip->state = FL_READY;
  962. spin_unlock_bh(chip->mutex);
  963. printk(KERN_WARNING "%s: waiting for erase to complete "
  964.        "timed out.n", map->name);
  965. DISABLE_VPP(map);
  966. return -EIO;
  967. }
  968. /* Latency issues. Drop the lock, wait a while and retry */
  969. spin_unlock_bh(chip->mutex);
  970. if (current->need_resched)
  971. schedule();
  972. else
  973. udelay(1);
  974. spin_lock_bh(chip->mutex);
  975. }
  976. /* Verify every single word */
  977. {
  978. int address;
  979. int error = 0;
  980. __u8 verify;
  981. for (address = adr; address < (adr + size); address++) {
  982. if ((verify = map->read8(map, address)) != 0xFF) {
  983. error = 1;
  984. break;
  985. }
  986. }
  987. if (error) {
  988. chip->state = FL_READY;
  989. spin_unlock_bh(chip->mutex);
  990. printk(KERN_WARNING
  991.        "%s: verify error at 0x%x, size %ld.n",
  992.        map->name, address, size);
  993. DISABLE_VPP(map);
  994. return -EIO;
  995. }
  996. }
  997. DISABLE_VPP(map);
  998. chip->state = FL_READY;
  999. wake_up(&chip->wq);
  1000. spin_unlock_bh(chip->mutex);
  1001. return 0;
  1002. }
  1003. static int amd_flash_erase(struct mtd_info *mtd, struct erase_info *instr)
  1004. {
  1005. struct map_info *map = mtd->priv;
  1006. struct amd_flash_private *private = map->fldrv_priv;
  1007. unsigned long adr, len;
  1008. int chipnum;
  1009. int ret = 0;
  1010. int i;
  1011. int first;
  1012. struct mtd_erase_region_info *regions = mtd->eraseregions;
  1013. if (instr->addr > mtd->size) {
  1014. return -EINVAL;
  1015. }
  1016. if ((instr->len + instr->addr) > mtd->size) {
  1017. return -EINVAL;
  1018. }
  1019. /* Check that both start and end of the requested erase are
  1020.  * aligned with the erasesize at the appropriate addresses.
  1021.  */
  1022. i = 0;
  1023.         /* Skip all erase regions which are ended before the start of
  1024.            the requested erase. Actually, to save on the calculations,
  1025.            we skip to the first erase region which starts after the
  1026.            start of the requested erase, and then go back one.
  1027.         */
  1028.         while ((i < mtd->numeraseregions) &&
  1029.        (instr->addr >= regions[i].offset)) {
  1030.                i++;
  1031. }
  1032.         i--;
  1033. /* OK, now i is pointing at the erase region in which this
  1034.  * erase request starts. Check the start of the requested
  1035.  * erase range is aligned with the erase size which is in
  1036.  * effect here.
  1037.  */
  1038. if (instr->addr & (regions[i].erasesize-1)) {
  1039. return -EINVAL;
  1040. }
  1041. /* Remember the erase region we start on. */
  1042. first = i;
  1043. /* Next, check that the end of the requested erase is aligned
  1044.  * with the erase region at that address.
  1045.  */
  1046. while ((i < mtd->numeraseregions) && 
  1047.        ((instr->addr + instr->len) >= regions[i].offset)) {
  1048.                 i++;
  1049. }
  1050. /* As before, drop back one to point at the region in which
  1051.  * the address actually falls.
  1052.  */
  1053. i--;
  1054. if ((instr->addr + instr->len) & (regions[i].erasesize-1)) {
  1055.                 return -EINVAL;
  1056. }
  1057. chipnum = instr->addr >> private->chipshift;
  1058. adr = instr->addr - (chipnum << private->chipshift);
  1059. len = instr->len;
  1060. i = first;
  1061. while (len) {
  1062. ret = erase_one_block(map, &private->chips[chipnum], adr,
  1063.       regions[i].erasesize);
  1064. if (ret) {
  1065. return ret;
  1066. }
  1067. adr += regions[i].erasesize;
  1068. len -= regions[i].erasesize;
  1069. if ((adr % (1 << private->chipshift)) ==
  1070.     ((regions[i].offset + (regions[i].erasesize *
  1071.         regions[i].numblocks))
  1072.      % (1 << private->chipshift))) {
  1073. i++;
  1074. }
  1075. if (adr >> private->chipshift) {
  1076. adr = 0;
  1077. chipnum++;
  1078. if (chipnum >= private->numchips) {
  1079. break;
  1080. }
  1081. }
  1082. }
  1083. instr->state = MTD_ERASE_DONE;
  1084. if (instr->callback) {
  1085. instr->callback(instr);
  1086. }
  1087. return 0;
  1088. }
  1089. static void amd_flash_sync(struct mtd_info *mtd)
  1090. {
  1091. struct map_info *map = mtd->priv;
  1092. struct amd_flash_private *private = map->fldrv_priv;
  1093. int i;
  1094. struct flchip *chip;
  1095. int ret = 0;
  1096. DECLARE_WAITQUEUE(wait, current);
  1097. for (i = 0; !ret && (i < private->numchips); i++) {
  1098. chip = &private->chips[i];
  1099. retry:
  1100. spin_lock_bh(chip->mutex);
  1101. switch(chip->state) {
  1102. case FL_READY:
  1103. case FL_STATUS:
  1104. case FL_CFI_QUERY:
  1105. case FL_JEDEC_QUERY:
  1106. chip->oldstate = chip->state;
  1107. chip->state = FL_SYNCING;
  1108. /* No need to wake_up() on this state change - 
  1109.  * as the whole point is that nobody can do anything
  1110.  * with the chip now anyway.
  1111.  */
  1112. case FL_SYNCING:
  1113. spin_unlock_bh(chip->mutex);
  1114. break;
  1115. default:
  1116. /* Not an idle state */
  1117. add_wait_queue(&chip->wq, &wait);
  1118. spin_unlock_bh(chip->mutex);
  1119. schedule();
  1120.         remove_wait_queue(&chip->wq, &wait);
  1121. goto retry;
  1122. }
  1123. }
  1124. /* Unlock the chips again */
  1125. for (i--; i >= 0; i--) {
  1126. chip = &private->chips[i];
  1127. spin_lock_bh(chip->mutex);
  1128. if (chip->state == FL_SYNCING) {
  1129. chip->state = chip->oldstate;
  1130. wake_up(&chip->wq);
  1131. }
  1132. spin_unlock_bh(chip->mutex);
  1133. }
  1134. }
  1135. static int amd_flash_suspend(struct mtd_info *mtd)
  1136. {
  1137. printk("amd_flash_suspend(): not implemented!n");
  1138. return -EINVAL;
  1139. }
  1140. static void amd_flash_resume(struct mtd_info *mtd)
  1141. {
  1142. printk("amd_flash_resume(): not implemented!n");
  1143. }
  1144. static void amd_flash_destroy(struct mtd_info *mtd)
  1145. {
  1146. struct map_info *map = mtd->priv;
  1147. struct amd_flash_private *private = map->fldrv_priv;
  1148. kfree(private);
  1149. }
  1150. int __init amd_flash_init(void)
  1151. {
  1152. register_mtd_chip_driver(&amd_flash_chipdrv);
  1153. return 0;
  1154. }
  1155. void __exit amd_flash_exit(void)
  1156. {
  1157. unregister_mtd_chip_driver(&amd_flash_chipdrv);
  1158. }
  1159. module_init(amd_flash_init);
  1160. module_exit(amd_flash_exit);
  1161. MODULE_LICENSE("GPL");
  1162. MODULE_AUTHOR("Jonas Holmberg <jonas.holmberg@axis.com>");
  1163. MODULE_DESCRIPTION("Old MTD chip driver for AMD flash chips");