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

嵌入式Linux

开发平台:

Unix_Linux

  1. /* -*- c-basic-offset: 2; tab-width: 8 -*-
  2.  * Based on nand_smc.c
  3.  *
  4.  * This program is free software; you can redistribute it and/or modify
  5.  * it under the terms of the GNU General Public License version 2 as
  6.  * published by the Free Software Foundation.
  7.  *
  8.  */
  9. #include <linux/config.h>
  10. #include <linux/module.h>
  11. #include <linux/kernel.h>
  12. #include <linux/delay.h>
  13. #include <linux/errno.h>
  14. #include <linux/sched.h>
  15. #include <linux/types.h>
  16. #include <linux/interrupt.h>
  17. #include <asm/io.h>
  18. #define CONFIG_MTD_DEBUG_VERBOSE 3
  19. #include <linux/mtd/mtd.h>
  20. #include <linux/mtd/nand.h>
  21. #include <linux/mtd/nand_ids.h>
  22. #include <linux/mtd/nand_ecc.h>
  23. /*
  24.  * Macros for low-level register control
  25.  */
  26. #define nand_select() this->hwcontrol(NAND_CTL_SETNCE); 
  27. nand_command(mtd, NAND_CMD_RESET, -1, -1); 
  28. udelay (10);
  29. #define nand_deselect() this->hwcontrol(NAND_CTL_CLRNCE);
  30. static inline void sm_swap(u_char *x, u_char *y) {
  31.     u_char tmp;
  32.     tmp = *x;
  33.     *x = *y;
  34.     *y = tmp;
  35. }
  36. /* define if you'll be using < 2M SMC device */
  37. #undef USE_256BYTE_NAND_FLASH
  38. /*
  39.  * Send command to NAND device
  40.  */
  41. static void nand_command (struct mtd_info *mtd, unsigned command,
  42. int column, int page_addr)
  43. {
  44. register struct nand_chip *this = mtd->priv;
  45. /* Begin command latch cycle */
  46. this->hwcontrol(NAND_CTL_SETCLE);
  47. this->hwcontrol(NAND_CTL_DAT_OUT);
  48. /*
  49.  * Write out the command to the device.
  50.  */
  51. if (command != NAND_CMD_SEQIN)
  52. this->write_cmd (command);
  53. else {
  54. if (mtd->oobblock == 256 && column >= 256) {
  55. column -= 256;
  56. this->write_cmd(NAND_CMD_RESET);
  57. this->write_cmd(NAND_CMD_READOOB);
  58. this->write_cmd(NAND_CMD_SEQIN);
  59. }
  60. else if (mtd->oobblock == 512 && column >= 256) {
  61. if (column < 512) {
  62. column -= 256;
  63. this->write_cmd(NAND_CMD_READ1);
  64. this->write_cmd(NAND_CMD_SEQIN);
  65. }
  66. else {
  67. column -= 512;
  68. this->write_cmd(NAND_CMD_READOOB);
  69. this->write_cmd(NAND_CMD_SEQIN);
  70. }
  71. }
  72. else {
  73. this->write_cmd(NAND_CMD_READ0);
  74. this->write_cmd(NAND_CMD_SEQIN);
  75. }
  76. }
  77. /* Set ALE and clear CLE to start address cycle */
  78. this->hwcontrol(NAND_CTL_CLRCLE);
  79. this->hwcontrol(NAND_CTL_SETALE);
  80. /* Serially input address */
  81. if (column != -1)
  82. this->write_addr (column);
  83. if (page_addr != -1) {
  84. this->write_addr ((u_char) (page_addr & 0xff));
  85. this->write_addr ((u_char) ((page_addr >> 8) & 0xff));
  86. /* One more address cycle for higher density devices */
  87. if (mtd->size & 0x0c000000) {
  88. this->write_addr ((u_char) ((page_addr >> 16) & 0x0f));
  89. }
  90. }
  91. /* Latch in address */
  92. this->hwcontrol(NAND_CTL_CLRALE);
  93. this->hwcontrol(NAND_CTL_DAT_IN);
  94. /* Pause for 15us */
  95. udelay (15);
  96. }
  97. /*
  98.  * NAND read
  99.  */
  100. static int nand_read (struct mtd_info *mtd, loff_t from, size_t len,
  101. size_t *retlen, u_char *buf)
  102. {
  103. int j, col, page, state;
  104. int erase_state = 0;
  105. struct nand_chip *this = mtd->priv;
  106. DECLARE_WAITQUEUE(wait, current);
  107. DEBUG (MTD_DEBUG_LEVEL3,
  108. __FUNCTION__ ": from = 0x%08x, len = %in",
  109. (unsigned int) from, (int) len);
  110. /* Do not allow reads past end of device */
  111. if ((from + len) > mtd->size) {
  112. DEBUG (MTD_DEBUG_LEVEL0,
  113. __FUNCTION__ ": Attempt read beyond end of devicen");
  114. *retlen = 0;
  115. return -EINVAL;
  116. }
  117. /* Grab the lock and see if the device is available */
  118. retry:
  119. spin_lock_bh (&this->chip_lock);
  120. switch (this->state) {
  121. case FL_READY:
  122. this->state = FL_READING;
  123. spin_unlock_bh (&this->chip_lock);
  124. break;
  125. case FL_ERASING:
  126. this->state = FL_READING;
  127. erase_state = 1;
  128. spin_unlock_bh (&this->chip_lock);
  129. break;
  130. default:
  131. set_current_state (TASK_UNINTERRUPTIBLE);
  132. add_wait_queue (&this->wq, &wait);
  133. spin_unlock_bh (&this->chip_lock);
  134. schedule();
  135. remove_wait_queue (&this->wq, &wait);
  136. goto retry;
  137. };
  138. /* First we calculate the starting page */
  139. page = from >> this->page_shift;
  140. /* Get raw starting column */
  141. col = from & (mtd->oobblock - 1);
  142. /* State machine for devices having pages larger than 256 bytes */
  143. state = (col < mtd->eccsize) ? 0 : 1;
  144. /* Calculate column address within ECC block context */
  145. col = (col >= mtd->eccsize) ? (col - mtd->eccsize) : col;
  146. /* Initialize return value */
  147. *retlen = 0;
  148. /* Select the NAND device */
  149. nand_select ();
  150. /* Loop until all data read */
  151. while (*retlen < len) {
  152. /* Send the read command */
  153. if (!state)
  154. nand_command (mtd, NAND_CMD_READ0, col, page);
  155. else 
  156. nand_command (mtd, NAND_CMD_READ1, col, page);
  157. this->wait_for_ready();
  158. /* Read the data directly into the return buffer */ 
  159. if ((*retlen + (mtd->eccsize - col)) >= len) {
  160. while (*retlen < len)
  161. buf[(*retlen)++] = this->read_data();
  162. /* We're done */
  163. continue;
  164. }
  165. else
  166. for (j=col ; j < mtd->eccsize ; j++)
  167. buf[(*retlen)++] = this->read_data();
  168. /*
  169.  * If the amount of data to be read is greater than
  170.  * (256 - col), then all subsequent reads will take
  171.  * place on page or half-page (in the case of 512 byte
  172.  * page devices) aligned boundaries and the column
  173.  * address will be zero. Setting the column address to
  174.  * to zero after the first read allows us to simplify
  175.  * the reading of data and the if/else statements above.
  176.  */
  177. if (col)
  178. col = 0x00;
  179. /* Increment page address */
  180. if ((mtd->oobblock == 256) || state)
  181. page++;
  182. /* Toggle state machine */
  183. if (mtd->oobblock == 512)
  184. state = state ? 0 : 1;
  185. }
  186. /* De-select the NAND device */
  187. nand_deselect ();
  188. /* Wake up anyone waiting on the device */
  189. spin_lock_bh (&this->chip_lock);
  190. if (erase_state)
  191. this->state = FL_ERASING;
  192. else
  193. this->state = FL_READY;
  194. wake_up (&this->wq);
  195. spin_unlock_bh (&this->chip_lock);
  196. /* Return happy */
  197. return 0;
  198. }
  199. /*
  200.  * if mtd->oobblock == 512
  201.  */
  202. inline int smc_read_ecc_512(struct mtd_info *mtd, u_char *ecc_code)
  203. {
  204.     struct nand_chip *this = mtd->priv;
  205.     u_char ecc_calc[3];
  206.     int j, ret;
  207.     /* Read in a block big enough for ECC */
  208.     for (j=0; j < (mtd->oobblock + mtd->oobsize); j++)
  209.       this->data_buf[j] = this->read_data ();
  210. #if 0 /* for debugging, tolkien@mizi.com */
  211.     printk("Block + OOB");
  212.     for (j=0; j < (mtd->oobblock + mtd->oobsize); j++) {
  213.       if (j % 16 == 0)
  214. printk("n");
  215.       printk("%02x ", this->data_buf[j]);
  216.     }
  217.     printk("n");
  218. #endif
  219.     for (j=0; j < mtd->oobsize; j++)
  220.       ecc_code[j] = this->data_buf[(mtd->oobblock + j)];
  221. #if 0 /* for debugging, tolkien@mizi.com */
  222.     printk("OOB");
  223.     for (j=0; j < mtd->oobsize; j++) {
  224.       if (j % 16 == 0)
  225. printk("n");
  226.       printk("%02x ", this->data_buf[(mtd->oobblock + j)]);
  227.     }
  228.     printk("n");
  229. #endif
  230.     nand_calculate_ecc(&this->data_buf[0], &ecc_calc[0]);
  231.     sm_swap(&ecc_calc[0], &ecc_calc[1]);
  232.     DEBUG (MTD_DEBUG_LEVEL3,
  233.    __FUNCTION__ ": ECC [%02x%02x%02x : %02x%02x%02x]n",
  234.    ecc_code[SMC_OOB_ECC1], ecc_code[SMC_OOB_ECC1+1],
  235.    ecc_code[SMC_OOB_ECC1+2], ecc_calc[0], ecc_calc[1], ecc_calc[2]);
  236.     ret = nand_correct_data(&this->data_buf[0],
  237.     &(ecc_code[SMC_OOB_ECC1]), &ecc_calc[0]);
  238.     if (ret == -1)
  239.       return ret;
  240.     nand_calculate_ecc(&this->data_buf[mtd->eccsize], &ecc_calc[0]);
  241.     sm_swap(&ecc_calc[0], &ecc_calc[1]);
  242.     DEBUG (MTD_DEBUG_LEVEL3,
  243.    __FUNCTION__ ": ECC [%02x%02x%02x : %02x%02x%02x]n",
  244.    ecc_code[SMC_OOB_ECC2], ecc_code[SMC_OOB_ECC2+1],
  245.    ecc_code[SMC_OOB_ECC2+2], ecc_calc[0], ecc_calc[1], ecc_calc[2]);
  246.     ret = nand_correct_data(&this->data_buf[mtd->eccsize],
  247.     &(ecc_code[SMC_OOB_ECC2]), &ecc_calc[0]);
  248.     if (ret == -1)
  249.       return ret;
  250.     return 0;
  251. }
  252. /*
  253.  * NAND read with ECC
  254.  */
  255. static int nand_read_ecc (struct mtd_info *mtd, loff_t from, size_t len,
  256. size_t *retlen, u_char *buf, u_char *ecc_code)
  257. {
  258.     int j, offset, page;
  259.     int erase_state = 0;
  260.     struct nand_chip *this = mtd->priv;
  261.     DECLARE_WAITQUEUE(wait, current);
  262.     int ret;
  263.     DEBUG (MTD_DEBUG_LEVEL3,
  264.    __FUNCTION__ ": from = 0x%08x, len = %in", (unsigned int) from,
  265.    (int) len);
  266.     /* Do not allow reads past end of device */
  267.     if ((from + len) > mtd->size) {
  268.       DEBUG (MTD_DEBUG_LEVEL0,
  269.      __FUNCTION__ ": Attempt read beyond end of devicen");
  270.       *retlen = 0;
  271.       return -EINVAL;
  272.     }
  273.     /* Grab the lock and see if the device is available */
  274.  retry:
  275.     spin_lock_bh (&this->chip_lock);
  276.     switch (this->state) {
  277.     case FL_READY:
  278.       this->state = FL_READING;
  279.       spin_unlock_bh (&this->chip_lock);
  280.       break;
  281.     case FL_ERASING:
  282.       this->state = FL_READING;
  283.       erase_state = 1;
  284.       spin_unlock_bh (&this->chip_lock);
  285.       break;
  286.     default:
  287.       set_current_state (TASK_UNINTERRUPTIBLE);
  288.       add_wait_queue (&this->wq, &wait);
  289.       spin_unlock_bh (&this->chip_lock);
  290.       schedule();
  291.       remove_wait_queue (&this->wq, &wait);
  292.       goto retry;
  293.     };
  294.     /* Select the NAND device */
  295.     nand_select ();
  296.     /* Initialize return value */
  297.     *retlen = 0;
  298. #ifdef USE_256BYTE_NAND_FLASH
  299.     /* First we calculate the starting page */
  300.     page = from >> this->page_shift;
  301.     /* Get raw starting column */
  302.     offset = from & (mtd->oobblock - 1);
  303.     /* if the length of Page is 256 bytes,
  304.        2 Pages must be taken for 1 Sector and as a result,
  305.        higher level 8 bytes of information
  306.        among the above 16 byte information must coincide with
  307.        Spare(or OOB) of Even-Page while lowel level 8 bytes
  308.        coincide with Spare(or OOB) of Odd-page.
  309.    i.e, [0 block][oob][1 block][oob]
  310. [2 block][oob][3 block][oob]...
  311.     */
  312.     if (mtd->oobblock == 256) {
  313. u_char ecc_calc[3];
  314. int oob_offset;
  315. /* Loop until all data read */
  316. while (*retlen < len) {
  317.   nand_command(mtd, NAND_CMD_READ0, 0x00, page);
  318.   this->wait_for_ready();
  319.   /* Read in a block big enough for ECC */
  320.   for(j=0; j < mtd->eccsize; j++)
  321.     this->data_buf[j] = this->read_data ();
  322.   if (!(page & 0x1)) { /* page is odd! */
  323.     nand_command (mtd, NAND_CMD_READOOB, SMC_OOB256_ECC1, page + 1);
  324.     oob_offset = SMC_OOB_ECC1;
  325.   } else {
  326.     nand_command (mtd, NAND_CMD_READOOB, SMC_OOB256_ECC2, page);
  327.     oob_offset = SMC_OOB_ECC2;
  328.   }
  329.   this->wait_for_ready();
  330.   for(j=0; j < 3; j++)
  331.     ecc_code[oob_offset + j] = this->read_data ();
  332.   nand_calculate_ecc (&this->data_buf[0], &ecc_calc[0]);
  333.   sm_swap(&ecc_calc[0], &ecc_calc[1]);
  334.   ret = nand_correct_data (&this->data_buf[0],
  335.    &(ecc_code[oob_offset]), &ecc_calc[0]);
  336.   if (ret == -1)
  337.     goto nand_read_ecc_err;
  338.   /* Read the data from ECC data buffer into return buffer */
  339.   if ((*retlen + (mtd->eccsize - offset)) >= len) {
  340.     while (*retlen < len)
  341.       buf[(*retlen)++] = this->data_buf[offset++];
  342.     /* We're done */
  343.     continue;
  344.   } else
  345.     for (j=offset ; j < mtd->eccsize ; j++)
  346.       buf[(*retlen)++] = this->data_buf[j];
  347.   /*
  348.    * If the amount of data to be read is greater than
  349.    * (256 - offset), then all subsequent reads will take
  350.    * place on page or half-page (in the case of 512 byte
  351.    * page devices) aligned boundaries and the column
  352.    * address will be zero. Setting the column address to
  353.    * to zero after the first read allows us to simplify
  354.    * the reading of data and the if/else statements above.
  355.    */
  356.   if (offset)
  357.     offset = 0x00;
  358.   /* Increment page address */
  359.   page++;
  360. }
  361.     }
  362.     else
  363. #endif /* USE_256BYTE_NAND_FLASH */
  364.     { /* mtd->oobblock == 512 */
  365.       size_t last, next, len2;
  366.       last = from + len;
  367.       for(next=from; from < last;) {
  368. page = from >> this->page_shift;
  369. offset = from & (mtd->oobblock - 1);
  370. len2 = mtd->oobblock - offset;
  371. next += len2;
  372. nand_command(mtd, NAND_CMD_READ0, 0x00, page);
  373. this->wait_for_ready();
  374. ret = smc_read_ecc_512(mtd, ecc_code);
  375. if (ret == -1)
  376.   goto nand_read_ecc_err;
  377. if (next >= last)
  378.   if ((last & (mtd->oobblock - 1)) != 0)
  379.     len2 = (last & (mtd->oobblock - 1)) - offset;
  380. for(j = 0; j < len2; j++)
  381.   buf[(*retlen) + j] = this->data_buf[offset + j];
  382. *retlen += len2;
  383. from = next;
  384.       }
  385.     }
  386.     ret = 0;
  387.     goto nand_read_ecc_exit;
  388.  nand_read_ecc_err:
  389.     DEBUG (MTD_DEBUG_LEVEL0,
  390.    __FUNCTION__ ": Failed ECC read, page 0x%08xn", page);
  391.     ret = -EIO;
  392.  nand_read_ecc_exit:
  393.     /* De-select the NAND device */
  394.     nand_deselect ();
  395.     /* Wake up anyone waiting on the device */
  396.     spin_lock_bh (&this->chip_lock);
  397.     if (erase_state)
  398.       this->state = FL_ERASING;
  399.     else
  400.       this->state = FL_READY;
  401.     wake_up (&this->wq);
  402.     spin_unlock_bh (&this->chip_lock);
  403.     return ret;
  404. }
  405. /*
  406.  * NAND read out-of-band
  407.  */
  408. static int nand_read_oob (struct mtd_info *mtd, loff_t from, size_t len,
  409. size_t *retlen, u_char *buf)
  410. {
  411. int i, offset, page;
  412. int erase_state = 0;
  413. struct nand_chip *this = mtd->priv;
  414. DECLARE_WAITQUEUE(wait, current);
  415. DEBUG (MTD_DEBUG_LEVEL3,
  416.        __FUNCTION__ ": from = 0x%08x, len = %in", (unsigned int) from,
  417.        (int) len);
  418. /* Shift to get page */
  419. page = ((int) from) >> this->page_shift;
  420. /* Mask to get column */
  421. offset = from & 0x0f;
  422. /* Initialize return length value */
  423. *retlen = 0;
  424. /* Do not allow read past end of page */
  425. if ((offset + len) > mtd->oobsize) {
  426. DEBUG (MTD_DEBUG_LEVEL0,
  427. __FUNCTION__ ": Attempt read past end of page " 
  428. "0x%08x, column %i, length %in", page, offset, len);
  429. return -EINVAL;
  430. }
  431. retry:
  432. /* Grab the lock and see if the device is available */
  433. spin_lock_bh (&this->chip_lock);
  434. switch (this->state) {
  435. case FL_READY:
  436. this->state = FL_READING;
  437. spin_unlock_bh (&this->chip_lock);
  438. break;
  439. case FL_ERASING:
  440. this->state = FL_READING;
  441. erase_state = 1;
  442. spin_unlock_bh (&this->chip_lock);
  443. break;
  444. default:
  445. set_current_state (TASK_UNINTERRUPTIBLE);
  446. add_wait_queue (&this->wq, &wait);
  447. spin_unlock_bh (&this->chip_lock);
  448. schedule();
  449. remove_wait_queue (&this->wq, &wait);
  450. goto retry;
  451. };
  452. /* Select the NAND device */
  453. nand_select ();
  454. /* Send the read command */
  455. nand_command (mtd, NAND_CMD_READOOB, offset, page);
  456. this->wait_for_ready();
  457. /* Read the data */
  458. for (i = 0 ; i < len ; i++)
  459. buf[i] = this->read_data();
  460. /* De-select the NAND device */
  461. nand_deselect ();
  462. /* Wake up anyone waiting on the device */
  463. spin_lock_bh (&this->chip_lock);
  464. if (erase_state)
  465. this->state = FL_ERASING;
  466. else
  467. this->state = FL_READY;
  468. wake_up (&this->wq);
  469. spin_unlock_bh (&this->chip_lock);
  470. /* Return happy */
  471. *retlen = len;
  472. return 0;
  473. }
  474. /*
  475.  * NAND write
  476.  */
  477. static int nand_write (struct mtd_info *mtd, loff_t to, size_t len,
  478.        size_t *retlen, const u_char *buf)
  479. {
  480.     int i, page, col, cnt, status;
  481.     struct nand_chip *this = mtd->priv;
  482.     DECLARE_WAITQUEUE(wait, current);
  483.     DEBUG (MTD_DEBUG_LEVEL3,
  484.    __FUNCTION__ ": to = 0x%08x, len = %in", (unsigned int) to,
  485.    (int) len);
  486.     /* Do not allow write past end of page */
  487.     if ((to + len) > mtd->size) {
  488.       DEBUG (MTD_DEBUG_LEVEL0,
  489.      __FUNCTION__ ": Attempted write past end of devicen");
  490.       return -EINVAL;
  491.     }
  492. retry:
  493.     /* Grab the lock and see if the device is available */
  494.     spin_lock_bh (&this->chip_lock);
  495.     switch (this->state) {
  496.     case FL_READY:
  497.       this->state = FL_WRITING;
  498.       spin_unlock_bh (&this->chip_lock);
  499.       break;
  500.     default:
  501.       set_current_state (TASK_UNINTERRUPTIBLE);
  502.       add_wait_queue (&this->wq, &wait);
  503.       spin_unlock_bh (&this->chip_lock);
  504.       schedule();
  505.       remove_wait_queue (&this->wq, &wait);
  506.       goto retry;
  507.     };
  508.     /* Shift to get page */
  509.     page = ((int) to) >> this->page_shift;
  510.     /* Get the starting column */
  511.     col = to & (mtd->oobblock - 1);
  512.     /* Initialize return length value */
  513.     *retlen = 0;
  514.     /* Select the NAND device */
  515.     nand_select ();
  516.     /* Check the WP bit */
  517.     nand_command (mtd, NAND_CMD_STATUS, -1, -1);
  518.     this->wait_for_ready();
  519.     if (!(this->read_data () & SMC_STAT_NOT_WP)) {
  520.       DEBUG (MTD_DEBUG_LEVEL0,
  521.      __FUNCTION__ ": Device is write protected!!!n");
  522.       i = -EPERM;
  523.       goto nand_write_exit;
  524.     }
  525.     /* Loop until all data is written */
  526.     while (*retlen < len) {
  527.       /* Write data into buffer */
  528.       if ((col + len) >= mtd->oobblock)
  529. for(i=col, cnt=0 ; i < mtd->oobblock ; i++, cnt++)
  530.   this->data_buf[i] = buf[(*retlen + cnt)];
  531.       else
  532. for(i=col, cnt=0 ; cnt < (len - *retlen) ; i++, cnt++)
  533.   this->data_buf[i] = buf[(*retlen + cnt)];
  534.       /* Write ones for partial page programming */
  535.       for (i=mtd->oobblock ; i < (mtd->oobblock + mtd->oobsize) ; i++)
  536. this->data_buf[i] = 0xff;
  537.       /* Write pre-padding bytes into buffer */
  538.       for (i=0 ; i < col ; i++)
  539. this->data_buf[i] = 0xff;
  540.       /* Write post-padding bytes into buffer */
  541.       if ((col + (len - *retlen)) < mtd->oobblock) {
  542. for(i=(col + cnt) ; i < mtd->oobblock ; i++)
  543.   this->data_buf[i] = 0xff;
  544.       }
  545.       /* Send command to begin auto page programming */
  546.       nand_command (mtd, NAND_CMD_SEQIN, 0x00, page);
  547.       /* Write out complete page of data */
  548.       this->hwcontrol(NAND_CTL_DAT_OUT);
  549.       for (i=0 ; i < (mtd->oobblock + mtd->oobsize) ; i++)
  550. this->write_data (this->data_buf[i]);
  551.       this->hwcontrol(NAND_CTL_DAT_IN);
  552.       /* Send command to actually program the data */
  553.       nand_command (mtd, NAND_CMD_PAGEPROG, -1, -1);
  554.       this->wait_for_ready();
  555.       /*
  556.        * Wait for program operation to complete. This could
  557.        * take up to 3000us (3ms) on some devices, so we try
  558.        * and exit as quickly as possible.
  559.        */
  560.       status = 0;
  561.       for (i=0 ; i<24 ; i++) {
  562. /* Delay for 125us */
  563. udelay (125);
  564. /* Check the status */
  565. nand_command (mtd, NAND_CMD_STATUS, -1, -1);
  566. status = (int) this->read_data ();
  567. if (status & SMC_STAT_READY)
  568.   break;
  569.       }
  570.       /* See if device thinks it succeeded */
  571.       if (status & SMC_STAT_WRITE_ERR) {
  572. DEBUG (MTD_DEBUG_LEVEL0,
  573.        __FUNCTION__ ": Failed write, page 0x%08x, " 
  574.        "%6i bytes were succesfuln", page, *retlen);
  575. i = -EIO;
  576. goto nand_write_exit;
  577.       }
  578. #ifdef CONFIG_MTD_NAND_VERIFY_WRITE
  579.       /*
  580.        * The NAND device assumes that it is always writing to
  581.        * a cleanly erased page. Hence, it performs its internal
  582.        * write verification only on bits that transitioned from
  583.        * 1 to 0. The device does NOT verify the whole page on a
  584.        * byte by byte basis. It is possible that the page was
  585.        * not completely erased or the page is becoming unusable
  586.        * due to wear. The read with ECC would catch the error
  587.        * later when the ECC page check fails, but we would rather
  588.        * catch it early in the page write stage. Better to write
  589.        * no data than invalid data.
  590.        */
  591.       /* Send command to read back the page */
  592.       if (col < mtd->eccsize)
  593. nand_command (mtd, NAND_CMD_READ0, col, page);
  594.       else
  595. nand_command (mtd, NAND_CMD_READ1, col - 256, page);
  596.       this->wait_for_ready();
  597.       /* Loop through and verify the data */
  598.       for (i=col ; i < cnt ; i++) {
  599. if (this->data_buf[i] != this->read_data ()) {
  600.   DEBUG (MTD_DEBUG_LEVEL0,
  601.  __FUNCTION__ ": Failed write verify, page 0x%08x, " 
  602.  "%6i bytes were succesfuln",
  603.  page, *retlen);
  604.   i = -EIO;
  605.   goto nand_write_exit;
  606. }
  607.       }
  608. #endif
  609.       /*
  610.        * If we are writing a large amount of data and/or it
  611.        * crosses page or half-page boundaries, we set the
  612.        * the column to zero. It simplifies the program logic.
  613.        */
  614.       if (col)
  615. col = 0x00;
  616.       /* Update written bytes count */
  617.       *retlen += cnt;
  618.       /* Increment page address */
  619.       page++;
  620.     }
  621.     /* Return happy */
  622.     *retlen = len;
  623.     i = 0;
  624.  nand_write_exit:
  625.     /* De-select the NAND device */
  626.     nand_deselect ();
  627.     /* Wake up anyone waiting on the device */
  628.     spin_lock_bh (&this->chip_lock);
  629.     this->state = FL_READY;
  630.     wake_up (&this->wq);
  631.     spin_unlock_bh (&this->chip_lock);
  632.     return i;
  633. }
  634. /*
  635.  * NAND write with ECC, but only 1 sector!
  636.  */
  637. static int nand_write_ecc (struct mtd_info *mtd, loff_t to, size_t len,
  638.        size_t *retlen, const u_char *buf, u_char *ecc_code)
  639. {
  640.     int i, page, cnt, status, ret;
  641.     struct nand_chip *this = mtd->priv;
  642.     DECLARE_WAITQUEUE(wait, current);
  643.     unsigned int sector_size, page_size, oob_size;
  644.     DEBUG (MTD_DEBUG_LEVEL3,
  645.    __FUNCTION__ ": to = 0x%08x, len = %in", (unsigned int) to,
  646.    (int) len);
  647.     sector_size = this->dev->szS;
  648.     page_size = mtd->oobblock;
  649.     oob_size = mtd->oobsize;
  650.     if (to & (sector_size - 1)) {
  651.       DEBUG (MTD_DEBUG_LEVEL0,
  652.      __FUNCTION__ ": Not Sector alignedn");
  653.       return -EINVAL;
  654.     }
  655.     if (len != sector_size) {
  656.       DEBUG (MTD_DEBUG_LEVEL0,
  657.      __FUNCTION__ ": Only 1 Sector!n");
  658.       return -EINVAL;
  659.     }
  660.     /* Do not allow write past end of page */
  661.     if ((to + len) > mtd->size) {
  662.       DEBUG (MTD_DEBUG_LEVEL0,
  663.      __FUNCTION__ ": Attempted write past end of devicen");
  664.       return -EINVAL;
  665.     }
  666. retry:
  667.     /* Grab the lock and see if the device is available */
  668.     spin_lock_bh (&this->chip_lock);
  669.     switch (this->state) {
  670.     case FL_READY:
  671.       this->state = FL_WRITING;
  672.       spin_unlock_bh (&this->chip_lock);
  673.       break;
  674.     default:
  675.       set_current_state (TASK_UNINTERRUPTIBLE);
  676.       add_wait_queue (&this->wq, &wait);
  677.       spin_unlock_bh (&this->chip_lock);
  678.       schedule();
  679.       remove_wait_queue (&this->wq, &wait);
  680.       goto retry;
  681.     };
  682.     /* Shift to get page */
  683.     page = ((int) to) >> this->page_shift;
  684.     /* Initialize return length value */
  685.     *retlen = 0;
  686.     /* Select the NAND device */
  687.     nand_select ();
  688.     /* Check the WP bit */
  689.     nand_command (mtd, NAND_CMD_STATUS, -1, -1);
  690.     this->wait_for_ready();
  691.     if (!(this->read_data () & SMC_STAT_NOT_WP)) {
  692.       DEBUG (MTD_DEBUG_LEVEL0,
  693.      __FUNCTION__ ": Device is write protected!!!n");
  694.       ret = -EPERM;
  695.       goto nand_write_err;
  696.     }
  697.     /* Loop until all data is written */
  698.     while (*retlen < len) {
  699.       /* Send command to begin auto page programming */
  700.       nand_command (mtd, NAND_CMD_SEQIN, 0x00, page);
  701.       this->hwcontrol(NAND_CTL_DAT_OUT);
  702.       /* Write out complete page of data */
  703.       for(i=0, cnt=0; i < page_size; i++, cnt++)
  704. this->write_data (buf[(*retlen) + cnt]);
  705.       /* Write ones for partial page programming */
  706.       for (i=0; i < oob_size; i++) {
  707. #ifdef USE_256BYTE_NAND_FLASH
  708. if (*retlen & (sector_size - 1))
  709.   this->write_data (ecc_code[SMC_OOB256_SIZE + i]);
  710. else
  711. #endif
  712.   this->write_data (ecc_code[i]);
  713.       }
  714.     
  715.       this->hwcontrol(NAND_CTL_DAT_IN);
  716.       /* Send command to actually program the data */
  717.       nand_command (mtd, NAND_CMD_PAGEPROG, -1, -1);
  718.       this->wait_for_ready();
  719.       /*
  720.        * Wait for program operation to complete. This could
  721.        * take up to 3000us (3ms) on some devices, so we try
  722.        * and exit as quickly as possible.
  723.        */
  724.       status = 0;
  725.       for (i=0 ; i<24 ; i++) {
  726. /* Delay for 125us */
  727. udelay (125);
  728. /* Check the status */
  729. nand_command (mtd, NAND_CMD_STATUS, -1, -1);
  730. status = (int) this->read_data ();
  731. if (status & SMC_STAT_READY)
  732.   break;
  733.       }
  734.       /* See if device thinks it succeeded */
  735.       if (status & SMC_STAT_WRITE_ERR) {
  736. DEBUG (MTD_DEBUG_LEVEL0,
  737.        __FUNCTION__ ": Failed write, page 0x%08x, " 
  738.        "%6i bytes were succesfuln", page, *retlen);
  739. ret = -EIO;
  740. goto nand_write_err;
  741.       }
  742. #ifdef CONFIG_MTD_NAND_VERIFY_WRITE
  743.       /*
  744.        * The NAND device assumes that it is always writing to
  745.        * a cleanly erased page. Hence, it performs its internal
  746.        * write verification only on bits that transitioned from
  747.        * 1 to 0. The device does NOT verify the whole page on a
  748.        * byte by byte basis. It is possible that the page was
  749.        * not completely erased or the page is becoming unusable
  750.        * due to wear. The read with ECC would catch the error
  751.        * later when the ECC page check fails, but we would rather
  752.        * catch it early in the page write stage. Better to write
  753.        * no data than invalid data.
  754.        */
  755.       /* Send command to read back the page */
  756. #ifdef USE_256BYTE_NAND_FLASH
  757.       if (*retlen & (sector_size - 1))
  758. nand_command (mtd, NAND_CMD_READ0, 0x00, page + 1);
  759.       else
  760. #endif
  761. nand_command (mtd, NAND_CMD_READ0, 0x00, page);
  762.       this->wait_for_ready();
  763.       /* Loop through and verify the data */
  764.       for (i=0; i < page_size; i++) {
  765. if (this->data_buf[i] != this->read_data ()) {
  766.   DEBUG (MTD_DEBUG_LEVEL0,
  767.  __FUNCTION__ ": Failed write verify, page 0x%08x, " 
  768.  "%6i bytes were succesfuln",
  769.  page, *retlen);
  770.   ret = -EIO;
  771.   goto nand_write_err;
  772. }
  773.       }
  774. #endif
  775.       /* Update written bytes count */
  776.       *retlen += cnt;
  777.       /* Increment page address */
  778.       page++;
  779.     }
  780.     *retlen = len;
  781.     ret = 0;
  782.  nand_write_err:
  783.     /* De-select the NAND device */
  784.     nand_deselect ();
  785.     /* Wake up anyone waiting on the device */
  786.     spin_lock_bh (&this->chip_lock);
  787.     this->state = FL_READY;
  788.     wake_up (&this->wq);
  789.     spin_unlock_bh (&this->chip_lock);
  790.     return ret;
  791. }
  792. /*
  793.  * NAND write out-of-band
  794.  */
  795. static int nand_write_oob (struct mtd_info *mtd, loff_t to, size_t len,
  796. size_t *retlen, const u_char *buf)
  797. {
  798.     int i, offset, page, status, ret;
  799.     struct nand_chip *this = mtd->priv;
  800.     DECLARE_WAITQUEUE(wait, current);
  801.     DEBUG (MTD_DEBUG_LEVEL3,
  802.    __FUNCTION__ ": to = 0x%08x, len = %in", (unsigned int) to,
  803.    (int) len);
  804.     /* Shift to get page */
  805.     page = ((int) to) >> this->page_shift;
  806.     /* Mask to get column */
  807.     offset = to & 0x1f;
  808.     /* Initialize return length value */
  809.     *retlen = 0;
  810.     /* Do not allow write past end of page */
  811.     if ((offset + len) > mtd->oobsize) {
  812.       DEBUG (MTD_DEBUG_LEVEL0,
  813.      __FUNCTION__": Attempt to write past end of pagen");
  814.       return -EINVAL;
  815.     }
  816. retry:
  817.     /* Grab the lock and see if the device is available */
  818.     spin_lock_bh (&this->chip_lock);
  819.     switch (this->state) {
  820.     case FL_READY:
  821.       this->state = FL_WRITING;
  822.       spin_unlock_bh (&this->chip_lock);
  823.       break;
  824.     default:
  825.       set_current_state (TASK_UNINTERRUPTIBLE);
  826.       add_wait_queue (&this->wq, &wait);
  827.       spin_unlock_bh (&this->chip_lock);
  828.       schedule();
  829.       remove_wait_queue (&this->wq, &wait);
  830.       goto retry;
  831.     };
  832.     /* Select the NAND device */
  833.     nand_select ();
  834.     /* Check the WP bit */
  835.     nand_command (mtd, NAND_CMD_STATUS, -1, -1);
  836.     this->wait_for_ready();
  837.     if (!(this->read_data () & SMC_STAT_NOT_WP)) {
  838.       DEBUG (MTD_DEBUG_LEVEL0,
  839.      __FUNCTION__ ": Device is write protected!!!n");
  840.       ret = -EPERM;
  841.       goto nand_write_oob_err;
  842.     }
  843.     /* Write out desired data */
  844.     nand_command (mtd, NAND_CMD_SEQIN, offset + mtd->oobblock, page);
  845.     this->hwcontrol(NAND_CTL_DAT_OUT);
  846.     for (i=0 ; i<len ; i++)
  847.       this->write_data (buf[i]);
  848.     this->hwcontrol(NAND_CTL_DAT_IN);
  849.     /* Send command to program the OOB data */
  850.     nand_command (mtd, NAND_CMD_PAGEPROG, -1, -1);
  851.     this->wait_for_ready();
  852.  
  853.     /*
  854.      * Wait for program operation to complete. This could
  855.      * take up to 3000us (3ms) on some devices, so we try
  856.      * and exit as quickly as possible.
  857.      */
  858.     status = 0;
  859.     for (i=0 ; i<24 ; i++) {
  860.       /* Delay for 125us */
  861.       udelay (125);
  862.       /* Check the status */
  863.       nand_command (mtd, NAND_CMD_STATUS, -1, -1);
  864.       this->wait_for_ready();
  865.       status = (int) this->read_data ();
  866.       if (status & SMC_STAT_READY)
  867. break;
  868.     }
  869.     /* See if device thinks it succeeded */
  870.     if (status & SMC_STAT_WRITE_ERR) {
  871.       DEBUG (MTD_DEBUG_LEVEL0,
  872.      __FUNCTION__ ": Failed write, page 0x%08xn", page);
  873.       ret = -EIO;
  874.       goto nand_write_oob_err;
  875.     }
  876. #ifdef CONFIG_MTD_NAND_VERIFY_WRITE
  877.     /* Send command to read back the data */
  878.     nand_command (mtd, NAND_CMD_READOOB, offset, page);
  879.     this->wait_for_ready();
  880.     /* Loop through and verify the data */
  881.     for (i=0 ; i<len ; i++) {
  882.       if (buf[i] != this->read_data ()) {
  883. DEBUG (MTD_DEBUG_LEVEL0,
  884.        __FUNCTION__ ": Failed write verify, page 0x%08xn", page);
  885. ret = -EIO;
  886. goto nand_write_oob_err;
  887.       }
  888.     }
  889. #endif
  890.     /* Return happy */
  891.     *retlen = len;
  892.     ret = 0;
  893.  nand_write_oob_err:
  894.     /* De-select the NAND device */
  895.     nand_deselect ();
  896.     /* Wake up anyone waiting on the device */
  897.     spin_lock_bh (&this->chip_lock);
  898.     this->state = FL_READY;
  899.     wake_up (&this->wq);
  900.     spin_unlock_bh (&this->chip_lock);
  901.     return ret;
  902. }
  903. /*
  904.  * NAND erase a block
  905.  */
  906. static int nand_erase (struct mtd_info *mtd, struct erase_info *instr)
  907. {
  908. int i, page, len, status, pages_per_block;
  909. struct nand_chip *this = mtd->priv;
  910. DECLARE_WAITQUEUE(wait, current);
  911. DEBUG (MTD_DEBUG_LEVEL3,
  912. __FUNCTION__ ": start = 0x%08x, len = %in",
  913. (unsigned int) instr->addr, (unsigned int) instr->len);
  914. /* Start address must align on block boundary */
  915. if (instr->addr & (mtd->erasesize - 1)) {
  916. DEBUG (MTD_DEBUG_LEVEL0,
  917. __FUNCTION__ ": Unaligned addressn");
  918. return -EINVAL;
  919. }
  920. /* Length must align on block boundary */
  921. if (instr->len & (mtd->erasesize - 1)) {
  922. DEBUG (MTD_DEBUG_LEVEL0,
  923. __FUNCTION__ ": Length not block alignedn");
  924. return -EINVAL;
  925. }
  926. /* Do not allow erase past end of device */
  927. if ((instr->len + instr->addr) > mtd->size) {
  928. DEBUG (MTD_DEBUG_LEVEL0,
  929. __FUNCTION__ ": Erase past end of devicen");
  930. return -EINVAL;
  931. }
  932. retry:
  933. /* Grab the lock and see if the device is available */
  934. spin_lock_bh (&this->chip_lock);
  935. switch (this->state) {
  936. case FL_READY:
  937. this->state = FL_ERASING;
  938. break;
  939. default:
  940. set_current_state (TASK_UNINTERRUPTIBLE);
  941. add_wait_queue (&this->wq, &wait);
  942. spin_unlock_bh (&this->chip_lock);
  943. schedule();
  944. remove_wait_queue (&this->wq, &wait);
  945. goto retry;
  946. };
  947. /* Shift to get first page */
  948. page = (int) (instr->addr >> this->page_shift);
  949. /* Calculate pages in each block */
  950. pages_per_block = mtd->erasesize / mtd->oobblock;
  951. /* Select the NAND device */
  952. nand_select ();
  953. /* Check the WP bit */
  954. nand_command (mtd, NAND_CMD_STATUS, -1, -1);
  955. this->wait_for_ready();
  956. if (!(this->read_data () & SMC_STAT_NOT_WP)) {
  957. DEBUG (MTD_DEBUG_LEVEL0,
  958. __FUNCTION__ ": Device is write protected!!!n");
  959. nand_deselect ();
  960. this->state = FL_READY;
  961. spin_unlock_bh (&this->chip_lock);
  962. return -EIO;
  963. }
  964. /* Loop through the pages */
  965. len = instr->len;
  966. while (len) {
  967. /* Send commands to erase a page */
  968. nand_command(mtd, NAND_CMD_ERASE1, -1, page);
  969. nand_command(mtd, NAND_CMD_ERASE2, -1, -1);
  970. this->wait_for_ready();
  971. /*
  972.  * Wait for program operation to complete. This could
  973.  * take up to 4000us (4ms) on some devices, so we try
  974.  * and exit as quickly as possible.
  975.  */
  976. status = 0;
  977. for (i=0 ; i<32 ; i++) {
  978. /* Delay for 125us */
  979. udelay (125);
  980. /* Check the status */
  981. nand_command (mtd, NAND_CMD_STATUS, -1, -1);
  982. this->wait_for_ready();
  983. status = (int) this->read_data ();
  984. if (status & SMC_STAT_READY)
  985. break;
  986. }
  987. /* See if block erase succeeded */
  988. if (status & SMC_STAT_WRITE_ERR) {
  989. DEBUG (MTD_DEBUG_LEVEL0, __FUNCTION__ 
  990. ": Failed erase, page 0x%08xn", page);
  991. nand_deselect ();
  992. instr->state = MTD_ERASE_FAILED;
  993. if (instr->callback)
  994.   instr->callback (instr);
  995. this->state = FL_READY;
  996. spin_unlock_bh (&this->chip_lock);
  997. return -EIO;
  998. }
  999. /* Increment page address and decrement length */
  1000. len -= mtd->erasesize;
  1001. page += pages_per_block;
  1002. /* Release the spin lock */
  1003. spin_unlock_bh (&this->chip_lock);
  1004. erase_retry:
  1005. /* Check the state and sleep if it changed */
  1006. spin_lock_bh (&this->chip_lock);
  1007. if (this->state == FL_ERASING) {
  1008. continue;
  1009. }
  1010. else {
  1011. set_current_state (TASK_UNINTERRUPTIBLE);
  1012. add_wait_queue (&this->wq, &wait);
  1013. spin_unlock_bh (&this->chip_lock);
  1014. schedule();
  1015. remove_wait_queue (&this->wq, &wait);
  1016. goto erase_retry;
  1017. }
  1018. }
  1019. spin_unlock_bh (&this->chip_lock);
  1020. /* De-select the NAND device */
  1021. nand_deselect ();
  1022. /* Do call back function */
  1023. instr->state = MTD_ERASE_DONE;
  1024. if (instr->callback)
  1025. instr->callback (instr);
  1026. /* The device is ready */
  1027. spin_lock_bh (&this->chip_lock);
  1028. this->state = FL_READY;
  1029. spin_unlock_bh (&this->chip_lock);
  1030. /* Return happy */
  1031. return 0;
  1032. }
  1033. /*
  1034.  * NAND sync
  1035.  */
  1036. static void nand_sync (struct mtd_info *mtd)
  1037. {
  1038. struct nand_chip *this = mtd->priv;
  1039. DECLARE_WAITQUEUE(wait, current);
  1040. DEBUG (MTD_DEBUG_LEVEL3, __FUNCTION__ ": calledn");
  1041. retry:
  1042. /* Grab the spinlock */
  1043. spin_lock_bh(&this->chip_lock);
  1044. /* See what's going on */
  1045. switch(this->state) {
  1046. case FL_READY:
  1047. case FL_SYNCING:
  1048. this->state = FL_SYNCING;
  1049. spin_unlock_bh (&this->chip_lock);
  1050. break;
  1051. default:
  1052. /* Not an idle state */
  1053. add_wait_queue (&this->wq, &wait);
  1054. spin_unlock_bh (&this->chip_lock);
  1055. schedule ();
  1056. remove_wait_queue (&this->wq, &wait);
  1057. goto retry;
  1058. }
  1059.         /* Lock the device */
  1060. spin_lock_bh (&this->chip_lock);
  1061. /* Set the device to be ready again */
  1062. if (this->state == FL_SYNCING) {
  1063. this->state = FL_READY;
  1064. wake_up (&this->wq);
  1065. }
  1066.         /* Unlock the device */
  1067. spin_unlock_bh (&this->chip_lock);
  1068. }
  1069. /*
  1070.  * Scan for the SMC device
  1071.  */
  1072. int smc_scan (struct mtd_info *mtd)
  1073. {
  1074. int i, nand_maf_id, nand_dev_id;
  1075. struct nand_chip *this = mtd->priv;
  1076. /* Select the device */
  1077. nand_select ();
  1078. /* Send the command for reading device ID */
  1079. nand_command (mtd, NAND_CMD_READID, 0x00, -1);
  1080. this->wait_for_ready();
  1081. /* Read manufacturer and device IDs */
  1082. nand_maf_id = this->read_data ();
  1083. nand_dev_id = this->read_data ();
  1084. /* Print and store flash device information */
  1085. for (i = 0; nand_flash_ids[i].name != NULL; i++) {
  1086. if (nand_maf_id == nand_flash_ids[i].manufacture_id &&
  1087.     nand_dev_id == nand_flash_ids[i].model_id) {
  1088. #ifdef USE_256BYTE_NAND_FLASH
  1089. if (!mtd->size) {
  1090. mtd->name = nand_flash_ids[i].name;
  1091. mtd->erasesize = nand_flash_ids[i].erasesize;
  1092. mtd->size = (1 << nand_flash_ids[i].chipshift);
  1093. mtd->eccsize = 256;
  1094. if (nand_flash_ids[i].page256) {
  1095. mtd->oobblock = 256;
  1096. mtd->oobsize = 8;
  1097. this->page_shift = 8;
  1098. }
  1099. else {
  1100. mtd->oobblock = 512;
  1101. mtd->oobsize = 16;
  1102. this->page_shift = 9;
  1103. }
  1104. this->dev = &nand_smc_info[GET_DI_NUM(nand_flash_ids[i].chipshift)];
  1105. }
  1106. #else
  1107. if (!(mtd->size) && !(nand_flash_ids[i].page256)) {
  1108.   mtd->name = nand_flash_ids[i].name;
  1109.   mtd->erasesize = nand_flash_ids[i].erasesize;
  1110.   mtd->size = (1 << nand_flash_ids[i].chipshift);
  1111.   mtd->eccsize = 256;
  1112.   mtd->oobblock = 512;
  1113.   mtd->oobsize = 16;
  1114.   this->page_shift = 9;
  1115.   this->dev = &nand_smc_info[GET_DI_NUM(nand_flash_ids[i].chipshift)];
  1116. }
  1117. #endif
  1118. printk (KERN_INFO "NAND device: Manufacture ID:" 
  1119. " 0x%02x, Chip ID: 0x%02x (%s)n",
  1120. nand_maf_id, nand_dev_id, mtd->name);
  1121. break;
  1122. }
  1123. }
  1124. /* Initialize state and spinlock */
  1125. this->state = FL_READY;
  1126. spin_lock_init(&this->chip_lock);
  1127. init_waitqueue_head(&(this->wq));
  1128. /* De-select the device */
  1129. nand_deselect ();
  1130. /* Print warning message for no device */
  1131. if (!mtd->size) {
  1132. printk (KERN_WARNING "No NAND device found!!!n");
  1133. return 1;
  1134. }
  1135. /* Fill in remaining MTD driver data */
  1136. mtd->type = MTD_NANDFLASH;
  1137. mtd->flags = MTD_CAP_NANDFLASH | MTD_ECC;
  1138. mtd->module = THIS_MODULE;
  1139. mtd->ecctype = MTD_ECC_SW;
  1140. mtd->erase = nand_erase;
  1141. mtd->point = NULL;
  1142. mtd->unpoint = NULL;
  1143. mtd->read = nand_read;
  1144. mtd->write = nand_write;
  1145. mtd->read_ecc = nand_read_ecc;
  1146. mtd->write_ecc = nand_write_ecc;
  1147. mtd->read_oob = nand_read_oob;
  1148. mtd->write_oob = nand_write_oob;
  1149. mtd->readv = NULL;
  1150. mtd->writev = NULL;
  1151. mtd->sync = nand_sync;
  1152. mtd->lock = NULL;
  1153. mtd->unlock = NULL;
  1154. mtd->suspend = NULL;
  1155. mtd->resume = NULL;
  1156. /* Return happy */
  1157. return 0;
  1158. }
  1159. EXPORT_SYMBOL(smc_scan);
  1160. MODULE_LICENSE("GPL");
  1161. MODULE_AUTHOR("Yong-iL Joh <tolkien@mizi.com>");
  1162. MODULE_DESCRIPTION("S3C2410 NAND Flash");