Lines Matching full:nfc
6 * https://github.com/yuq/sunxi-nfc-mtd
316 static int sunxi_nfc_wait_int(struct sunxi_nfc *nfc, u32 flags, in sunxi_nfc_wait_int() argument
331 status = readl(nfc->regs + NFC_REG_ST); in sunxi_nfc_wait_int()
340 writel(status & flags, nfc->regs + NFC_REG_ST); in sunxi_nfc_wait_int()
345 static int sunxi_nfc_wait_cmd_fifo_empty(struct sunxi_nfc *nfc) in sunxi_nfc_wait_cmd_fifo_empty() argument
353 if (!(readl(nfc->regs + NFC_REG_ST) & NFC_CMD_FIFO_STATUS)) in sunxi_nfc_wait_cmd_fifo_empty()
357 dev_err(nfc->dev, "wait for empty cmd FIFO timedout\n"); in sunxi_nfc_wait_cmd_fifo_empty()
361 static int sunxi_nfc_rst(struct sunxi_nfc *nfc) in sunxi_nfc_rst() argument
367 writel(0, nfc->regs + NFC_REG_ECC_CTL); in sunxi_nfc_rst()
368 writel(NFC_RESET, nfc->regs + NFC_REG_CTL); in sunxi_nfc_rst()
372 if (!(readl(nfc->regs + NFC_REG_CTL) & NFC_RESET)) in sunxi_nfc_rst()
376 dev_err(nfc->dev, "wait for NAND controller reset timedout\n"); in sunxi_nfc_rst()
384 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller); in sunxi_nfc_dev_ready() local
396 ret = !!(readl(nfc->regs + NFC_REG_ST) & in sunxi_nfc_dev_ready()
401 sunxi_nfc_wait_int(nfc, NFC_RB_B2R, timeo); in sunxi_nfc_dev_ready()
402 ret = !!(readl(nfc->regs + NFC_REG_ST) & in sunxi_nfc_dev_ready()
411 dev_err(nfc->dev, "cannot check R/B NAND status!\n"); in sunxi_nfc_dev_ready()
422 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller); in sunxi_nfc_select_chip() local
432 ctl = readl(nfc->regs + NFC_REG_CTL) & in sunxi_nfc_select_chip()
448 writel(mtd->writesize, nfc->regs + NFC_REG_SPARE_AREA); in sunxi_nfc_select_chip()
450 if (nfc->clk_rate != sunxi_nand->clk_rate) { in sunxi_nfc_select_chip()
452 nfc->clk_rate = sunxi_nand->clk_rate; in sunxi_nfc_select_chip()
456 writel(sunxi_nand->timing_ctl, nfc->regs + NFC_REG_TIMING_CTL); in sunxi_nfc_select_chip()
457 writel(sunxi_nand->timing_cfg, nfc->regs + NFC_REG_TIMING_CFG); in sunxi_nfc_select_chip()
458 writel(ctl, nfc->regs + NFC_REG_CTL); in sunxi_nfc_select_chip()
467 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller); in sunxi_nfc_read_buf() local
476 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc); in sunxi_nfc_read_buf()
480 writel(cnt, nfc->regs + NFC_REG_CNT); in sunxi_nfc_read_buf()
482 writel(tmp, nfc->regs + NFC_REG_CMD); in sunxi_nfc_read_buf()
484 ret = sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0); in sunxi_nfc_read_buf()
489 memcpy_fromio(buf + offs, nfc->regs + NFC_RAM0_BASE, in sunxi_nfc_read_buf()
500 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller); in sunxi_nfc_write_buf() local
509 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc); in sunxi_nfc_write_buf()
513 writel(cnt, nfc->regs + NFC_REG_CNT); in sunxi_nfc_write_buf()
514 memcpy_toio(nfc->regs + NFC_RAM0_BASE, buf + offs, cnt); in sunxi_nfc_write_buf()
517 writel(tmp, nfc->regs + NFC_REG_CMD); in sunxi_nfc_write_buf()
519 ret = sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0); in sunxi_nfc_write_buf()
541 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller); in sunxi_nfc_cmd_ctrl() local
545 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc); in sunxi_nfc_cmd_ctrl()
550 tmp = readl(nfc->regs + NFC_REG_CTL); in sunxi_nfc_cmd_ctrl()
555 writel(tmp, nfc->regs + NFC_REG_CTL); in sunxi_nfc_cmd_ctrl()
571 nfc->regs + NFC_REG_RCMD_SET); in sunxi_nfc_cmd_ctrl()
580 nfc->regs + NFC_REG_ADDR_LOW); in sunxi_nfc_cmd_ctrl()
585 nfc->regs + NFC_REG_ADDR_HIGH); in sunxi_nfc_cmd_ctrl()
587 writel(cmd, nfc->regs + NFC_REG_CMD); in sunxi_nfc_cmd_ctrl()
591 sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0); in sunxi_nfc_cmd_ctrl()
707 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller); in sunxi_nfc_randomizer_config() local
708 u32 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL); in sunxi_nfc_randomizer_config()
714 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL); in sunxi_nfc_randomizer_config()
716 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_RANDOM_SEED_MSK; in sunxi_nfc_randomizer_config()
717 writel(ecc_ctl | NFC_RANDOM_SEED(state), nfc->regs + NFC_REG_ECC_CTL); in sunxi_nfc_randomizer_config()
723 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller); in sunxi_nfc_randomizer_enable() local
728 writel(readl(nfc->regs + NFC_REG_ECC_CTL) | NFC_RANDOM_EN, in sunxi_nfc_randomizer_enable()
729 nfc->regs + NFC_REG_ECC_CTL); in sunxi_nfc_randomizer_enable()
735 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller); in sunxi_nfc_randomizer_disable() local
740 writel(readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_RANDOM_EN, in sunxi_nfc_randomizer_disable()
741 nfc->regs + NFC_REG_ECC_CTL); in sunxi_nfc_randomizer_disable()
774 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller); in sunxi_nfc_hw_ecc_enable() local
778 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL); in sunxi_nfc_hw_ecc_enable()
786 writel(ecc_ctl, nfc->regs + NFC_REG_ECC_CTL); in sunxi_nfc_hw_ecc_enable()
792 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller); in sunxi_nfc_hw_ecc_disable() local
794 writel(readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_ECC_EN, in sunxi_nfc_hw_ecc_disable()
795 nfc->regs + NFC_REG_ECC_CTL); in sunxi_nfc_hw_ecc_disable()
814 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller); in sunxi_nfc_hw_ecc_read_chunk() local
828 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc); in sunxi_nfc_hw_ecc_read_chunk()
834 nfc->regs + NFC_REG_CMD); in sunxi_nfc_hw_ecc_read_chunk()
836 ret = sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0); in sunxi_nfc_hw_ecc_read_chunk()
843 status = readl(nfc->regs + NFC_REG_ECC_ST); in sunxi_nfc_hw_ecc_read_chunk()
847 if (unlikely(!(readl(nfc->regs + NFC_REG_PAT_ID) & 0x1))) in sunxi_nfc_hw_ecc_read_chunk()
856 ret = NFC_ECC_ERR_CNT(0, readl(nfc->regs + NFC_REG_ECC_ERR_CNT(0))); in sunxi_nfc_hw_ecc_read_chunk()
858 memcpy_fromio(data, nfc->regs + NFC_RAM0_BASE, ecc->size); in sunxi_nfc_hw_ecc_read_chunk()
885 sunxi_nfc_user_data_to_buf(readl(nfc->regs + in sunxi_nfc_hw_ecc_read_chunk()
941 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller); in sunxi_nfc_hw_ecc_write_chunk() local
957 nfc->regs + NFC_REG_USER_DATA(0)); in sunxi_nfc_hw_ecc_write_chunk()
960 nfc->regs + NFC_REG_USER_DATA(0)); in sunxi_nfc_hw_ecc_write_chunk()
966 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc); in sunxi_nfc_hw_ecc_write_chunk()
973 nfc->regs + NFC_REG_CMD); in sunxi_nfc_hw_ecc_write_chunk()
975 ret = sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0); in sunxi_nfc_hw_ecc_write_chunk()
1294 dev_err(nfc->dev, "unsupported tWB\n"); in sunxi_nand_chip_set_timings()
1300 dev_err(nfc->dev, "unsupported tADL\n"); in sunxi_nand_chip_set_timings()
1306 dev_err(nfc->dev, "unsupported tWHR\n"); in sunxi_nand_chip_set_timings()
1313 dev_err(nfc->dev, "unsupported tRHW\n"); in sunxi_nand_chip_set_timings()
1421 dev_err(nfc->dev, "unsupported strength\n"); in sunxi_nand_hw_common_ecc_ctrl_init()
1600 static int sunxi_nand_chip_init(int node, struct sunxi_nfc *nfc, int devnum) in sunxi_nand_chip_init() argument
1660 if (test_and_set_bit(tmp, &nfc->assigned_cs)) { in sunxi_nand_chip_init()
1701 nand->controller = &nfc->controller; in sunxi_nand_chip_init()
1751 list_add_tail(&chip->node, &nfc->chips); in sunxi_nand_chip_init()
1756 static int sunxi_nand_chips_init(int node, struct sunxi_nfc *nfc) in sunxi_nand_chips_init() argument
1774 ret = sunxi_nand_chip_init(nand_node, nfc, i++); in sunxi_nand_chips_init()
1783 static void sunxi_nand_chips_cleanup(struct sunxi_nfc *nfc) in sunxi_nand_chips_cleanup() argument
1787 while (!list_empty(&nfc->chips)) { in sunxi_nand_chips_cleanup()
1788 chip = list_first_entry(&nfc->chips, struct sunxi_nand_chip, in sunxi_nand_chips_cleanup()
1801 struct sunxi_nfc *nfc; in sunxi_nand_init() local
1806 nfc = kzalloc(sizeof(*nfc), GFP_KERNEL); in sunxi_nand_init()
1807 if (!nfc) in sunxi_nand_init()
1810 spin_lock_init(&nfc->controller.lock); in sunxi_nand_init()
1811 init_waitqueue_head(&nfc->controller.wq); in sunxi_nand_init()
1812 INIT_LIST_HEAD(&nfc->chips); in sunxi_nand_init()
1816 pr_err("unable to find nfc node in device tree\n"); in sunxi_nand_init()
1821 pr_err("nfc disabled in device tree\n"); in sunxi_nand_init()
1827 pr_err("unable to find nfc address in device tree\n"); in sunxi_nand_init()
1831 nfc->regs = (void *)regs; in sunxi_nand_init()
1833 ret = sunxi_nfc_rst(nfc); in sunxi_nand_init()
1837 ret = sunxi_nand_chips_init(node, nfc); in sunxi_nand_init()
1846 kfree(nfc); in sunxi_nand_init()