Lines Matching refs:this
152 static int onenand_block_address(struct onenand_chip *this, int block) in onenand_block_address() argument
155 if (block & this->density_mask) in onenand_block_address()
156 return ONENAND_DDP_CHIP1 | (block ^ this->density_mask); in onenand_block_address()
169 static int onenand_bufferram_address(struct onenand_chip *this, int block) in onenand_bufferram_address() argument
172 if (block & this->density_mask) in onenand_bufferram_address()
229 static unsigned int flexonenand_block(struct onenand_chip *this, loff_t addr) in flexonenand_block() argument
233 if (ONENAND_IS_DDP(this) && addr >= this->diesize[0]) { in flexonenand_block()
235 addr -= this->diesize[0]; in flexonenand_block()
238 boundary = this->boundary[die]; in flexonenand_block()
240 blk = addr >> (this->erase_shift - 1); in flexonenand_block()
244 blk += die ? this->density_mask : 0; in flexonenand_block()
248 unsigned int onenand_block(struct onenand_chip *this, loff_t addr) in onenand_block() argument
250 if (!FLEXONENAND(this)) in onenand_block()
251 return addr >> this->erase_shift; in onenand_block()
252 return flexonenand_block(this, addr); in onenand_block()
262 static loff_t flexonenand_addr(struct onenand_chip *this, int block) in flexonenand_addr() argument
267 if (ONENAND_IS_DDP(this) && block >= this->density_mask) { in flexonenand_addr()
268 block -= this->density_mask; in flexonenand_addr()
270 ofs = this->diesize[0]; in flexonenand_addr()
273 boundary = this->boundary[die]; in flexonenand_addr()
274 ofs += (loff_t) block << (this->erase_shift - 1); in flexonenand_addr()
277 << (this->erase_shift - 1); in flexonenand_addr()
281 loff_t onenand_addr(struct onenand_chip *this, int block) in onenand_addr() argument
283 if (!FLEXONENAND(this)) in onenand_addr()
284 return (loff_t) block << this->erase_shift; in onenand_addr()
285 return flexonenand_addr(this, block); in onenand_addr()
328 struct onenand_chip *this = mtd->priv; in onenand_command() local
347 block = addr * this->density_mask; in onenand_command()
353 block = onenand_block(this, addr); in onenand_command()
359 block = addr * this->density_mask; in onenand_command()
364 block = onenand_block(this, addr); in onenand_command()
366 - onenand_addr(this, block)) >> this->page_shift; in onenand_command()
367 page &= this->page_mask; in onenand_command()
374 value = onenand_bufferram_address(this, block); in onenand_command()
375 this->write_word(value, in onenand_command()
376 this->base + ONENAND_REG_START_ADDRESS2); in onenand_command()
378 if (ONENAND_IS_4KB_PAGE(this)) in onenand_command()
379 ONENAND_SET_BUFFERRAM0(this); in onenand_command()
382 ONENAND_SET_NEXT_BUFFERRAM(this); in onenand_command()
389 value = onenand_block_address(this, block); in onenand_command()
390 this->write_word(value, in onenand_command()
391 this->base + ONENAND_REG_START_ADDRESS1); in onenand_command()
394 value = onenand_bufferram_address(this, block); in onenand_command()
395 this->write_word(value, in onenand_command()
396 this->base + ONENAND_REG_START_ADDRESS2); in onenand_command()
406 if (ONENAND_IS_4KB_PAGE(this)) in onenand_command()
407 dataram = ONENAND_SET_BUFFERRAM0(this); in onenand_command()
409 dataram = ONENAND_SET_NEXT_BUFFERRAM(this); in onenand_command()
414 dataram = ONENAND_CURRENT_BUFFERRAM(this); in onenand_command()
420 this->write_word(value, in onenand_command()
421 this->base + ONENAND_REG_START_ADDRESS8); in onenand_command()
425 this->write_word(value, this->base + ONENAND_REG_START_BUFFER); in onenand_command()
429 this->write_word(ONENAND_INT_CLEAR, this->base + ONENAND_REG_INTERRUPT); in onenand_command()
431 this->write_word(cmd, this->base + ONENAND_REG_COMMAND); in onenand_command()
440 static int onenand_read_ecc(struct onenand_chip *this) in onenand_read_ecc() argument
444 if (!FLEXONENAND(this)) in onenand_read_ecc()
445 return this->read_word(this->base + ONENAND_REG_ECC_STATUS); in onenand_read_ecc()
448 ecc = this->read_word(this->base in onenand_read_ecc()
470 struct onenand_chip *this = mtd->priv; in onenand_wait() local
481 interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT); in onenand_wait()
484 ctrl = this->read_word(this->base + ONENAND_REG_CTRL_STATUS); in onenand_wait()
487 int ecc = onenand_read_ecc(this); in onenand_wait()
517 struct onenand_chip *this = mtd->priv; in onenand_bufferram_offset() local
519 if (ONENAND_CURRENT_BUFFERRAM(this)) { in onenand_bufferram_offset()
543 struct onenand_chip *this = mtd->priv; in onenand_read_bufferram() local
546 bufferram = this->base + area; in onenand_read_bufferram()
568 struct onenand_chip *this = mtd->priv; in onenand_sync_read_bufferram() local
571 bufferram = this->base + area; in onenand_sync_read_bufferram()
574 this->mmcontrol(mtd, ONENAND_SYS_CFG1_SYNC_READ); in onenand_sync_read_bufferram()
578 this->mmcontrol(mtd, 0); in onenand_sync_read_bufferram()
597 struct onenand_chip *this = mtd->priv; in onenand_write_bufferram() local
600 bufferram = this->base + area; in onenand_write_bufferram()
618 struct onenand_chip *this = mtd->priv; in onenand_get_2x_blockpage() local
622 block = (int) (addr >> this->erase_shift) & ~1; in onenand_get_2x_blockpage()
624 if (addr & this->writesize) in onenand_get_2x_blockpage()
626 page = (int) (addr >> (this->page_shift + 1)) & this->page_mask; in onenand_get_2x_blockpage()
642 struct onenand_chip *this = mtd->priv; in onenand_check_bufferram() local
646 if (ONENAND_IS_2PLANE(this)) in onenand_check_bufferram()
649 blockpage = (int) (addr >> this->page_shift); in onenand_check_bufferram()
652 i = ONENAND_CURRENT_BUFFERRAM(this); in onenand_check_bufferram()
653 if (this->bufferram[i].blockpage == blockpage) in onenand_check_bufferram()
657 i = ONENAND_NEXT_BUFFERRAM(this); in onenand_check_bufferram()
658 if (this->bufferram[i].blockpage == blockpage) { in onenand_check_bufferram()
659 ONENAND_SET_NEXT_BUFFERRAM(this); in onenand_check_bufferram()
664 if (found && ONENAND_IS_DDP(this)) { in onenand_check_bufferram()
666 int block = onenand_block(this, addr); in onenand_check_bufferram()
667 int value = onenand_bufferram_address(this, block); in onenand_check_bufferram()
668 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2); in onenand_check_bufferram()
685 struct onenand_chip *this = mtd->priv; in onenand_update_bufferram() local
689 if (ONENAND_IS_2PLANE(this)) in onenand_update_bufferram()
692 blockpage = (int)(addr >> this->page_shift); in onenand_update_bufferram()
695 i = ONENAND_NEXT_BUFFERRAM(this); in onenand_update_bufferram()
696 if (this->bufferram[i].blockpage == blockpage) in onenand_update_bufferram()
697 this->bufferram[i].blockpage = -1; in onenand_update_bufferram()
700 i = ONENAND_CURRENT_BUFFERRAM(this); in onenand_update_bufferram()
702 this->bufferram[i].blockpage = blockpage; in onenand_update_bufferram()
704 this->bufferram[i].blockpage = -1; in onenand_update_bufferram()
720 struct onenand_chip *this = mtd->priv; in onenand_invalidate_bufferram() local
726 loff_t buf_addr = this->bufferram[i].blockpage << this->page_shift; in onenand_invalidate_bufferram()
729 this->bufferram[i].blockpage = -1; in onenand_invalidate_bufferram()
766 struct onenand_chip *this = mtd->priv; in onenand_transfer_auto_oob() local
772 uint8_t *oob_buf = this->oob_buf; in onenand_transfer_auto_oob()
774 free = this->ecclayout->oobfree; in onenand_transfer_auto_oob()
783 this->read_bufferram(mtd, 0, ONENAND_SPARERAM, oob_buf, 0, mtd->oobsize); in onenand_transfer_auto_oob()
784 free = this->ecclayout->oobfree; in onenand_transfer_auto_oob()
815 struct onenand_chip *this = mtd->priv; in onenand_recover_lsb() local
819 if (!FLEXONENAND(this)) in onenand_recover_lsb()
828 if (mtd->eraseregions[i].erasesize < (1 << this->erase_shift)) in onenand_recover_lsb()
835 this->command(mtd, FLEXONENAND_CMD_RECOVER_LSB, addr, this->writesize); in onenand_recover_lsb()
836 return this->wait(mtd, FL_READING); in onenand_recover_lsb()
850 struct onenand_chip *this = mtd->priv; in onenand_read_ops_nolock() local
859 int writesize = this->writesize; in onenand_read_ops_nolock()
865 oobsize = this->ecclayout->oobavail; in onenand_read_ops_nolock()
887 this->main_buf = buf; in onenand_read_ops_nolock()
888 this->command(mtd, ONENAND_CMD_READ, from, writesize); in onenand_read_ops_nolock()
889 ret = this->wait(mtd, FL_READING); in onenand_read_ops_nolock()
906 if (!ONENAND_IS_4KB_PAGE(this) && read + thislen < len) { in onenand_read_ops_nolock()
907 this->main_buf = buf + thislen; in onenand_read_ops_nolock()
908 this->command(mtd, ONENAND_CMD_READ, from, writesize); in onenand_read_ops_nolock()
914 if (ONENAND_IS_DDP(this) && in onenand_read_ops_nolock()
915 unlikely(from == (this->chipsize >> 1))) { in onenand_read_ops_nolock()
916 this->write_word(ONENAND_DDP_CHIP0, this->base + ONENAND_REG_START_ADDRESS2); in onenand_read_ops_nolock()
920 ONENAND_SET_PREV_BUFFERRAM(this); in onenand_read_ops_nolock()
924 this->read_bufferram(mtd, from - thislen, ONENAND_DATARAM, buf, column, thislen); in onenand_read_ops_nolock()
934 this->read_bufferram(mtd, 0, ONENAND_SPARERAM, oobbuf, oobcolumn, thisooblen); in onenand_read_ops_nolock()
940 if (ONENAND_IS_4KB_PAGE(this) && (read + thislen < len)) { in onenand_read_ops_nolock()
941 this->command(mtd, ONENAND_CMD_READ, from, writesize); in onenand_read_ops_nolock()
942 ret = this->wait(mtd, FL_READING); in onenand_read_ops_nolock()
956 this->write_word(ONENAND_DDP_CHIP1, this->base + ONENAND_REG_START_ADDRESS2); in onenand_read_ops_nolock()
957 if (!ONENAND_IS_4KB_PAGE(this)) in onenand_read_ops_nolock()
958 ONENAND_SET_NEXT_BUFFERRAM(this); in onenand_read_ops_nolock()
963 if (!ONENAND_IS_4KB_PAGE(this)) { in onenand_read_ops_nolock()
965 ret = this->wait(mtd, FL_READING); in onenand_read_ops_nolock()
1001 struct onenand_chip *this = mtd->priv; in onenand_read_oob_nolock() local
1018 oobsize = this->ecclayout->oobavail; in onenand_read_oob_nolock()
1031 column + len > ((mtd->size >> this->page_shift) - in onenand_read_oob_nolock()
1032 (from >> this->page_shift)) * oobsize)) { in onenand_read_oob_nolock()
1039 readcmd = ONENAND_IS_4KB_PAGE(this) ? in onenand_read_oob_nolock()
1046 this->spare_buf = buf; in onenand_read_oob_nolock()
1047 this->command(mtd, readcmd, from, mtd->oobsize); in onenand_read_oob_nolock()
1051 ret = this->wait(mtd, FL_READING); in onenand_read_oob_nolock()
1063 this->read_bufferram(mtd, 0, ONENAND_SPARERAM, buf, column, thislen); in onenand_read_oob_nolock()
1162 struct onenand_chip *this = mtd->priv; in onenand_bbt_wait() local
1173 interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT); in onenand_bbt_wait()
1177 interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT); in onenand_bbt_wait()
1178 ctrl = this->read_word(this->base + ONENAND_REG_CTRL_STATUS); in onenand_bbt_wait()
1181 int ecc = onenand_read_ecc(this); in onenand_bbt_wait()
1213 struct onenand_chip *this = mtd->priv; in onenand_bbt_read_oob() local
1222 readcmd = ONENAND_IS_4KB_PAGE(this) ? in onenand_bbt_read_oob()
1244 this->spare_buf = buf; in onenand_bbt_read_oob()
1245 this->command(mtd, readcmd, from, mtd->oobsize); in onenand_bbt_read_oob()
1249 ret = this->bbt_wait(mtd, FL_READING); in onenand_bbt_read_oob()
1256 this->read_bufferram(mtd, 0, ONENAND_SPARERAM, buf, column, thislen); in onenand_bbt_read_oob()
1266 from += this->writesize; in onenand_bbt_read_oob()
1288 struct onenand_chip *this = mtd->priv; in onenand_verify_oob() local
1289 u_char *oob_buf = this->oob_buf; in onenand_verify_oob()
1292 readcmd = ONENAND_IS_4KB_PAGE(this) ? in onenand_verify_oob()
1295 this->command(mtd, readcmd, to, mtd->oobsize); in onenand_verify_oob()
1297 status = this->wait(mtd, FL_READING); in onenand_verify_oob()
1301 this->read_bufferram(mtd, 0, ONENAND_SPARERAM, oob_buf, 0, mtd->oobsize); in onenand_verify_oob()
1318 struct onenand_chip *this = mtd->priv; in onenand_verify() local
1324 thislen = min_t(int, this->writesize, len); in onenand_verify()
1325 column = addr & (this->writesize - 1); in onenand_verify()
1326 if (column + thislen > this->writesize) in onenand_verify()
1327 thislen = this->writesize - column; in onenand_verify()
1329 this->command(mtd, ONENAND_CMD_READ, addr, this->writesize); in onenand_verify()
1333 ret = this->wait(mtd, FL_READING); in onenand_verify()
1339 dataram = this->base + ONENAND_DATARAM; in onenand_verify()
1357 #define NOTALIGNED(x) ((x & (this->subpagesize - 1)) != 0)
1370 struct onenand_chip *this = mtd->priv; in onenand_fill_auto_oob() local
1377 free = this->ecclayout->oobfree; in onenand_fill_auto_oob()
1386 free = this->ecclayout->oobfree; in onenand_fill_auto_oob()
1413 struct onenand_chip *this = mtd->priv; in onenand_write_ops_nolock() local
1437 oobsize = this->ecclayout->oobavail; in onenand_write_ops_nolock()
1452 this->command(mtd, ONENAND_CMD_BUFFERRAM, to, thislen); in onenand_write_ops_nolock()
1457 memset(this->page_buf, 0xff, mtd->writesize); in onenand_write_ops_nolock()
1458 memcpy(this->page_buf + column, buf, thislen); in onenand_write_ops_nolock()
1459 wbuf = this->page_buf; in onenand_write_ops_nolock()
1462 this->write_bufferram(mtd, to, ONENAND_DATARAM, wbuf, 0, mtd->writesize); in onenand_write_ops_nolock()
1465 oobbuf = this->oob_buf; in onenand_write_ops_nolock()
1481 this->write_bufferram(mtd, 0, ONENAND_SPARERAM, oobbuf, 0, mtd->oobsize); in onenand_write_ops_nolock()
1483 this->command(mtd, ONENAND_CMD_PROG, to, mtd->writesize); in onenand_write_ops_nolock()
1485 ret = this->wait(mtd, FL_WRITING); in onenand_write_ops_nolock()
1489 if (ONENAND_IS_2PLANE(this)) { in onenand_write_ops_nolock()
1490 ONENAND_SET_BUFFERRAM1(this); in onenand_write_ops_nolock()
1491 onenand_update_bufferram(mtd, to + this->writesize, !ret && !subpage); in onenand_write_ops_nolock()
1535 struct onenand_chip *this = mtd->priv; in onenand_write_oob_nolock() local
1552 oobsize = this->ecclayout->oobavail; in onenand_write_oob_nolock()
1572 column + len > ((mtd->size >> this->page_shift) - in onenand_write_oob_nolock()
1573 (to >> this->page_shift)) * oobsize)) { in onenand_write_oob_nolock()
1578 oobbuf = this->oob_buf; in onenand_write_oob_nolock()
1580 oobcmd = ONENAND_IS_4KB_PAGE(this) ? in onenand_write_oob_nolock()
1587 this->command(mtd, ONENAND_CMD_BUFFERRAM, to, mtd->oobsize); in onenand_write_oob_nolock()
1596 this->write_bufferram(mtd, 0, ONENAND_SPARERAM, oobbuf, 0, mtd->oobsize); in onenand_write_oob_nolock()
1598 if (ONENAND_IS_4KB_PAGE(this)) { in onenand_write_oob_nolock()
1600 memset(this->page_buf, 0xff, mtd->writesize); in onenand_write_oob_nolock()
1601 this->write_bufferram(mtd, 0, ONENAND_DATARAM, in onenand_write_oob_nolock()
1602 this->page_buf, 0, mtd->writesize); in onenand_write_oob_nolock()
1605 this->command(mtd, oobcmd, to, mtd->oobsize); in onenand_write_oob_nolock()
1608 if (ONENAND_IS_2PLANE(this)) { in onenand_write_oob_nolock()
1609 ONENAND_SET_BUFFERRAM1(this); in onenand_write_oob_nolock()
1610 onenand_update_bufferram(mtd, to + this->writesize, 0); in onenand_write_oob_nolock()
1613 ret = this->wait(mtd, FL_WRITING); in onenand_write_oob_nolock()
1713 struct onenand_chip *this = mtd->priv; in onenand_block_isbad_nolock() local
1714 struct bbm_info *bbm = this->bbm; in onenand_block_isbad_nolock()
1730 struct onenand_chip *this = mtd->priv; in onenand_erase() local
1741 if (FLEXONENAND(this)) { in onenand_erase()
1758 block_size = 1 << this->erase_shift; in onenand_erase()
1790 this->command(mtd, ONENAND_CMD_ERASE, addr, block_size); in onenand_erase()
1794 ret = this->wait(mtd, FL_ERASING); in onenand_erase()
1803 onenand_block(this, addr)); in onenand_erase()
1894 struct onenand_chip *this = mtd->priv; in onenand_default_block_markbad() local
1895 struct bbm_info *bbm = this->bbm; in onenand_default_block_markbad()
1906 block = onenand_block(this, ofs); in onenand_default_block_markbad()
1924 struct onenand_chip *this = mtd->priv; in onenand_block_markbad() local
1936 ret = this->block_markbad(mtd, ofs); in onenand_block_markbad()
1953 struct onenand_chip *this = mtd->priv; in onenand_do_lock_cmd() local
1956 start = onenand_block(this, ofs); in onenand_do_lock_cmd()
1957 end = onenand_block(this, ofs + len); in onenand_do_lock_cmd()
1960 if (this->options & ONENAND_HAS_CONT_LOCK) { in onenand_do_lock_cmd()
1962 this->write_word(start, in onenand_do_lock_cmd()
1963 this->base + ONENAND_REG_START_BLOCK_ADDRESS); in onenand_do_lock_cmd()
1965 this->write_word(end - 1, in onenand_do_lock_cmd()
1966 this->base + ONENAND_REG_END_BLOCK_ADDRESS); in onenand_do_lock_cmd()
1968 this->command(mtd, cmd, 0, 0); in onenand_do_lock_cmd()
1971 this->wait(mtd, FL_UNLOCKING); in onenand_do_lock_cmd()
1974 while (this->read_word(this->base + ONENAND_REG_CTRL_STATUS) in onenand_do_lock_cmd()
1979 status = this->read_word(this->base + ONENAND_REG_WP_STATUS); in onenand_do_lock_cmd()
1989 value = onenand_block_address(this, block); in onenand_do_lock_cmd()
1990 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS1); in onenand_do_lock_cmd()
1992 value = onenand_bufferram_address(this, block); in onenand_do_lock_cmd()
1993 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2); in onenand_do_lock_cmd()
1996 this->write_word(block, in onenand_do_lock_cmd()
1997 this->base + ONENAND_REG_START_BLOCK_ADDRESS); in onenand_do_lock_cmd()
1999 this->command(mtd, ONENAND_CMD_UNLOCK, 0, 0); in onenand_do_lock_cmd()
2002 this->wait(mtd, FL_UNLOCKING); in onenand_do_lock_cmd()
2005 while (this->read_word(this->base + ONENAND_REG_CTRL_STATUS) in onenand_do_lock_cmd()
2010 status = this->read_word(this->base + ONENAND_REG_WP_STATUS); in onenand_do_lock_cmd()
2063 static int onenand_check_lock_status(struct onenand_chip *this) in onenand_check_lock_status() argument
2068 end = this->chipsize >> this->erase_shift; in onenand_check_lock_status()
2071 value = onenand_block_address(this, block); in onenand_check_lock_status()
2072 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS1); in onenand_check_lock_status()
2074 value = onenand_bufferram_address(this, block); in onenand_check_lock_status()
2075 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2); in onenand_check_lock_status()
2077 this->write_word(block, this->base + ONENAND_REG_START_BLOCK_ADDRESS); in onenand_check_lock_status()
2080 status = this->read_word(this->base + ONENAND_REG_WP_STATUS); in onenand_check_lock_status()
2098 struct onenand_chip *this = mtd->priv; in onenand_unlock_all() local
2102 if (this->options & ONENAND_HAS_UNLOCK_ALL) { in onenand_unlock_all()
2104 this->write_word(0, this->base + ONENAND_REG_START_BLOCK_ADDRESS); in onenand_unlock_all()
2106 this->command(mtd, ONENAND_CMD_UNLOCK_ALL, 0, 0); in onenand_unlock_all()
2109 this->wait(mtd, FL_LOCKING); in onenand_unlock_all()
2112 while (this->read_word(this->base + ONENAND_REG_CTRL_STATUS) in onenand_unlock_all()
2117 if (onenand_check_lock_status(this)) in onenand_unlock_all()
2121 if (ONENAND_IS_DDP(this) && !FLEXONENAND(this)) { in onenand_unlock_all()
2123 ofs = this->chipsize >> 1; in onenand_unlock_all()
2124 len = this->chipsize >> 1; in onenand_unlock_all()
2142 struct onenand_chip *this = mtd->priv; in onenand_check_features() local
2146 density = onenand_get_density(this->device_id); in onenand_check_features()
2147 process = this->version_id >> ONENAND_VERSION_PROCESS_SHIFT; in onenand_check_features()
2152 if (ONENAND_IS_DDP(this)) in onenand_check_features()
2153 this->options |= ONENAND_HAS_2PLANE; in onenand_check_features()
2155 this->options |= ONENAND_HAS_4KB_PAGE; in onenand_check_features()
2159 if (!ONENAND_IS_DDP(this)) in onenand_check_features()
2160 this->options |= ONENAND_HAS_2PLANE; in onenand_check_features()
2161 this->options |= ONENAND_HAS_UNLOCK_ALL; in onenand_check_features()
2166 this->options |= ONENAND_HAS_UNLOCK_ALL; in onenand_check_features()
2172 this->options |= ONENAND_HAS_CONT_LOCK; in onenand_check_features()
2176 if (ONENAND_IS_MLC(this)) in onenand_check_features()
2177 this->options |= ONENAND_HAS_4KB_PAGE; in onenand_check_features()
2179 if (ONENAND_IS_4KB_PAGE(this)) in onenand_check_features()
2180 this->options &= ~ONENAND_HAS_2PLANE; in onenand_check_features()
2182 if (FLEXONENAND(this)) { in onenand_check_features()
2183 this->options &= ~ONENAND_HAS_CONT_LOCK; in onenand_check_features()
2184 this->options |= ONENAND_HAS_UNLOCK_ALL; in onenand_check_features()
2187 if (this->options & ONENAND_HAS_CONT_LOCK) in onenand_check_features()
2189 if (this->options & ONENAND_HAS_UNLOCK_ALL) in onenand_check_features()
2191 if (this->options & ONENAND_HAS_2PLANE) in onenand_check_features()
2193 if (this->options & ONENAND_HAS_4KB_PAGE) in onenand_check_features()
2270 struct onenand_chip *this = mtd->priv; in flexonenand_get_boundary() local
2275 syscfg = this->read_word(this->base + ONENAND_REG_SYS_CFG1); in flexonenand_get_boundary()
2276 this->write_word((syscfg | 0x0100), this->base + ONENAND_REG_SYS_CFG1); in flexonenand_get_boundary()
2278 for (die = 0; die < this->dies; die++) { in flexonenand_get_boundary()
2279 this->command(mtd, FLEXONENAND_CMD_PI_ACCESS, die, 0); in flexonenand_get_boundary()
2280 this->wait(mtd, FL_SYNCING); in flexonenand_get_boundary()
2282 this->command(mtd, FLEXONENAND_CMD_READ_PI, die, 0); in flexonenand_get_boundary()
2283 this->wait(mtd, FL_READING); in flexonenand_get_boundary()
2285 bdry = this->read_word(this->base + ONENAND_DATARAM); in flexonenand_get_boundary()
2290 this->boundary[die] = bdry & FLEXONENAND_PI_MASK; in flexonenand_get_boundary()
2292 this->command(mtd, ONENAND_CMD_RESET, 0, 0); in flexonenand_get_boundary()
2293 this->wait(mtd, FL_RESETING); in flexonenand_get_boundary()
2296 this->boundary[die], locked ? "(Locked)" : "(Unlocked)"); in flexonenand_get_boundary()
2300 this->write_word(syscfg, this->base + ONENAND_REG_SYS_CFG1); in flexonenand_get_boundary()
2312 struct onenand_chip *this = mtd->priv; in flexonenand_get_size() local
2317 density = onenand_get_density(this->device_id); in flexonenand_get_size()
2318 blksperdie = ((loff_t)(16 << density) << 20) >> (this->erase_shift); in flexonenand_get_size()
2319 blksperdie >>= ONENAND_IS_DDP(this) ? 1 : 0; in flexonenand_get_size()
2321 eraseshift = this->erase_shift - 1; in flexonenand_get_size()
2323 mtd->numeraseregions = this->dies << 1; in flexonenand_get_size()
2330 for (; die < this->dies; die++) { in flexonenand_get_size()
2331 if (!die || this->boundary[die-1] != maxbdry) { in flexonenand_get_size()
2336 this->boundary[die] + 1; in flexonenand_get_size()
2342 this->boundary[die] + 1; in flexonenand_get_size()
2343 ofs += (this->boundary[die] + 1) << (eraseshift - 1); in flexonenand_get_size()
2345 if (this->boundary[die] != maxbdry) { in flexonenand_get_size()
2350 this->boundary[die]; in flexonenand_get_size()
2358 mtd->erasesize = 1 << this->erase_shift; in flexonenand_get_size()
2369 for (die = 0, mtd->size = 0; die < this->dies; die++) { in flexonenand_get_size()
2370 this->diesize[die] = (loff_t) (blksperdie << this->erase_shift); in flexonenand_get_size()
2371 this->diesize[die] -= (loff_t) (this->boundary[die] + 1) in flexonenand_get_size()
2372 << (this->erase_shift - 1); in flexonenand_get_size()
2373 mtd->size += this->diesize[die]; in flexonenand_get_size()
2394 struct onenand_chip *this = mtd->priv; in flexonenand_check_blocks_erased() local
2402 .oobbuf = this->oob_buf, in flexonenand_check_blocks_erased()
2409 addr = flexonenand_addr(this, block); in flexonenand_check_blocks_erased()
2422 if (this->oob_buf[i] != 0xff) in flexonenand_check_blocks_erased()
2441 struct onenand_chip *this = mtd->priv; in flexonenand_set_boundary() local
2445 if (die >= this->dies) in flexonenand_set_boundary()
2448 if (boundary == this->boundary[die]) in flexonenand_set_boundary()
2451 density = onenand_get_density(this->device_id); in flexonenand_set_boundary()
2452 blksperdie = ((16 << density) << 20) >> this->erase_shift; in flexonenand_set_boundary()
2453 blksperdie >>= ONENAND_IS_DDP(this) ? 1 : 0; in flexonenand_set_boundary()
2463 old = this->boundary[die] + (die * this->density_mask); in flexonenand_set_boundary()
2464 new = boundary + (die * this->density_mask); in flexonenand_set_boundary()
2472 this->command(mtd, FLEXONENAND_CMD_PI_ACCESS, die, 0); in flexonenand_set_boundary()
2473 this->wait(mtd, FL_SYNCING); in flexonenand_set_boundary()
2476 this->command(mtd, FLEXONENAND_CMD_READ_PI, die, 0); in flexonenand_set_boundary()
2477 ret = this->wait(mtd, FL_READING); in flexonenand_set_boundary()
2479 thisboundary = this->read_word(this->base + ONENAND_DATARAM); in flexonenand_set_boundary()
2491 addr = die ? this->diesize[0] : 0; in flexonenand_set_boundary()
2492 this->command(mtd, ONENAND_CMD_ERASE, addr, 0); in flexonenand_set_boundary()
2493 ret = this->wait(mtd, FL_ERASING); in flexonenand_set_boundary()
2500 this->write_word(boundary, this->base + ONENAND_DATARAM); in flexonenand_set_boundary()
2501 this->command(mtd, ONENAND_CMD_PROG, addr, 0); in flexonenand_set_boundary()
2502 ret = this->wait(mtd, FL_WRITING); in flexonenand_set_boundary()
2509 this->command(mtd, FLEXONENAND_CMD_PI_UPDATE, die, 0); in flexonenand_set_boundary()
2510 ret = this->wait(mtd, FL_WRITING); in flexonenand_set_boundary()
2512 this->write_word(ONENAND_CMD_RESET, this->base + ONENAND_REG_COMMAND); in flexonenand_set_boundary()
2513 this->wait(mtd, FL_RESETING); in flexonenand_set_boundary()
2530 struct onenand_chip *this = mtd->priv; in onenand_chip_probe() local
2535 syscfg = this->read_word(this->base + ONENAND_REG_SYS_CFG1); in onenand_chip_probe()
2538 this->write_word((syscfg & ~ONENAND_SYS_CFG1_SYNC_READ), in onenand_chip_probe()
2539 this->base + ONENAND_REG_SYS_CFG1); in onenand_chip_probe()
2542 this->write_word(ONENAND_CMD_READID, this->base + ONENAND_BOOTRAM); in onenand_chip_probe()
2545 bram_maf_id = this->read_word(this->base + ONENAND_BOOTRAM + 0x0); in onenand_chip_probe()
2546 bram_dev_id = this->read_word(this->base + ONENAND_BOOTRAM + 0x2); in onenand_chip_probe()
2549 this->write_word(ONENAND_CMD_RESET, this->base + ONENAND_BOOTRAM); in onenand_chip_probe()
2552 if (this->wait(mtd, FL_RESETING)) in onenand_chip_probe()
2556 this->write_word(syscfg, this->base + ONENAND_REG_SYS_CFG1); in onenand_chip_probe()
2563 maf_id = this->read_word(this->base + ONENAND_REG_MANUFACTURER_ID); in onenand_chip_probe()
2564 dev_id = this->read_word(this->base + ONENAND_REG_DEVICE_ID); in onenand_chip_probe()
2582 struct onenand_chip *this = mtd->priv; in onenand_probe() local
2587 ret = this->chip_probe(mtd); in onenand_probe()
2592 dev_id = this->read_word(this->base + ONENAND_REG_DEVICE_ID); in onenand_probe()
2593 ver_id = this->read_word(this->base + ONENAND_REG_VERSION_ID); in onenand_probe()
2594 this->technology = this->read_word(this->base + ONENAND_REG_TECHNOLOGY); in onenand_probe()
2598 this->device_id = dev_id; in onenand_probe()
2599 this->version_id = ver_id; in onenand_probe()
2605 if (FLEXONENAND(this)) { in onenand_probe()
2606 this->dies = ONENAND_IS_DDP(this) ? 2 : 1; in onenand_probe()
2608 mtd->numeraseregions = this->dies << 1; in onenand_probe()
2610 * (this->dies << 1)); in onenand_probe()
2619 this->chipsize = (16 << density) << 20; in onenand_probe()
2624 this->read_word(this->base + ONENAND_REG_DATA_BUFFER_SIZE); in onenand_probe()
2626 if (ONENAND_IS_4KB_PAGE(this)) in onenand_probe()
2637 if (FLEXONENAND(this)) in onenand_probe()
2640 this->erase_shift = ffs(mtd->erasesize) - 1; in onenand_probe()
2641 this->page_shift = ffs(mtd->writesize) - 1; in onenand_probe()
2642 this->ppb_shift = (this->erase_shift - this->page_shift); in onenand_probe()
2643 this->page_mask = (mtd->erasesize / mtd->writesize) - 1; in onenand_probe()
2645 if (ONENAND_IS_DDP(this)) in onenand_probe()
2646 this->density_mask = this->chipsize >> (this->erase_shift + 1); in onenand_probe()
2648 this->writesize = mtd->writesize; in onenand_probe()
2652 if (FLEXONENAND(this)) in onenand_probe()
2655 mtd->size = this->chipsize; in onenand_probe()
2682 struct onenand_chip *this = mtd->priv; in onenand_scan() local
2684 if (!this->read_word) in onenand_scan()
2685 this->read_word = onenand_readw; in onenand_scan()
2686 if (!this->write_word) in onenand_scan()
2687 this->write_word = onenand_writew; in onenand_scan()
2689 if (!this->command) in onenand_scan()
2690 this->command = onenand_command; in onenand_scan()
2691 if (!this->wait) in onenand_scan()
2692 this->wait = onenand_wait; in onenand_scan()
2693 if (!this->bbt_wait) in onenand_scan()
2694 this->bbt_wait = onenand_bbt_wait; in onenand_scan()
2696 if (!this->read_bufferram) in onenand_scan()
2697 this->read_bufferram = onenand_read_bufferram; in onenand_scan()
2698 if (!this->write_bufferram) in onenand_scan()
2699 this->write_bufferram = onenand_write_bufferram; in onenand_scan()
2701 if (!this->chip_probe) in onenand_scan()
2702 this->chip_probe = onenand_chip_probe; in onenand_scan()
2704 if (!this->block_markbad) in onenand_scan()
2705 this->block_markbad = onenand_default_block_markbad; in onenand_scan()
2706 if (!this->scan_bbt) in onenand_scan()
2707 this->scan_bbt = onenand_default_bbt; in onenand_scan()
2713 if (this->mmcontrol) { in onenand_scan()
2715 this->read_bufferram = onenand_sync_read_bufferram; in onenand_scan()
2719 if (!this->page_buf) { in onenand_scan()
2720 this->page_buf = kzalloc(mtd->writesize, GFP_KERNEL); in onenand_scan()
2721 if (!this->page_buf) { in onenand_scan()
2725 this->options |= ONENAND_PAGEBUF_ALLOC; in onenand_scan()
2727 if (!this->oob_buf) { in onenand_scan()
2728 this->oob_buf = kzalloc(mtd->oobsize, GFP_KERNEL); in onenand_scan()
2729 if (!this->oob_buf) { in onenand_scan()
2731 if (this->options & ONENAND_PAGEBUF_ALLOC) { in onenand_scan()
2732 this->options &= ~ONENAND_PAGEBUF_ALLOC; in onenand_scan()
2733 kfree(this->page_buf); in onenand_scan()
2737 this->options |= ONENAND_OOBBUF_ALLOC; in onenand_scan()
2740 this->state = FL_READY; in onenand_scan()
2747 this->ecclayout = &onenand_oob_128; in onenand_scan()
2752 this->ecclayout = &onenand_oob_64; in onenand_scan()
2757 this->ecclayout = &onenand_oob_32; in onenand_scan()
2766 this->ecclayout = &onenand_oob_32; in onenand_scan()
2770 this->subpagesize = mtd->writesize >> mtd->subpage_sft; in onenand_scan()
2776 this->ecclayout->oobavail = 0; in onenand_scan()
2779 this->ecclayout->oobfree[i].length; i++) in onenand_scan()
2780 this->ecclayout->oobavail += in onenand_scan()
2781 this->ecclayout->oobfree[i].length; in onenand_scan()
2782 mtd->oobavail = this->ecclayout->oobavail; in onenand_scan()
2784 mtd->ecclayout = this->ecclayout; in onenand_scan()
2789 return this->scan_bbt(mtd); in onenand_scan()