Lines Matching full:this

18  * This program is free software; you can redistribute it and/or modify
191 * @param this onenand chip data structure
197 static int onenand_block_address(struct onenand_chip *this, int block) in onenand_block_address() argument
200 if (block & this->density_mask) in onenand_block_address()
201 return ONENAND_DDP_CHIP1 | (block ^ this->density_mask); in onenand_block_address()
208 * @param this onenand chip data structure
214 static int onenand_bufferram_address(struct onenand_chip *this, int block) in onenand_bufferram_address() argument
217 if (block & this->density_mask) in onenand_bufferram_address()
271 * @param this - OneNAND device structure
274 static unsigned flexonenand_block(struct onenand_chip *this, loff_t addr) in flexonenand_block() argument
278 if (ONENAND_IS_DDP(this) && addr >= this->diesize[0]) { in flexonenand_block()
280 addr -= this->diesize[0]; in flexonenand_block()
283 boundary = this->boundary[die]; in flexonenand_block()
285 blk = addr >> (this->erase_shift - 1); in flexonenand_block()
289 blk += die ? this->density_mask : 0; in flexonenand_block()
293 inline unsigned onenand_block(struct onenand_chip *this, loff_t addr) in onenand_block() argument
295 if (!FLEXONENAND(this)) in onenand_block()
296 return addr >> this->erase_shift; in onenand_block()
297 return flexonenand_block(this, addr); in onenand_block()
302 * @this: OneNAND device structure
307 static loff_t flexonenand_addr(struct onenand_chip *this, int block) in flexonenand_addr() argument
312 if (ONENAND_IS_DDP(this) && block >= this->density_mask) { in flexonenand_addr()
313 block -= this->density_mask; in flexonenand_addr()
315 ofs = this->diesize[0]; in flexonenand_addr()
318 boundary = this->boundary[die]; in flexonenand_addr()
319 ofs += (loff_t)block << (this->erase_shift - 1); in flexonenand_addr()
321 ofs += (loff_t)(block - boundary - 1) << (this->erase_shift - 1); in flexonenand_addr()
325 loff_t onenand_addr(struct onenand_chip *this, int block) in onenand_addr() argument
327 if (!FLEXONENAND(this)) in onenand_addr()
328 return (loff_t)block << this->erase_shift; in onenand_addr()
329 return flexonenand_addr(this, block); in onenand_addr()
368 * Send command to OneNAND device. This function is used for middle/large page
373 struct onenand_chip *this = mtd->priv; in onenand_command() local
388 block = addr * this->density_mask; in onenand_command()
397 block = onenand_block(this, addr); in onenand_command()
403 block = addr * this->density_mask; in onenand_command()
408 block = onenand_block(this, addr); in onenand_command()
409 if (FLEXONENAND(this)) in onenand_command()
410 page = (int) (addr - onenand_addr(this, block))>>\ in onenand_command()
411 this->page_shift; in onenand_command()
413 page = (int) (addr >> this->page_shift); in onenand_command()
414 if (ONENAND_IS_2PLANE(this)) { in onenand_command()
418 if (addr & this->writesize) in onenand_command()
422 page &= this->page_mask; in onenand_command()
429 value = onenand_bufferram_address(this, block); in onenand_command()
430 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2); in onenand_command()
432 if (ONENAND_IS_2PLANE(this) || ONENAND_IS_4KB_PAGE(this)) in onenand_command()
434 ONENAND_SET_BUFFERRAM0(this); in onenand_command()
437 ONENAND_SET_NEXT_BUFFERRAM(this); in onenand_command()
444 value = onenand_block_address(this, block); in onenand_command()
445 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS1); in onenand_command()
448 value = onenand_bufferram_address(this, block); in onenand_command()
449 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2); in onenand_command()
461 if (ONENAND_IS_4KB_PAGE(this)) in onenand_command()
463 dataram = ONENAND_SET_BUFFERRAM0(this); in onenand_command()
465 dataram = ONENAND_SET_NEXT_BUFFERRAM(this); in onenand_command()
469 if (ONENAND_IS_2PLANE(this) && cmd == ONENAND_CMD_PROG) in onenand_command()
471 dataram = ONENAND_CURRENT_BUFFERRAM(this); in onenand_command()
477 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS8); in onenand_command()
481 this->write_word(value, this->base + ONENAND_REG_START_BUFFER); in onenand_command()
485 this->write_word(ONENAND_INT_CLEAR, this->base + ONENAND_REG_INTERRUPT); in onenand_command()
488 this->write_word(cmd, this->base + ONENAND_REG_COMMAND); in onenand_command()
495 * @param this onenand chip structure
497 static inline int onenand_read_ecc(struct onenand_chip *this) in onenand_read_ecc() argument
501 if (!FLEXONENAND(this) && !ONENAND_IS_4KB_PAGE(this)) in onenand_read_ecc()
502 return this->read_word(this->base + ONENAND_REG_ECC_STATUS); in onenand_read_ecc()
505 ecc = this->read_word(this->base + ONENAND_REG_ECC_STATUS + i*2); in onenand_read_ecc()
522 * Wait for command done. This applies to all OneNAND command
528 struct onenand_chip * this = mtd->priv; in onenand_wait() local
537 interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT); in onenand_wait()
546 interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT); in onenand_wait()
548 ctrl = this->read_word(this->base + ONENAND_REG_CTRL_STATUS); in onenand_wait()
556 int ecc = onenand_read_ecc(this); in onenand_wait()
608 struct onenand_chip *this = data; in onenand_interrupt() local
611 if (!this->complete.done) in onenand_interrupt()
612 complete(&this->complete); in onenand_interrupt()
626 struct onenand_chip *this = mtd->priv; in onenand_interrupt_wait() local
628 wait_for_completion(&this->complete); in onenand_interrupt_wait()
642 struct onenand_chip *this = mtd->priv; in onenand_try_interrupt_wait() local
646 this->wait = onenand_interrupt_wait; in onenand_try_interrupt_wait()
649 remain = wait_for_completion_timeout(&this->complete, timeout); in onenand_try_interrupt_wait()
655 free_irq(this->irq, this); in onenand_try_interrupt_wait()
657 this->wait = onenand_wait; in onenand_try_interrupt_wait()
673 struct onenand_chip *this = mtd->priv; in onenand_setup_wait() local
676 init_completion(&this->complete); in onenand_setup_wait()
678 if (this->irq <= 0) { in onenand_setup_wait()
679 this->wait = onenand_wait; in onenand_setup_wait()
683 if (request_irq(this->irq, &onenand_interrupt, in onenand_setup_wait()
684 IRQF_SHARED, "onenand", this)) { in onenand_setup_wait()
686 this->wait = onenand_wait; in onenand_setup_wait()
691 syscfg = this->read_word(this->base + ONENAND_REG_SYS_CFG1); in onenand_setup_wait()
693 this->write_word(syscfg, this->base + ONENAND_REG_SYS_CFG1); in onenand_setup_wait()
695 this->wait = onenand_try_interrupt_wait; in onenand_setup_wait()
708 struct onenand_chip *this = mtd->priv; in onenand_bufferram_offset() local
710 if (ONENAND_CURRENT_BUFFERRAM(this)) { in onenand_bufferram_offset()
711 /* Note: the 'this->writesize' is a real page size */ in onenand_bufferram_offset()
713 return this->writesize; in onenand_bufferram_offset()
734 struct onenand_chip *this = mtd->priv; in onenand_read_bufferram() local
737 bufferram = this->base + area; in onenand_read_bufferram()
748 word = this->read_word(bufferram + offset + count); in onenand_read_bufferram()
770 struct onenand_chip *this = mtd->priv; in onenand_sync_read_bufferram() local
773 bufferram = this->base + area; in onenand_sync_read_bufferram()
777 this->mmcontrol(mtd, ONENAND_SYS_CFG1_SYNC_READ); in onenand_sync_read_bufferram()
786 word = this->read_word(bufferram + offset + count); in onenand_sync_read_bufferram()
792 this->mmcontrol(mtd, 0); in onenand_sync_read_bufferram()
810 struct onenand_chip *this = mtd->priv; in onenand_write_bufferram() local
813 bufferram = this->base + area; in onenand_write_bufferram()
828 word = this->read_word(bufferram + byte_offset); in onenand_write_bufferram()
830 this->write_word(word, bufferram + byte_offset); in onenand_write_bufferram()
848 struct onenand_chip *this = mtd->priv; in onenand_get_2x_blockpage() local
852 block = (int) (addr >> this->erase_shift) & ~1; in onenand_get_2x_blockpage()
854 if (addr & this->writesize) in onenand_get_2x_blockpage()
856 page = (int) (addr >> (this->page_shift + 1)) & this->page_mask; in onenand_get_2x_blockpage()
872 struct onenand_chip *this = mtd->priv; in onenand_check_bufferram() local
876 if (ONENAND_IS_2PLANE(this)) in onenand_check_bufferram()
879 blockpage = (int) (addr >> this->page_shift); in onenand_check_bufferram()
882 i = ONENAND_CURRENT_BUFFERRAM(this); in onenand_check_bufferram()
883 if (this->bufferram[i].blockpage == blockpage) in onenand_check_bufferram()
887 i = ONENAND_NEXT_BUFFERRAM(this); in onenand_check_bufferram()
888 if (this->bufferram[i].blockpage == blockpage) { in onenand_check_bufferram()
889 ONENAND_SET_NEXT_BUFFERRAM(this); in onenand_check_bufferram()
894 if (found && ONENAND_IS_DDP(this)) { in onenand_check_bufferram()
896 int block = onenand_block(this, addr); in onenand_check_bufferram()
897 int value = onenand_bufferram_address(this, block); in onenand_check_bufferram()
898 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2); in onenand_check_bufferram()
915 struct onenand_chip *this = mtd->priv; in onenand_update_bufferram() local
919 if (ONENAND_IS_2PLANE(this)) in onenand_update_bufferram()
922 blockpage = (int) (addr >> this->page_shift); in onenand_update_bufferram()
925 i = ONENAND_NEXT_BUFFERRAM(this); in onenand_update_bufferram()
926 if (this->bufferram[i].blockpage == blockpage) in onenand_update_bufferram()
927 this->bufferram[i].blockpage = -1; in onenand_update_bufferram()
930 i = ONENAND_CURRENT_BUFFERRAM(this); in onenand_update_bufferram()
932 this->bufferram[i].blockpage = blockpage; in onenand_update_bufferram()
934 this->bufferram[i].blockpage = -1; in onenand_update_bufferram()
948 struct onenand_chip *this = mtd->priv; in onenand_invalidate_bufferram() local
954 loff_t buf_addr = this->bufferram[i].blockpage << this->page_shift; in onenand_invalidate_bufferram()
956 this->bufferram[i].blockpage = -1; in onenand_invalidate_bufferram()
969 struct onenand_chip *this = mtd->priv; in onenand_get_device() local
976 spin_lock(&this->chip_lock); in onenand_get_device()
977 if (this->state == FL_READY) { in onenand_get_device()
978 this->state = new_state; in onenand_get_device()
979 spin_unlock(&this->chip_lock); in onenand_get_device()
980 if (new_state != FL_PM_SUSPENDED && this->enable) in onenand_get_device()
981 this->enable(mtd); in onenand_get_device()
985 spin_unlock(&this->chip_lock); in onenand_get_device()
986 return (this->state == FL_PM_SUSPENDED) ? 0 : -EAGAIN; in onenand_get_device()
989 add_wait_queue(&this->wq, &wait); in onenand_get_device()
990 spin_unlock(&this->chip_lock); in onenand_get_device()
992 remove_wait_queue(&this->wq, &wait); in onenand_get_device()
1006 struct onenand_chip *this = mtd->priv; in onenand_release_device() local
1008 if (this->state != FL_PM_SUSPENDED && this->disable) in onenand_release_device()
1009 this->disable(mtd); in onenand_release_device()
1011 spin_lock(&this->chip_lock); in onenand_release_device()
1012 this->state = FL_READY; in onenand_release_device()
1013 wake_up(&this->wq); in onenand_release_device()
1014 spin_unlock(&this->chip_lock); in onenand_release_device()
1027 struct onenand_chip *this = mtd->priv; in onenand_transfer_auto_oob() local
1033 uint8_t *oob_buf = this->oob_buf; in onenand_transfer_auto_oob()
1035 free = this->ecclayout->oobfree; in onenand_transfer_auto_oob()
1043 this->read_bufferram(mtd, ONENAND_SPARERAM, oob_buf, 0, mtd->oobsize); in onenand_transfer_auto_oob()
1044 free = this->ecclayout->oobfree; in onenand_transfer_auto_oob()
1074 struct onenand_chip *this = mtd->priv; in onenand_recover_lsb() local
1078 if (!FLEXONENAND(this)) in onenand_recover_lsb()
1087 if (mtd->eraseregions[i].erasesize < (1 << this->erase_shift)) in onenand_recover_lsb()
1098 this->command(mtd, FLEXONENAND_CMD_RECOVER_LSB, addr, this->writesize); in onenand_recover_lsb()
1099 return this->wait(mtd, FL_READING); in onenand_recover_lsb()
1114 struct onenand_chip *this = mtd->priv; in onenand_mlc_read_ops_nolock() local
1123 int writesize = this->writesize; in onenand_mlc_read_ops_nolock()
1129 oobsize = this->ecclayout->oobavail; in onenand_mlc_read_ops_nolock()
1156 this->command(mtd, ONENAND_CMD_READ, from, writesize); in onenand_mlc_read_ops_nolock()
1158 ret = this->wait(mtd, FL_READING); in onenand_mlc_read_ops_nolock()
1168 this->read_bufferram(mtd, ONENAND_DATARAM, buf, column, thislen); in onenand_mlc_read_ops_nolock()
1176 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()
1350 struct onenand_chip *this = mtd->priv; in onenand_read_oob_nolock() local
1367 oobsize = this->ecclayout->oobavail; in onenand_read_oob_nolock()
1381 column + len > ((mtd->size >> this->page_shift) - in onenand_read_oob_nolock()
1382 (from >> this->page_shift)) * oobsize)) { in onenand_read_oob_nolock()
1390 readcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_READ : ONENAND_CMD_READOOB; in onenand_read_oob_nolock()
1398 this->command(mtd, readcmd, from, mtd->oobsize); in onenand_read_oob_nolock()
1402 ret = this->wait(mtd, FL_READING); in onenand_read_oob_nolock()
1415 this->read_bufferram(mtd, ONENAND_SPARERAM, buf, column, thislen); in onenand_read_oob_nolock()
1456 struct onenand_chip *this = mtd->priv; in onenand_read() local
1466 ret = ONENAND_IS_4KB_PAGE(this) ? in onenand_read()
1486 struct onenand_chip *this = mtd->priv; in onenand_read_oob() local
1501 ret = ONENAND_IS_4KB_PAGE(this) ? in onenand_read_oob()
1520 struct onenand_chip *this = mtd->priv; in onenand_bbt_wait() local
1527 interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT); in onenand_bbt_wait()
1532 interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT); in onenand_bbt_wait()
1533 ctrl = this->read_word(this->base + ONENAND_REG_CTRL_STATUS); in onenand_bbt_wait()
1534 addr1 = this->read_word(this->base + ONENAND_REG_START_ADDRESS1); in onenand_bbt_wait()
1535 addr8 = this->read_word(this->base + ONENAND_REG_START_ADDRESS8); in onenand_bbt_wait()
1538 ecc = onenand_read_ecc(this); in onenand_bbt_wait()
1573 struct onenand_chip *this = mtd->priv; in onenand_bbt_read_oob() local
1597 readcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_READ : ONENAND_CMD_READOOB; in onenand_bbt_read_oob()
1605 this->command(mtd, readcmd, from, mtd->oobsize); in onenand_bbt_read_oob()
1609 ret = this->bbt_wait(mtd, FL_READING); in onenand_bbt_read_oob()
1616 this->read_bufferram(mtd, ONENAND_SPARERAM, buf, column, thislen); in onenand_bbt_read_oob()
1626 from += this->writesize; in onenand_bbt_read_oob()
1647 struct onenand_chip *this = mtd->priv; in onenand_verify_oob() local
1648 u_char *oob_buf = this->oob_buf; in onenand_verify_oob()
1651 readcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_READ : ONENAND_CMD_READOOB; in onenand_verify_oob()
1653 this->command(mtd, readcmd, to, mtd->oobsize); in onenand_verify_oob()
1655 status = this->wait(mtd, FL_READING); in onenand_verify_oob()
1659 this->read_bufferram(mtd, ONENAND_SPARERAM, oob_buf, 0, mtd->oobsize); in onenand_verify_oob()
1676 struct onenand_chip *this = mtd->priv; in onenand_verify() local
1680 column = addr & (this->writesize - 1); in onenand_verify()
1683 thislen = min_t(int, this->writesize - column, len); in onenand_verify()
1685 this->command(mtd, ONENAND_CMD_READ, addr, this->writesize); in onenand_verify()
1689 ret = this->wait(mtd, FL_READING); in onenand_verify()
1695 this->read_bufferram(mtd, ONENAND_DATARAM, this->verify_buf, 0, mtd->writesize); in onenand_verify()
1697 if (memcmp(buf, this->verify_buf + column, thislen)) in onenand_verify()
1713 #define NOTALIGNED(x) ((x & (this->subpagesize - 1)) != 0)
1717 struct onenand_chip *this = mtd->priv; in onenand_panic_wait() local
1722 interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT); in onenand_panic_wait()
1742 struct onenand_chip *this = mtd->priv; in onenand_panic_write() local
1747 if (this->state == FL_PM_SUSPENDED) in onenand_panic_write()
1780 this->command(mtd, ONENAND_CMD_BUFFERRAM, to, thislen); in onenand_panic_write()
1785 memset(this->page_buf, 0xff, mtd->writesize); in onenand_panic_write()
1786 memcpy(this->page_buf + column, buf, thislen); in onenand_panic_write()
1787 wbuf = this->page_buf; in onenand_panic_write()
1790 this->write_bufferram(mtd, ONENAND_DATARAM, wbuf, 0, mtd->writesize); in onenand_panic_write()
1791 this->write_bufferram(mtd, ONENAND_SPARERAM, ffchars, 0, mtd->oobsize); in onenand_panic_write()
1793 this->command(mtd, ONENAND_CMD_PROG, to, mtd->writesize); in onenand_panic_write()
1799 if (ONENAND_IS_2PLANE(this)) { in onenand_panic_write()
1800 ONENAND_SET_BUFFERRAM1(this); in onenand_panic_write()
1801 onenand_update_bufferram(mtd, to + this->writesize, !ret && !subpage); in onenand_panic_write()
1834 struct onenand_chip *this = mtd->priv; in onenand_fill_auto_oob() local
1841 free = this->ecclayout->oobfree; in onenand_fill_auto_oob()
1849 free = this->ecclayout->oobfree; in onenand_fill_auto_oob()
1875 struct onenand_chip *this = mtd->priv; in onenand_write_ops_nolock() local
1912 oobsize = this->ecclayout->oobavail; in onenand_write_ops_nolock()
1930 this->command(mtd, ONENAND_CMD_BUFFERRAM, to, thislen); in onenand_write_ops_nolock()
1935 memset(this->page_buf, 0xff, mtd->writesize); in onenand_write_ops_nolock()
1936 memcpy(this->page_buf + column, buf, thislen); in onenand_write_ops_nolock()
1937 wbuf = this->page_buf; in onenand_write_ops_nolock()
1940 this->write_bufferram(mtd, ONENAND_DATARAM, wbuf, 0, mtd->writesize); in onenand_write_ops_nolock()
1943 oobbuf = this->oob_buf; in onenand_write_ops_nolock()
1959 this->write_bufferram(mtd, ONENAND_SPARERAM, oobbuf, 0, mtd->oobsize); in onenand_write_ops_nolock()
1961 ONENAND_SET_NEXT_BUFFERRAM(this); in onenand_write_ops_nolock()
1967 if (!ONENAND_IS_2PLANE(this) && !ONENAND_IS_4KB_PAGE(this) && !first) { in onenand_write_ops_nolock()
1968 ONENAND_SET_PREV_BUFFERRAM(this); in onenand_write_ops_nolock()
1970 ret = this->wait(mtd, FL_WRITING); in onenand_write_ops_nolock()
1990 ONENAND_SET_NEXT_BUFFERRAM(this); in onenand_write_ops_nolock()
1993 this->ongoing = 0; in onenand_write_ops_nolock()
1997 if (ONENAND_IS_CACHE_PROGRAM(this) && in onenand_write_ops_nolock()
1998 likely(onenand_block(this, to) != 0) && in onenand_write_ops_nolock()
1999 ONENAND_IS_4KB_PAGE(this) && in onenand_write_ops_nolock()
2002 this->ongoing = 1; in onenand_write_ops_nolock()
2005 this->command(mtd, cmd, to, mtd->writesize); in onenand_write_ops_nolock()
2010 if (ONENAND_IS_2PLANE(this) || ONENAND_IS_4KB_PAGE(this)) { in onenand_write_ops_nolock()
2011 ret = this->wait(mtd, FL_WRITING); in onenand_write_ops_nolock()
2071 struct onenand_chip *this = mtd->priv; in onenand_write_oob_nolock() local
2088 oobsize = this->ecclayout->oobavail; in onenand_write_oob_nolock()
2109 column + len > ((mtd->size >> this->page_shift) - in onenand_write_oob_nolock()
2110 (to >> this->page_shift)) * oobsize)) { in onenand_write_oob_nolock()
2116 oobbuf = this->oob_buf; in onenand_write_oob_nolock()
2118 oobcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_PROG : ONENAND_CMD_PROGOOB; in onenand_write_oob_nolock()
2126 this->command(mtd, ONENAND_CMD_BUFFERRAM, to, mtd->oobsize); in onenand_write_oob_nolock()
2135 this->write_bufferram(mtd, ONENAND_SPARERAM, oobbuf, 0, mtd->oobsize); in onenand_write_oob_nolock()
2137 if (ONENAND_IS_4KB_PAGE(this)) { in onenand_write_oob_nolock()
2139 memset(this->page_buf, 0xff, mtd->writesize); in onenand_write_oob_nolock()
2140 this->write_bufferram(mtd, ONENAND_DATARAM, in onenand_write_oob_nolock()
2141 this->page_buf, 0, mtd->writesize); in onenand_write_oob_nolock()
2144 this->command(mtd, oobcmd, to, mtd->oobsize); in onenand_write_oob_nolock()
2147 if (ONENAND_IS_2PLANE(this)) { in onenand_write_oob_nolock()
2148 ONENAND_SET_BUFFERRAM1(this); in onenand_write_oob_nolock()
2149 onenand_update_bufferram(mtd, to + this->writesize, 0); in onenand_write_oob_nolock()
2152 ret = this->wait(mtd, FL_WRITING); in onenand_write_oob_nolock()
2250 struct onenand_chip *this = mtd->priv; in onenand_block_isbad_nolock() local
2251 struct bbm_info *bbm = this->bbm; in onenand_block_isbad_nolock()
2261 struct onenand_chip *this = mtd->priv; in onenand_multiblock_erase_verify() local
2264 unsigned int block_size = (1 << this->erase_shift); in onenand_multiblock_erase_verify()
2268 this->command(mtd, ONENAND_CMD_ERASE_VERIFY, addr, block_size); in onenand_multiblock_erase_verify()
2269 ret = this->wait(mtd, FL_VERIFYING_ERASE); in onenand_multiblock_erase_verify()
2272 __func__, onenand_block(this, addr)); in onenand_multiblock_erase_verify()
2295 struct onenand_chip *this = mtd->priv; in onenand_multiblock_erase() local
2304 if (ONENAND_IS_DDP(this)) { in onenand_multiblock_erase()
2305 loff_t bdry_addr = this->chipsize >> 1; in onenand_multiblock_erase()
2307 bdry_block = bdry_addr >> this->erase_shift; in onenand_multiblock_erase()
2337 int this_block = (addr >> this->erase_shift); in onenand_multiblock_erase()
2348 this->command(mtd, ONENAND_CMD_MULTIBLOCK_ERASE, in onenand_multiblock_erase()
2352 ret = this->wait(mtd, FL_PREPARING_ERASE); in onenand_multiblock_erase()
2356 onenand_block(this, addr)); in onenand_multiblock_erase()
2369 this->command(mtd, ONENAND_CMD_ERASE, addr, block_size); in onenand_multiblock_erase()
2372 ret = this->wait(mtd, FL_ERASING); in onenand_multiblock_erase()
2376 __func__, onenand_block(this, addr)); in onenand_multiblock_erase()
2413 struct onenand_chip *this = mtd->priv; in onenand_block_by_block_erase() local
2439 this->command(mtd, ONENAND_CMD_ERASE, addr, block_size); in onenand_block_by_block_erase()
2443 ret = this->wait(mtd, FL_ERASING); in onenand_block_by_block_erase()
2447 __func__, onenand_block(this, addr)); in onenand_block_by_block_erase()
2465 /* FIXME: This should be handled at MTD partitioning level. */ in onenand_block_by_block_erase()
2484 struct onenand_chip *this = mtd->priv; in onenand_erase() local
2502 if (FLEXONENAND(this)) { in onenand_erase()
2503 /* Find the eraseregion of this address */ in onenand_erase()
2514 block_size = 1 << this->erase_shift; in onenand_erase()
2533 if (ONENAND_IS_4KB_PAGE(this) || region || in onenand_erase()
2597 * This is the default implementation, which can be overridden by
2602 struct onenand_chip *this = mtd->priv; in onenand_default_block_markbad() local
2603 struct bbm_info *bbm = this->bbm; in onenand_default_block_markbad()
2614 block = onenand_block(this, ofs); in onenand_default_block_markbad()
2663 struct onenand_chip *this = mtd->priv; in onenand_do_lock_cmd() local
2667 start = onenand_block(this, ofs); in onenand_do_lock_cmd()
2668 end = onenand_block(this, ofs + len) - 1; in onenand_do_lock_cmd()
2676 if (this->options & ONENAND_HAS_CONT_LOCK) { in onenand_do_lock_cmd()
2678 this->write_word(start, this->base + ONENAND_REG_START_BLOCK_ADDRESS); in onenand_do_lock_cmd()
2680 this->write_word(end, this->base + ONENAND_REG_END_BLOCK_ADDRESS); in onenand_do_lock_cmd()
2682 this->command(mtd, cmd, 0, 0); in onenand_do_lock_cmd()
2685 this->wait(mtd, FL_LOCKING); in onenand_do_lock_cmd()
2688 while (this->read_word(this->base + ONENAND_REG_CTRL_STATUS) in onenand_do_lock_cmd()
2693 status = this->read_word(this->base + ONENAND_REG_WP_STATUS); in onenand_do_lock_cmd()
2704 value = onenand_block_address(this, block); in onenand_do_lock_cmd()
2705 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS1); in onenand_do_lock_cmd()
2707 value = onenand_bufferram_address(this, block); in onenand_do_lock_cmd()
2708 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2); in onenand_do_lock_cmd()
2710 this->write_word(block, this->base + ONENAND_REG_START_BLOCK_ADDRESS); in onenand_do_lock_cmd()
2712 this->command(mtd, cmd, 0, 0); in onenand_do_lock_cmd()
2715 this->wait(mtd, FL_LOCKING); in onenand_do_lock_cmd()
2718 while (this->read_word(this->base + ONENAND_REG_CTRL_STATUS) in onenand_do_lock_cmd()
2723 status = this->read_word(this->base + ONENAND_REG_WP_STATUS); in onenand_do_lock_cmd()
2770 * @param this onenand chip data structure
2774 static int onenand_check_lock_status(struct onenand_chip *this) in onenand_check_lock_status() argument
2779 end = this->chipsize >> this->erase_shift; in onenand_check_lock_status()
2782 value = onenand_block_address(this, block); in onenand_check_lock_status()
2783 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS1); in onenand_check_lock_status()
2785 value = onenand_bufferram_address(this, block); in onenand_check_lock_status()
2786 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2); in onenand_check_lock_status()
2788 this->write_word(block, this->base + ONENAND_REG_START_BLOCK_ADDRESS); in onenand_check_lock_status()
2791 status = this->read_word(this->base + ONENAND_REG_WP_STATUS); in onenand_check_lock_status()
2810 struct onenand_chip *this = mtd->priv; in onenand_unlock_all() local
2814 if (this->options & ONENAND_HAS_UNLOCK_ALL) { in onenand_unlock_all()
2816 this->write_word(0, this->base + ONENAND_REG_START_BLOCK_ADDRESS); in onenand_unlock_all()
2818 this->command(mtd, ONENAND_CMD_UNLOCK_ALL, 0, 0); in onenand_unlock_all()
2821 this->wait(mtd, FL_LOCKING); in onenand_unlock_all()
2824 while (this->read_word(this->base + ONENAND_REG_CTRL_STATUS) in onenand_unlock_all()
2829 if (this->options & ONENAND_SKIP_UNLOCK_CHECK) in onenand_unlock_all()
2833 if (onenand_check_lock_status(this)) in onenand_unlock_all()
2837 if (ONENAND_IS_DDP(this) && !FLEXONENAND(this)) { in onenand_unlock_all()
2839 ofs = this->chipsize >> 1; in onenand_unlock_all()
2840 len = this->chipsize >> 1; in onenand_unlock_all()
2859 struct onenand_chip *this = mtd->priv; in onenand_otp_command() local
2865 block = (int) (addr >> this->erase_shift); in onenand_otp_command()
2870 block = (int) (addr >> this->erase_shift); in onenand_otp_command()
2871 page = (int) (addr >> this->page_shift); in onenand_otp_command()
2873 if (ONENAND_IS_2PLANE(this)) { in onenand_otp_command()
2877 if (addr & this->writesize) in onenand_otp_command()
2881 page &= this->page_mask; in onenand_otp_command()
2887 value = onenand_block_address(this, block); in onenand_otp_command()
2888 this->write_word(value, this->base + in onenand_otp_command()
2899 if (ONENAND_IS_2PLANE(this) && cmd == ONENAND_CMD_PROG) in onenand_otp_command()
2901 dataram = ONENAND_CURRENT_BUFFERRAM(this); in onenand_otp_command()
2907 this->write_word(value, this->base + in onenand_otp_command()
2912 this->write_word(value, this->base + ONENAND_REG_START_BUFFER); in onenand_otp_command()
2916 this->write_word(ONENAND_INT_CLEAR, this->base + ONENAND_REG_INTERRUPT); in onenand_otp_command()
2919 this->write_word(cmd, this->base + ONENAND_REG_COMMAND); in onenand_otp_command()
2937 struct onenand_chip *this = mtd->priv; in onenand_otp_write_oob_nolock() local
2954 oobbuf = this->oob_buf; in onenand_otp_write_oob_nolock()
2962 block = (int) (to >> this->erase_shift); in onenand_otp_write_oob_nolock()
2968 value = onenand_block_address(this, block); in onenand_otp_write_oob_nolock()
2969 this->write_word(value, this->base + in onenand_otp_write_oob_nolock()
2977 value = onenand_bufferram_address(this, block); in onenand_otp_write_oob_nolock()
2978 this->write_word(value, this->base + in onenand_otp_write_oob_nolock()
2980 ONENAND_SET_NEXT_BUFFERRAM(this); in onenand_otp_write_oob_nolock()
2985 this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0); in onenand_otp_write_oob_nolock()
2986 this->wait(mtd, FL_OTPING); in onenand_otp_write_oob_nolock()
2998 this->write_bufferram(mtd, ONENAND_SPARERAM, in onenand_otp_write_oob_nolock()
3003 if (ONENAND_IS_2PLANE(this)) { in onenand_otp_write_oob_nolock()
3004 ONENAND_SET_BUFFERRAM1(this); in onenand_otp_write_oob_nolock()
3005 onenand_update_bufferram(mtd, to + this->writesize, 0); in onenand_otp_write_oob_nolock()
3008 ret = this->wait(mtd, FL_WRITING); in onenand_otp_write_oob_nolock()
3015 this->command(mtd, ONENAND_CMD_RESET, 0, 0); in onenand_otp_write_oob_nolock()
3016 this->wait(mtd, FL_RESETING); in onenand_otp_write_oob_nolock()
3018 status = this->read_word(this->base + ONENAND_REG_CTRL_STATUS); in onenand_otp_write_oob_nolock()
3068 struct onenand_chip *this = mtd->priv; in do_otp_read() local
3078 this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0); in do_otp_read()
3079 this->wait(mtd, FL_OTPING); in do_otp_read()
3081 ret = ONENAND_IS_4KB_PAGE(this) ? in do_otp_read()
3086 this->command(mtd, ONENAND_CMD_RESET, 0, 0); in do_otp_read()
3087 this->wait(mtd, FL_RESETING); in do_otp_read()
3105 struct onenand_chip *this = mtd->priv; in do_otp_write() local
3112 memcpy(this->page_buf, buf, len); in do_otp_write()
3113 memset(this->page_buf + len, 0xff, mtd->writesize - len); in do_otp_write()
3114 pbuf = this->page_buf; in do_otp_write()
3119 this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0); in do_otp_write()
3120 this->wait(mtd, FL_OTPING); in do_otp_write()
3130 this->command(mtd, ONENAND_CMD_RESET, 0, 0); in do_otp_write()
3131 this->wait(mtd, FL_RESETING); in do_otp_write()
3149 struct onenand_chip *this = mtd->priv; in do_otp_lock() local
3153 if (FLEXONENAND(this)) { in do_otp_lock()
3156 this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0); in do_otp_lock()
3157 this->wait(mtd, FL_OTPING); in do_otp_lock()
3170 this->command(mtd, ONENAND_CMD_RESET, 0, 0); in do_otp_lock()
3171 this->wait(mtd, FL_RESETING); in do_otp_lock()
3200 struct onenand_chip *this = mtd->priv; in onenand_otp_walk() local
3207 density = onenand_get_density(this->device_id); in onenand_otp_walk()
3362 struct onenand_chip *this = mtd->priv; in onenand_lock_user_prot_reg() local
3363 u_char *buf = FLEXONENAND(this) ? this->page_buf : this->oob_buf; in onenand_lock_user_prot_reg()
3368 memset(buf, 0xff, FLEXONENAND(this) ? this->writesize in onenand_lock_user_prot_reg()
3378 len = FLEXONENAND(this) ? mtd->writesize : 16; in onenand_lock_user_prot_reg()
3386 if (FLEXONENAND(this)) in onenand_lock_user_prot_reg()
3416 struct onenand_chip *this = mtd->priv; in onenand_check_features() local
3420 density = onenand_get_density(this->device_id); in onenand_check_features()
3421 process = this->version_id >> ONENAND_VERSION_PROCESS_SHIFT; in onenand_check_features()
3422 numbufs = this->read_word(this->base + ONENAND_REG_NUM_BUFFERS) >> 8; in onenand_check_features()
3427 if (ONENAND_IS_DDP(this)) in onenand_check_features()
3428 this->options |= ONENAND_HAS_2PLANE; in onenand_check_features()
3430 this->options |= ONENAND_HAS_4KB_PAGE; in onenand_check_features()
3431 this->options |= ONENAND_HAS_CACHE_PROGRAM; in onenand_check_features()
3443 if ((this->version_id & 0xf) == 0xe) in onenand_check_features()
3444 this->options |= ONENAND_HAS_NOP_1; in onenand_check_features()
3449 if (!ONENAND_IS_DDP(this)) in onenand_check_features()
3450 this->options |= ONENAND_HAS_2PLANE; in onenand_check_features()
3451 this->options |= ONENAND_HAS_UNLOCK_ALL; in onenand_check_features()
3456 this->options |= ONENAND_HAS_UNLOCK_ALL; in onenand_check_features()
3462 this->options |= ONENAND_HAS_CONT_LOCK; in onenand_check_features()
3467 if (ONENAND_IS_MLC(this)) in onenand_check_features()
3468 this->options |= ONENAND_HAS_4KB_PAGE; in onenand_check_features()
3470 if (ONENAND_IS_4KB_PAGE(this)) in onenand_check_features()
3471 this->options &= ~ONENAND_HAS_2PLANE; in onenand_check_features()
3473 if (FLEXONENAND(this)) { in onenand_check_features()
3474 this->options &= ~ONENAND_HAS_CONT_LOCK; in onenand_check_features()
3475 this->options |= ONENAND_HAS_UNLOCK_ALL; in onenand_check_features()
3478 if (this->options & ONENAND_HAS_CONT_LOCK) in onenand_check_features()
3480 if (this->options & ONENAND_HAS_UNLOCK_ALL) in onenand_check_features()
3482 if (this->options & ONENAND_HAS_2PLANE) in onenand_check_features()
3484 if (this->options & ONENAND_HAS_4KB_PAGE) in onenand_check_features()
3486 if (this->options & ONENAND_HAS_CACHE_PROGRAM) in onenand_check_features()
3553 struct onenand_chip *this = mtd->priv; in flexonenand_get_boundary() local
3558 syscfg = this->read_word(this->base + ONENAND_REG_SYS_CFG1); in flexonenand_get_boundary()
3559 this->write_word((syscfg | 0x0100), this->base + ONENAND_REG_SYS_CFG1); in flexonenand_get_boundary()
3561 for (die = 0; die < this->dies; die++) { in flexonenand_get_boundary()
3562 this->command(mtd, FLEXONENAND_CMD_PI_ACCESS, die, 0); in flexonenand_get_boundary()
3563 this->wait(mtd, FL_SYNCING); in flexonenand_get_boundary()
3565 this->command(mtd, FLEXONENAND_CMD_READ_PI, die, 0); in flexonenand_get_boundary()
3566 ret = this->wait(mtd, FL_READING); in flexonenand_get_boundary()
3568 bdry = this->read_word(this->base + ONENAND_DATARAM); in flexonenand_get_boundary()
3573 this->boundary[die] = bdry & FLEXONENAND_PI_MASK; in flexonenand_get_boundary()
3575 this->command(mtd, ONENAND_CMD_RESET, 0, 0); in flexonenand_get_boundary()
3576 ret = this->wait(mtd, FL_RESETING); in flexonenand_get_boundary()
3579 this->boundary[die], locked ? "(Locked)" : "(Unlocked)"); in flexonenand_get_boundary()
3583 this->write_word(syscfg, this->base + ONENAND_REG_SYS_CFG1); in flexonenand_get_boundary()
3594 struct onenand_chip *this = mtd->priv; in flexonenand_get_size() local
3599 density = onenand_get_density(this->device_id); in flexonenand_get_size()
3600 blksperdie = ((loff_t)(16 << density) << 20) >> (this->erase_shift); in flexonenand_get_size()
3601 blksperdie >>= ONENAND_IS_DDP(this) ? 1 : 0; in flexonenand_get_size()
3603 eraseshift = this->erase_shift - 1; in flexonenand_get_size()
3605 mtd->numeraseregions = this->dies << 1; in flexonenand_get_size()
3607 /* This fills up the device boundary */ in flexonenand_get_size()
3611 for (; die < this->dies; die++) { in flexonenand_get_size()
3612 if (!die || this->boundary[die-1] != maxbdry) { in flexonenand_get_size()
3617 this->boundary[die] + 1; in flexonenand_get_size()
3623 this->boundary[die] + 1; in flexonenand_get_size()
3624 ofs += (this->boundary[die] + 1) << (eraseshift - 1); in flexonenand_get_size()
3626 if (this->boundary[die] != maxbdry) { in flexonenand_get_size()
3631 this->boundary[die]; in flexonenand_get_size()
3639 mtd->erasesize = 1 << this->erase_shift; in flexonenand_get_size()
3651 for (die = 0, mtd->size = 0; die < this->dies; die++) { in flexonenand_get_size()
3652 this->diesize[die] = (loff_t)blksperdie << this->erase_shift; in flexonenand_get_size()
3653 this->diesize[die] -= (loff_t)(this->boundary[die] + 1) in flexonenand_get_size()
3654 << (this->erase_shift - 1); in flexonenand_get_size()
3655 mtd->size += this->diesize[die]; in flexonenand_get_size()
3668 * This might lead to the block being detected as bad.
3670 * Avoid this by ensuring that the block to be converted is
3675 struct onenand_chip *this = mtd->priv; in flexonenand_check_blocks_erased() local
3683 .oobbuf = this->oob_buf, in flexonenand_check_blocks_erased()
3690 addr = flexonenand_addr(this, block); in flexonenand_check_blocks_erased()
3703 if (this->oob_buf[i] != 0xff) in flexonenand_check_blocks_erased()
3723 struct onenand_chip *this = mtd->priv; in flexonenand_set_boundary() local
3728 if (die && (!ONENAND_IS_DDP(this))) in flexonenand_set_boundary()
3732 if (boundary < 0 || boundary == this->boundary[die]) in flexonenand_set_boundary()
3735 density = onenand_get_density(this->device_id); in flexonenand_set_boundary()
3736 blksperdie = ((16 << density) << 20) >> this->erase_shift; in flexonenand_set_boundary()
3737 blksperdie >>= ONENAND_IS_DDP(this) ? 1 : 0; in flexonenand_set_boundary()
3746 old = this->boundary[die] + (die * this->density_mask); in flexonenand_set_boundary()
3747 new = boundary + (die * this->density_mask); in flexonenand_set_boundary()
3755 this->command(mtd, FLEXONENAND_CMD_PI_ACCESS, die, 0); in flexonenand_set_boundary()
3756 this->wait(mtd, FL_SYNCING); in flexonenand_set_boundary()
3759 this->command(mtd, FLEXONENAND_CMD_READ_PI, die, 0); in flexonenand_set_boundary()
3760 ret = this->wait(mtd, FL_READING); in flexonenand_set_boundary()
3762 thisboundary = this->read_word(this->base + ONENAND_DATARAM); in flexonenand_set_boundary()
3772 addr = die ? this->diesize[0] : 0; in flexonenand_set_boundary()
3777 this->command(mtd, ONENAND_CMD_ERASE, addr, 0); in flexonenand_set_boundary()
3778 ret = this->wait(mtd, FL_ERASING); in flexonenand_set_boundary()
3785 this->write_word(boundary, this->base + ONENAND_DATARAM); in flexonenand_set_boundary()
3786 this->command(mtd, ONENAND_CMD_PROG, addr, 0); in flexonenand_set_boundary()
3787 ret = this->wait(mtd, FL_WRITING); in flexonenand_set_boundary()
3794 this->command(mtd, FLEXONENAND_CMD_PI_UPDATE, die, 0); in flexonenand_set_boundary()
3795 ret = this->wait(mtd, FL_WRITING); in flexonenand_set_boundary()
3797 this->write_word(ONENAND_CMD_RESET, this->base + ONENAND_REG_COMMAND); in flexonenand_set_boundary()
3798 this->wait(mtd, FL_RESETING); in flexonenand_set_boundary()
3815 struct onenand_chip *this = mtd->priv; in onenand_chip_probe() local
3820 syscfg = this->read_word(this->base + ONENAND_REG_SYS_CFG1); in onenand_chip_probe()
3822this->write_word((syscfg & ~ONENAND_SYS_CFG1_SYNC_READ & ~ONENAND_SYS_CFG1_SYNC_WRITE), this->base… in onenand_chip_probe()
3825 this->write_word(ONENAND_CMD_READID, this->base + ONENAND_BOOTRAM); in onenand_chip_probe()
3828 bram_maf_id = this->read_word(this->base + ONENAND_BOOTRAM + 0x0); in onenand_chip_probe()
3829 bram_dev_id = this->read_word(this->base + ONENAND_BOOTRAM + 0x2); in onenand_chip_probe()
3832 this->write_word(ONENAND_CMD_RESET, this->base + ONENAND_BOOTRAM); in onenand_chip_probe()
3834 this->wait(mtd, FL_RESETING); in onenand_chip_probe()
3837 this->write_word(syscfg, this->base + ONENAND_REG_SYS_CFG1); in onenand_chip_probe()
3844 maf_id = this->read_word(this->base + ONENAND_REG_MANUFACTURER_ID); in onenand_chip_probe()
3845 dev_id = this->read_word(this->base + ONENAND_REG_DEVICE_ID); in onenand_chip_probe()
3860 struct onenand_chip *this = mtd->priv; in onenand_probe() local
3865 ret = this->chip_probe(mtd); in onenand_probe()
3870 maf_id = this->read_word(this->base + ONENAND_REG_MANUFACTURER_ID); in onenand_probe()
3871 dev_id = this->read_word(this->base + ONENAND_REG_DEVICE_ID); in onenand_probe()
3872 ver_id = this->read_word(this->base + ONENAND_REG_VERSION_ID); in onenand_probe()
3873 this->technology = this->read_word(this->base + ONENAND_REG_TECHNOLOGY); in onenand_probe()
3877 this->device_id = dev_id; in onenand_probe()
3878 this->version_id = ver_id; in onenand_probe()
3884 if (FLEXONENAND(this)) { in onenand_probe()
3885 this->dies = ONENAND_IS_DDP(this) ? 2 : 1; in onenand_probe()
3887 mtd->numeraseregions = this->dies << 1; in onenand_probe()
3889 * (this->dies << 1), GFP_KERNEL); in onenand_probe()
3898 this->chipsize = (16 << density) << 20; in onenand_probe()
3902 mtd->writesize = this->read_word(this->base + ONENAND_REG_DATA_BUFFER_SIZE); in onenand_probe()
3904 if (ONENAND_IS_4KB_PAGE(this)) in onenand_probe()
3915 if (FLEXONENAND(this)) in onenand_probe()
3918 this->erase_shift = ffs(mtd->erasesize) - 1; in onenand_probe()
3919 this->page_shift = ffs(mtd->writesize) - 1; in onenand_probe()
3920 this->page_mask = (1 << (this->erase_shift - this->page_shift)) - 1; in onenand_probe()
3922 if (ONENAND_IS_DDP(this)) in onenand_probe()
3923 this->density_mask = this->chipsize >> (this->erase_shift + 1); in onenand_probe()
3925 this->writesize = mtd->writesize; in onenand_probe()
3929 if (FLEXONENAND(this)) in onenand_probe()
3932 mtd->size = this->chipsize; in onenand_probe()
3940 if (ONENAND_IS_2PLANE(this)) { in onenand_probe()
3963 struct onenand_chip *this = mtd->priv; in onenand_resume() local
3965 if (this->state == FL_PM_SUSPENDED) in onenand_resume()
3977 * This fills out all the not initialized function pointers
3985 struct onenand_chip *this = mtd->priv; in onenand_scan() local
3987 if (!this->read_word) in onenand_scan()
3988 this->read_word = onenand_readw; in onenand_scan()
3989 if (!this->write_word) in onenand_scan()
3990 this->write_word = onenand_writew; in onenand_scan()
3992 if (!this->command) in onenand_scan()
3993 this->command = onenand_command; in onenand_scan()
3994 if (!this->wait) in onenand_scan()
3996 if (!this->bbt_wait) in onenand_scan()
3997 this->bbt_wait = onenand_bbt_wait; in onenand_scan()
3998 if (!this->unlock_all) in onenand_scan()
3999 this->unlock_all = onenand_unlock_all; in onenand_scan()
4001 if (!this->chip_probe) in onenand_scan()
4002 this->chip_probe = onenand_chip_probe; in onenand_scan()
4004 if (!this->read_bufferram) in onenand_scan()
4005 this->read_bufferram = onenand_read_bufferram; in onenand_scan()
4006 if (!this->write_bufferram) in onenand_scan()
4007 this->write_bufferram = onenand_write_bufferram; in onenand_scan()
4009 if (!this->block_markbad) in onenand_scan()
4010 this->block_markbad = onenand_default_block_markbad; in onenand_scan()
4011 if (!this->scan_bbt) in onenand_scan()
4012 this->scan_bbt = onenand_default_bbt; in onenand_scan()
4018 if (this->mmcontrol) { in onenand_scan()
4020 this->read_bufferram = onenand_sync_read_bufferram; in onenand_scan()
4024 if (!this->page_buf) { in onenand_scan()
4025 this->page_buf = kzalloc(mtd->writesize, GFP_KERNEL); in onenand_scan()
4026 if (!this->page_buf) { in onenand_scan()
4032 this->verify_buf = kzalloc(mtd->writesize, GFP_KERNEL); in onenand_scan()
4033 if (!this->verify_buf) { in onenand_scan()
4034 kfree(this->page_buf); in onenand_scan()
4038 this->options |= ONENAND_PAGEBUF_ALLOC; in onenand_scan()
4040 if (!this->oob_buf) { in onenand_scan()
4041 this->oob_buf = kzalloc(mtd->oobsize, GFP_KERNEL); in onenand_scan()
4042 if (!this->oob_buf) { in onenand_scan()
4045 if (this->options & ONENAND_PAGEBUF_ALLOC) { in onenand_scan()
4046 this->options &= ~ONENAND_PAGEBUF_ALLOC; in onenand_scan()
4047 kfree(this->page_buf); in onenand_scan()
4051 this->options |= ONENAND_OOBBUF_ALLOC; in onenand_scan()
4054 this->state = FL_READY; in onenand_scan()
4055 init_waitqueue_head(&this->wq); in onenand_scan()
4056 spin_lock_init(&this->chip_lock); in onenand_scan()
4063 if (FLEXONENAND(this)) { in onenand_scan()
4064 this->ecclayout = &flexonenand_oob_128; in onenand_scan()
4067 this->ecclayout = &onenand_oob_128; in onenand_scan()
4070 if (ONENAND_IS_NOP_1(this)) in onenand_scan()
4074 this->ecclayout = &onenand_oob_64; in onenand_scan()
4079 this->ecclayout = &onenand_oob_32; in onenand_scan()
4088 this->ecclayout = &onenand_oob_32; in onenand_scan()
4092 this->subpagesize = mtd->writesize >> mtd->subpage_sft; in onenand_scan()
4098 this->ecclayout->oobavail = 0; in onenand_scan()
4100 this->ecclayout->oobfree[i].length; i++) in onenand_scan()
4101 this->ecclayout->oobavail += in onenand_scan()
4102 this->ecclayout->oobfree[i].length; in onenand_scan()
4103 mtd->oobavail = this->ecclayout->oobavail; in onenand_scan()
4105 mtd->ecclayout = this->ecclayout; in onenand_scan()
4108 mtd->type = ONENAND_IS_MLC(this) ? MTD_MLCNANDFLASH : MTD_NANDFLASH; in onenand_scan()
4137 if (!(this->options & ONENAND_SKIP_INITIAL_UNLOCKING)) in onenand_scan()
4138 this->unlock_all(mtd); in onenand_scan()
4140 ret = this->scan_bbt(mtd); in onenand_scan()
4141 if ((!FLEXONENAND(this)) || ret) in onenand_scan()
4158 struct onenand_chip *this = mtd->priv; in onenand_release() local
4164 if (this->bbm) { in onenand_release()
4165 struct bbm_info *bbm = this->bbm; in onenand_release()
4167 kfree(this->bbm); in onenand_release()
4170 if (this->options & ONENAND_PAGEBUF_ALLOC) { in onenand_release()
4171 kfree(this->page_buf); in onenand_release()
4173 kfree(this->verify_buf); in onenand_release()
4176 if (this->options & ONENAND_OOBBUF_ALLOC) in onenand_release()
4177 kfree(this->oob_buf); in onenand_release()