ark_nand.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901
  1. /*
  2. * This program is free software; you can redistribute it and/or modify
  3. * it under the terms of the GNU General Public License as published by
  4. * the Free Software Foundation; either version 2 of the License, or
  5. * (at your option) any later version.
  6. *
  7. * This program is distributed in the hope that it will be useful,
  8. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. * GNU General Public License for more details.
  11. */
  12. #include <linux/dma-mapping.h>
  13. #include <linux/slab.h>
  14. #include <linux/module.h>
  15. #include <linux/moduleparam.h>
  16. #include <linux/platform_device.h>
  17. #include <linux/of.h>
  18. #include <linux/of_device.h>
  19. #include <linux/of_gpio.h>
  20. #include <linux/mtd/mtd.h>
  21. #include <linux/mtd/rawnand.h>
  22. #include <linux/mtd/partitions.h>
  23. #include <linux/of_address.h>
  24. #include <linux/of_irq.h>
  25. #include <linux/of_platform.h>
  26. #include <linux/clk.h>
  27. #include <linux/delay.h>
  28. #include <linux/dmaengine.h>
  29. #include <linux/gpio.h>
  30. #include <linux/interrupt.h>
  31. #include <linux/iopoll.h>
  32. #include <linux/reset.h>
  33. /* NAND Flash Controller */
  34. #define rNAND_CR (0x00)
  35. #define rNAND_CLE_WR (0x04)
  36. #define rNAND_ALE_WR (0x08)
  37. #define rNAND_ID_RD (0x0c)
  38. #define rNAND_STATUS_RD (0x10)
  39. #define rNAND_DATA (0x14)
  40. #define rNAND_TX_FIFO (0x18)
  41. #define rNAND_RX_FIFO (0x1c)
  42. #define rNAND_WRBLK_START (0x20)
  43. #define rNAND_RDBLK_START (0x24)
  44. #define rEX_BCH_ENCODE_STATUS (0x274)
  45. #define rEX_BCH_DECODE_STATUS (0x278)
  46. #define rBCH_CR (0x27c)
  47. #define rBCH_NAND_STATUS (0x280)
  48. #define rBCH_DECODE_STATUS (0x284)
  49. #define rBCH_INT (0x288)
  50. #define rBCH_INT_MASK (0x28c)
  51. #define rNAND_DMA_CTRL (0x290)
  52. #define rNAND_GLOBAL_CTL (0x294)
  53. #define rNAND_JUMP_CTL (0x298)
  54. #define EX_BCH_ENCODE_RESULT_ADDR (0x1d0)
  55. #define EX_BCH_DECODE_RESULT_ADDR (0x29c)
  56. #define NAND_INT_GLOBAL (1<<3)
  57. #define NAND_INT_DECODE_ERR (1<<2)
  58. #define NAND_INT_DECODE_END (1<<1)
  59. #define NAND_INT_ENCODE_END (1<<0)
  60. //BCH_CR register fields defination
  61. #define BCH_CR_SECTOR_MODE (1<<8)
  62. #define BCH_CR_SECTOR_LENGTH (1<<7)
  63. #define BCH_CR_ENCODER_RESET (1<<3)
  64. #define BCH_CR_DECODER_RESET (1<<2)
  65. #define BCH_CR_SOFT_ECC_ENABLE (1<<1)
  66. #define BCH_CR_BCH_ENABLE (1<<0)
  67. #define BCH_7BIT_SEL 0x0
  68. #define BCH_13BIT_SEL 0x1
  69. #define BCH_24BIT_SEL 0x2
  70. #define BCH_30BIT_SEL 0x3
  71. #define BCH_36BIT_SEL 0x4
  72. #define BCH_BIT_SEL(x) ((x)<<4)
  73. #define BIT_7_ECC_BYTE 13
  74. #define BIT_13_ECC_BYTE 23
  75. #define BIT_24_ECC_BYTE 42
  76. #define BIT_30_ECC_BYTE 53
  77. #define BIT_48_ECC_BYTE 84
  78. #define ARK_NAND_MAX_CHIPS 1
  79. #define ARK_NAND_ADDR_UNALIGNED 0x1
  80. #define ARK_NAND_LEN_UNALIGNED 0x2
  81. //#define USE_DATA_INTERFACE 1
  82. struct ark_nfc {
  83. struct nand_controller controller;
  84. struct device *dev;
  85. void __iomem *regs;
  86. struct reset_control *reset;
  87. unsigned long assigned_cs;
  88. unsigned long clk_rate;
  89. int max_chips;
  90. int chip_num;
  91. int raw_rw;
  92. struct nand_chip nand;
  93. struct completion complete;
  94. };
  95. static inline struct ark_nfc *to_ark_nfc(struct nand_chip *nand)
  96. {
  97. return container_of(nand, struct ark_nfc, nand);
  98. }
  99. static irqreturn_t ark_nfc_interrupt(int irq, void *dev_id)
  100. {
  101. return IRQ_HANDLED;
  102. }
  103. static void ark_nand_enable_hwecc(struct mtd_info *mtd, int mode)
  104. {
  105. struct nand_chip *chip = mtd_to_nand(mtd);
  106. struct ark_nfc *nfc = to_ark_nfc(chip);
  107. //printk("ark_nand_enable_hwecc\n");
  108. switch(mode){
  109. case NAND_ECC_READ:
  110. writel(readl(nfc->regs + rBCH_CR) | BCH_CR_SECTOR_MODE,
  111. nfc->regs + rBCH_CR);
  112. writel(readl(nfc->regs + rBCH_CR) | BCH_CR_DECODER_RESET,
  113. nfc->regs + rBCH_CR);
  114. writel(readl(nfc->regs + rBCH_CR) & ~BCH_CR_DECODER_RESET,
  115. nfc->regs + rBCH_CR);
  116. writel(readl(nfc->regs + rBCH_CR) | (BCH_CR_SOFT_ECC_ENABLE|BCH_CR_BCH_ENABLE),
  117. nfc->regs + rBCH_CR);
  118. #ifndef USE_DATA_INTERFACE
  119. //spin_lock(&nfc->lock);
  120. //nfc->bch_int_status = 0;
  121. //spin_unlock(&nfc->lock);
  122. writel(1, nfc->regs + rNAND_RDBLK_START);
  123. #endif
  124. break;
  125. case NAND_ECC_WRITE:
  126. writel(readl(nfc->regs + rBCH_CR) | BCH_CR_SECTOR_MODE,
  127. nfc->regs + rBCH_CR);
  128. writel(readl(nfc->regs + rBCH_CR) | BCH_CR_ENCODER_RESET,
  129. nfc->regs + rBCH_CR);
  130. writel(readl(nfc->regs + rBCH_CR) & ~BCH_CR_ENCODER_RESET,
  131. nfc->regs + rBCH_CR);
  132. writel(readl(nfc->regs + rBCH_CR) | (BCH_CR_SOFT_ECC_ENABLE|BCH_CR_BCH_ENABLE),
  133. nfc->regs + rBCH_CR);
  134. #ifndef USE_DATA_INTERFACE
  135. //spin_lock(&nfc->lock);
  136. //nfc->bch_int_status = 0;
  137. //spin_unlock(&nfc->lock);
  138. writel(1, nfc->regs + rNAND_WRBLK_START);
  139. #endif
  140. break;
  141. case NAND_ECC_READSYN:
  142. #ifndef USE_DATA_INTERFACE
  143. /* wait for data decode end while useing block process */
  144. //wait_event(nfc->irq_waitq, nfc->bch_int_status & NAND_INT_DECODE_END);
  145. while(!(readl(nfc->regs + rBCH_INT) & NAND_INT_DECODE_END));
  146. writel(1, nfc->regs + rBCH_INT);
  147. #endif
  148. break;
  149. }
  150. return;
  151. }
  152. static int ark_nand_calculate_ecc(struct mtd_info *mtd, const uint8_t *dat,
  153. uint8_t *ecc_code)
  154. {
  155. struct nand_chip *chip = mtd_to_nand(mtd);
  156. struct ark_nfc *nfc = to_ark_nfc(chip);
  157. unsigned int bch_encode_no = 0;
  158. int i;
  159. union{
  160. unsigned int word;
  161. unsigned char byte[4];
  162. } tmp;
  163. //printk("ark_nand_calculate_ecc\n");
  164. #ifndef USE_DATA_INTERFACE
  165. //wait_event(nfc->irq_waitq, info->bch_int_status & NAND_INT_ENCODE_END);
  166. while(!(readl(nfc->regs + rBCH_INT) & NAND_INT_ENCODE_END));
  167. writel(1, nfc->regs + rBCH_INT);
  168. #endif
  169. writel(readl(nfc->regs + rBCH_CR) & ~BCH_CR_BCH_ENABLE,
  170. nfc->regs + rBCH_CR); //disable BCH for write ECC Code
  171. #ifdef USE_DATA_INTERFACE
  172. while((readl(nfc->regs + rBCH_NAND_STATUS) & 0x3F) != 0 ); //wait for fsm to idle state
  173. #else
  174. while((readl(nfc->regs + rBCH_NAND_STATUS) >> 14) & 0x0F); //wait for all data in fifo to be transfered over.
  175. while((readl(nfc->regs + rBCH_NAND_STATUS) & 0x3F) != 0 );//wait for fsm to idle state
  176. #endif
  177. switch(chip->ecc.bytes){
  178. case BIT_7_ECC_BYTE:
  179. bch_encode_no = 4;
  180. break;
  181. case BIT_13_ECC_BYTE:
  182. bch_encode_no = 6;
  183. break;
  184. case BIT_24_ECC_BYTE:
  185. bch_encode_no = 11;
  186. break;
  187. case BIT_30_ECC_BYTE:
  188. bch_encode_no = 14;
  189. break;
  190. case BIT_48_ECC_BYTE:
  191. bch_encode_no = 21;
  192. break;
  193. }
  194. for(i = 0; i < bch_encode_no; i++){
  195. tmp.word = readl(nfc->regs + (EX_BCH_ENCODE_RESULT_ADDR + i*4));
  196. *ecc_code++ = tmp.byte[0];
  197. *ecc_code++ = tmp.byte[1];
  198. *ecc_code++ = tmp.byte[2];
  199. *ecc_code++ = tmp.byte[3];
  200. }
  201. return 0;
  202. }
  203. static int ark_nand_correct_data(struct mtd_info *mtd, uint8_t *dat, uint8_t *read_ecc,
  204. uint8_t *calc_ecc)
  205. {
  206. struct nand_chip *chip = mtd_to_nand(mtd);
  207. struct ark_nfc *nfc = to_ark_nfc(chip);
  208. unsigned int bch_encode_no = 0;
  209. unsigned int bch_decode_no = 0;
  210. unsigned char bch_decode_status;
  211. unsigned int err_byte_addr[2];
  212. unsigned int err_bit_addr[2];
  213. int i, ret = 0;
  214. //printk("ark_nand_correct_data\n");
  215. switch(chip->ecc.bytes){
  216. case BIT_7_ECC_BYTE:
  217. bch_encode_no = 4;
  218. bch_decode_no = 4; /* no. of loops to correct 2 bits per loop */
  219. break;
  220. case BIT_13_ECC_BYTE:
  221. bch_encode_no = 6;
  222. bch_decode_no = 7;
  223. break;
  224. case BIT_24_ECC_BYTE:
  225. bch_encode_no = 11;
  226. bch_decode_no = 12;
  227. break;
  228. case BIT_30_ECC_BYTE:
  229. bch_encode_no = 14;
  230. bch_decode_no = 15;
  231. break;
  232. case BIT_48_ECC_BYTE:
  233. bch_encode_no = 21;
  234. bch_decode_no = 24;
  235. break;
  236. }
  237. //wait for ecc data read end
  238. while(readl(nfc->regs + rEX_BCH_DECODE_STATUS) & 0x01);
  239. bch_decode_status = (unsigned char)(readl(nfc->regs + rEX_BCH_DECODE_STATUS) & 0x7);
  240. if(bch_decode_status & 0x2){
  241. /* All data correct */
  242. }else if(bch_decode_status & 0x4){ //err more than 8 bit
  243. writel(readl(nfc->regs + rBCH_CR) & ~BCH_CR_BCH_ENABLE,
  244. nfc->regs + rBCH_CR);
  245. pr_err("%s: uncorrectable ECC error\n", __func__);
  246. return -EBADMSG;
  247. }else{
  248. for(i=0; i<bch_decode_no; i++){
  249. unsigned int val;
  250. val = readl(nfc->regs + (EX_BCH_DECODE_RESULT_ADDR+4*i));
  251. err_byte_addr[0] = (val&0x3ff8)>>3;
  252. err_bit_addr[0] = val&0x7;
  253. val = val >> 14;
  254. err_byte_addr[1] = (val&0x3ff8)>>3;
  255. err_bit_addr[1] = val&0x7;
  256. if(err_byte_addr[0] < 1024){
  257. (*(dat+err_byte_addr[0]) )^= (1<<err_bit_addr[0]);
  258. ret++;
  259. }
  260. if(err_byte_addr[1] < 1024){
  261. (*(dat+err_byte_addr[1]) )^= (1<<err_bit_addr[1]);
  262. ret++;
  263. }
  264. }
  265. }
  266. return ret;
  267. }
  268. /**
  269. * ark_nand_read_page_syndrome - hardware ecc syndrom based page read
  270. * @mtd: mtd info structure
  271. * @chip: nand chip info structure
  272. * @buf: buffer to store read data
  273. * @page: page number to read
  274. *
  275. */
  276. static int ark_nand_read_page_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
  277. uint8_t *buf, int oob_required, int page)
  278. {
  279. struct ark_nfc *nfc = to_ark_nfc(chip);
  280. struct mtd_oob_region oobregion;
  281. int i, eccsize = chip->ecc.size;
  282. int eccbytes = chip->ecc.bytes;
  283. int eccsteps = chip->ecc.steps;
  284. uint8_t *p = buf;
  285. uint8_t *oob = chip->oob_poi;
  286. int oob_pos = 0, pos = 0;
  287. //printk("ark_nand_read_page_syndrome\n");
  288. chip->cmdfunc(mtd, NAND_CMD_READ0, 0x00, page);
  289. oob_pos += mtd->writesize;
  290. mtd_ooblayout_ecc(mtd, 0, &oobregion);
  291. oob_pos += oobregion.offset;
  292. oob += oobregion.offset;
  293. //printk("ark_nand_read_page_syndrome oobregion.offset = %d\n",oobregion.offset);
  294. //writel(1,nfc->regs + rBCH_NAND_STATUS);
  295. for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
  296. int stat;
  297. chip->ecc.hwctl(mtd, NAND_ECC_READ);
  298. chip->read_buf(mtd, p, eccsize);
  299. chip->ecc.hwctl(mtd, NAND_ECC_READSYN);
  300. if (mtd->writesize > 512){
  301. chip->cmdfunc(mtd, NAND_CMD_RNDOUT, oob_pos, -1);
  302. }else{
  303. chip->cmdfunc(mtd, NAND_CMD_READ0, oob_pos, page);
  304. }
  305. oob_pos += eccbytes;
  306. chip->read_buf(mtd, oob, eccbytes);
  307. stat = chip->ecc.correct(mtd, p, oob, NULL);
  308. oob += eccbytes;
  309. if(eccsteps > 1){
  310. pos += eccsize;
  311. if (mtd->writesize > 512){
  312. chip->cmdfunc(mtd, NAND_CMD_RNDOUT, pos, -1);
  313. }else{
  314. chip->cmdfunc(mtd, NAND_CMD_READ0, pos, page);
  315. }
  316. }
  317. }
  318. writel(1, nfc->regs + rBCH_INT);
  319. writel(readl(nfc->regs + rBCH_CR) & ~BCH_CR_BCH_ENABLE, nfc->regs + rBCH_CR);
  320. if (oob_required){
  321. oob_pos = mtd->writesize;
  322. if (mtd->writesize > 512){
  323. chip->cmdfunc(mtd, NAND_CMD_RNDOUT, oob_pos, -1);
  324. }else{
  325. chip->cmdfunc(mtd, NAND_CMD_READ0, oob_pos, page);
  326. }
  327. chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
  328. }
  329. return 0;
  330. }
  331. /**
  332. * ark_nand_write_page_syndrome - hardware ecc syndrom based page write
  333. * @mtd: mtd info structure
  334. * @chip: nand chip info structure
  335. * @buf: data buffer
  336. *
  337. * The hw generator calculates the error syndrome automatically. Therefor
  338. * we need a special oob layout and handling.
  339. */
  340. static int ark_nand_write_page_syndrome(struct mtd_info *mtd,
  341. struct nand_chip *chip, const uint8_t *buf,
  342. int oob_required, int page)
  343. {
  344. struct mtd_oob_region oobregion;
  345. int i, eccsize = chip->ecc.size;
  346. int eccbytes = chip->ecc.bytes;
  347. int eccsteps = chip->ecc.steps;
  348. const uint8_t *p = buf;
  349. uint8_t *oob = chip->oob_poi;
  350. int status;
  351. //printk("ark_nand_write_page_syndrome\n");
  352. chip->cmdfunc(mtd, NAND_CMD_SEQIN, 0x00, page);
  353. mtd_ooblayout_ecc(mtd, 0, &oobregion);
  354. oob += oobregion.offset;
  355. for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
  356. chip->ecc.hwctl(mtd, NAND_ECC_WRITE);
  357. chip->write_buf(mtd, p, eccsize);
  358. chip->ecc.calculate(mtd, p, oob);
  359. oob += eccbytes;
  360. }
  361. chip->write_buf(mtd, chip->oob_poi, mtd->oobsize);
  362. chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1);
  363. status = chip->waitfunc(mtd, chip);
  364. if (status & NAND_STATUS_FAIL)
  365. return -EIO;
  366. return 0;
  367. }
  368. static int ark_nand_hw_syndrome_ecc_ctrl_init(struct mtd_info *mtd, struct nand_ecc_ctrl *ecc)
  369. {
  370. struct nand_chip *chip = mtd_to_nand(mtd);
  371. struct ark_nfc *nfc = to_ark_nfc(chip);
  372. u32 val;
  373. ecc->calculate = ark_nand_calculate_ecc;
  374. ecc->hwctl = ark_nand_enable_hwecc;
  375. ecc->correct = ark_nand_correct_data;
  376. ecc->read_page = ark_nand_read_page_syndrome;
  377. ecc->write_page = ark_nand_write_page_syndrome;
  378. ecc->size = 1024;
  379. if (mtd->oobsize == 64) {
  380. ecc->bytes = BIT_13_ECC_BYTE;
  381. ecc->strength = 13;
  382. val = BCH_CR_SECTOR_MODE | BCH_CR_SECTOR_LENGTH | BCH_BIT_SEL(BCH_13BIT_SEL) | BCH_CR_BCH_ENABLE;
  383. writel(val, nfc->regs + rBCH_CR);
  384. } else if(mtd->oobsize >= 128) {
  385. ecc->bytes = BIT_24_ECC_BYTE;
  386. ecc->strength = 24;
  387. val = BCH_CR_SECTOR_MODE | BCH_CR_SECTOR_LENGTH | BCH_BIT_SEL(BCH_24BIT_SEL) | BCH_CR_BCH_ENABLE;
  388. writel(val, nfc->regs + rBCH_CR);
  389. }
  390. mtd_set_ooblayout(mtd, &nand_ooblayout_lp_ops);
  391. return 0;
  392. }
  393. static int ark_nand_ecc_init(struct mtd_info *mtd, struct nand_ecc_ctrl *ecc)
  394. {
  395. int ret;
  396. switch (ecc->mode) {
  397. case NAND_ECC_HW_SYNDROME:
  398. ret = ark_nand_hw_syndrome_ecc_ctrl_init(mtd, ecc);
  399. if (ret)
  400. return ret;
  401. break;
  402. case NAND_ECC_HW:
  403. case NAND_ECC_NONE:
  404. case NAND_ECC_SOFT:
  405. break;
  406. default:
  407. return -EINVAL;
  408. }
  409. return 0;
  410. }
  411. static void ark_nfc_select_chip(struct mtd_info *mtd, int chipnr)
  412. {
  413. struct nand_chip *chip = mtd_to_nand(mtd);
  414. struct ark_nfc *nfc = to_ark_nfc(chip);
  415. unsigned int nand_cr;
  416. //printk("ark_nand_select_chip\n");
  417. if(chipnr == -1){
  418. chip->cmd_ctrl(mtd, NAND_CMD_NONE, 0 | NAND_CTRL_CHANGE);
  419. return;
  420. }
  421. if(chipnr < nfc->max_chips){
  422. nand_cr = readl(nfc->regs + rNAND_CR);
  423. nand_cr &= ~(0x3<<23);
  424. nand_cr |= (chipnr<<23);
  425. writel(nand_cr, nfc->regs + rNAND_CR);
  426. nfc->chip_num = chipnr;
  427. }
  428. return;
  429. }
  430. static void ark_nfc_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl)
  431. {
  432. struct nand_chip *chip = mtd_to_nand(mtd);
  433. struct ark_nfc *nfc = to_ark_nfc(chip);
  434. //printk("ark_nand_hwcontrol\n");
  435. /*
  436. * Point the IO_ADDR to DATA and ADDRESS registers instead
  437. * of chip address
  438. */
  439. switch (ctrl) {
  440. case NAND_CTRL_CHANGE | NAND_CTRL_CLE:
  441. //printk("CLE\n");
  442. chip->IO_ADDR_W = (void __iomem *)(nfc->regs + rNAND_CLE_WR);
  443. break;
  444. case NAND_CTRL_CHANGE | NAND_CTRL_ALE:
  445. //printk("ALE\n");
  446. chip->IO_ADDR_W = (void __iomem *)(nfc->regs + rNAND_ALE_WR);
  447. break;
  448. case NAND_CTRL_CHANGE:
  449. /* Must be a 32-bit write at ARK1680 NFC */
  450. //printk("CHANGE\n");
  451. chip->IO_ADDR_W = (void __iomem *)(nfc->regs + rNAND_DATA);
  452. break;
  453. }
  454. if(ctrl & NAND_NCE){
  455. ; /* TODO: Chip Enable activate */
  456. }else{
  457. ; /* TODO: Chip Enable de-activate */
  458. }
  459. if (cmd != NAND_CMD_NONE){
  460. //printk("cmd: 0x%x\n",cmd);
  461. writeb(cmd, chip->IO_ADDR_W);
  462. }
  463. return;
  464. }
  465. static int ark_nfc_dev_ready(struct mtd_info *mtd)
  466. {
  467. struct nand_chip *chip = mtd_to_nand(mtd);
  468. struct ark_nfc *nfc = to_ark_nfc(chip);
  469. //return readl(rBCH_NAND_STATUS) & (1 << (18 + nand_info->chip_num));
  470. return readl(nfc->regs + rBCH_NAND_STATUS) & (1 << (6 + nfc->chip_num));
  471. }
  472. static void ark_nfc_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
  473. {
  474. struct nand_chip *chip = mtd_to_nand(mtd);
  475. struct ark_nfc *nfc = to_ark_nfc(chip);
  476. int i;
  477. unsigned int* tmp_buf32;
  478. uint8_t* tmp_buf8;
  479. unsigned int unaligned_flag = 0;
  480. unsigned int excess_len;
  481. unsigned int addr_aligned;
  482. unsigned int read_addr = rNAND_DATA;
  483. union{
  484. unsigned int word;
  485. unsigned char byte[4];
  486. } tmp;
  487. //printk("ark_nand_read_buf\n");
  488. addr_aligned = ((unsigned int)buf)%4;
  489. if(addr_aligned){ // Address not aligned to 32 bit word
  490. unaligned_flag |= ARK_NAND_ADDR_UNALIGNED;
  491. }
  492. excess_len = len%4;
  493. if(excess_len){ // length not aligned to 32 bit word
  494. unaligned_flag |= ARK_NAND_LEN_UNALIGNED;
  495. }
  496. #ifndef USE_DATA_INTERFACE
  497. if (len >= chip->ecc.size && !nfc->raw_rw)
  498. read_addr = rNAND_RX_FIFO;
  499. #endif
  500. switch(unaligned_flag){
  501. case 0:
  502. tmp_buf32 = (unsigned int*)buf;
  503. for (i = 0; i < len >> 2; i++){
  504. *tmp_buf32++ = readl(nfc->regs + read_addr);
  505. }
  506. break;
  507. case ARK_NAND_ADDR_UNALIGNED:
  508. tmp_buf8 = buf;
  509. for (i = 0; i < len >> 2; i++){
  510. tmp.word = readl(nfc->regs + read_addr);
  511. *tmp_buf8++ = tmp.byte[0];
  512. *tmp_buf8++ = tmp.byte[1];
  513. *tmp_buf8++ = tmp.byte[2];
  514. *tmp_buf8++ = tmp.byte[3];
  515. }
  516. break;
  517. case ARK_NAND_LEN_UNALIGNED:
  518. tmp_buf32 = (unsigned int*)buf;
  519. for (i = 0; i < len >> 2; i++){
  520. *tmp_buf32++ = readl(nfc->regs + read_addr);
  521. }
  522. /* read the excess byte */
  523. tmp_buf8 = (uint8_t*)tmp_buf32;
  524. tmp.word = readl(nfc->regs + read_addr);
  525. for(i = 0; i < excess_len; i++){
  526. *tmp_buf8++ = tmp.byte[i];
  527. }
  528. break;
  529. case ARK_NAND_ADDR_UNALIGNED | ARK_NAND_LEN_UNALIGNED:
  530. tmp_buf8 = buf;
  531. for (i = 0; i < len >> 2; i++){
  532. tmp.word = readl(nfc->regs + read_addr);
  533. *tmp_buf8++ = tmp.byte[0];
  534. *tmp_buf8++ = tmp.byte[1];
  535. *tmp_buf8++ = tmp.byte[2];
  536. *tmp_buf8++ = tmp.byte[3];
  537. }
  538. /* read the excess byte */
  539. tmp.word = readl(nfc->regs + read_addr);
  540. for(i = 0; i < excess_len; i++){
  541. *tmp_buf8++ = tmp.byte[i];
  542. }
  543. break;
  544. }
  545. return;
  546. }
  547. static void ark_nfc_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len)
  548. {
  549. struct nand_chip *chip = mtd_to_nand(mtd);
  550. struct ark_nfc *nfc = to_ark_nfc(chip);
  551. int i;
  552. unsigned int* tmp_buf32;
  553. uint8_t* tmp_buf8;
  554. unsigned int unaligned_flag = 0;
  555. unsigned int excess_len;
  556. unsigned int addr_aligned;
  557. unsigned int write_addr = rNAND_DATA;
  558. union{
  559. unsigned int word;
  560. unsigned char byte[4];
  561. } tmp;
  562. //printk("ark_nand_write_buf\n");
  563. tmp.word = 0xFFFFFFFF;
  564. addr_aligned = (unsigned int)buf % 4;
  565. if(addr_aligned){ // Address not aligned to 32 bit word
  566. unaligned_flag |= ARK_NAND_ADDR_UNALIGNED;
  567. }
  568. excess_len = len % 0x4;
  569. if(excess_len){ // length not aligned to 32 bit word
  570. unaligned_flag |= ARK_NAND_LEN_UNALIGNED;
  571. }
  572. #ifndef USE_DATA_INTERFACE
  573. if (len >= chip->ecc.size && !nfc->raw_rw)
  574. write_addr = rNAND_TX_FIFO;
  575. #endif
  576. switch(unaligned_flag){
  577. case 0:
  578. tmp_buf32 = (unsigned int*)buf;
  579. for (i = 0; i < len >> 2; i++){
  580. writel(*tmp_buf32++, nfc->regs + write_addr);
  581. }
  582. break;
  583. case ARK_NAND_ADDR_UNALIGNED:
  584. tmp_buf8 = (uint8_t*)buf;
  585. for (i = 0; i < len >> 2; i++){
  586. tmp.byte[0] = *tmp_buf8++;
  587. tmp.byte[1] = *tmp_buf8++;
  588. tmp.byte[2] = *tmp_buf8++;
  589. tmp.byte[3] = *tmp_buf8++;
  590. writel(tmp.word, nfc->regs + write_addr);
  591. }
  592. break;
  593. case ARK_NAND_LEN_UNALIGNED:
  594. tmp_buf32 = (unsigned int*)buf;
  595. for (i = 0; i < len >> 2; i++){
  596. writel(*tmp_buf32++, nfc->regs + write_addr);
  597. }
  598. /* write the excess byte */
  599. tmp_buf8 = (uint8_t*)tmp_buf32;
  600. tmp.word = 0xFFFFFFFF;
  601. for(i = 0; i < excess_len; i++){
  602. *tmp_buf8++ = tmp.byte[i];
  603. }
  604. writel(tmp.word, nfc->regs + write_addr);
  605. break;
  606. case ARK_NAND_ADDR_UNALIGNED | ARK_NAND_LEN_UNALIGNED:
  607. tmp_buf8 = (uint8_t*)buf;
  608. for (i = 0; i < len >> 2; i++){
  609. tmp.byte[0] = *tmp_buf8++;
  610. tmp.byte[1] = *tmp_buf8++;
  611. tmp.byte[2] = *tmp_buf8++;
  612. tmp.byte[3] = *tmp_buf8++;
  613. writel(tmp.word, nfc->regs + write_addr);
  614. }
  615. tmp.word = 0xFFFFFFFF;
  616. for(i = 0; i < excess_len; i++){
  617. *tmp_buf8++ = tmp.byte[i];
  618. }
  619. writel(tmp.word, nfc->regs + write_addr);
  620. break;
  621. }
  622. return;
  623. }
  624. static int ark_nand_chip_init(struct device *dev, struct ark_nfc *nfc)
  625. {
  626. struct mtd_info *mtd;
  627. struct nand_chip *nand;
  628. int ret;
  629. nand = &nfc->nand;
  630. nand->chip_delay = 100;
  631. nand->controller = &nfc->controller;
  632. /*
  633. * Set the ECC mode to the default value in case nothing is specified
  634. * in the DT.
  635. */
  636. nand_set_flash_node(nand, dev->of_node);
  637. nand->IO_ADDR_R = nfc->regs + rNAND_STATUS_RD;
  638. nand->IO_ADDR_W = nfc->regs + rNAND_DATA;
  639. nand->select_chip = ark_nfc_select_chip;
  640. nand->dev_ready = ark_nfc_dev_ready;
  641. nand->cmd_ctrl = ark_nfc_cmd_ctrl;
  642. nand->read_buf = ark_nfc_read_buf;
  643. nand->write_buf = ark_nfc_write_buf;
  644. mtd = nand_to_mtd(nand);
  645. mtd->name = "ark-nand";
  646. mtd->dev.parent = dev;
  647. ret = nand_scan(nand, ARK_NAND_MAX_CHIPS);
  648. if (ret)
  649. return ret;
  650. ret = mtd_device_register(mtd, NULL, 0);
  651. if (ret) {
  652. dev_err(dev, "failed to register mtd device: %d\n", ret);
  653. nand_release(nand);
  654. return ret;
  655. }
  656. return 0;
  657. }
  658. static void ark_nand_chips_cleanup(struct ark_nfc *nfc)
  659. {
  660. nand_release(&nfc->nand);
  661. }
  662. static int ark_nand_attach_chip(struct nand_chip *nand)
  663. {
  664. struct mtd_info *mtd = nand_to_mtd(nand);
  665. struct ark_nfc *nfc = container_of(nand, struct ark_nfc, nand);
  666. int ret;
  667. if (nand->bbt_options & NAND_BBT_USE_FLASH)
  668. nand->bbt_options |= NAND_BBT_NO_OOB;
  669. nand->options |= NAND_NO_SUBPAGE_WRITE;
  670. ret = ark_nand_ecc_init(mtd, &nand->ecc);
  671. if (ret) {
  672. dev_err(nfc->dev, "ECC init failed: %d\n", ret);
  673. return ret;
  674. }
  675. return 0;
  676. }
  677. static const struct nand_controller_ops ark_nand_controller_ops = {
  678. .attach_chip = ark_nand_attach_chip,
  679. };
  680. static int ark_nfc_probe(struct platform_device *pdev)
  681. {
  682. struct device *dev = &pdev->dev;
  683. struct ark_nfc *nfc;
  684. struct device_node *np = dev->of_node;
  685. int irq;
  686. int ret;
  687. u32 val;
  688. nfc = devm_kzalloc(dev, sizeof(*nfc), GFP_KERNEL);
  689. if (!nfc)
  690. return -ENOMEM;
  691. nfc->dev = dev;
  692. nand_controller_init(&nfc->controller);
  693. nfc->controller.ops = &ark_nand_controller_ops;
  694. nfc->raw_rw = 0;
  695. nfc->chip_num = 0;
  696. nfc->max_chips = 1;
  697. if (!of_property_read_u32(np, "max-chips", &val)) {
  698. nfc->max_chips = val;
  699. }
  700. nfc->regs = of_iomap(np, 0);
  701. if (IS_ERR(nfc->regs))
  702. return PTR_ERR(nfc->regs);
  703. irq = of_irq_get(np, 0);
  704. if (irq < 0) {
  705. dev_err(dev, "failed to retrieve irq\n");
  706. return irq;
  707. }
  708. ret = devm_request_irq(dev, irq, ark_nfc_interrupt,
  709. 0, "ark-nand", nfc);
  710. if (ret) {
  711. dev_err(dev, "failed to request irq %d.\n", irq);
  712. return ret;
  713. }
  714. platform_set_drvdata(pdev, nfc);
  715. ret = ark_nand_chip_init(dev, nfc);
  716. if (ret) {
  717. dev_err(dev, "failed to init nand chips\n");
  718. return ret;
  719. }
  720. return 0;
  721. }
  722. static int ark_nfc_remove(struct platform_device *pdev)
  723. {
  724. struct ark_nfc *nfc = platform_get_drvdata(pdev);
  725. ark_nand_chips_cleanup(nfc);
  726. return 0;
  727. }
  728. static const struct of_device_id ark_nfc_ids[] = {
  729. { .compatible = "arkmicro,ark-nand" },
  730. { /* sentinel */ }
  731. };
  732. MODULE_DEVICE_TABLE(of, ark_nfc_ids);
  733. static struct platform_driver ark_nfc_driver = {
  734. .driver = {
  735. .name = "ark_nand",
  736. .of_match_table = ark_nfc_ids,
  737. },
  738. .probe = ark_nfc_probe,
  739. .remove = ark_nfc_remove,
  740. };
  741. module_platform_driver(ark_nfc_driver);
  742. MODULE_AUTHOR("Sim");
  743. MODULE_DESCRIPTION("Arkmicro NAND Flash Controller driver");
  744. MODULE_LICENSE("GPL v2");