Lines Matching refs:nand
19 struct nand_info *nand);
21 static int nand_wait(struct nand_info *nand) in nand_wait() argument
31 neesr = read_reg(nand, NAND_EVTER_STAT); in nand_wait()
33 write_reg(nand, NAND_EVTER_STAT, neesr); in nand_wait()
63 static uint32_t nand_get_port_size(struct nand_info *nand) in nand_get_port_size() argument
71 port_size = (read_reg(nand, cs_reg) & CSPR_PS) >> CSPR_PS_SHIFT; in nand_get_port_size()
89 static uint32_t nand_get_page_size(struct nand_info *nand) in nand_get_page_size() argument
97 pg_size = read_reg(nand, cs_reg) & CSOR_NAND_PGS; in nand_get_page_size()
118 static uint32_t nand_get_pages_per_blk(struct nand_info *nand) in nand_get_pages_per_blk() argument
126 pages_per_blk = (read_reg(nand, cs_reg) & CSOR_NAND_PB); in nand_get_pages_per_blk()
178 static void nand_get_params(struct nand_info *nand) in nand_get_params() argument
180 nand->port_size = nand_get_port_size(nand); in nand_get_params()
182 nand->page_size = nand_get_page_size(nand); in nand_get_params()
190 nand->bad_marker_loc = (nand->page_size == 512) ? in nand_get_params()
191 ((nand->port_size == 8) ? 0x5 : 0xa) : 0; in nand_get_params()
194 nand->onfi_dev_flag = in nand_get_params()
195 (read_reg(nand, NAND_EVTER_STAT) & NAND_EVTER_STAT_BBI_SRCH_SEL) in nand_get_params()
199 nand->bbs = 0; in nand_get_params()
202 nand->ppb = nand_get_pages_per_blk(nand); in nand_get_params()
205 nand->blk_size = nand->page_size * nand->ppb; in nand_get_params()
208 nand->pi_width = get_page_index_width(nand->ppb); in nand_get_params()
211 nand->lgb = 0; in nand_get_params()
212 nand->bbt_max = 0; in nand_get_params()
213 nand->bzero_good = 0; in nand_get_params()
214 memset(nand->bbt, EMPTY_VAL, BBT_SIZE * sizeof(nand->bbt[0])); in nand_get_params()
217 static int nand_init(struct nand_info *nand) in nand_init() argument
222 nand_get_params(nand); in nand_init()
225 write_reg(nand, NAND_EVTER_STAT, U(0xffffffff)); in nand_init()
231 ncfgr = read_reg(nand, NCFGR); in nand_init()
232 write_reg(nand, NCFGR, (ncfgr & ~NCFGR_BOOT)); in nand_init()
244 struct nand_info *nand) in nand_read_data() argument
255 write_reg(nand, NAND_BC, byte_cnt); in nand_read_data()
257 write_reg(nand, ROW0, row_add); in nand_read_data()
258 write_reg(nand, COL0, col_val); in nand_read_data()
261 if (nand->page_size == U(512)) { in nand_read_data()
264 write_reg(nand, NAND_FCR0, in nand_read_data()
267 write_reg(nand, NAND_FCR0, in nand_read_data()
270 write_reg(nand, NAND_FCR0, in nand_read_data()
276 write_reg(nand, NAND_FCR0, (NAND_CMD_READ0 << FCR_CMD0_SHIFT) | in nand_read_data()
279 if (nand->page_size == U(512)) { in nand_read_data()
280 write_reg(nand, NAND_FIR0, ((FIR_OP_CW0 << FIR_OP0_SHIFT) | in nand_read_data()
285 write_reg(nand, NAND_FIR1, U(0x00000000)); in nand_read_data()
287 write_reg(nand, NAND_FIR0, ((FIR_OP_CW0 << FIR_OP0_SHIFT) | in nand_read_data()
293 write_reg(nand, NAND_FIR1, (FIR_OP_NOP << FIR_OP5_SHIFT)); in nand_read_data()
295 write_reg(nand, NANDSEQ_STRT, NAND_SEQ_STRT_FIR_STRT); in nand_read_data()
297 ret = nand_wait(nand); in nand_read_data()
305 if (nand->page_size == U(512)) in nand_read_data()
307 else if (nand->page_size == U(2048)) in nand_read_data()
309 else if (nand->page_size == U(4096)) in nand_read_data()
311 else if (nand->page_size == U(8192)) in nand_read_data()
313 else if (nand->page_size == U(16384)) in nand_read_data()
328 (col_add + nand->page_size); in nand_read_data()
333 nand->page_size); in nand_read_data()
340 static int nand_read(struct nand_info *nand, int32_t src_addr, in nand_read() argument
359 log_blk = (src_addr / nand->blk_size); in nand_read()
360 pg_no = ((src_addr - (log_blk * nand->blk_size)) / in nand_read()
361 nand->page_size); in nand_read()
365 for (i = 0; i <= nand->bbt_max; i++) { in nand_read()
366 if (nand->bbt[i] == EMPTY_VAL_CHECK) { in nand_read()
367 ret = update_bbt(i, pblk, &updated, nand); in nand_read()
379 if (pblk < nand->bbt[i]) in nand_read()
381 else if (pblk >= nand->bbt[i]) in nand_read()
385 col_off = (src_addr % nand->page_size); in nand_read()
387 if ((col_off + size) < nand->page_size) in nand_read()
390 byte_cnt = nand->page_size - col_off; in nand_read()
392 row_off = (pblk << nand->pi_width) | pg_no; in nand_read()
395 nand->ifc_region_addr, in nand_read()
398 byte_cnt, out, MAIN, nand); in nand_read()
408 if (size < nand->page_size) { in nand_read()
412 byte_cnt = nand->page_size; in nand_read()
415 row_off = (pblk << nand->pi_width) | pg_no; in nand_read()
418 nand->ifc_region_addr, in nand_read()
421 read_cnt, out, MAIN, nand); in nand_read()
435 static int isgoodblock(uint32_t blk, uint32_t *gb, struct nand_info *nand) in isgoodblock() argument
445 nand->ifc_region_addr, in isgoodblock()
446 blk << nand->pi_width, in isgoodblock()
447 nand->bad_marker_loc, in isgoodblock()
448 0x2, buf, 1, nand); in isgoodblock()
456 row_add = (blk << nand->pi_width); in isgoodblock()
457 if (nand->port_size == 8) { in isgoodblock()
462 if (nand->onfi_dev_flag) in isgoodblock()
464 nand->ifc_region_addr, in isgoodblock()
465 row_add | (nand->ppb - 1), in isgoodblock()
466 nand->bad_marker_loc, in isgoodblock()
467 0x2, buf, SPARE, nand); in isgoodblock()
470 nand->ifc_region_addr, in isgoodblock()
472 nand->bad_marker_loc, in isgoodblock()
473 0x2, buf, SPARE, nand); in isgoodblock()
492 if (nand->onfi_dev_flag) { in isgoodblock()
494 nand->ifc_region_addr, in isgoodblock()
495 row_add | (nand->ppb - 1), in isgoodblock()
496 nand->bad_marker_loc, in isgoodblock()
497 0x2, buf, SPARE, nand); in isgoodblock()
500 nand->ifc_region_addr, in isgoodblock()
502 nand->bad_marker_loc, in isgoodblock()
503 0x2, buf, SPARE, nand); in isgoodblock()
524 uint32_t *updated, struct nand_info *nand) in update_bbt() argument
530 if (nand->bzero_good && blk == 0) in update_bbt()
535 if (nand->lgb != 0 && blk <= nand->lgb) in update_bbt()
544 if (nand->lgb < blk) in update_bbt()
545 sblk = nand->lgb; in update_bbt()
551 lgb = nand->lgb; in update_bbt()
558 ret = isgoodblock(lgb, &gb, nand); in update_bbt()
564 nand->bzero_good = 1; in update_bbt()
572 nand->bbt[idx] = lgb; in update_bbt()
576 if (idx > nand->bbt_max) in update_bbt()
577 nand->bbt_max = idx; in update_bbt()
584 nand->lgb = blk; in update_bbt()
598 struct nand_info *nand = &nand_drv_data; in ifc_nand_read() local
600 page_size = nand_get_page_size(nand); in ifc_nand_read()
602 ret = nand_read(nand, src_addr, buf, size); in ifc_nand_read()
628 struct nand_info *nand = NULL; in ifc_nand_init() local
631 nand = &nand_drv_data; in ifc_nand_init()
632 memset(nand, 0, sizeof(struct nand_info)); in ifc_nand_init()
634 nand->ifc_region_addr = ifc_region_addr; in ifc_nand_init()
635 nand->ifc_register_addr = ifc_register_addr; in ifc_nand_init()
638 ret = nand_init(nand); in ifc_nand_init()
647 ifc_nand_spec.block_size = nand_get_page_size(nand); in ifc_nand_init()