mxc_nand.c 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393
  1. /*
  2. * Copyright 2004-2007 Freescale Semiconductor, Inc.
  3. * Copyright 2008 Sascha Hauer, kernel@pengutronix.de
  4. * Copyright 2009 Ilya Yanok, <yanok@emcraft.com>
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU General Public License
  8. * as published by the Free Software Foundation; either version 2
  9. * of the License, or (at your option) any later version.
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program; if not, write to the Free Software
  17. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  18. * MA 02110-1301, USA.
  19. */
  20. #include <common.h>
  21. #include <nand.h>
  22. #include <linux/err.h>
  23. #include <asm/io.h>
  24. #if defined(CONFIG_MX25) || defined(CONFIG_MX27)
  25. #include <asm/arch/imx-regs.h>
  26. #endif
  27. #define DRIVER_NAME "mxc_nand"
  28. /*
  29. * TODO: Use same register defs here as nand_spl mxc nand driver.
  30. */
  31. /*
  32. * Register map and bit definitions for the Freescale NAND Flash Controller
  33. * present in various i.MX devices.
  34. *
  35. * MX31 and MX27 have version 1 which has
  36. * 4 512 byte main buffers and
  37. * 4 16 byte spare buffers
  38. * to support up to 2K byte pagesize nand.
  39. * Reading or writing a 2K page requires 4 FDI/FDO cycles.
  40. *
  41. * MX25 has version 1.1 which has
  42. * 8 512 byte main buffers and
  43. * 8 64 byte spare buffers
  44. * to support up to 4K byte pagesize nand.
  45. * Reading or writing a 2K or 4K page requires only 1 FDI/FDO cycle.
  46. * Also some of registers are moved and/or changed meaning as seen below.
  47. */
  48. #if defined(CONFIG_MX31) || defined(CONFIG_MX27)
  49. #define MXC_NFC_V1
  50. #elif defined(CONFIG_MX25)
  51. #define MXC_NFC_V1_1
  52. #else
  53. #warning "MXC NFC version not defined"
  54. #endif
  55. #if defined(MXC_NFC_V1)
  56. #define NAND_MXC_NR_BUFS 4
  57. #define NAND_MXC_SPARE_BUF_SIZE 16
  58. #define NAND_MXC_REG_OFFSET 0xe00
  59. #define is_mxc_nfc_11() 0
  60. #elif defined(MXC_NFC_V1_1)
  61. #define NAND_MXC_NR_BUFS 8
  62. #define NAND_MXC_SPARE_BUF_SIZE 64
  63. #define NAND_MXC_REG_OFFSET 0x1e00
  64. #define is_mxc_nfc_11() 1
  65. #else
  66. #error "define CONFIG_NAND_MXC_VXXX to use mtd mxc nand driver"
  67. #endif
  68. struct nfc_regs {
  69. uint8_t main_area[NAND_MXC_NR_BUFS][0x200];
  70. uint8_t spare_area[NAND_MXC_NR_BUFS][NAND_MXC_SPARE_BUF_SIZE];
  71. /*
  72. * reserved size is offset of nfc registers
  73. * minus total main and spare sizes
  74. */
  75. uint8_t reserved1[NAND_MXC_REG_OFFSET
  76. - NAND_MXC_NR_BUFS * (512 + NAND_MXC_SPARE_BUF_SIZE)];
  77. #if defined(MXC_NFC_V1)
  78. uint16_t nfc_buf_size;
  79. uint16_t reserved2;
  80. uint16_t nfc_buf_addr;
  81. uint16_t nfc_flash_addr;
  82. uint16_t nfc_flash_cmd;
  83. uint16_t nfc_config;
  84. uint16_t nfc_ecc_status_result;
  85. uint16_t nfc_rsltmain_area;
  86. uint16_t nfc_rsltspare_area;
  87. uint16_t nfc_wrprot;
  88. uint16_t nfc_unlockstart_blkaddr;
  89. uint16_t nfc_unlockend_blkaddr;
  90. uint16_t nfc_nf_wrprst;
  91. uint16_t nfc_config1;
  92. uint16_t nfc_config2;
  93. #elif defined(MXC_NFC_V1_1)
  94. uint16_t reserved2[2];
  95. uint16_t nfc_buf_addr;
  96. uint16_t nfc_flash_addr;
  97. uint16_t nfc_flash_cmd;
  98. uint16_t nfc_config;
  99. uint16_t nfc_ecc_status_result;
  100. uint16_t nfc_ecc_status_result2;
  101. uint16_t nfc_spare_area_size;
  102. uint16_t nfc_wrprot;
  103. uint16_t reserved3[2];
  104. uint16_t nfc_nf_wrprst;
  105. uint16_t nfc_config1;
  106. uint16_t nfc_config2;
  107. uint16_t reserved4;
  108. uint16_t nfc_unlockstart_blkaddr;
  109. uint16_t nfc_unlockend_blkaddr;
  110. uint16_t nfc_unlockstart_blkaddr1;
  111. uint16_t nfc_unlockend_blkaddr1;
  112. uint16_t nfc_unlockstart_blkaddr2;
  113. uint16_t nfc_unlockend_blkaddr2;
  114. uint16_t nfc_unlockstart_blkaddr3;
  115. uint16_t nfc_unlockend_blkaddr3;
  116. #endif
  117. };
  118. /*
  119. * Set INT to 0, FCMD to 1, rest to 0 in NFC_CONFIG2 Register
  120. * for Command operation
  121. */
  122. #define NFC_CMD 0x1
  123. /*
  124. * Set INT to 0, FADD to 1, rest to 0 in NFC_CONFIG2 Register
  125. * for Address operation
  126. */
  127. #define NFC_ADDR 0x2
  128. /*
  129. * Set INT to 0, FDI to 1, rest to 0 in NFC_CONFIG2 Register
  130. * for Input operation
  131. */
  132. #define NFC_INPUT 0x4
  133. /*
  134. * Set INT to 0, FDO to 001, rest to 0 in NFC_CONFIG2 Register
  135. * for Data Output operation
  136. */
  137. #define NFC_OUTPUT 0x8
  138. /*
  139. * Set INT to 0, FD0 to 010, rest to 0 in NFC_CONFIG2 Register
  140. * for Read ID operation
  141. */
  142. #define NFC_ID 0x10
  143. /*
  144. * Set INT to 0, FDO to 100, rest to 0 in NFC_CONFIG2 Register
  145. * for Read Status operation
  146. */
  147. #define NFC_STATUS 0x20
  148. /*
  149. * Set INT to 1, rest to 0 in NFC_CONFIG2 Register for Read
  150. * Status operation
  151. */
  152. #define NFC_INT 0x8000
  153. #ifdef MXC_NFC_V1_1
  154. #define NFC_4_8N_ECC (1 << 0)
  155. #else
  156. #define NFC_4_8N_ECC 0
  157. #endif
  158. #define NFC_SP_EN (1 << 2)
  159. #define NFC_ECC_EN (1 << 3)
  160. #define NFC_BIG (1 << 5)
  161. #define NFC_RST (1 << 6)
  162. #define NFC_CE (1 << 7)
  163. #define NFC_ONE_CYCLE (1 << 8)
  164. typedef enum {false, true} bool;
  165. struct mxc_nand_host {
  166. struct mtd_info mtd;
  167. struct nand_chip *nand;
  168. struct nfc_regs __iomem *regs;
  169. int spare_only;
  170. int status_request;
  171. int pagesize_2k;
  172. int clk_act;
  173. uint16_t col_addr;
  174. unsigned int page_addr;
  175. };
  176. static struct mxc_nand_host mxc_host;
  177. static struct mxc_nand_host *host = &mxc_host;
  178. /* Define delays in microsec for NAND device operations */
  179. #define TROP_US_DELAY 2000
  180. /* Macros to get byte and bit positions of ECC */
  181. #define COLPOS(x) ((x) >> 3)
  182. #define BITPOS(x) ((x) & 0xf)
  183. /* Define single bit Error positions in Main & Spare area */
  184. #define MAIN_SINGLEBIT_ERROR 0x4
  185. #define SPARE_SINGLEBIT_ERROR 0x1
  186. /* OOB placement block for use with hardware ecc generation */
  187. #if defined(MXC_NFC_V1)
  188. #ifndef CONFIG_SYS_NAND_LARGEPAGE
  189. static struct nand_ecclayout nand_hw_eccoob = {
  190. .eccbytes = 5,
  191. .eccpos = {6, 7, 8, 9, 10},
  192. .oobfree = { {0, 5}, {11, 5}, }
  193. };
  194. #else
  195. static struct nand_ecclayout nand_hw_eccoob2k = {
  196. .eccbytes = 20,
  197. .eccpos = {
  198. 6, 7, 8, 9, 10,
  199. 22, 23, 24, 25, 26,
  200. 38, 39, 40, 41, 42,
  201. 54, 55, 56, 57, 58,
  202. },
  203. .oobfree = { {2, 4}, {11, 11}, {27, 11}, {43, 11}, {59, 5} },
  204. };
  205. #endif
  206. #elif defined(MXC_NFC_V1_1)
  207. #ifndef CONFIG_SYS_NAND_LARGEPAGE
  208. static struct nand_ecclayout nand_hw_eccoob = {
  209. .eccbytes = 9,
  210. .eccpos = {7, 8, 9, 10, 11, 12, 13, 14, 15},
  211. .oobfree = { {2, 5} }
  212. };
  213. #else
  214. static struct nand_ecclayout nand_hw_eccoob2k = {
  215. .eccbytes = 36,
  216. .eccpos = {
  217. 7, 8, 9, 10, 11, 12, 13, 14, 15,
  218. 23, 24, 25, 26, 27, 28, 29, 30, 31,
  219. 39, 40, 41, 42, 43, 44, 45, 46, 47,
  220. 55, 56, 57, 58, 59, 60, 61, 62, 63,
  221. },
  222. .oobfree = { {2, 5}, {16, 7}, {32, 7}, {48, 7} },
  223. };
  224. #endif
  225. #endif
  226. #ifdef CONFIG_MX27
  227. static int is_16bit_nand(void)
  228. {
  229. struct system_control_regs *sc_regs =
  230. (struct system_control_regs *)IMX_SYSTEM_CTL_BASE;
  231. if (readl(&sc_regs->fmcr) & NF_16BIT_SEL)
  232. return 1;
  233. else
  234. return 0;
  235. }
  236. #elif defined(CONFIG_MX31)
  237. static int is_16bit_nand(void)
  238. {
  239. struct clock_control_regs *sc_regs =
  240. (struct clock_control_regs *)CCM_BASE;
  241. if (readl(&sc_regs->rcsr) & CCM_RCSR_NF16B)
  242. return 1;
  243. else
  244. return 0;
  245. }
  246. #elif defined(CONFIG_MX25)
  247. static int is_16bit_nand(void)
  248. {
  249. struct ccm_regs *ccm =
  250. (struct ccm_regs *)IMX_CCM_BASE;
  251. if (readl(&ccm->rcsr) & CCM_RCSR_NF_16BIT_SEL)
  252. return 1;
  253. else
  254. return 0;
  255. }
  256. #else
  257. #warning "8/16 bit NAND autodetection not supported"
  258. static int is_16bit_nand(void)
  259. {
  260. return 0;
  261. }
  262. #endif
  263. static uint32_t *mxc_nand_memcpy32(uint32_t *dest, uint32_t *source, size_t size)
  264. {
  265. uint32_t *d = dest;
  266. size >>= 2;
  267. while (size--)
  268. __raw_writel(__raw_readl(source++), d++);
  269. return dest;
  270. }
  271. /*
  272. * This function polls the NANDFC to wait for the basic operation to
  273. * complete by checking the INT bit of config2 register.
  274. */
  275. static void wait_op_done(struct mxc_nand_host *host, int max_retries,
  276. uint16_t param)
  277. {
  278. uint32_t tmp;
  279. while (max_retries-- > 0) {
  280. if (readw(&host->regs->nfc_config2) & NFC_INT) {
  281. tmp = readw(&host->regs->nfc_config2);
  282. tmp &= ~NFC_INT;
  283. writew(tmp, &host->regs->nfc_config2);
  284. break;
  285. }
  286. udelay(1);
  287. }
  288. if (max_retries < 0) {
  289. MTDDEBUG(MTD_DEBUG_LEVEL0, "%s(%d): INT not set\n",
  290. __func__, param);
  291. }
  292. }
  293. /*
  294. * This function issues the specified command to the NAND device and
  295. * waits for completion.
  296. */
  297. static void send_cmd(struct mxc_nand_host *host, uint16_t cmd)
  298. {
  299. MTDDEBUG(MTD_DEBUG_LEVEL3, "send_cmd(host, 0x%x)\n", cmd);
  300. writew(cmd, &host->regs->nfc_flash_cmd);
  301. writew(NFC_CMD, &host->regs->nfc_config2);
  302. /* Wait for operation to complete */
  303. wait_op_done(host, TROP_US_DELAY, cmd);
  304. }
  305. /*
  306. * This function sends an address (or partial address) to the
  307. * NAND device. The address is used to select the source/destination for
  308. * a NAND command.
  309. */
  310. static void send_addr(struct mxc_nand_host *host, uint16_t addr)
  311. {
  312. MTDDEBUG(MTD_DEBUG_LEVEL3, "send_addr(host, 0x%x)\n", addr);
  313. writew(addr, &host->regs->nfc_flash_addr);
  314. writew(NFC_ADDR, &host->regs->nfc_config2);
  315. /* Wait for operation to complete */
  316. wait_op_done(host, TROP_US_DELAY, addr);
  317. }
  318. /*
  319. * This function requests the NANDFC to initate the transfer
  320. * of data currently in the NANDFC RAM buffer to the NAND device.
  321. */
  322. static void send_prog_page(struct mxc_nand_host *host, uint8_t buf_id,
  323. int spare_only)
  324. {
  325. if (spare_only)
  326. MTDDEBUG(MTD_DEBUG_LEVEL1, "send_prog_page (%d)\n", spare_only);
  327. if (is_mxc_nfc_11()) {
  328. int i;
  329. /*
  330. * The controller copies the 64 bytes of spare data from
  331. * the first 16 bytes of each of the 4 64 byte spare buffers.
  332. * Copy the contiguous data starting in spare_area[0] to
  333. * the four spare area buffers.
  334. */
  335. for (i = 1; i < 4; i++) {
  336. void __iomem *src = &host->regs->spare_area[0][i * 16];
  337. void __iomem *dst = &host->regs->spare_area[i][0];
  338. mxc_nand_memcpy32(dst, src, 16);
  339. }
  340. }
  341. writew(buf_id, &host->regs->nfc_buf_addr);
  342. /* Configure spare or page+spare access */
  343. if (!host->pagesize_2k) {
  344. uint16_t config1 = readw(&host->regs->nfc_config1);
  345. if (spare_only)
  346. config1 |= NFC_SP_EN;
  347. else
  348. config1 &= ~(NFC_SP_EN);
  349. writew(config1, &host->regs->nfc_config1);
  350. }
  351. writew(NFC_INPUT, &host->regs->nfc_config2);
  352. /* Wait for operation to complete */
  353. wait_op_done(host, TROP_US_DELAY, spare_only);
  354. }
  355. /*
  356. * Requests NANDFC to initated the transfer of data from the
  357. * NAND device into in the NANDFC ram buffer.
  358. */
  359. static void send_read_page(struct mxc_nand_host *host, uint8_t buf_id,
  360. int spare_only)
  361. {
  362. MTDDEBUG(MTD_DEBUG_LEVEL3, "send_read_page (%d)\n", spare_only);
  363. writew(buf_id, &host->regs->nfc_buf_addr);
  364. /* Configure spare or page+spare access */
  365. if (!host->pagesize_2k) {
  366. uint32_t config1 = readw(&host->regs->nfc_config1);
  367. if (spare_only)
  368. config1 |= NFC_SP_EN;
  369. else
  370. config1 &= ~NFC_SP_EN;
  371. writew(config1, &host->regs->nfc_config1);
  372. }
  373. writew(NFC_OUTPUT, &host->regs->nfc_config2);
  374. /* Wait for operation to complete */
  375. wait_op_done(host, TROP_US_DELAY, spare_only);
  376. if (is_mxc_nfc_11()) {
  377. int i;
  378. /*
  379. * The controller copies the 64 bytes of spare data to
  380. * the first 16 bytes of each of the 4 spare buffers.
  381. * Make the data contiguous starting in spare_area[0].
  382. */
  383. for (i = 1; i < 4; i++) {
  384. void __iomem *src = &host->regs->spare_area[i][0];
  385. void __iomem *dst = &host->regs->spare_area[0][i * 16];
  386. mxc_nand_memcpy32(dst, src, 16);
  387. }
  388. }
  389. }
  390. /* Request the NANDFC to perform a read of the NAND device ID. */
  391. static void send_read_id(struct mxc_nand_host *host)
  392. {
  393. uint16_t tmp;
  394. /* NANDFC buffer 0 is used for device ID output */
  395. writew(0x0, &host->regs->nfc_buf_addr);
  396. /* Read ID into main buffer */
  397. tmp = readw(&host->regs->nfc_config1);
  398. tmp &= ~NFC_SP_EN;
  399. writew(tmp, &host->regs->nfc_config1);
  400. writew(NFC_ID, &host->regs->nfc_config2);
  401. /* Wait for operation to complete */
  402. wait_op_done(host, TROP_US_DELAY, 0);
  403. }
  404. /*
  405. * This function requests the NANDFC to perform a read of the
  406. * NAND device status and returns the current status.
  407. */
  408. static uint16_t get_dev_status(struct mxc_nand_host *host)
  409. {
  410. void __iomem *main_buf = host->regs->main_area[1];
  411. uint32_t store;
  412. uint16_t ret, tmp;
  413. /* Issue status request to NAND device */
  414. /* store the main area1 first word, later do recovery */
  415. store = readl(main_buf);
  416. /* NANDFC buffer 1 is used for device status */
  417. writew(1, &host->regs->nfc_buf_addr);
  418. /* Read status into main buffer */
  419. tmp = readw(&host->regs->nfc_config1);
  420. tmp &= ~NFC_SP_EN;
  421. writew(tmp, &host->regs->nfc_config1);
  422. writew(NFC_STATUS, &host->regs->nfc_config2);
  423. /* Wait for operation to complete */
  424. wait_op_done(host, TROP_US_DELAY, 0);
  425. /*
  426. * Status is placed in first word of main buffer
  427. * get status, then recovery area 1 data
  428. */
  429. ret = readw(main_buf);
  430. writel(store, main_buf);
  431. return ret;
  432. }
  433. /* This function is used by upper layer to checks if device is ready */
  434. static int mxc_nand_dev_ready(struct mtd_info *mtd)
  435. {
  436. /*
  437. * NFC handles R/B internally. Therefore, this function
  438. * always returns status as ready.
  439. */
  440. return 1;
  441. }
  442. #ifdef CONFIG_MXC_NAND_HWECC
  443. static void mxc_nand_enable_hwecc(struct mtd_info *mtd, int mode)
  444. {
  445. /*
  446. * If HW ECC is enabled, we turn it on during init. There is
  447. * no need to enable again here.
  448. */
  449. }
  450. #ifdef MXC_NFC_V1_1
  451. static void _mxc_nand_enable_hwecc(struct mtd_info *mtd, int on)
  452. {
  453. struct nand_chip *nand_chip = mtd->priv;
  454. struct mxc_nand_host *host = nand_chip->priv;
  455. uint16_t tmp = readw(&host->regs->nfc_config1);
  456. if (on)
  457. tmp |= NFC_ECC_EN;
  458. else
  459. tmp &= ~NFC_ECC_EN;
  460. writew(tmp, &host->regs->nfc_config1);
  461. }
  462. static int mxc_nand_read_oob_syndrome(struct mtd_info *mtd,
  463. struct nand_chip *chip,
  464. int page, int sndcmd)
  465. {
  466. struct mxc_nand_host *host = chip->priv;
  467. uint8_t *buf = chip->oob_poi;
  468. int length = mtd->oobsize;
  469. int eccpitch = chip->ecc.bytes + chip->ecc.prepad + chip->ecc.postpad;
  470. uint8_t *bufpoi = buf;
  471. int i, toread;
  472. MTDDEBUG(MTD_DEBUG_LEVEL0,
  473. "%s: Reading OOB area of page %u to oob %p\n",
  474. __FUNCTION__, host->page_addr, buf);
  475. chip->cmdfunc(mtd, NAND_CMD_READOOB, mtd->writesize, page);
  476. for (i = 0; i < chip->ecc.steps; i++) {
  477. toread = min_t(int, length, chip->ecc.prepad);
  478. if (toread) {
  479. chip->read_buf(mtd, bufpoi, toread);
  480. bufpoi += toread;
  481. length -= toread;
  482. }
  483. bufpoi += chip->ecc.bytes;
  484. host->col_addr += chip->ecc.bytes;
  485. length -= chip->ecc.bytes;
  486. toread = min_t(int, length, chip->ecc.postpad);
  487. if (toread) {
  488. chip->read_buf(mtd, bufpoi, toread);
  489. bufpoi += toread;
  490. length -= toread;
  491. }
  492. }
  493. if (length > 0)
  494. chip->read_buf(mtd, bufpoi, length);
  495. _mxc_nand_enable_hwecc(mtd, 0);
  496. chip->cmdfunc(mtd, NAND_CMD_READOOB,
  497. mtd->writesize + chip->ecc.prepad, page);
  498. bufpoi = buf + chip->ecc.prepad;
  499. length = mtd->oobsize - chip->ecc.prepad;
  500. for (i = 0; i < chip->ecc.steps; i++) {
  501. toread = min_t(int, length, chip->ecc.bytes);
  502. chip->read_buf(mtd, bufpoi, toread);
  503. bufpoi += eccpitch;
  504. length -= eccpitch;
  505. host->col_addr += chip->ecc.postpad + chip->ecc.prepad;
  506. }
  507. _mxc_nand_enable_hwecc(mtd, 1);
  508. return 1;
  509. }
  510. static int mxc_nand_read_page_raw_syndrome(struct mtd_info *mtd,
  511. struct nand_chip *chip,
  512. uint8_t *buf,
  513. int page)
  514. {
  515. struct mxc_nand_host *host = chip->priv;
  516. int eccsize = chip->ecc.size;
  517. int eccbytes = chip->ecc.bytes;
  518. int eccpitch = eccbytes + chip->ecc.prepad + chip->ecc.postpad;
  519. uint8_t *oob = chip->oob_poi;
  520. int steps, size;
  521. int n;
  522. _mxc_nand_enable_hwecc(mtd, 0);
  523. chip->cmdfunc(mtd, NAND_CMD_READ0, 0x00, host->page_addr);
  524. for (n = 0, steps = chip->ecc.steps; steps > 0; n++, steps--) {
  525. host->col_addr = n * eccsize;
  526. chip->read_buf(mtd, buf, eccsize);
  527. buf += eccsize;
  528. host->col_addr = mtd->writesize + n * eccpitch;
  529. if (chip->ecc.prepad) {
  530. chip->read_buf(mtd, oob, chip->ecc.prepad);
  531. oob += chip->ecc.prepad;
  532. }
  533. chip->read_buf(mtd, oob, eccbytes);
  534. oob += eccbytes;
  535. if (chip->ecc.postpad) {
  536. chip->read_buf(mtd, oob, chip->ecc.postpad);
  537. oob += chip->ecc.postpad;
  538. }
  539. }
  540. size = mtd->oobsize - (oob - chip->oob_poi);
  541. if (size)
  542. chip->read_buf(mtd, oob, size);
  543. _mxc_nand_enable_hwecc(mtd, 0);
  544. return 0;
  545. }
  546. static int mxc_nand_read_page_syndrome(struct mtd_info *mtd,
  547. struct nand_chip *chip,
  548. uint8_t *buf,
  549. int page)
  550. {
  551. struct mxc_nand_host *host = chip->priv;
  552. int n, eccsize = chip->ecc.size;
  553. int eccbytes = chip->ecc.bytes;
  554. int eccpitch = eccbytes + chip->ecc.prepad + chip->ecc.postpad;
  555. int eccsteps = chip->ecc.steps;
  556. uint8_t *p = buf;
  557. uint8_t *oob = chip->oob_poi;
  558. MTDDEBUG(MTD_DEBUG_LEVEL1, "Reading page %u to buf %p oob %p\n",
  559. host->page_addr, buf, oob);
  560. /* first read out the data area and the available portion of OOB */
  561. for (n = 0; eccsteps; n++, eccsteps--, p += eccsize) {
  562. int stat;
  563. host->col_addr = n * eccsize;
  564. chip->read_buf(mtd, p, eccsize);
  565. host->col_addr = mtd->writesize + n * eccpitch;
  566. if (chip->ecc.prepad) {
  567. chip->read_buf(mtd, oob, chip->ecc.prepad);
  568. oob += chip->ecc.prepad;
  569. }
  570. stat = chip->ecc.correct(mtd, p, oob, NULL);
  571. if (stat < 0)
  572. mtd->ecc_stats.failed++;
  573. else
  574. mtd->ecc_stats.corrected += stat;
  575. oob += eccbytes;
  576. if (chip->ecc.postpad) {
  577. chip->read_buf(mtd, oob, chip->ecc.postpad);
  578. oob += chip->ecc.postpad;
  579. }
  580. }
  581. /* Calculate remaining oob bytes */
  582. n = mtd->oobsize - (oob - chip->oob_poi);
  583. if (n)
  584. chip->read_buf(mtd, oob, n);
  585. /* Then switch ECC off and read the OOB area to get the ECC code */
  586. _mxc_nand_enable_hwecc(mtd, 0);
  587. chip->cmdfunc(mtd, NAND_CMD_READOOB, mtd->writesize, host->page_addr);
  588. eccsteps = chip->ecc.steps;
  589. oob = chip->oob_poi + chip->ecc.prepad;
  590. for (n = 0; eccsteps; n++, eccsteps--, p += eccsize) {
  591. host->col_addr = mtd->writesize +
  592. n * eccpitch +
  593. chip->ecc.prepad;
  594. chip->read_buf(mtd, oob, eccbytes);
  595. oob += eccbytes + chip->ecc.postpad;
  596. }
  597. _mxc_nand_enable_hwecc(mtd, 1);
  598. return 0;
  599. }
  600. static int mxc_nand_write_oob_syndrome(struct mtd_info *mtd,
  601. struct nand_chip *chip, int page)
  602. {
  603. struct mxc_nand_host *host = chip->priv;
  604. int eccpitch = chip->ecc.bytes + chip->ecc.prepad + chip->ecc.postpad;
  605. int length = mtd->oobsize;
  606. int i, len, status, steps = chip->ecc.steps;
  607. const uint8_t *bufpoi = chip->oob_poi;
  608. chip->cmdfunc(mtd, NAND_CMD_SEQIN, mtd->writesize, page);
  609. for (i = 0; i < steps; i++) {
  610. len = min_t(int, length, eccpitch);
  611. chip->write_buf(mtd, bufpoi, len);
  612. bufpoi += len;
  613. length -= len;
  614. host->col_addr += chip->ecc.prepad + chip->ecc.postpad;
  615. }
  616. if (length > 0)
  617. chip->write_buf(mtd, bufpoi, length);
  618. chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1);
  619. status = chip->waitfunc(mtd, chip);
  620. return status & NAND_STATUS_FAIL ? -EIO : 0;
  621. }
  622. static void mxc_nand_write_page_raw_syndrome(struct mtd_info *mtd,
  623. struct nand_chip *chip,
  624. const uint8_t *buf)
  625. {
  626. struct mxc_nand_host *host = chip->priv;
  627. int eccsize = chip->ecc.size;
  628. int eccbytes = chip->ecc.bytes;
  629. int eccpitch = eccbytes + chip->ecc.prepad + chip->ecc.postpad;
  630. uint8_t *oob = chip->oob_poi;
  631. int steps, size;
  632. int n;
  633. for (n = 0, steps = chip->ecc.steps; steps > 0; n++, steps--) {
  634. host->col_addr = n * eccsize;
  635. chip->write_buf(mtd, buf, eccsize);
  636. buf += eccsize;
  637. host->col_addr = mtd->writesize + n * eccpitch;
  638. if (chip->ecc.prepad) {
  639. chip->write_buf(mtd, oob, chip->ecc.prepad);
  640. oob += chip->ecc.prepad;
  641. }
  642. host->col_addr += eccbytes;
  643. oob += eccbytes;
  644. if (chip->ecc.postpad) {
  645. chip->write_buf(mtd, oob, chip->ecc.postpad);
  646. oob += chip->ecc.postpad;
  647. }
  648. }
  649. size = mtd->oobsize - (oob - chip->oob_poi);
  650. if (size)
  651. chip->write_buf(mtd, oob, size);
  652. }
  653. static void mxc_nand_write_page_syndrome(struct mtd_info *mtd,
  654. struct nand_chip *chip,
  655. const uint8_t *buf)
  656. {
  657. struct mxc_nand_host *host = chip->priv;
  658. int i, n, eccsize = chip->ecc.size;
  659. int eccbytes = chip->ecc.bytes;
  660. int eccpitch = eccbytes + chip->ecc.prepad + chip->ecc.postpad;
  661. int eccsteps = chip->ecc.steps;
  662. const uint8_t *p = buf;
  663. uint8_t *oob = chip->oob_poi;
  664. chip->ecc.hwctl(mtd, NAND_ECC_WRITE);
  665. for (i = n = 0;
  666. eccsteps;
  667. n++, eccsteps--, i += eccbytes, p += eccsize) {
  668. host->col_addr = n * eccsize;
  669. chip->write_buf(mtd, p, eccsize);
  670. host->col_addr = mtd->writesize + n * eccpitch;
  671. if (chip->ecc.prepad) {
  672. chip->write_buf(mtd, oob, chip->ecc.prepad);
  673. oob += chip->ecc.prepad;
  674. }
  675. chip->write_buf(mtd, oob, eccbytes);
  676. oob += eccbytes;
  677. if (chip->ecc.postpad) {
  678. chip->write_buf(mtd, oob, chip->ecc.postpad);
  679. oob += chip->ecc.postpad;
  680. }
  681. }
  682. /* Calculate remaining oob bytes */
  683. i = mtd->oobsize - (oob - chip->oob_poi);
  684. if (i)
  685. chip->write_buf(mtd, oob, i);
  686. }
  687. static int mxc_nand_correct_data(struct mtd_info *mtd, u_char *dat,
  688. u_char *read_ecc, u_char *calc_ecc)
  689. {
  690. struct nand_chip *nand_chip = mtd->priv;
  691. struct mxc_nand_host *host = nand_chip->priv;
  692. uint16_t ecc_status = readw(&host->regs->nfc_ecc_status_result);
  693. int subpages = mtd->writesize / nand_chip->subpagesize;
  694. int pg2blk_shift = nand_chip->phys_erase_shift -
  695. nand_chip->page_shift;
  696. do {
  697. if ((ecc_status & 0xf) > 4) {
  698. static int last_bad = -1;
  699. if (last_bad != host->page_addr >> pg2blk_shift) {
  700. last_bad = host->page_addr >> pg2blk_shift;
  701. printk(KERN_DEBUG
  702. "MXC_NAND: HWECC uncorrectable ECC error"
  703. " in block %u page %u subpage %d\n",
  704. last_bad, host->page_addr,
  705. mtd->writesize / nand_chip->subpagesize
  706. - subpages);
  707. }
  708. return -1;
  709. }
  710. ecc_status >>= 4;
  711. subpages--;
  712. } while (subpages > 0);
  713. return 0;
  714. }
  715. #else
  716. #define mxc_nand_read_page_syndrome NULL
  717. #define mxc_nand_read_page_raw_syndrome NULL
  718. #define mxc_nand_read_oob_syndrome NULL
  719. #define mxc_nand_write_page_syndrome NULL
  720. #define mxc_nand_write_page_raw_syndrome NULL
  721. #define mxc_nand_write_oob_syndrome NULL
  722. #define mxc_nfc_11_nand_correct_data NULL
  723. static int mxc_nand_correct_data(struct mtd_info *mtd, u_char *dat,
  724. u_char *read_ecc, u_char *calc_ecc)
  725. {
  726. struct nand_chip *nand_chip = mtd->priv;
  727. struct mxc_nand_host *host = nand_chip->priv;
  728. /*
  729. * 1-Bit errors are automatically corrected in HW. No need for
  730. * additional correction. 2-Bit errors cannot be corrected by
  731. * HW ECC, so we need to return failure
  732. */
  733. uint16_t ecc_status = readw(&host->regs->nfc_ecc_status_result);
  734. if (((ecc_status & 0x3) == 2) || ((ecc_status >> 2) == 2)) {
  735. MTDDEBUG(MTD_DEBUG_LEVEL0,
  736. "MXC_NAND: HWECC uncorrectable 2-bit ECC error\n");
  737. return -1;
  738. }
  739. return 0;
  740. }
  741. #endif
  742. static int mxc_nand_calculate_ecc(struct mtd_info *mtd, const u_char *dat,
  743. u_char *ecc_code)
  744. {
  745. return 0;
  746. }
  747. #endif
  748. static u_char mxc_nand_read_byte(struct mtd_info *mtd)
  749. {
  750. struct nand_chip *nand_chip = mtd->priv;
  751. struct mxc_nand_host *host = nand_chip->priv;
  752. uint8_t ret = 0;
  753. uint16_t col;
  754. uint16_t __iomem *main_buf =
  755. (uint16_t __iomem *)host->regs->main_area[0];
  756. uint16_t __iomem *spare_buf =
  757. (uint16_t __iomem *)host->regs->spare_area[0];
  758. union {
  759. uint16_t word;
  760. uint8_t bytes[2];
  761. } nfc_word;
  762. /* Check for status request */
  763. if (host->status_request)
  764. return get_dev_status(host) & 0xFF;
  765. /* Get column for 16-bit access */
  766. col = host->col_addr >> 1;
  767. /* If we are accessing the spare region */
  768. if (host->spare_only)
  769. nfc_word.word = readw(&spare_buf[col]);
  770. else
  771. nfc_word.word = readw(&main_buf[col]);
  772. /* Pick upper/lower byte of word from RAM buffer */
  773. ret = nfc_word.bytes[host->col_addr & 0x1];
  774. /* Update saved column address */
  775. if (nand_chip->options & NAND_BUSWIDTH_16)
  776. host->col_addr += 2;
  777. else
  778. host->col_addr++;
  779. return ret;
  780. }
  781. static uint16_t mxc_nand_read_word(struct mtd_info *mtd)
  782. {
  783. struct nand_chip *nand_chip = mtd->priv;
  784. struct mxc_nand_host *host = nand_chip->priv;
  785. uint16_t col, ret;
  786. uint16_t __iomem *p;
  787. MTDDEBUG(MTD_DEBUG_LEVEL3,
  788. "mxc_nand_read_word(col = %d)\n", host->col_addr);
  789. col = host->col_addr;
  790. /* Adjust saved column address */
  791. if (col < mtd->writesize && host->spare_only)
  792. col += mtd->writesize;
  793. if (col < mtd->writesize) {
  794. p = (uint16_t __iomem *)(host->regs->main_area[0] +
  795. (col >> 1));
  796. } else {
  797. p = (uint16_t __iomem *)(host->regs->spare_area[0] +
  798. ((col - mtd->writesize) >> 1));
  799. }
  800. if (col & 1) {
  801. union {
  802. uint16_t word;
  803. uint8_t bytes[2];
  804. } nfc_word[3];
  805. nfc_word[0].word = readw(p);
  806. nfc_word[1].word = readw(p + 1);
  807. nfc_word[2].bytes[0] = nfc_word[0].bytes[1];
  808. nfc_word[2].bytes[1] = nfc_word[1].bytes[0];
  809. ret = nfc_word[2].word;
  810. } else {
  811. ret = readw(p);
  812. }
  813. /* Update saved column address */
  814. host->col_addr = col + 2;
  815. return ret;
  816. }
  817. /*
  818. * Write data of length len to buffer buf. The data to be
  819. * written on NAND Flash is first copied to RAMbuffer. After the Data Input
  820. * Operation by the NFC, the data is written to NAND Flash
  821. */
  822. static void mxc_nand_write_buf(struct mtd_info *mtd,
  823. const u_char *buf, int len)
  824. {
  825. struct nand_chip *nand_chip = mtd->priv;
  826. struct mxc_nand_host *host = nand_chip->priv;
  827. int n, col, i = 0;
  828. MTDDEBUG(MTD_DEBUG_LEVEL3,
  829. "mxc_nand_write_buf(col = %d, len = %d)\n", host->col_addr,
  830. len);
  831. col = host->col_addr;
  832. /* Adjust saved column address */
  833. if (col < mtd->writesize && host->spare_only)
  834. col += mtd->writesize;
  835. n = mtd->writesize + mtd->oobsize - col;
  836. n = min(len, n);
  837. MTDDEBUG(MTD_DEBUG_LEVEL3,
  838. "%s:%d: col = %d, n = %d\n", __func__, __LINE__, col, n);
  839. while (n > 0) {
  840. void __iomem *p;
  841. if (col < mtd->writesize) {
  842. p = host->regs->main_area[0] + (col & ~3);
  843. } else {
  844. p = host->regs->spare_area[0] -
  845. mtd->writesize + (col & ~3);
  846. }
  847. MTDDEBUG(MTD_DEBUG_LEVEL3, "%s:%d: p = %p\n", __func__,
  848. __LINE__, p);
  849. if (((col | (unsigned long)&buf[i]) & 3) || n < 4) {
  850. union {
  851. uint32_t word;
  852. uint8_t bytes[4];
  853. } nfc_word;
  854. nfc_word.word = readl(p);
  855. nfc_word.bytes[col & 3] = buf[i++];
  856. n--;
  857. col++;
  858. writel(nfc_word.word, p);
  859. } else {
  860. int m = mtd->writesize - col;
  861. if (col >= mtd->writesize)
  862. m += mtd->oobsize;
  863. m = min(n, m) & ~3;
  864. MTDDEBUG(MTD_DEBUG_LEVEL3,
  865. "%s:%d: n = %d, m = %d, i = %d, col = %d\n",
  866. __func__, __LINE__, n, m, i, col);
  867. mxc_nand_memcpy32(p, (uint32_t *)&buf[i], m);
  868. col += m;
  869. i += m;
  870. n -= m;
  871. }
  872. }
  873. /* Update saved column address */
  874. host->col_addr = col;
  875. }
  876. /*
  877. * Read the data buffer from the NAND Flash. To read the data from NAND
  878. * Flash first the data output cycle is initiated by the NFC, which copies
  879. * the data to RAMbuffer. This data of length len is then copied to buffer buf.
  880. */
  881. static void mxc_nand_read_buf(struct mtd_info *mtd, u_char *buf, int len)
  882. {
  883. struct nand_chip *nand_chip = mtd->priv;
  884. struct mxc_nand_host *host = nand_chip->priv;
  885. int n, col, i = 0;
  886. MTDDEBUG(MTD_DEBUG_LEVEL3,
  887. "mxc_nand_read_buf(col = %d, len = %d)\n", host->col_addr, len);
  888. col = host->col_addr;
  889. /* Adjust saved column address */
  890. if (col < mtd->writesize && host->spare_only)
  891. col += mtd->writesize;
  892. n = mtd->writesize + mtd->oobsize - col;
  893. n = min(len, n);
  894. while (n > 0) {
  895. void __iomem *p;
  896. if (col < mtd->writesize) {
  897. p = host->regs->main_area[0] + (col & ~3);
  898. } else {
  899. p = host->regs->spare_area[0] -
  900. mtd->writesize + (col & ~3);
  901. }
  902. if (((col | (int)&buf[i]) & 3) || n < 4) {
  903. union {
  904. uint32_t word;
  905. uint8_t bytes[4];
  906. } nfc_word;
  907. nfc_word.word = readl(p);
  908. buf[i++] = nfc_word.bytes[col & 3];
  909. n--;
  910. col++;
  911. } else {
  912. int m = mtd->writesize - col;
  913. if (col >= mtd->writesize)
  914. m += mtd->oobsize;
  915. m = min(n, m) & ~3;
  916. mxc_nand_memcpy32((uint32_t *)&buf[i], p, m);
  917. col += m;
  918. i += m;
  919. n -= m;
  920. }
  921. }
  922. /* Update saved column address */
  923. host->col_addr = col;
  924. }
  925. /*
  926. * Used by the upper layer to verify the data in NAND Flash
  927. * with the data in the buf.
  928. */
  929. static int mxc_nand_verify_buf(struct mtd_info *mtd,
  930. const u_char *buf, int len)
  931. {
  932. u_char tmp[256];
  933. uint bsize;
  934. while (len) {
  935. bsize = min(len, 256);
  936. mxc_nand_read_buf(mtd, tmp, bsize);
  937. if (memcmp(buf, tmp, bsize))
  938. return 1;
  939. buf += bsize;
  940. len -= bsize;
  941. }
  942. return 0;
  943. }
  944. /*
  945. * This function is used by upper layer for select and
  946. * deselect of the NAND chip
  947. */
  948. static void mxc_nand_select_chip(struct mtd_info *mtd, int chip)
  949. {
  950. struct nand_chip *nand_chip = mtd->priv;
  951. struct mxc_nand_host *host = nand_chip->priv;
  952. switch (chip) {
  953. case -1:
  954. /* TODO: Disable the NFC clock */
  955. if (host->clk_act)
  956. host->clk_act = 0;
  957. break;
  958. case 0:
  959. /* TODO: Enable the NFC clock */
  960. if (!host->clk_act)
  961. host->clk_act = 1;
  962. break;
  963. default:
  964. break;
  965. }
  966. }
  967. /*
  968. * Used by the upper layer to write command to NAND Flash for
  969. * different operations to be carried out on NAND Flash
  970. */
  971. void mxc_nand_command(struct mtd_info *mtd, unsigned command,
  972. int column, int page_addr)
  973. {
  974. struct nand_chip *nand_chip = mtd->priv;
  975. struct mxc_nand_host *host = nand_chip->priv;
  976. MTDDEBUG(MTD_DEBUG_LEVEL3,
  977. "mxc_nand_command (cmd = 0x%x, col = 0x%x, page = 0x%x)\n",
  978. command, column, page_addr);
  979. /* Reset command state information */
  980. host->status_request = false;
  981. /* Command pre-processing step */
  982. switch (command) {
  983. case NAND_CMD_STATUS:
  984. host->col_addr = 0;
  985. host->status_request = true;
  986. break;
  987. case NAND_CMD_READ0:
  988. host->page_addr = page_addr;
  989. host->col_addr = column;
  990. host->spare_only = false;
  991. break;
  992. case NAND_CMD_READOOB:
  993. host->col_addr = column;
  994. host->spare_only = true;
  995. if (host->pagesize_2k)
  996. command = NAND_CMD_READ0; /* only READ0 is valid */
  997. break;
  998. case NAND_CMD_SEQIN:
  999. if (column >= mtd->writesize) {
  1000. /*
  1001. * before sending SEQIN command for partial write,
  1002. * we need read one page out. FSL NFC does not support
  1003. * partial write. It alway send out 512+ecc+512+ecc ...
  1004. * for large page nand flash. But for small page nand
  1005. * flash, it does support SPARE ONLY operation.
  1006. */
  1007. if (host->pagesize_2k) {
  1008. /* call ourself to read a page */
  1009. mxc_nand_command(mtd, NAND_CMD_READ0, 0,
  1010. page_addr);
  1011. }
  1012. host->col_addr = column - mtd->writesize;
  1013. host->spare_only = true;
  1014. /* Set program pointer to spare region */
  1015. if (!host->pagesize_2k)
  1016. send_cmd(host, NAND_CMD_READOOB);
  1017. } else {
  1018. host->spare_only = false;
  1019. host->col_addr = column;
  1020. /* Set program pointer to page start */
  1021. if (!host->pagesize_2k)
  1022. send_cmd(host, NAND_CMD_READ0);
  1023. }
  1024. break;
  1025. case NAND_CMD_PAGEPROG:
  1026. send_prog_page(host, 0, host->spare_only);
  1027. if (host->pagesize_2k && !is_mxc_nfc_11()) {
  1028. /* data in 4 areas datas */
  1029. send_prog_page(host, 1, host->spare_only);
  1030. send_prog_page(host, 2, host->spare_only);
  1031. send_prog_page(host, 3, host->spare_only);
  1032. }
  1033. break;
  1034. }
  1035. /* Write out the command to the device. */
  1036. send_cmd(host, command);
  1037. /* Write out column address, if necessary */
  1038. if (column != -1) {
  1039. /*
  1040. * MXC NANDFC can only perform full page+spare or
  1041. * spare-only read/write. When the upper layers
  1042. * layers perform a read/write buf operation,
  1043. * we will used the saved column adress to index into
  1044. * the full page.
  1045. */
  1046. send_addr(host, 0);
  1047. if (host->pagesize_2k)
  1048. /* another col addr cycle for 2k page */
  1049. send_addr(host, 0);
  1050. }
  1051. /* Write out page address, if necessary */
  1052. if (page_addr != -1) {
  1053. u32 page_mask = nand_chip->pagemask;
  1054. do {
  1055. send_addr(host, page_addr & 0xFF);
  1056. page_addr >>= 8;
  1057. page_mask >>= 8;
  1058. } while (page_mask);
  1059. }
  1060. /* Command post-processing step */
  1061. switch (command) {
  1062. case NAND_CMD_RESET:
  1063. break;
  1064. case NAND_CMD_READOOB:
  1065. case NAND_CMD_READ0:
  1066. if (host->pagesize_2k) {
  1067. /* send read confirm command */
  1068. send_cmd(host, NAND_CMD_READSTART);
  1069. /* read for each AREA */
  1070. send_read_page(host, 0, host->spare_only);
  1071. if (!is_mxc_nfc_11()) {
  1072. send_read_page(host, 1, host->spare_only);
  1073. send_read_page(host, 2, host->spare_only);
  1074. send_read_page(host, 3, host->spare_only);
  1075. }
  1076. } else {
  1077. send_read_page(host, 0, host->spare_only);
  1078. }
  1079. break;
  1080. case NAND_CMD_READID:
  1081. host->col_addr = 0;
  1082. send_read_id(host);
  1083. break;
  1084. case NAND_CMD_PAGEPROG:
  1085. break;
  1086. case NAND_CMD_STATUS:
  1087. break;
  1088. case NAND_CMD_ERASE2:
  1089. break;
  1090. }
  1091. }
  1092. #ifdef MXC_NFC_V1_1
  1093. static void mxc_setup_config1(void)
  1094. {
  1095. uint16_t tmp;
  1096. tmp = readw(&host->regs->nfc_config1);
  1097. tmp |= NFC_ONE_CYCLE;
  1098. tmp |= NFC_4_8N_ECC;
  1099. writew(tmp, &host->regs->nfc_config1);
  1100. if (host->pagesize_2k)
  1101. writew(64/2, &host->regs->nfc_spare_area_size);
  1102. else
  1103. writew(16/2, &host->regs->nfc_spare_area_size);
  1104. }
  1105. #else
  1106. #define mxc_setup_config1()
  1107. #endif
  1108. int board_nand_init(struct nand_chip *this)
  1109. {
  1110. struct mtd_info *mtd;
  1111. uint16_t tmp;
  1112. int err = 0;
  1113. /* structures must be linked */
  1114. mtd = &host->mtd;
  1115. mtd->priv = this;
  1116. host->nand = this;
  1117. /* 5 us command delay time */
  1118. this->chip_delay = 5;
  1119. this->priv = host;
  1120. this->dev_ready = mxc_nand_dev_ready;
  1121. this->cmdfunc = mxc_nand_command;
  1122. this->select_chip = mxc_nand_select_chip;
  1123. this->read_byte = mxc_nand_read_byte;
  1124. this->read_word = mxc_nand_read_word;
  1125. this->write_buf = mxc_nand_write_buf;
  1126. this->read_buf = mxc_nand_read_buf;
  1127. this->verify_buf = mxc_nand_verify_buf;
  1128. host->regs = (struct nfc_regs __iomem *)CONFIG_MXC_NAND_REGS_BASE;
  1129. host->clk_act = 1;
  1130. #ifdef CONFIG_MXC_NAND_HWECC
  1131. this->ecc.calculate = mxc_nand_calculate_ecc;
  1132. this->ecc.hwctl = mxc_nand_enable_hwecc;
  1133. this->ecc.correct = mxc_nand_correct_data;
  1134. if (is_mxc_nfc_11()) {
  1135. this->ecc.mode = NAND_ECC_HW_SYNDROME;
  1136. this->ecc.read_page = mxc_nand_read_page_syndrome;
  1137. this->ecc.read_page_raw = mxc_nand_read_page_raw_syndrome;
  1138. this->ecc.read_oob = mxc_nand_read_oob_syndrome;
  1139. this->ecc.write_page = mxc_nand_write_page_syndrome;
  1140. this->ecc.write_page_raw = mxc_nand_write_page_raw_syndrome;
  1141. this->ecc.write_oob = mxc_nand_write_oob_syndrome;
  1142. this->ecc.bytes = 9;
  1143. this->ecc.prepad = 7;
  1144. } else {
  1145. this->ecc.mode = NAND_ECC_HW;
  1146. }
  1147. host->pagesize_2k = 0;
  1148. this->ecc.size = 512;
  1149. tmp = readw(&host->regs->nfc_config1);
  1150. tmp |= NFC_ECC_EN;
  1151. writew(tmp, &host->regs->nfc_config1);
  1152. #else
  1153. this->ecc.layout = &nand_soft_eccoob;
  1154. this->ecc.mode = NAND_ECC_SOFT;
  1155. tmp = readw(&host->regs->nfc_config1);
  1156. tmp &= ~NFC_ECC_EN;
  1157. writew(tmp, &host->regs->nfc_config1);
  1158. #endif
  1159. /* Reset NAND */
  1160. this->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
  1161. /*
  1162. * preset operation
  1163. * Unlock the internal RAM Buffer
  1164. */
  1165. writew(0x2, &host->regs->nfc_config);
  1166. /* Blocks to be unlocked */
  1167. writew(0x0, &host->regs->nfc_unlockstart_blkaddr);
  1168. writew(0x4000, &host->regs->nfc_unlockend_blkaddr);
  1169. /* Unlock Block Command for given address range */
  1170. writew(0x4, &host->regs->nfc_wrprot);
  1171. /* NAND bus width determines access funtions used by upper layer */
  1172. if (is_16bit_nand())
  1173. this->options |= NAND_BUSWIDTH_16;
  1174. #ifdef CONFIG_SYS_NAND_LARGEPAGE
  1175. host->pagesize_2k = 1;
  1176. this->ecc.layout = &nand_hw_eccoob2k;
  1177. #else
  1178. host->pagesize_2k = 0;
  1179. this->ecc.layout = &nand_hw_eccoob;
  1180. #endif
  1181. mxc_setup_config1();
  1182. return err;
  1183. }