• Home
  • Raw
  • Download

Lines Matching refs:this

196 static int onenand_block_address(struct onenand_chip *this, int block)  in onenand_block_address()  argument
199 if (block & this->density_mask) in onenand_block_address()
200 return ONENAND_DDP_CHIP1 | (block ^ this->density_mask); in onenand_block_address()
213 static int onenand_bufferram_address(struct onenand_chip *this, int block) in onenand_bufferram_address() argument
216 if (block & this->density_mask) in onenand_bufferram_address()
273 static unsigned flexonenand_block(struct onenand_chip *this, loff_t addr) in flexonenand_block() argument
277 if (ONENAND_IS_DDP(this) && addr >= this->diesize[0]) { in flexonenand_block()
279 addr -= this->diesize[0]; in flexonenand_block()
282 boundary = this->boundary[die]; in flexonenand_block()
284 blk = addr >> (this->erase_shift - 1); in flexonenand_block()
288 blk += die ? this->density_mask : 0; in flexonenand_block()
292 inline unsigned onenand_block(struct onenand_chip *this, loff_t addr) in onenand_block() argument
294 if (!FLEXONENAND(this)) in onenand_block()
295 return addr >> this->erase_shift; in onenand_block()
296 return flexonenand_block(this, addr); in onenand_block()
306 static loff_t flexonenand_addr(struct onenand_chip *this, int block) in flexonenand_addr() argument
311 if (ONENAND_IS_DDP(this) && block >= this->density_mask) { in flexonenand_addr()
312 block -= this->density_mask; in flexonenand_addr()
314 ofs = this->diesize[0]; in flexonenand_addr()
317 boundary = this->boundary[die]; in flexonenand_addr()
318 ofs += (loff_t)block << (this->erase_shift - 1); in flexonenand_addr()
320 ofs += (loff_t)(block - boundary - 1) << (this->erase_shift - 1); in flexonenand_addr()
324 loff_t onenand_addr(struct onenand_chip *this, int block) in onenand_addr() argument
326 if (!FLEXONENAND(this)) in onenand_addr()
327 return (loff_t)block << this->erase_shift; in onenand_addr()
328 return flexonenand_addr(this, block); in onenand_addr()
372 struct onenand_chip *this = mtd->priv; in onenand_command() local
387 block = addr * this->density_mask; in onenand_command()
396 block = onenand_block(this, addr); in onenand_command()
402 block = addr * this->density_mask; in onenand_command()
407 block = onenand_block(this, addr); in onenand_command()
408 if (FLEXONENAND(this)) in onenand_command()
409 page = (int) (addr - onenand_addr(this, block))>>\ in onenand_command()
410 this->page_shift; in onenand_command()
412 page = (int) (addr >> this->page_shift); in onenand_command()
413 if (ONENAND_IS_2PLANE(this)) { in onenand_command()
417 if (addr & this->writesize) in onenand_command()
421 page &= this->page_mask; in onenand_command()
428 value = onenand_bufferram_address(this, block); in onenand_command()
429 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2); in onenand_command()
431 if (ONENAND_IS_2PLANE(this) || ONENAND_IS_4KB_PAGE(this)) in onenand_command()
433 ONENAND_SET_BUFFERRAM0(this); in onenand_command()
436 ONENAND_SET_NEXT_BUFFERRAM(this); in onenand_command()
443 value = onenand_block_address(this, block); in onenand_command()
444 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS1); in onenand_command()
447 value = onenand_bufferram_address(this, block); in onenand_command()
448 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2); in onenand_command()
460 if (ONENAND_IS_4KB_PAGE(this)) in onenand_command()
462 dataram = ONENAND_SET_BUFFERRAM0(this); in onenand_command()
464 dataram = ONENAND_SET_NEXT_BUFFERRAM(this); in onenand_command()
468 if (ONENAND_IS_2PLANE(this) && cmd == ONENAND_CMD_PROG) in onenand_command()
470 dataram = ONENAND_CURRENT_BUFFERRAM(this); in onenand_command()
476 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS8); in onenand_command()
480 this->write_word(value, this->base + ONENAND_REG_START_BUFFER); in onenand_command()
484 this->write_word(ONENAND_INT_CLEAR, this->base + ONENAND_REG_INTERRUPT); in onenand_command()
487 this->write_word(cmd, this->base + ONENAND_REG_COMMAND); in onenand_command()
496 static inline int onenand_read_ecc(struct onenand_chip *this) in onenand_read_ecc() argument
500 if (!FLEXONENAND(this) && !ONENAND_IS_4KB_PAGE(this)) in onenand_read_ecc()
501 return this->read_word(this->base + ONENAND_REG_ECC_STATUS); in onenand_read_ecc()
504 ecc = this->read_word(this->base + ONENAND_REG_ECC_STATUS + i*2); in onenand_read_ecc()
527 struct onenand_chip * this = mtd->priv; in onenand_wait() local
536 interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT); in onenand_wait()
545 interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT); in onenand_wait()
547 ctrl = this->read_word(this->base + ONENAND_REG_CTRL_STATUS); in onenand_wait()
555 int ecc = onenand_read_ecc(this); in onenand_wait()
607 struct onenand_chip *this = data; in onenand_interrupt() local
610 if (!this->complete.done) in onenand_interrupt()
611 complete(&this->complete); in onenand_interrupt()
625 struct onenand_chip *this = mtd->priv; in onenand_interrupt_wait() local
627 wait_for_completion(&this->complete); in onenand_interrupt_wait()
641 struct onenand_chip *this = mtd->priv; in onenand_try_interrupt_wait() local
645 this->wait = onenand_interrupt_wait; in onenand_try_interrupt_wait()
648 remain = wait_for_completion_timeout(&this->complete, timeout); in onenand_try_interrupt_wait()
654 free_irq(this->irq, this); in onenand_try_interrupt_wait()
656 this->wait = onenand_wait; in onenand_try_interrupt_wait()
672 struct onenand_chip *this = mtd->priv; in onenand_setup_wait() local
675 init_completion(&this->complete); in onenand_setup_wait()
677 if (this->irq <= 0) { in onenand_setup_wait()
678 this->wait = onenand_wait; in onenand_setup_wait()
682 if (request_irq(this->irq, &onenand_interrupt, in onenand_setup_wait()
683 IRQF_SHARED, "onenand", this)) { in onenand_setup_wait()
685 this->wait = onenand_wait; in onenand_setup_wait()
690 syscfg = this->read_word(this->base + ONENAND_REG_SYS_CFG1); in onenand_setup_wait()
692 this->write_word(syscfg, this->base + ONENAND_REG_SYS_CFG1); in onenand_setup_wait()
694 this->wait = onenand_try_interrupt_wait; in onenand_setup_wait()
707 struct onenand_chip *this = mtd->priv; in onenand_bufferram_offset() local
709 if (ONENAND_CURRENT_BUFFERRAM(this)) { in onenand_bufferram_offset()
712 return this->writesize; in onenand_bufferram_offset()
733 struct onenand_chip *this = mtd->priv; in onenand_read_bufferram() local
736 bufferram = this->base + area; in onenand_read_bufferram()
747 word = this->read_word(bufferram + offset + count); in onenand_read_bufferram()
769 struct onenand_chip *this = mtd->priv; in onenand_sync_read_bufferram() local
772 bufferram = this->base + area; in onenand_sync_read_bufferram()
776 this->mmcontrol(mtd, ONENAND_SYS_CFG1_SYNC_READ); in onenand_sync_read_bufferram()
785 word = this->read_word(bufferram + offset + count); in onenand_sync_read_bufferram()
791 this->mmcontrol(mtd, 0); in onenand_sync_read_bufferram()
809 struct onenand_chip *this = mtd->priv; in onenand_write_bufferram() local
812 bufferram = this->base + area; in onenand_write_bufferram()
827 word = this->read_word(bufferram + byte_offset); in onenand_write_bufferram()
829 this->write_word(word, bufferram + byte_offset); in onenand_write_bufferram()
847 struct onenand_chip *this = mtd->priv; in onenand_get_2x_blockpage() local
851 block = (int) (addr >> this->erase_shift) & ~1; in onenand_get_2x_blockpage()
853 if (addr & this->writesize) in onenand_get_2x_blockpage()
855 page = (int) (addr >> (this->page_shift + 1)) & this->page_mask; in onenand_get_2x_blockpage()
871 struct onenand_chip *this = mtd->priv; in onenand_check_bufferram() local
875 if (ONENAND_IS_2PLANE(this)) in onenand_check_bufferram()
878 blockpage = (int) (addr >> this->page_shift); in onenand_check_bufferram()
881 i = ONENAND_CURRENT_BUFFERRAM(this); in onenand_check_bufferram()
882 if (this->bufferram[i].blockpage == blockpage) in onenand_check_bufferram()
886 i = ONENAND_NEXT_BUFFERRAM(this); in onenand_check_bufferram()
887 if (this->bufferram[i].blockpage == blockpage) { in onenand_check_bufferram()
888 ONENAND_SET_NEXT_BUFFERRAM(this); in onenand_check_bufferram()
893 if (found && ONENAND_IS_DDP(this)) { in onenand_check_bufferram()
895 int block = onenand_block(this, addr); in onenand_check_bufferram()
896 int value = onenand_bufferram_address(this, block); in onenand_check_bufferram()
897 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2); in onenand_check_bufferram()
914 struct onenand_chip *this = mtd->priv; in onenand_update_bufferram() local
918 if (ONENAND_IS_2PLANE(this)) in onenand_update_bufferram()
921 blockpage = (int) (addr >> this->page_shift); in onenand_update_bufferram()
924 i = ONENAND_NEXT_BUFFERRAM(this); in onenand_update_bufferram()
925 if (this->bufferram[i].blockpage == blockpage) in onenand_update_bufferram()
926 this->bufferram[i].blockpage = -1; in onenand_update_bufferram()
929 i = ONENAND_CURRENT_BUFFERRAM(this); in onenand_update_bufferram()
931 this->bufferram[i].blockpage = blockpage; in onenand_update_bufferram()
933 this->bufferram[i].blockpage = -1; in onenand_update_bufferram()
947 struct onenand_chip *this = mtd->priv; in onenand_invalidate_bufferram() local
953 loff_t buf_addr = this->bufferram[i].blockpage << this->page_shift; in onenand_invalidate_bufferram()
955 this->bufferram[i].blockpage = -1; in onenand_invalidate_bufferram()
968 struct onenand_chip *this = mtd->priv; in onenand_get_device() local
975 spin_lock(&this->chip_lock); in onenand_get_device()
976 if (this->state == FL_READY) { in onenand_get_device()
977 this->state = new_state; in onenand_get_device()
978 spin_unlock(&this->chip_lock); in onenand_get_device()
979 if (new_state != FL_PM_SUSPENDED && this->enable) in onenand_get_device()
980 this->enable(mtd); in onenand_get_device()
984 spin_unlock(&this->chip_lock); in onenand_get_device()
985 return (this->state == FL_PM_SUSPENDED) ? 0 : -EAGAIN; in onenand_get_device()
988 add_wait_queue(&this->wq, &wait); in onenand_get_device()
989 spin_unlock(&this->chip_lock); in onenand_get_device()
991 remove_wait_queue(&this->wq, &wait); in onenand_get_device()
1005 struct onenand_chip *this = mtd->priv; in onenand_release_device() local
1007 if (this->state != FL_PM_SUSPENDED && this->disable) in onenand_release_device()
1008 this->disable(mtd); in onenand_release_device()
1010 spin_lock(&this->chip_lock); in onenand_release_device()
1011 this->state = FL_READY; in onenand_release_device()
1012 wake_up(&this->wq); in onenand_release_device()
1013 spin_unlock(&this->chip_lock); in onenand_release_device()
1026 struct onenand_chip *this = mtd->priv; in onenand_transfer_auto_oob() local
1032 uint8_t *oob_buf = this->oob_buf; in onenand_transfer_auto_oob()
1034 free = this->ecclayout->oobfree; in onenand_transfer_auto_oob()
1042 this->read_bufferram(mtd, ONENAND_SPARERAM, oob_buf, 0, mtd->oobsize); in onenand_transfer_auto_oob()
1043 free = this->ecclayout->oobfree; in onenand_transfer_auto_oob()
1073 struct onenand_chip *this = mtd->priv; in onenand_recover_lsb() local
1077 if (!FLEXONENAND(this)) in onenand_recover_lsb()
1086 if (mtd->eraseregions[i].erasesize < (1 << this->erase_shift)) in onenand_recover_lsb()
1097 this->command(mtd, FLEXONENAND_CMD_RECOVER_LSB, addr, this->writesize); in onenand_recover_lsb()
1098 return this->wait(mtd, FL_READING); in onenand_recover_lsb()
1113 struct onenand_chip *this = mtd->priv; in onenand_mlc_read_ops_nolock() local
1122 int writesize = this->writesize; in onenand_mlc_read_ops_nolock()
1128 oobsize = this->ecclayout->oobavail; in onenand_mlc_read_ops_nolock()
1155 this->command(mtd, ONENAND_CMD_READ, from, writesize); in onenand_mlc_read_ops_nolock()
1157 ret = this->wait(mtd, FL_READING); in onenand_mlc_read_ops_nolock()
1167 this->read_bufferram(mtd, ONENAND_DATARAM, buf, column, thislen); in onenand_mlc_read_ops_nolock()
1175 this->read_bufferram(mtd, ONENAND_SPARERAM, oobbuf, oobcolumn, thisooblen); in onenand_mlc_read_ops_nolock()
1218 struct onenand_chip *this = mtd->priv; in onenand_read_ops_nolock() local
1227 int writesize = this->writesize; in onenand_read_ops_nolock()
1233 oobsize = this->ecclayout->oobavail; in onenand_read_ops_nolock()
1255 this->command(mtd, ONENAND_CMD_READ, from, writesize); in onenand_read_ops_nolock()
1256 ret = this->wait(mtd, FL_READING); in onenand_read_ops_nolock()
1272 this->command(mtd, ONENAND_CMD_READ, from, writesize); in onenand_read_ops_nolock()
1278 if (ONENAND_IS_DDP(this) && in onenand_read_ops_nolock()
1279 unlikely(from == (this->chipsize >> 1))) { in onenand_read_ops_nolock()
1280 this->write_word(ONENAND_DDP_CHIP0, this->base + ONENAND_REG_START_ADDRESS2); in onenand_read_ops_nolock()
1284 ONENAND_SET_PREV_BUFFERRAM(this); in onenand_read_ops_nolock()
1287 this->read_bufferram(mtd, ONENAND_DATARAM, buf, column, thislen); in onenand_read_ops_nolock()
1297 this->read_bufferram(mtd, ONENAND_SPARERAM, oobbuf, oobcolumn, thisooblen); in onenand_read_ops_nolock()
1309 this->write_word(ONENAND_DDP_CHIP1, this->base + ONENAND_REG_START_ADDRESS2); in onenand_read_ops_nolock()
1310 ONENAND_SET_NEXT_BUFFERRAM(this); in onenand_read_ops_nolock()
1316 ret = this->wait(mtd, FL_READING); in onenand_read_ops_nolock()
1351 struct onenand_chip *this = mtd->priv; in onenand_read_oob_nolock() local
1368 oobsize = this->ecclayout->oobavail; in onenand_read_oob_nolock()
1382 column + len > ((mtd->size >> this->page_shift) - in onenand_read_oob_nolock()
1383 (from >> this->page_shift)) * oobsize)) { in onenand_read_oob_nolock()
1391 readcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_READ : ONENAND_CMD_READOOB; in onenand_read_oob_nolock()
1399 this->command(mtd, readcmd, from, mtd->oobsize); in onenand_read_oob_nolock()
1403 ret = this->wait(mtd, FL_READING); in onenand_read_oob_nolock()
1416 this->read_bufferram(mtd, ONENAND_SPARERAM, buf, column, thislen); in onenand_read_oob_nolock()
1457 struct onenand_chip *this = mtd->priv; in onenand_read() local
1467 ret = ONENAND_IS_4KB_PAGE(this) ? in onenand_read()
1487 struct onenand_chip *this = mtd->priv; in onenand_read_oob() local
1502 ret = ONENAND_IS_4KB_PAGE(this) ? in onenand_read_oob()
1521 struct onenand_chip *this = mtd->priv; in onenand_bbt_wait() local
1528 interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT); in onenand_bbt_wait()
1533 interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT); in onenand_bbt_wait()
1534 ctrl = this->read_word(this->base + ONENAND_REG_CTRL_STATUS); in onenand_bbt_wait()
1535 addr1 = this->read_word(this->base + ONENAND_REG_START_ADDRESS1); in onenand_bbt_wait()
1536 addr8 = this->read_word(this->base + ONENAND_REG_START_ADDRESS8); in onenand_bbt_wait()
1539 ecc = onenand_read_ecc(this); in onenand_bbt_wait()
1574 struct onenand_chip *this = mtd->priv; in onenand_bbt_read_oob() local
1598 readcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_READ : ONENAND_CMD_READOOB; in onenand_bbt_read_oob()
1606 this->command(mtd, readcmd, from, mtd->oobsize); in onenand_bbt_read_oob()
1610 ret = this->bbt_wait(mtd, FL_READING); in onenand_bbt_read_oob()
1617 this->read_bufferram(mtd, ONENAND_SPARERAM, buf, column, thislen); in onenand_bbt_read_oob()
1627 from += this->writesize; in onenand_bbt_read_oob()
1648 struct onenand_chip *this = mtd->priv; in onenand_verify_oob() local
1649 u_char *oob_buf = this->oob_buf; in onenand_verify_oob()
1652 readcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_READ : ONENAND_CMD_READOOB; in onenand_verify_oob()
1654 this->command(mtd, readcmd, to, mtd->oobsize); in onenand_verify_oob()
1656 status = this->wait(mtd, FL_READING); in onenand_verify_oob()
1660 this->read_bufferram(mtd, ONENAND_SPARERAM, oob_buf, 0, mtd->oobsize); in onenand_verify_oob()
1677 struct onenand_chip *this = mtd->priv; in onenand_verify() local
1681 column = addr & (this->writesize - 1); in onenand_verify()
1684 thislen = min_t(int, this->writesize - column, len); in onenand_verify()
1686 this->command(mtd, ONENAND_CMD_READ, addr, this->writesize); in onenand_verify()
1690 ret = this->wait(mtd, FL_READING); in onenand_verify()
1696 this->read_bufferram(mtd, ONENAND_DATARAM, this->verify_buf, 0, mtd->writesize); in onenand_verify()
1698 if (memcmp(buf, this->verify_buf + column, thislen)) in onenand_verify()
1714 #define NOTALIGNED(x) ((x & (this->subpagesize - 1)) != 0)
1718 struct onenand_chip *this = mtd->priv; in onenand_panic_wait() local
1723 interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT); in onenand_panic_wait()
1743 struct onenand_chip *this = mtd->priv; in onenand_panic_write() local
1747 if (this->state == FL_PM_SUSPENDED) in onenand_panic_write()
1770 this->command(mtd, ONENAND_CMD_BUFFERRAM, to, thislen); in onenand_panic_write()
1775 memset(this->page_buf, 0xff, mtd->writesize); in onenand_panic_write()
1776 memcpy(this->page_buf + column, buf, thislen); in onenand_panic_write()
1777 wbuf = this->page_buf; in onenand_panic_write()
1780 this->write_bufferram(mtd, ONENAND_DATARAM, wbuf, 0, mtd->writesize); in onenand_panic_write()
1781 this->write_bufferram(mtd, ONENAND_SPARERAM, ffchars, 0, mtd->oobsize); in onenand_panic_write()
1783 this->command(mtd, ONENAND_CMD_PROG, to, mtd->writesize); in onenand_panic_write()
1789 if (ONENAND_IS_2PLANE(this)) { in onenand_panic_write()
1790 ONENAND_SET_BUFFERRAM1(this); in onenand_panic_write()
1791 onenand_update_bufferram(mtd, to + this->writesize, !subpage); in onenand_panic_write()
1819 struct onenand_chip *this = mtd->priv; in onenand_fill_auto_oob() local
1826 free = this->ecclayout->oobfree; in onenand_fill_auto_oob()
1834 free = this->ecclayout->oobfree; in onenand_fill_auto_oob()
1860 struct onenand_chip *this = mtd->priv; in onenand_write_ops_nolock() local
1890 oobsize = this->ecclayout->oobavail; in onenand_write_ops_nolock()
1908 this->command(mtd, ONENAND_CMD_BUFFERRAM, to, thislen); in onenand_write_ops_nolock()
1913 memset(this->page_buf, 0xff, mtd->writesize); in onenand_write_ops_nolock()
1914 memcpy(this->page_buf + column, buf, thislen); in onenand_write_ops_nolock()
1915 wbuf = this->page_buf; in onenand_write_ops_nolock()
1918 this->write_bufferram(mtd, ONENAND_DATARAM, wbuf, 0, mtd->writesize); in onenand_write_ops_nolock()
1921 oobbuf = this->oob_buf; in onenand_write_ops_nolock()
1937 this->write_bufferram(mtd, ONENAND_SPARERAM, oobbuf, 0, mtd->oobsize); in onenand_write_ops_nolock()
1939 ONENAND_SET_NEXT_BUFFERRAM(this); in onenand_write_ops_nolock()
1945 if (!ONENAND_IS_2PLANE(this) && !ONENAND_IS_4KB_PAGE(this) && !first) { in onenand_write_ops_nolock()
1946 ONENAND_SET_PREV_BUFFERRAM(this); in onenand_write_ops_nolock()
1948 ret = this->wait(mtd, FL_WRITING); in onenand_write_ops_nolock()
1968 ONENAND_SET_NEXT_BUFFERRAM(this); in onenand_write_ops_nolock()
1971 this->ongoing = 0; in onenand_write_ops_nolock()
1975 if (ONENAND_IS_CACHE_PROGRAM(this) && in onenand_write_ops_nolock()
1976 likely(onenand_block(this, to) != 0) && in onenand_write_ops_nolock()
1977 ONENAND_IS_4KB_PAGE(this) && in onenand_write_ops_nolock()
1980 this->ongoing = 1; in onenand_write_ops_nolock()
1983 this->command(mtd, cmd, to, mtd->writesize); in onenand_write_ops_nolock()
1988 if (ONENAND_IS_2PLANE(this) || ONENAND_IS_4KB_PAGE(this)) { in onenand_write_ops_nolock()
1989 ret = this->wait(mtd, FL_WRITING); in onenand_write_ops_nolock()
2049 struct onenand_chip *this = mtd->priv; in onenand_write_oob_nolock() local
2066 oobsize = this->ecclayout->oobavail; in onenand_write_oob_nolock()
2087 column + len > ((mtd->size >> this->page_shift) - in onenand_write_oob_nolock()
2088 (to >> this->page_shift)) * oobsize)) { in onenand_write_oob_nolock()
2094 oobbuf = this->oob_buf; in onenand_write_oob_nolock()
2096 oobcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_PROG : ONENAND_CMD_PROGOOB; in onenand_write_oob_nolock()
2104 this->command(mtd, ONENAND_CMD_BUFFERRAM, to, mtd->oobsize); in onenand_write_oob_nolock()
2113 this->write_bufferram(mtd, ONENAND_SPARERAM, oobbuf, 0, mtd->oobsize); in onenand_write_oob_nolock()
2115 if (ONENAND_IS_4KB_PAGE(this)) { in onenand_write_oob_nolock()
2117 memset(this->page_buf, 0xff, mtd->writesize); in onenand_write_oob_nolock()
2118 this->write_bufferram(mtd, ONENAND_DATARAM, in onenand_write_oob_nolock()
2119 this->page_buf, 0, mtd->writesize); in onenand_write_oob_nolock()
2122 this->command(mtd, oobcmd, to, mtd->oobsize); in onenand_write_oob_nolock()
2125 if (ONENAND_IS_2PLANE(this)) { in onenand_write_oob_nolock()
2126 ONENAND_SET_BUFFERRAM1(this); in onenand_write_oob_nolock()
2127 onenand_update_bufferram(mtd, to + this->writesize, 0); in onenand_write_oob_nolock()
2130 ret = this->wait(mtd, FL_WRITING); in onenand_write_oob_nolock()
2228 struct onenand_chip *this = mtd->priv; in onenand_block_isbad_nolock() local
2229 struct bbm_info *bbm = this->bbm; in onenand_block_isbad_nolock()
2239 struct onenand_chip *this = mtd->priv; in onenand_multiblock_erase_verify() local
2242 unsigned int block_size = (1 << this->erase_shift); in onenand_multiblock_erase_verify()
2246 this->command(mtd, ONENAND_CMD_ERASE_VERIFY, addr, block_size); in onenand_multiblock_erase_verify()
2247 ret = this->wait(mtd, FL_VERIFYING_ERASE); in onenand_multiblock_erase_verify()
2250 __func__, onenand_block(this, addr)); in onenand_multiblock_erase_verify()
2273 struct onenand_chip *this = mtd->priv; in onenand_multiblock_erase() local
2282 if (ONENAND_IS_DDP(this)) { in onenand_multiblock_erase()
2283 loff_t bdry_addr = this->chipsize >> 1; in onenand_multiblock_erase()
2285 bdry_block = bdry_addr >> this->erase_shift; in onenand_multiblock_erase()
2315 int this_block = (addr >> this->erase_shift); in onenand_multiblock_erase()
2326 this->command(mtd, ONENAND_CMD_MULTIBLOCK_ERASE, in onenand_multiblock_erase()
2330 ret = this->wait(mtd, FL_PREPARING_ERASE); in onenand_multiblock_erase()
2334 onenand_block(this, addr)); in onenand_multiblock_erase()
2347 this->command(mtd, ONENAND_CMD_ERASE, addr, block_size); in onenand_multiblock_erase()
2350 ret = this->wait(mtd, FL_ERASING); in onenand_multiblock_erase()
2354 __func__, onenand_block(this, addr)); in onenand_multiblock_erase()
2391 struct onenand_chip *this = mtd->priv; in onenand_block_by_block_erase() local
2417 this->command(mtd, ONENAND_CMD_ERASE, addr, block_size); in onenand_block_by_block_erase()
2421 ret = this->wait(mtd, FL_ERASING); in onenand_block_by_block_erase()
2425 __func__, onenand_block(this, addr)); in onenand_block_by_block_erase()
2462 struct onenand_chip *this = mtd->priv; in onenand_erase() local
2474 if (FLEXONENAND(this)) { in onenand_erase()
2486 block_size = 1 << this->erase_shift; in onenand_erase()
2503 if (ONENAND_IS_4KB_PAGE(this) || region || in onenand_erase()
2568 struct onenand_chip *this = mtd->priv; in onenand_default_block_markbad() local
2569 struct bbm_info *bbm = this->bbm; in onenand_default_block_markbad()
2580 block = onenand_block(this, ofs); in onenand_default_block_markbad()
2602 struct onenand_chip *this = mtd->priv; in onenand_block_markbad() local
2614 ret = this->block_markbad(mtd, ofs); in onenand_block_markbad()
2630 struct onenand_chip *this = mtd->priv; in onenand_do_lock_cmd() local
2634 start = onenand_block(this, ofs); in onenand_do_lock_cmd()
2635 end = onenand_block(this, ofs + len) - 1; in onenand_do_lock_cmd()
2643 if (this->options & ONENAND_HAS_CONT_LOCK) { in onenand_do_lock_cmd()
2645 this->write_word(start, this->base + ONENAND_REG_START_BLOCK_ADDRESS); in onenand_do_lock_cmd()
2647 this->write_word(end, this->base + ONENAND_REG_END_BLOCK_ADDRESS); in onenand_do_lock_cmd()
2649 this->command(mtd, cmd, 0, 0); in onenand_do_lock_cmd()
2652 this->wait(mtd, FL_LOCKING); in onenand_do_lock_cmd()
2655 while (this->read_word(this->base + ONENAND_REG_CTRL_STATUS) in onenand_do_lock_cmd()
2660 status = this->read_word(this->base + ONENAND_REG_WP_STATUS); in onenand_do_lock_cmd()
2671 value = onenand_block_address(this, block); in onenand_do_lock_cmd()
2672 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS1); in onenand_do_lock_cmd()
2674 value = onenand_bufferram_address(this, block); in onenand_do_lock_cmd()
2675 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2); in onenand_do_lock_cmd()
2677 this->write_word(block, this->base + ONENAND_REG_START_BLOCK_ADDRESS); in onenand_do_lock_cmd()
2679 this->command(mtd, cmd, 0, 0); in onenand_do_lock_cmd()
2682 this->wait(mtd, FL_LOCKING); in onenand_do_lock_cmd()
2685 while (this->read_word(this->base + ONENAND_REG_CTRL_STATUS) in onenand_do_lock_cmd()
2690 status = this->read_word(this->base + ONENAND_REG_WP_STATUS); in onenand_do_lock_cmd()
2741 static int onenand_check_lock_status(struct onenand_chip *this) in onenand_check_lock_status() argument
2746 end = this->chipsize >> this->erase_shift; in onenand_check_lock_status()
2749 value = onenand_block_address(this, block); in onenand_check_lock_status()
2750 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS1); in onenand_check_lock_status()
2752 value = onenand_bufferram_address(this, block); in onenand_check_lock_status()
2753 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2); in onenand_check_lock_status()
2755 this->write_word(block, this->base + ONENAND_REG_START_BLOCK_ADDRESS); in onenand_check_lock_status()
2758 status = this->read_word(this->base + ONENAND_REG_WP_STATUS); in onenand_check_lock_status()
2777 struct onenand_chip *this = mtd->priv; in onenand_unlock_all() local
2781 if (this->options & ONENAND_HAS_UNLOCK_ALL) { in onenand_unlock_all()
2783 this->write_word(0, this->base + ONENAND_REG_START_BLOCK_ADDRESS); in onenand_unlock_all()
2785 this->command(mtd, ONENAND_CMD_UNLOCK_ALL, 0, 0); in onenand_unlock_all()
2788 this->wait(mtd, FL_LOCKING); in onenand_unlock_all()
2791 while (this->read_word(this->base + ONENAND_REG_CTRL_STATUS) in onenand_unlock_all()
2796 if (this->options & ONENAND_SKIP_UNLOCK_CHECK) in onenand_unlock_all()
2800 if (onenand_check_lock_status(this)) in onenand_unlock_all()
2804 if (ONENAND_IS_DDP(this) && !FLEXONENAND(this)) { in onenand_unlock_all()
2806 ofs = this->chipsize >> 1; in onenand_unlock_all()
2807 len = this->chipsize >> 1; in onenand_unlock_all()
2826 struct onenand_chip *this = mtd->priv; in onenand_otp_command() local
2832 block = (int) (addr >> this->erase_shift); in onenand_otp_command()
2837 block = (int) (addr >> this->erase_shift); in onenand_otp_command()
2838 page = (int) (addr >> this->page_shift); in onenand_otp_command()
2840 if (ONENAND_IS_2PLANE(this)) { in onenand_otp_command()
2844 if (addr & this->writesize) in onenand_otp_command()
2848 page &= this->page_mask; in onenand_otp_command()
2854 value = onenand_block_address(this, block); in onenand_otp_command()
2855 this->write_word(value, this->base + in onenand_otp_command()
2866 if (ONENAND_IS_2PLANE(this) && cmd == ONENAND_CMD_PROG) in onenand_otp_command()
2868 dataram = ONENAND_CURRENT_BUFFERRAM(this); in onenand_otp_command()
2874 this->write_word(value, this->base + in onenand_otp_command()
2879 this->write_word(value, this->base + ONENAND_REG_START_BUFFER); in onenand_otp_command()
2883 this->write_word(ONENAND_INT_CLEAR, this->base + ONENAND_REG_INTERRUPT); in onenand_otp_command()
2886 this->write_word(cmd, this->base + ONENAND_REG_COMMAND); in onenand_otp_command()
2904 struct onenand_chip *this = mtd->priv; in onenand_otp_write_oob_nolock() local
2921 oobbuf = this->oob_buf; in onenand_otp_write_oob_nolock()
2929 block = (int) (to >> this->erase_shift); in onenand_otp_write_oob_nolock()
2935 value = onenand_block_address(this, block); in onenand_otp_write_oob_nolock()
2936 this->write_word(value, this->base + in onenand_otp_write_oob_nolock()
2944 value = onenand_bufferram_address(this, block); in onenand_otp_write_oob_nolock()
2945 this->write_word(value, this->base + in onenand_otp_write_oob_nolock()
2947 ONENAND_SET_NEXT_BUFFERRAM(this); in onenand_otp_write_oob_nolock()
2952 this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0); in onenand_otp_write_oob_nolock()
2953 this->wait(mtd, FL_OTPING); in onenand_otp_write_oob_nolock()
2965 this->write_bufferram(mtd, ONENAND_SPARERAM, in onenand_otp_write_oob_nolock()
2970 if (ONENAND_IS_2PLANE(this)) { in onenand_otp_write_oob_nolock()
2971 ONENAND_SET_BUFFERRAM1(this); in onenand_otp_write_oob_nolock()
2972 onenand_update_bufferram(mtd, to + this->writesize, 0); in onenand_otp_write_oob_nolock()
2975 ret = this->wait(mtd, FL_WRITING); in onenand_otp_write_oob_nolock()
2982 this->command(mtd, ONENAND_CMD_RESET, 0, 0); in onenand_otp_write_oob_nolock()
2983 this->wait(mtd, FL_RESETING); in onenand_otp_write_oob_nolock()
2985 status = this->read_word(this->base + ONENAND_REG_CTRL_STATUS); in onenand_otp_write_oob_nolock()
3035 struct onenand_chip *this = mtd->priv; in do_otp_read() local
3045 this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0); in do_otp_read()
3046 this->wait(mtd, FL_OTPING); in do_otp_read()
3048 ret = ONENAND_IS_4KB_PAGE(this) ? in do_otp_read()
3053 this->command(mtd, ONENAND_CMD_RESET, 0, 0); in do_otp_read()
3054 this->wait(mtd, FL_RESETING); in do_otp_read()
3072 struct onenand_chip *this = mtd->priv; in do_otp_write() local
3079 memcpy(this->page_buf, buf, len); in do_otp_write()
3080 memset(this->page_buf + len, 0xff, mtd->writesize - len); in do_otp_write()
3081 pbuf = this->page_buf; in do_otp_write()
3086 this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0); in do_otp_write()
3087 this->wait(mtd, FL_OTPING); in do_otp_write()
3097 this->command(mtd, ONENAND_CMD_RESET, 0, 0); in do_otp_write()
3098 this->wait(mtd, FL_RESETING); in do_otp_write()
3116 struct onenand_chip *this = mtd->priv; in do_otp_lock() local
3120 if (FLEXONENAND(this)) { in do_otp_lock()
3123 this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0); in do_otp_lock()
3124 this->wait(mtd, FL_OTPING); in do_otp_lock()
3137 this->command(mtd, ONENAND_CMD_RESET, 0, 0); in do_otp_lock()
3138 this->wait(mtd, FL_RESETING); in do_otp_lock()
3167 struct onenand_chip *this = mtd->priv; in onenand_otp_walk() local
3174 density = onenand_get_density(this->device_id); in onenand_otp_walk()
3323 struct onenand_chip *this = mtd->priv; in onenand_lock_user_prot_reg() local
3324 u_char *buf = FLEXONENAND(this) ? this->page_buf : this->oob_buf; in onenand_lock_user_prot_reg()
3329 memset(buf, 0xff, FLEXONENAND(this) ? this->writesize in onenand_lock_user_prot_reg()
3339 len = FLEXONENAND(this) ? mtd->writesize : 16; in onenand_lock_user_prot_reg()
3347 if (FLEXONENAND(this)) in onenand_lock_user_prot_reg()
3377 struct onenand_chip *this = mtd->priv; in onenand_check_features() local
3381 density = onenand_get_density(this->device_id); in onenand_check_features()
3382 process = this->version_id >> ONENAND_VERSION_PROCESS_SHIFT; in onenand_check_features()
3383 numbufs = this->read_word(this->base + ONENAND_REG_NUM_BUFFERS) >> 8; in onenand_check_features()
3388 if (ONENAND_IS_DDP(this)) in onenand_check_features()
3389 this->options |= ONENAND_HAS_2PLANE; in onenand_check_features()
3391 this->options |= ONENAND_HAS_4KB_PAGE; in onenand_check_features()
3392 this->options |= ONENAND_HAS_CACHE_PROGRAM; in onenand_check_features()
3404 if ((this->version_id & 0xf) == 0xe) in onenand_check_features()
3405 this->options |= ONENAND_HAS_NOP_1; in onenand_check_features()
3410 if (!ONENAND_IS_DDP(this)) in onenand_check_features()
3411 this->options |= ONENAND_HAS_2PLANE; in onenand_check_features()
3412 this->options |= ONENAND_HAS_UNLOCK_ALL; in onenand_check_features()
3417 this->options |= ONENAND_HAS_UNLOCK_ALL; in onenand_check_features()
3423 this->options |= ONENAND_HAS_CONT_LOCK; in onenand_check_features()
3428 if (ONENAND_IS_MLC(this)) in onenand_check_features()
3429 this->options |= ONENAND_HAS_4KB_PAGE; in onenand_check_features()
3431 if (ONENAND_IS_4KB_PAGE(this)) in onenand_check_features()
3432 this->options &= ~ONENAND_HAS_2PLANE; in onenand_check_features()
3434 if (FLEXONENAND(this)) { in onenand_check_features()
3435 this->options &= ~ONENAND_HAS_CONT_LOCK; in onenand_check_features()
3436 this->options |= ONENAND_HAS_UNLOCK_ALL; in onenand_check_features()
3439 if (this->options & ONENAND_HAS_CONT_LOCK) in onenand_check_features()
3441 if (this->options & ONENAND_HAS_UNLOCK_ALL) in onenand_check_features()
3443 if (this->options & ONENAND_HAS_2PLANE) in onenand_check_features()
3445 if (this->options & ONENAND_HAS_4KB_PAGE) in onenand_check_features()
3447 if (this->options & ONENAND_HAS_CACHE_PROGRAM) in onenand_check_features()
3514 struct onenand_chip *this = mtd->priv; in flexonenand_get_boundary() local
3519 syscfg = this->read_word(this->base + ONENAND_REG_SYS_CFG1); in flexonenand_get_boundary()
3520 this->write_word((syscfg | 0x0100), this->base + ONENAND_REG_SYS_CFG1); in flexonenand_get_boundary()
3522 for (die = 0; die < this->dies; die++) { in flexonenand_get_boundary()
3523 this->command(mtd, FLEXONENAND_CMD_PI_ACCESS, die, 0); in flexonenand_get_boundary()
3524 this->wait(mtd, FL_SYNCING); in flexonenand_get_boundary()
3526 this->command(mtd, FLEXONENAND_CMD_READ_PI, die, 0); in flexonenand_get_boundary()
3527 this->wait(mtd, FL_READING); in flexonenand_get_boundary()
3529 bdry = this->read_word(this->base + ONENAND_DATARAM); in flexonenand_get_boundary()
3534 this->boundary[die] = bdry & FLEXONENAND_PI_MASK; in flexonenand_get_boundary()
3536 this->command(mtd, ONENAND_CMD_RESET, 0, 0); in flexonenand_get_boundary()
3537 this->wait(mtd, FL_RESETING); in flexonenand_get_boundary()
3540 this->boundary[die], locked ? "(Locked)" : "(Unlocked)"); in flexonenand_get_boundary()
3544 this->write_word(syscfg, this->base + ONENAND_REG_SYS_CFG1); in flexonenand_get_boundary()
3555 struct onenand_chip *this = mtd->priv; in flexonenand_get_size() local
3560 density = onenand_get_density(this->device_id); in flexonenand_get_size()
3561 blksperdie = ((loff_t)(16 << density) << 20) >> (this->erase_shift); in flexonenand_get_size()
3562 blksperdie >>= ONENAND_IS_DDP(this) ? 1 : 0; in flexonenand_get_size()
3564 eraseshift = this->erase_shift - 1; in flexonenand_get_size()
3566 mtd->numeraseregions = this->dies << 1; in flexonenand_get_size()
3572 for (; die < this->dies; die++) { in flexonenand_get_size()
3573 if (!die || this->boundary[die-1] != maxbdry) { in flexonenand_get_size()
3578 this->boundary[die] + 1; in flexonenand_get_size()
3584 this->boundary[die] + 1; in flexonenand_get_size()
3585 ofs += (this->boundary[die] + 1) << (eraseshift - 1); in flexonenand_get_size()
3587 if (this->boundary[die] != maxbdry) { in flexonenand_get_size()
3592 this->boundary[die]; in flexonenand_get_size()
3600 mtd->erasesize = 1 << this->erase_shift; in flexonenand_get_size()
3612 for (die = 0, mtd->size = 0; die < this->dies; die++) { in flexonenand_get_size()
3613 this->diesize[die] = (loff_t)blksperdie << this->erase_shift; in flexonenand_get_size()
3614 this->diesize[die] -= (loff_t)(this->boundary[die] + 1) in flexonenand_get_size()
3615 << (this->erase_shift - 1); in flexonenand_get_size()
3616 mtd->size += this->diesize[die]; in flexonenand_get_size()
3636 struct onenand_chip *this = mtd->priv; in flexonenand_check_blocks_erased() local
3644 .oobbuf = this->oob_buf, in flexonenand_check_blocks_erased()
3651 addr = flexonenand_addr(this, block); in flexonenand_check_blocks_erased()
3664 if (this->oob_buf[i] != 0xff) in flexonenand_check_blocks_erased()
3684 struct onenand_chip *this = mtd->priv; in flexonenand_set_boundary() local
3689 if (die && (!ONENAND_IS_DDP(this))) in flexonenand_set_boundary()
3693 if (boundary < 0 || boundary == this->boundary[die]) in flexonenand_set_boundary()
3696 density = onenand_get_density(this->device_id); in flexonenand_set_boundary()
3697 blksperdie = ((16 << density) << 20) >> this->erase_shift; in flexonenand_set_boundary()
3698 blksperdie >>= ONENAND_IS_DDP(this) ? 1 : 0; in flexonenand_set_boundary()
3707 old = this->boundary[die] + (die * this->density_mask); in flexonenand_set_boundary()
3708 new = boundary + (die * this->density_mask); in flexonenand_set_boundary()
3716 this->command(mtd, FLEXONENAND_CMD_PI_ACCESS, die, 0); in flexonenand_set_boundary()
3717 this->wait(mtd, FL_SYNCING); in flexonenand_set_boundary()
3720 this->command(mtd, FLEXONENAND_CMD_READ_PI, die, 0); in flexonenand_set_boundary()
3721 this->wait(mtd, FL_READING); in flexonenand_set_boundary()
3723 thisboundary = this->read_word(this->base + ONENAND_DATARAM); in flexonenand_set_boundary()
3733 addr = die ? this->diesize[0] : 0; in flexonenand_set_boundary()
3738 this->command(mtd, ONENAND_CMD_ERASE, addr, 0); in flexonenand_set_boundary()
3739 ret = this->wait(mtd, FL_ERASING); in flexonenand_set_boundary()
3746 this->write_word(boundary, this->base + ONENAND_DATARAM); in flexonenand_set_boundary()
3747 this->command(mtd, ONENAND_CMD_PROG, addr, 0); in flexonenand_set_boundary()
3748 ret = this->wait(mtd, FL_WRITING); in flexonenand_set_boundary()
3755 this->command(mtd, FLEXONENAND_CMD_PI_UPDATE, die, 0); in flexonenand_set_boundary()
3756 ret = this->wait(mtd, FL_WRITING); in flexonenand_set_boundary()
3758 this->write_word(ONENAND_CMD_RESET, this->base + ONENAND_REG_COMMAND); in flexonenand_set_boundary()
3759 this->wait(mtd, FL_RESETING); in flexonenand_set_boundary()
3776 struct onenand_chip *this = mtd->priv; in onenand_chip_probe() local
3781 syscfg = this->read_word(this->base + ONENAND_REG_SYS_CFG1); in onenand_chip_probe()
3783this->write_word((syscfg & ~ONENAND_SYS_CFG1_SYNC_READ & ~ONENAND_SYS_CFG1_SYNC_WRITE), this->base… in onenand_chip_probe()
3786 this->write_word(ONENAND_CMD_READID, this->base + ONENAND_BOOTRAM); in onenand_chip_probe()
3789 bram_maf_id = this->read_word(this->base + ONENAND_BOOTRAM + 0x0); in onenand_chip_probe()
3790 bram_dev_id = this->read_word(this->base + ONENAND_BOOTRAM + 0x2); in onenand_chip_probe()
3793 this->write_word(ONENAND_CMD_RESET, this->base + ONENAND_BOOTRAM); in onenand_chip_probe()
3795 this->wait(mtd, FL_RESETING); in onenand_chip_probe()
3798 this->write_word(syscfg, this->base + ONENAND_REG_SYS_CFG1); in onenand_chip_probe()
3805 maf_id = this->read_word(this->base + ONENAND_REG_MANUFACTURER_ID); in onenand_chip_probe()
3806 dev_id = this->read_word(this->base + ONENAND_REG_DEVICE_ID); in onenand_chip_probe()
3821 struct onenand_chip *this = mtd->priv; in onenand_probe() local
3826 ret = this->chip_probe(mtd); in onenand_probe()
3831 dev_id = this->read_word(this->base + ONENAND_REG_DEVICE_ID); in onenand_probe()
3832 ver_id = this->read_word(this->base + ONENAND_REG_VERSION_ID); in onenand_probe()
3833 this->technology = this->read_word(this->base + ONENAND_REG_TECHNOLOGY); in onenand_probe()
3837 this->device_id = dev_id; in onenand_probe()
3838 this->version_id = ver_id; in onenand_probe()
3844 if (FLEXONENAND(this)) { in onenand_probe()
3845 this->dies = ONENAND_IS_DDP(this) ? 2 : 1; in onenand_probe()
3847 mtd->numeraseregions = this->dies << 1; in onenand_probe()
3849 * (this->dies << 1), GFP_KERNEL); in onenand_probe()
3858 this->chipsize = (16 << density) << 20; in onenand_probe()
3862 mtd->writesize = this->read_word(this->base + ONENAND_REG_DATA_BUFFER_SIZE); in onenand_probe()
3864 if (ONENAND_IS_4KB_PAGE(this)) in onenand_probe()
3875 if (FLEXONENAND(this)) in onenand_probe()
3878 this->erase_shift = ffs(mtd->erasesize) - 1; in onenand_probe()
3879 this->page_shift = ffs(mtd->writesize) - 1; in onenand_probe()
3880 this->page_mask = (1 << (this->erase_shift - this->page_shift)) - 1; in onenand_probe()
3882 if (ONENAND_IS_DDP(this)) in onenand_probe()
3883 this->density_mask = this->chipsize >> (this->erase_shift + 1); in onenand_probe()
3885 this->writesize = mtd->writesize; in onenand_probe()
3889 if (FLEXONENAND(this)) in onenand_probe()
3892 mtd->size = this->chipsize; in onenand_probe()
3900 if (ONENAND_IS_2PLANE(this)) { in onenand_probe()
3923 struct onenand_chip *this = mtd->priv; in onenand_resume() local
3925 if (this->state == FL_PM_SUSPENDED) in onenand_resume()
3945 struct onenand_chip *this = mtd->priv; in onenand_scan() local
3947 if (!this->read_word) in onenand_scan()
3948 this->read_word = onenand_readw; in onenand_scan()
3949 if (!this->write_word) in onenand_scan()
3950 this->write_word = onenand_writew; in onenand_scan()
3952 if (!this->command) in onenand_scan()
3953 this->command = onenand_command; in onenand_scan()
3954 if (!this->wait) in onenand_scan()
3956 if (!this->bbt_wait) in onenand_scan()
3957 this->bbt_wait = onenand_bbt_wait; in onenand_scan()
3958 if (!this->unlock_all) in onenand_scan()
3959 this->unlock_all = onenand_unlock_all; in onenand_scan()
3961 if (!this->chip_probe) in onenand_scan()
3962 this->chip_probe = onenand_chip_probe; in onenand_scan()
3964 if (!this->read_bufferram) in onenand_scan()
3965 this->read_bufferram = onenand_read_bufferram; in onenand_scan()
3966 if (!this->write_bufferram) in onenand_scan()
3967 this->write_bufferram = onenand_write_bufferram; in onenand_scan()
3969 if (!this->block_markbad) in onenand_scan()
3970 this->block_markbad = onenand_default_block_markbad; in onenand_scan()
3971 if (!this->scan_bbt) in onenand_scan()
3972 this->scan_bbt = onenand_default_bbt; in onenand_scan()
3978 if (this->mmcontrol) { in onenand_scan()
3980 this->read_bufferram = onenand_sync_read_bufferram; in onenand_scan()
3984 if (!this->page_buf) { in onenand_scan()
3985 this->page_buf = kzalloc(mtd->writesize, GFP_KERNEL); in onenand_scan()
3986 if (!this->page_buf) in onenand_scan()
3989 this->verify_buf = kzalloc(mtd->writesize, GFP_KERNEL); in onenand_scan()
3990 if (!this->verify_buf) { in onenand_scan()
3991 kfree(this->page_buf); in onenand_scan()
3995 this->options |= ONENAND_PAGEBUF_ALLOC; in onenand_scan()
3997 if (!this->oob_buf) { in onenand_scan()
3998 this->oob_buf = kzalloc(mtd->oobsize, GFP_KERNEL); in onenand_scan()
3999 if (!this->oob_buf) { in onenand_scan()
4000 if (this->options & ONENAND_PAGEBUF_ALLOC) { in onenand_scan()
4001 this->options &= ~ONENAND_PAGEBUF_ALLOC; in onenand_scan()
4002 kfree(this->page_buf); in onenand_scan()
4006 this->options |= ONENAND_OOBBUF_ALLOC; in onenand_scan()
4009 this->state = FL_READY; in onenand_scan()
4010 init_waitqueue_head(&this->wq); in onenand_scan()
4011 spin_lock_init(&this->chip_lock); in onenand_scan()
4018 if (FLEXONENAND(this)) { in onenand_scan()
4019 this->ecclayout = &flexonenand_oob_128; in onenand_scan()
4022 this->ecclayout = &onenand_oob_128; in onenand_scan()
4025 if (ONENAND_IS_NOP_1(this)) in onenand_scan()
4029 this->ecclayout = &onenand_oob_64; in onenand_scan()
4034 this->ecclayout = &onenand_oob_32; in onenand_scan()
4043 this->ecclayout = &onenand_oob_32; in onenand_scan()
4047 this->subpagesize = mtd->writesize >> mtd->subpage_sft; in onenand_scan()
4053 this->ecclayout->oobavail = 0; in onenand_scan()
4055 this->ecclayout->oobfree[i].length; i++) in onenand_scan()
4056 this->ecclayout->oobavail += in onenand_scan()
4057 this->ecclayout->oobfree[i].length; in onenand_scan()
4058 mtd->oobavail = this->ecclayout->oobavail; in onenand_scan()
4060 mtd->ecclayout = this->ecclayout; in onenand_scan()
4064 mtd->type = ONENAND_IS_MLC(this) ? MTD_MLCNANDFLASH : MTD_NANDFLASH; in onenand_scan()
4093 if (!(this->options & ONENAND_SKIP_INITIAL_UNLOCKING)) in onenand_scan()
4094 this->unlock_all(mtd); in onenand_scan()
4096 ret = this->scan_bbt(mtd); in onenand_scan()
4097 if ((!FLEXONENAND(this)) || ret) in onenand_scan()
4114 struct onenand_chip *this = mtd->priv; in onenand_release() local
4120 if (this->bbm) { in onenand_release()
4121 struct bbm_info *bbm = this->bbm; in onenand_release()
4123 kfree(this->bbm); in onenand_release()
4126 if (this->options & ONENAND_PAGEBUF_ALLOC) { in onenand_release()
4127 kfree(this->page_buf); in onenand_release()
4129 kfree(this->verify_buf); in onenand_release()
4132 if (this->options & ONENAND_OOBBUF_ALLOC) in onenand_release()
4133 kfree(this->oob_buf); in onenand_release()