Lines Matching full:chip

51 #define ZYNQ_NAND_DIRECT_CMD	((0x4 << 23) |	/* Chip 0 from interface 1 */ \
81 #define ZYNQ_NAND_CLEAR_CS (1 << CLEAR_CS_SHIFT) /* Clear chip select */
418 * @chip: nand chip info structure
422 static int zynq_nand_read_oob(struct mtd_info *mtd, struct nand_chip *chip, in zynq_nand_read_oob() argument
429 chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page); in zynq_nand_read_oob()
431 p = chip->oob_poi; in zynq_nand_read_oob()
432 chip->read_buf(mtd, p, (mtd->oobsize - data_width)); in zynq_nand_read_oob()
435 data_phase_addr = (unsigned long)chip->IO_ADDR_R; in zynq_nand_read_oob()
437 chip->IO_ADDR_R = (void __iomem *)data_phase_addr; in zynq_nand_read_oob()
438 chip->read_buf(mtd, p, data_width); in zynq_nand_read_oob()
446 * @chip: nand chip info structure
449 static int zynq_nand_write_oob(struct mtd_info *mtd, struct nand_chip *chip, in zynq_nand_write_oob() argument
453 const u8 *buf = chip->oob_poi; in zynq_nand_write_oob()
456 chip->cmdfunc(mtd, NAND_CMD_SEQIN, mtd->writesize, page); in zynq_nand_write_oob()
458 chip->write_buf(mtd, buf, (mtd->oobsize - data_width)); in zynq_nand_write_oob()
461 data_phase_addr = (unsigned long)chip->IO_ADDR_W; in zynq_nand_write_oob()
464 chip->IO_ADDR_W = (void __iomem *)data_phase_addr; in zynq_nand_write_oob()
465 chip->write_buf(mtd, buf, data_width); in zynq_nand_write_oob()
468 chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1); in zynq_nand_write_oob()
469 status = chip->waitfunc(mtd, chip); in zynq_nand_write_oob()
477 * @chip: nand chip info structure
479 * @oob_required: must write chip->oob_poi to OOB
482 static int zynq_nand_read_page_raw(struct mtd_info *mtd, struct nand_chip *chip, in zynq_nand_read_page_raw() argument
489 chip->read_buf(mtd, buf, mtd->writesize); in zynq_nand_read_page_raw()
491 p = chip->oob_poi; in zynq_nand_read_page_raw()
492 chip->read_buf(mtd, p, (mtd->oobsize - data_width)); in zynq_nand_read_page_raw()
495 data_phase_addr = (unsigned long)chip->IO_ADDR_R; in zynq_nand_read_page_raw()
497 chip->IO_ADDR_R = (void __iomem *)data_phase_addr; in zynq_nand_read_page_raw()
499 chip->read_buf(mtd, p, data_width); in zynq_nand_read_page_raw()
504 struct nand_chip *chip, u8 *buf, int oob_required, int page) in zynq_nand_read_page_raw_nooob() argument
506 chip->read_buf(mtd, buf, mtd->writesize); in zynq_nand_read_page_raw_nooob()
511 struct nand_chip *chip, u32 data_offs, in zynq_nand_read_subpage_raw() argument
515 chip->cmdfunc(mtd, NAND_CMD_RNDOUT, data_offs, -1); in zynq_nand_read_subpage_raw()
518 chip->read_buf(mtd, buf, readlen); in zynq_nand_read_subpage_raw()
526 * @chip: nand chip info structure
528 * @oob_required: must write chip->oob_poi to OOB
531 struct nand_chip *chip, const u8 *buf, int oob_required, int page) in zynq_nand_write_page_raw() argument
537 chip->write_buf(mtd, buf, mtd->writesize); in zynq_nand_write_page_raw()
539 p = chip->oob_poi; in zynq_nand_write_page_raw()
540 chip->write_buf(mtd, p, (mtd->oobsize - data_width)); in zynq_nand_write_page_raw()
543 data_phase_addr = (unsigned long)chip->IO_ADDR_W; in zynq_nand_write_page_raw()
546 chip->IO_ADDR_W = (void __iomem *)data_phase_addr; in zynq_nand_write_page_raw()
548 chip->write_buf(mtd, p, data_width); in zynq_nand_write_page_raw()
556 * @chip: Pointer to the NAND chip info structure
558 * @oob_required: must write chip->oob_poi to OOB
563 struct nand_chip *chip, const u8 *buf, int oob_required, int page) in zynq_nand_write_page_hwecc() argument
565 int i, eccsteps, eccsize = chip->ecc.size; in zynq_nand_write_page_hwecc()
566 u8 *ecc_calc = chip->buffers->ecccalc; in zynq_nand_write_page_hwecc()
568 u32 *eccpos = chip->ecc.layout->eccpos; in zynq_nand_write_page_hwecc()
573 for (eccsteps = chip->ecc.steps; (eccsteps - 1); eccsteps--) { in zynq_nand_write_page_hwecc()
574 chip->write_buf(mtd, p, eccsize); in zynq_nand_write_page_hwecc()
577 chip->write_buf(mtd, p, (eccsize - data_width)); in zynq_nand_write_page_hwecc()
581 data_phase_addr = (unsigned long) chip->IO_ADDR_W; in zynq_nand_write_page_hwecc()
583 chip->IO_ADDR_W = (void __iomem *)data_phase_addr; in zynq_nand_write_page_hwecc()
584 chip->write_buf(mtd, p, data_width); in zynq_nand_write_page_hwecc()
588 chip->ecc.calculate(mtd, p, &ecc_calc[0]); in zynq_nand_write_page_hwecc()
590 for (i = 0; i < chip->ecc.total; i++) in zynq_nand_write_page_hwecc()
591 chip->oob_poi[eccpos[i]] = ~(ecc_calc[i]); in zynq_nand_write_page_hwecc()
594 data_phase_addr = (unsigned long)chip->IO_ADDR_W; in zynq_nand_write_page_hwecc()
596 chip->IO_ADDR_W = (void __iomem *)data_phase_addr; in zynq_nand_write_page_hwecc()
599 oob_ptr = chip->oob_poi; in zynq_nand_write_page_hwecc()
600 chip->write_buf(mtd, oob_ptr, (mtd->oobsize - data_width)); in zynq_nand_write_page_hwecc()
602 data_phase_addr = (unsigned long)chip->IO_ADDR_W; in zynq_nand_write_page_hwecc()
605 chip->IO_ADDR_W = (void __iomem *)data_phase_addr; in zynq_nand_write_page_hwecc()
607 chip->write_buf(mtd, oob_ptr, data_width); in zynq_nand_write_page_hwecc()
616 * @chip: nand chip info structure
618 * @oob_required: must write chip->oob_poi to OOB
621 struct nand_chip *chip, const u8 *buf, int oob_required, int page) in zynq_nand_write_page_swecc() argument
623 int i, eccsize = chip->ecc.size; in zynq_nand_write_page_swecc()
624 int eccbytes = chip->ecc.bytes; in zynq_nand_write_page_swecc()
625 int eccsteps = chip->ecc.steps; in zynq_nand_write_page_swecc()
626 u8 *ecc_calc = chip->buffers->ecccalc; in zynq_nand_write_page_swecc()
628 u32 *eccpos = chip->ecc.layout->eccpos; in zynq_nand_write_page_swecc()
632 chip->ecc.calculate(mtd, p, &ecc_calc[i]); in zynq_nand_write_page_swecc()
634 for (i = 0; i < chip->ecc.total; i++) in zynq_nand_write_page_swecc()
635 chip->oob_poi[eccpos[i]] = ecc_calc[i]; in zynq_nand_write_page_swecc()
637 return chip->ecc.write_page_raw(mtd, chip, buf, 1, page); in zynq_nand_write_page_swecc()
643 * @chip: Pointer to the NAND chip info structure
645 * @oob_required: must write chip->oob_poi to OOB
654 struct nand_chip *chip, u8 *buf, int oob_required, int page) in zynq_nand_read_page_hwecc() argument
656 int i, stat, eccsteps, eccsize = chip->ecc.size; in zynq_nand_read_page_hwecc()
657 int eccbytes = chip->ecc.bytes; in zynq_nand_read_page_hwecc()
659 u8 *ecc_calc = chip->buffers->ecccalc; in zynq_nand_read_page_hwecc()
660 u8 *ecc_code = chip->buffers->ecccode; in zynq_nand_read_page_hwecc()
661 u32 *eccpos = chip->ecc.layout->eccpos; in zynq_nand_read_page_hwecc()
666 for (eccsteps = chip->ecc.steps; (eccsteps - 1); eccsteps--) { in zynq_nand_read_page_hwecc()
667 chip->read_buf(mtd, p, eccsize); in zynq_nand_read_page_hwecc()
670 chip->read_buf(mtd, p, (eccsize - data_width)); in zynq_nand_read_page_hwecc()
674 data_phase_addr = (unsigned long)chip->IO_ADDR_R; in zynq_nand_read_page_hwecc()
676 chip->IO_ADDR_R = (void __iomem *)data_phase_addr; in zynq_nand_read_page_hwecc()
677 chip->read_buf(mtd, p, data_width); in zynq_nand_read_page_hwecc()
681 chip->ecc.calculate(mtd, p, &ecc_calc[0]); in zynq_nand_read_page_hwecc()
684 data_phase_addr = (unsigned long)chip->IO_ADDR_R; in zynq_nand_read_page_hwecc()
686 chip->IO_ADDR_R = (void __iomem *)data_phase_addr; in zynq_nand_read_page_hwecc()
689 oob_ptr = chip->oob_poi; in zynq_nand_read_page_hwecc()
690 chip->read_buf(mtd, oob_ptr, (mtd->oobsize - data_width)); in zynq_nand_read_page_hwecc()
692 /* de-assert chip select */ in zynq_nand_read_page_hwecc()
693 data_phase_addr = (unsigned long)chip->IO_ADDR_R; in zynq_nand_read_page_hwecc()
695 chip->IO_ADDR_R = (void __iomem *)data_phase_addr; in zynq_nand_read_page_hwecc()
698 chip->read_buf(mtd, oob_ptr, data_width); in zynq_nand_read_page_hwecc()
700 for (i = 0; i < chip->ecc.total; i++) in zynq_nand_read_page_hwecc()
701 ecc_code[i] = ~(chip->oob_poi[eccpos[i]]); in zynq_nand_read_page_hwecc()
703 eccsteps = chip->ecc.steps; in zynq_nand_read_page_hwecc()
708 stat = chip->ecc.correct(mtd, p, &ecc_code[i], &ecc_calc[i]); in zynq_nand_read_page_hwecc()
721 * @chip: nand chip info structure
726 struct nand_chip *chip, u8 *buf, int oob_required, int page) in zynq_nand_read_page_swecc() argument
728 int i, eccsize = chip->ecc.size; in zynq_nand_read_page_swecc()
729 int eccbytes = chip->ecc.bytes; in zynq_nand_read_page_swecc()
730 int eccsteps = chip->ecc.steps; in zynq_nand_read_page_swecc()
732 u8 *ecc_calc = chip->buffers->ecccalc; in zynq_nand_read_page_swecc()
733 u8 *ecc_code = chip->buffers->ecccode; in zynq_nand_read_page_swecc()
734 u32 *eccpos = chip->ecc.layout->eccpos; in zynq_nand_read_page_swecc()
736 chip->ecc.read_page_raw(mtd, chip, buf, 1, page); in zynq_nand_read_page_swecc()
739 chip->ecc.calculate(mtd, p, &ecc_calc[i]); in zynq_nand_read_page_swecc()
741 for (i = 0; i < chip->ecc.total; i++) in zynq_nand_read_page_swecc()
742 ecc_code[i] = chip->oob_poi[eccpos[i]]; in zynq_nand_read_page_swecc()
744 eccsteps = chip->ecc.steps; in zynq_nand_read_page_swecc()
750 stat = chip->ecc.correct(mtd, p, &ecc_code[i], &ecc_calc[i]); in zynq_nand_read_page_swecc()
762 * @chip: Chip number to be selected
764 * This function is empty as the NAND controller handles chip select line
765 * internally based on the chip address passed in command and data phase.
767 static void zynq_nand_select_chip(struct mtd_info *mtd, int chip) in zynq_nand_select_chip() argument
782 struct nand_chip *chip = mtd->priv; in zynq_nand_cmd_function() local
785 struct zynq_nand_info *xnand = (struct zynq_nand_info *)chip->priv; in zynq_nand_cmd_function()
837 addr_cycles = chip->onfi_params.addr_cycles & in zynq_nand_cmd_function()
839 addr_cycles += ((chip->onfi_params.addr_cycles & in zynq_nand_cmd_function()
864 chip->IO_ADDR_R = (void __iomem *)data_phase_addr; in zynq_nand_cmd_function()
865 chip->IO_ADDR_W = chip->IO_ADDR_R; in zynq_nand_cmd_function()
870 if (chip->options & NAND_BUSWIDTH_16) in zynq_nand_cmd_function()
876 if (chip->chipsize > (128 << 20)) { in zynq_nand_cmd_function()
887 if ((chip->options & NAND_BUSWIDTH_16) && in zynq_nand_cmd_function()
914 * zynq_nand_read_buf - read chip data into buffer
921 struct nand_chip *chip = mtd->priv; in zynq_nand_read_buf() local
927 *buf = readb(chip->IO_ADDR_R); in zynq_nand_read_buf()
935 *(u16 *)buf = readw(chip->IO_ADDR_R); in zynq_nand_read_buf()
944 *(u32 *)buf = readl(chip->IO_ADDR_R); in zynq_nand_read_buf()
952 *(u16 *)buf = readw(chip->IO_ADDR_R); in zynq_nand_read_buf()
957 *buf = readb(chip->IO_ADDR_R); in zynq_nand_read_buf()
962 * zynq_nand_write_buf - write buffer to chip
969 struct nand_chip *chip = mtd->priv; in zynq_nand_write_buf() local
970 const u32 *nand = chip->IO_ADDR_W; in zynq_nand_write_buf()