Lines Matching full:nfc
7 * https://github.com/yuq/sunxi-nfc-mtd
315 static int sunxi_nfc_wait_int(struct sunxi_nfc *nfc, u32 flags, in sunxi_nfc_wait_int() argument
330 status = readl(nfc->regs + NFC_REG_ST); in sunxi_nfc_wait_int()
339 writel(status & flags, nfc->regs + NFC_REG_ST); in sunxi_nfc_wait_int()
344 static int sunxi_nfc_wait_cmd_fifo_empty(struct sunxi_nfc *nfc) in sunxi_nfc_wait_cmd_fifo_empty() argument
352 if (!(readl(nfc->regs + NFC_REG_ST) & NFC_CMD_FIFO_STATUS)) in sunxi_nfc_wait_cmd_fifo_empty()
356 dev_err(nfc->dev, "wait for empty cmd FIFO timedout\n"); in sunxi_nfc_wait_cmd_fifo_empty()
360 static int sunxi_nfc_rst(struct sunxi_nfc *nfc) in sunxi_nfc_rst() argument
366 writel(0, nfc->regs + NFC_REG_ECC_CTL); in sunxi_nfc_rst()
367 writel(NFC_RESET, nfc->regs + NFC_REG_CTL); in sunxi_nfc_rst()
371 if (!(readl(nfc->regs + NFC_REG_CTL) & NFC_RESET)) in sunxi_nfc_rst()
375 dev_err(nfc->dev, "wait for NAND controller reset timedout\n"); in sunxi_nfc_rst()
383 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller); in sunxi_nfc_dev_ready() local
395 ret = !!(readl(nfc->regs + NFC_REG_ST) & in sunxi_nfc_dev_ready()
400 sunxi_nfc_wait_int(nfc, NFC_RB_B2R, timeo); in sunxi_nfc_dev_ready()
401 ret = !!(readl(nfc->regs + NFC_REG_ST) & in sunxi_nfc_dev_ready()
410 dev_err(nfc->dev, "cannot check R/B NAND status!\n"); in sunxi_nfc_dev_ready()
421 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller); in sunxi_nfc_select_chip() local
431 ctl = readl(nfc->regs + NFC_REG_CTL) & in sunxi_nfc_select_chip()
447 writel(mtd->writesize, nfc->regs + NFC_REG_SPARE_AREA); in sunxi_nfc_select_chip()
449 if (nfc->clk_rate != sunxi_nand->clk_rate) { in sunxi_nfc_select_chip()
451 nfc->clk_rate = sunxi_nand->clk_rate; in sunxi_nfc_select_chip()
455 writel(sunxi_nand->timing_ctl, nfc->regs + NFC_REG_TIMING_CTL); in sunxi_nfc_select_chip()
456 writel(sunxi_nand->timing_cfg, nfc->regs + NFC_REG_TIMING_CFG); in sunxi_nfc_select_chip()
457 writel(ctl, nfc->regs + NFC_REG_CTL); in sunxi_nfc_select_chip()
466 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller); in sunxi_nfc_read_buf() local
475 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc); in sunxi_nfc_read_buf()
479 writel(cnt, nfc->regs + NFC_REG_CNT); in sunxi_nfc_read_buf()
481 writel(tmp, nfc->regs + NFC_REG_CMD); in sunxi_nfc_read_buf()
483 ret = sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0); in sunxi_nfc_read_buf()
488 memcpy_fromio(buf + offs, nfc->regs + NFC_RAM0_BASE, in sunxi_nfc_read_buf()
499 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller); in sunxi_nfc_write_buf() local
508 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc); in sunxi_nfc_write_buf()
512 writel(cnt, nfc->regs + NFC_REG_CNT); in sunxi_nfc_write_buf()
513 memcpy_toio(nfc->regs + NFC_RAM0_BASE, buf + offs, cnt); in sunxi_nfc_write_buf()
516 writel(tmp, nfc->regs + NFC_REG_CMD); in sunxi_nfc_write_buf()
518 ret = sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0); in sunxi_nfc_write_buf()
540 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller); in sunxi_nfc_cmd_ctrl() local
544 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc); in sunxi_nfc_cmd_ctrl()
549 tmp = readl(nfc->regs + NFC_REG_CTL); in sunxi_nfc_cmd_ctrl()
554 writel(tmp, nfc->regs + NFC_REG_CTL); in sunxi_nfc_cmd_ctrl()
570 nfc->regs + NFC_REG_RCMD_SET); in sunxi_nfc_cmd_ctrl()
579 nfc->regs + NFC_REG_ADDR_LOW); in sunxi_nfc_cmd_ctrl()
584 nfc->regs + NFC_REG_ADDR_HIGH); in sunxi_nfc_cmd_ctrl()
586 writel(cmd, nfc->regs + NFC_REG_CMD); in sunxi_nfc_cmd_ctrl()
590 sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0); in sunxi_nfc_cmd_ctrl()
706 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller); in sunxi_nfc_randomizer_config() local
707 u32 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL); in sunxi_nfc_randomizer_config()
713 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL); in sunxi_nfc_randomizer_config()
715 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_RANDOM_SEED_MSK; in sunxi_nfc_randomizer_config()
716 writel(ecc_ctl | NFC_RANDOM_SEED(state), nfc->regs + NFC_REG_ECC_CTL); in sunxi_nfc_randomizer_config()
722 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller); in sunxi_nfc_randomizer_enable() local
727 writel(readl(nfc->regs + NFC_REG_ECC_CTL) | NFC_RANDOM_EN, in sunxi_nfc_randomizer_enable()
728 nfc->regs + NFC_REG_ECC_CTL); in sunxi_nfc_randomizer_enable()
734 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller); in sunxi_nfc_randomizer_disable() local
739 writel(readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_RANDOM_EN, in sunxi_nfc_randomizer_disable()
740 nfc->regs + NFC_REG_ECC_CTL); in sunxi_nfc_randomizer_disable()
773 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller); in sunxi_nfc_hw_ecc_enable() local
777 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL); in sunxi_nfc_hw_ecc_enable()
785 writel(ecc_ctl, nfc->regs + NFC_REG_ECC_CTL); in sunxi_nfc_hw_ecc_enable()
791 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller); in sunxi_nfc_hw_ecc_disable() local
793 writel(readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_ECC_EN, in sunxi_nfc_hw_ecc_disable()
794 nfc->regs + NFC_REG_ECC_CTL); in sunxi_nfc_hw_ecc_disable()
813 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller); in sunxi_nfc_hw_ecc_read_chunk() local
827 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc); in sunxi_nfc_hw_ecc_read_chunk()
833 nfc->regs + NFC_REG_CMD); in sunxi_nfc_hw_ecc_read_chunk()
835 ret = sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0); in sunxi_nfc_hw_ecc_read_chunk()
842 status = readl(nfc->regs + NFC_REG_ECC_ST); in sunxi_nfc_hw_ecc_read_chunk()
846 if (unlikely(!(readl(nfc->regs + NFC_REG_PAT_ID) & 0x1))) in sunxi_nfc_hw_ecc_read_chunk()
855 ret = NFC_ECC_ERR_CNT(0, readl(nfc->regs + NFC_REG_ECC_ERR_CNT(0))); in sunxi_nfc_hw_ecc_read_chunk()
857 memcpy_fromio(data, nfc->regs + NFC_RAM0_BASE, ecc->size); in sunxi_nfc_hw_ecc_read_chunk()
884 sunxi_nfc_user_data_to_buf(readl(nfc->regs + in sunxi_nfc_hw_ecc_read_chunk()
940 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller); in sunxi_nfc_hw_ecc_write_chunk() local
956 nfc->regs + NFC_REG_USER_DATA(0)); in sunxi_nfc_hw_ecc_write_chunk()
959 nfc->regs + NFC_REG_USER_DATA(0)); in sunxi_nfc_hw_ecc_write_chunk()
965 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc); in sunxi_nfc_hw_ecc_write_chunk()
972 nfc->regs + NFC_REG_CMD); in sunxi_nfc_hw_ecc_write_chunk()
974 ret = sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0); in sunxi_nfc_hw_ecc_write_chunk()
1293 dev_err(nfc->dev, "unsupported tWB\n"); in sunxi_nand_chip_set_timings()
1299 dev_err(nfc->dev, "unsupported tADL\n"); in sunxi_nand_chip_set_timings()
1305 dev_err(nfc->dev, "unsupported tWHR\n"); in sunxi_nand_chip_set_timings()
1312 dev_err(nfc->dev, "unsupported tRHW\n"); in sunxi_nand_chip_set_timings()
1420 dev_err(nfc->dev, "unsupported strength\n"); in sunxi_nand_hw_common_ecc_ctrl_init()
1599 static int sunxi_nand_chip_init(int node, struct sunxi_nfc *nfc, int devnum) in sunxi_nand_chip_init() argument
1659 if (test_and_set_bit(tmp, &nfc->assigned_cs)) { in sunxi_nand_chip_init()
1700 nand->controller = &nfc->controller; in sunxi_nand_chip_init()
1750 list_add_tail(&chip->node, &nfc->chips); in sunxi_nand_chip_init()
1755 static int sunxi_nand_chips_init(int node, struct sunxi_nfc *nfc) in sunxi_nand_chips_init() argument
1773 ret = sunxi_nand_chip_init(nand_node, nfc, i++); in sunxi_nand_chips_init()
1782 static void sunxi_nand_chips_cleanup(struct sunxi_nfc *nfc) in sunxi_nand_chips_cleanup() argument
1786 while (!list_empty(&nfc->chips)) { in sunxi_nand_chips_cleanup()
1787 chip = list_first_entry(&nfc->chips, struct sunxi_nand_chip, in sunxi_nand_chips_cleanup()
1800 struct sunxi_nfc *nfc; in sunxi_nand_init() local
1805 nfc = kzalloc(sizeof(*nfc), GFP_KERNEL); in sunxi_nand_init()
1806 if (!nfc) in sunxi_nand_init()
1809 spin_lock_init(&nfc->controller.lock); in sunxi_nand_init()
1810 init_waitqueue_head(&nfc->controller.wq); in sunxi_nand_init()
1811 INIT_LIST_HEAD(&nfc->chips); in sunxi_nand_init()
1815 pr_err("unable to find nfc node in device tree\n"); in sunxi_nand_init()
1820 pr_err("nfc disabled in device tree\n"); in sunxi_nand_init()
1826 pr_err("unable to find nfc address in device tree\n"); in sunxi_nand_init()
1830 nfc->regs = (void *)regs; in sunxi_nand_init()
1832 ret = sunxi_nfc_rst(nfc); in sunxi_nand_init()
1836 ret = sunxi_nand_chips_init(node, nfc); in sunxi_nand_init()
1845 kfree(nfc); in sunxi_nand_init()