ark_nand.c 23 KB

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