mxc_nand.c 35 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436
  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) || defined(CONFIG_MX35)
  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) || defined(CONFIG_MX35)
  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) || defined(CONFIG_MX35)
  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 initiate 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 initiate 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 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 always sends 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 */
  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 perform
  1042. * a read/write buffer operation, we will use the saved
  1043. * column address to index into the full page.
  1044. */
  1045. send_addr(host, 0);
  1046. if (host->pagesize_2k)
  1047. /* another col addr cycle for 2k page */
  1048. send_addr(host, 0);
  1049. }
  1050. /* Write out page address, if necessary */
  1051. if (page_addr != -1) {
  1052. u32 page_mask = nand_chip->pagemask;
  1053. do {
  1054. send_addr(host, page_addr & 0xFF);
  1055. page_addr >>= 8;
  1056. page_mask >>= 8;
  1057. } while (page_mask);
  1058. }
  1059. /* Command post-processing step */
  1060. switch (command) {
  1061. case NAND_CMD_RESET:
  1062. break;
  1063. case NAND_CMD_READOOB:
  1064. case NAND_CMD_READ0:
  1065. if (host->pagesize_2k) {
  1066. /* send read confirm command */
  1067. send_cmd(host, NAND_CMD_READSTART);
  1068. /* read for each AREA */
  1069. send_read_page(host, 0, host->spare_only);
  1070. if (!is_mxc_nfc_11()) {
  1071. send_read_page(host, 1, host->spare_only);
  1072. send_read_page(host, 2, host->spare_only);
  1073. send_read_page(host, 3, host->spare_only);
  1074. }
  1075. } else {
  1076. send_read_page(host, 0, host->spare_only);
  1077. }
  1078. break;
  1079. case NAND_CMD_READID:
  1080. host->col_addr = 0;
  1081. send_read_id(host);
  1082. break;
  1083. case NAND_CMD_PAGEPROG:
  1084. break;
  1085. case NAND_CMD_STATUS:
  1086. break;
  1087. case NAND_CMD_ERASE2:
  1088. break;
  1089. }
  1090. }
  1091. #ifdef MXC_NFC_V1_1
  1092. static void mxc_setup_config1(void)
  1093. {
  1094. uint16_t tmp;
  1095. tmp = readw(&host->regs->nfc_config1);
  1096. tmp |= NFC_ONE_CYCLE;
  1097. tmp |= NFC_4_8N_ECC;
  1098. writew(tmp, &host->regs->nfc_config1);
  1099. if (host->pagesize_2k)
  1100. writew(64/2, &host->regs->nfc_spare_area_size);
  1101. else
  1102. writew(16/2, &host->regs->nfc_spare_area_size);
  1103. }
  1104. #else
  1105. #define mxc_setup_config1()
  1106. #endif
  1107. #ifdef CONFIG_SYS_NAND_USE_FLASH_BBT
  1108. static u8 bbt_pattern[] = {'B', 'b', 't', '0' };
  1109. static u8 mirror_pattern[] = {'1', 't', 'b', 'B' };
  1110. static struct nand_bbt_descr bbt_main_descr = {
  1111. .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE |
  1112. NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
  1113. .offs = 0,
  1114. .len = 4,
  1115. .veroffs = 4,
  1116. .maxblocks = 4,
  1117. .pattern = bbt_pattern,
  1118. };
  1119. static struct nand_bbt_descr bbt_mirror_descr = {
  1120. .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE |
  1121. NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
  1122. .offs = 0,
  1123. .len = 4,
  1124. .veroffs = 4,
  1125. .maxblocks = 4,
  1126. .pattern = mirror_pattern,
  1127. };
  1128. #endif
  1129. int board_nand_init(struct nand_chip *this)
  1130. {
  1131. struct mtd_info *mtd;
  1132. uint16_t tmp;
  1133. int err = 0;
  1134. #ifdef CONFIG_SYS_NAND_USE_FLASH_BBT
  1135. this->options |= NAND_USE_FLASH_BBT;
  1136. this->bbt_td = &bbt_main_descr;
  1137. this->bbt_md = &bbt_mirror_descr;
  1138. #endif
  1139. /* structures must be linked */
  1140. mtd = &host->mtd;
  1141. mtd->priv = this;
  1142. host->nand = this;
  1143. /* 5 us command delay time */
  1144. this->chip_delay = 5;
  1145. this->priv = host;
  1146. this->dev_ready = mxc_nand_dev_ready;
  1147. this->cmdfunc = mxc_nand_command;
  1148. this->select_chip = mxc_nand_select_chip;
  1149. this->read_byte = mxc_nand_read_byte;
  1150. this->read_word = mxc_nand_read_word;
  1151. this->write_buf = mxc_nand_write_buf;
  1152. this->read_buf = mxc_nand_read_buf;
  1153. this->verify_buf = mxc_nand_verify_buf;
  1154. host->regs = (struct nfc_regs __iomem *)CONFIG_MXC_NAND_REGS_BASE;
  1155. host->clk_act = 1;
  1156. #ifdef CONFIG_MXC_NAND_HWECC
  1157. this->ecc.calculate = mxc_nand_calculate_ecc;
  1158. this->ecc.hwctl = mxc_nand_enable_hwecc;
  1159. this->ecc.correct = mxc_nand_correct_data;
  1160. if (is_mxc_nfc_11()) {
  1161. this->ecc.mode = NAND_ECC_HW_SYNDROME;
  1162. this->ecc.read_page = mxc_nand_read_page_syndrome;
  1163. this->ecc.read_page_raw = mxc_nand_read_page_raw_syndrome;
  1164. this->ecc.read_oob = mxc_nand_read_oob_syndrome;
  1165. this->ecc.write_page = mxc_nand_write_page_syndrome;
  1166. this->ecc.write_page_raw = mxc_nand_write_page_raw_syndrome;
  1167. this->ecc.write_oob = mxc_nand_write_oob_syndrome;
  1168. this->ecc.bytes = 9;
  1169. this->ecc.prepad = 7;
  1170. } else {
  1171. this->ecc.mode = NAND_ECC_HW;
  1172. }
  1173. host->pagesize_2k = 0;
  1174. this->ecc.size = 512;
  1175. tmp = readw(&host->regs->nfc_config1);
  1176. tmp |= NFC_ECC_EN;
  1177. writew(tmp, &host->regs->nfc_config1);
  1178. #else
  1179. this->ecc.layout = &nand_soft_eccoob;
  1180. this->ecc.mode = NAND_ECC_SOFT;
  1181. tmp = readw(&host->regs->nfc_config1);
  1182. tmp &= ~NFC_ECC_EN;
  1183. writew(tmp, &host->regs->nfc_config1);
  1184. #endif
  1185. /* Reset NAND */
  1186. this->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
  1187. /*
  1188. * preset operation
  1189. * Unlock the internal RAM Buffer
  1190. */
  1191. writew(0x2, &host->regs->nfc_config);
  1192. /* Blocks to be unlocked */
  1193. writew(0x0, &host->regs->nfc_unlockstart_blkaddr);
  1194. /* Originally (Freescale LTIB 2.6.21) 0x4000 was written to the
  1195. * unlockend_blkaddr, but the magic 0x4000 does not always work
  1196. * when writing more than some 32 megabytes (on 2k page nands)
  1197. * However 0xFFFF doesn't seem to have this kind
  1198. * of limitation (tried it back and forth several times).
  1199. * The linux kernel driver sets this to 0xFFFF for the v2 controller
  1200. * only, but probably this was not tested there for v1.
  1201. * The very same limitation seems to apply to this kernel driver.
  1202. * This might be NAND chip specific and the i.MX31 datasheet is
  1203. * extremely vague about the semantics of this register.
  1204. */
  1205. writew(0xFFFF, &host->regs->nfc_unlockend_blkaddr);
  1206. /* Unlock Block Command for given address range */
  1207. writew(0x4, &host->regs->nfc_wrprot);
  1208. /* NAND bus width determines access functions used by upper layer */
  1209. if (is_16bit_nand())
  1210. this->options |= NAND_BUSWIDTH_16;
  1211. #ifdef CONFIG_SYS_NAND_LARGEPAGE
  1212. host->pagesize_2k = 1;
  1213. this->ecc.layout = &nand_hw_eccoob2k;
  1214. #else
  1215. host->pagesize_2k = 0;
  1216. this->ecc.layout = &nand_hw_eccoob;
  1217. #endif
  1218. mxc_setup_config1();
  1219. return err;
  1220. }