Lines Matching full:nfc

22  * NFC Page Data Layout:
111 * @type: NFC version
226 struct rk_nfc *nfc = nand_get_controller_data(chip); in rk_nfc_data_ptr() local
228 return nfc->page_buf + i * rk_nfc_data_len(chip); in rk_nfc_data_ptr()
233 struct rk_nfc *nfc = nand_get_controller_data(chip); in rk_nfc_oob_ptr() local
235 return nfc->page_buf + i * rk_nfc_data_len(chip) + chip->ecc.size; in rk_nfc_oob_ptr()
240 struct rk_nfc *nfc = nand_get_controller_data(chip); in rk_nfc_hw_ecc_setup() local
244 if (strength == nfc->cfg->ecc_strengths[i]) { in rk_nfc_hw_ecc_setup()
245 reg = nfc->cfg->ecc_cfgs[i]; in rk_nfc_hw_ecc_setup()
253 writel(reg, nfc->regs + nfc->cfg->bchctl_off); in rk_nfc_hw_ecc_setup()
256 nfc->cur_ecc = strength; in rk_nfc_hw_ecc_setup()
263 struct rk_nfc *nfc = nand_get_controller_data(chip); in rk_nfc_select_chip() local
269 nfc->selected_bank = -1; in rk_nfc_select_chip()
271 val = readl_relaxed(nfc->regs + NFC_FMCTL); in rk_nfc_select_chip()
273 writel(val, nfc->regs + NFC_FMCTL); in rk_nfc_select_chip()
277 nfc->selected_bank = rknand->sels[cs]; in rk_nfc_select_chip()
278 nfc->band_offset = NFC_BANK + nfc->selected_bank * NFC_BANK_STEP; in rk_nfc_select_chip()
280 val = readl_relaxed(nfc->regs + NFC_FMCTL); in rk_nfc_select_chip()
282 val |= FMCTL_CE_SEL(nfc->selected_bank); in rk_nfc_select_chip()
284 writel(val, nfc->regs + NFC_FMCTL); in rk_nfc_select_chip()
290 if (nfc->cur_timing != rknand->timing) { in rk_nfc_select_chip()
291 writel(rknand->timing, nfc->regs + NFC_FMWAIT); in rk_nfc_select_chip()
292 nfc->cur_timing = rknand->timing; in rk_nfc_select_chip()
299 if (nfc->cur_ecc != ecc->strength) in rk_nfc_select_chip()
303 static inline int rk_nfc_wait_ioready(struct rk_nfc *nfc) in rk_nfc_wait_ioready() argument
308 rc = readl_relaxed_poll_timeout(nfc->regs + NFC_FMCTL, val, in rk_nfc_wait_ioready()
314 static void rk_nfc_read_buf(struct rk_nfc *nfc, u8 *buf, int len) in rk_nfc_read_buf() argument
319 buf[i] = readb_relaxed(nfc->regs + nfc->band_offset + in rk_nfc_read_buf()
323 static void rk_nfc_write_buf(struct rk_nfc *nfc, const u8 *buf, int len) in rk_nfc_write_buf() argument
328 writeb(buf[i], nfc->regs + nfc->band_offset + BANK_DATA); in rk_nfc_write_buf()
334 struct rk_nfc *nfc = nand_get_controller_data(chip); in rk_nfc_cmd() local
336 int reg_offset = nfc->band_offset; in rk_nfc_cmd()
348 nfc->regs + reg_offset + BANK_CMD); in rk_nfc_cmd()
357 nfc->regs + reg_offset + BANK_ADDR); in rk_nfc_cmd()
367 rk_nfc_write_buf(nfc, outbuf, cnt); in rk_nfc_cmd()
370 rk_nfc_read_buf(nfc, inbuf, cnt); in rk_nfc_cmd()
375 if (rk_nfc_wait_ioready(nfc) < 0) { in rk_nfc_cmd()
377 dev_err(nfc->dev, "IO not ready\n"); in rk_nfc_cmd()
418 struct rk_nfc *nfc = nand_get_controller_data(chip); in rk_nfc_setup_interface() local
430 if (IS_ERR(nfc->nfc_clk)) in rk_nfc_setup_interface()
431 rate = clk_get_rate(nfc->ahb_clk); in rk_nfc_setup_interface()
433 rate = clk_get_rate(nfc->nfc_clk); in rk_nfc_setup_interface()
468 static void rk_nfc_xfer_start(struct rk_nfc *nfc, u8 rw, u8 n_KB, in rk_nfc_xfer_start() argument
479 if (nfc->cfg->type == NFC_V6 || nfc->cfg->type == NFC_V8) { in rk_nfc_xfer_start()
480 bch_reg = readl_relaxed(nfc->regs + nfc->cfg->bchctl_off); in rk_nfc_xfer_start()
482 (nfc->selected_bank << BCHCTL_BANK); in rk_nfc_xfer_start()
483 writel(bch_reg, nfc->regs + nfc->cfg->bchctl_off); in rk_nfc_xfer_start()
486 writel(dma_reg, nfc->regs + nfc->cfg->dma_cfg_off); in rk_nfc_xfer_start()
487 writel((u32)dma_data, nfc->regs + nfc->cfg->dma_data_buf_off); in rk_nfc_xfer_start()
488 writel((u32)dma_oob, nfc->regs + nfc->cfg->dma_oob_buf_off); in rk_nfc_xfer_start()
489 writel(fl_reg, nfc->regs + nfc->cfg->flctl_off); in rk_nfc_xfer_start()
491 writel(fl_reg, nfc->regs + nfc->cfg->flctl_off); in rk_nfc_xfer_start()
494 static int rk_nfc_wait_for_xfer_done(struct rk_nfc *nfc) in rk_nfc_wait_for_xfer_done() argument
499 ptr = nfc->regs + nfc->cfg->flctl_off; in rk_nfc_wait_for_xfer_done()
510 struct rk_nfc *nfc = nand_get_controller_data(chip); in rk_nfc_write_page_raw() local
527 memset(nfc->page_buf, 0xff, mtd->writesize + mtd->oobsize); in rk_nfc_write_page_raw()
530 /* Copy data to the NFC buffer. */ in rk_nfc_write_page_raw()
548 * The OOB data layout on the NFC is: in rk_nfc_write_page_raw()
577 /* Copy ECC data to the NFC buffer. */ in rk_nfc_write_page_raw()
584 rk_nfc_write_buf(nfc, buf, mtd->writesize + mtd->oobsize); in rk_nfc_write_page_raw()
592 struct rk_nfc *nfc = nand_get_controller_data(chip); in rk_nfc_write_page_hwecc() local
606 memcpy(nfc->page_buf, buf, mtd->writesize); in rk_nfc_write_page_hwecc()
608 memset(nfc->page_buf, 0xFF, mtd->writesize); in rk_nfc_write_page_hwecc()
651 if (nfc->cfg->type == NFC_V9) in rk_nfc_write_page_hwecc()
652 nfc->oob_buf[i] = tmp; in rk_nfc_write_page_hwecc()
654 nfc->oob_buf[i * (oob_step / 4)] = tmp; in rk_nfc_write_page_hwecc()
657 dma_data = dma_map_single(nfc->dev, (void *)nfc->page_buf, in rk_nfc_write_page_hwecc()
659 dma_oob = dma_map_single(nfc->dev, nfc->oob_buf, in rk_nfc_write_page_hwecc()
663 reinit_completion(&nfc->done); in rk_nfc_write_page_hwecc()
664 writel(INT_DMA, nfc->regs + nfc->cfg->int_en_off); in rk_nfc_write_page_hwecc()
666 rk_nfc_xfer_start(nfc, NFC_WRITE, ecc->steps, dma_data, in rk_nfc_write_page_hwecc()
668 ret = wait_for_completion_timeout(&nfc->done, in rk_nfc_write_page_hwecc()
671 dev_warn(nfc->dev, "write: wait dma done timeout.\n"); in rk_nfc_write_page_hwecc()
674 * needs to check the NFC`s status register to see if the data in rk_nfc_write_page_hwecc()
677 ret = rk_nfc_wait_for_xfer_done(nfc); in rk_nfc_write_page_hwecc()
679 dma_unmap_single(nfc->dev, dma_data, mtd->writesize, in rk_nfc_write_page_hwecc()
681 dma_unmap_single(nfc->dev, dma_oob, ecc->steps * oob_step, in rk_nfc_write_page_hwecc()
688 dev_err(nfc->dev, "write: wait transfer done timeout.\n"); in rk_nfc_write_page_hwecc()
704 struct rk_nfc *nfc = nand_get_controller_data(chip); in rk_nfc_read_page_raw() local
721 rk_nfc_read_buf(nfc, nfc->page_buf, mtd->writesize + mtd->oobsize); in rk_nfc_read_page_raw()
739 /* Copy ECC data from the NFC buffer. */ in rk_nfc_read_page_raw()
744 /* Copy data from the NFC buffer. */ in rk_nfc_read_page_raw()
758 struct rk_nfc *nfc = nand_get_controller_data(chip); in rk_nfc_read_page_hwecc() local
772 dma_data = dma_map_single(nfc->dev, nfc->page_buf, in rk_nfc_read_page_hwecc()
775 dma_oob = dma_map_single(nfc->dev, nfc->oob_buf, in rk_nfc_read_page_hwecc()
791 reinit_completion(&nfc->done); in rk_nfc_read_page_hwecc()
792 writel(INT_DMA, nfc->regs + nfc->cfg->int_en_off); in rk_nfc_read_page_hwecc()
793 rk_nfc_xfer_start(nfc, NFC_READ, ecc->steps, dma_data, in rk_nfc_read_page_hwecc()
795 ret = wait_for_completion_timeout(&nfc->done, in rk_nfc_read_page_hwecc()
798 dev_warn(nfc->dev, "read: wait dma done timeout.\n"); in rk_nfc_read_page_hwecc()
801 * needs to check the NFC`s status register to see if the data in rk_nfc_read_page_hwecc()
804 ret = rk_nfc_wait_for_xfer_done(nfc); in rk_nfc_read_page_hwecc()
806 dma_unmap_single(nfc->dev, dma_data, mtd->writesize, in rk_nfc_read_page_hwecc()
808 dma_unmap_single(nfc->dev, dma_oob, ecc->steps * oob_step, in rk_nfc_read_page_hwecc()
813 dev_err(nfc->dev, "read: wait transfer done timeout.\n"); in rk_nfc_read_page_hwecc()
823 if (nfc->cfg->type == NFC_V9) in rk_nfc_read_page_hwecc()
824 tmp = nfc->oob_buf[i]; in rk_nfc_read_page_hwecc()
826 tmp = nfc->oob_buf[i * (oob_step / 4)]; in rk_nfc_read_page_hwecc()
835 bch_st = readl_relaxed(nfc->regs + in rk_nfc_read_page_hwecc()
836 nfc->cfg->bch_st_off + i * 4); in rk_nfc_read_page_hwecc()
837 if (bch_st & BIT(nfc->cfg->ecc0.err_flag_bit) || in rk_nfc_read_page_hwecc()
838 bch_st & BIT(nfc->cfg->ecc1.err_flag_bit)) { in rk_nfc_read_page_hwecc()
842 cnt = ECC_ERR_CNT(bch_st, nfc->cfg->ecc0); in rk_nfc_read_page_hwecc()
846 cnt = ECC_ERR_CNT(bch_st, nfc->cfg->ecc1); in rk_nfc_read_page_hwecc()
853 memcpy(buf, nfc->page_buf, mtd->writesize); in rk_nfc_read_page_hwecc()
863 dev_err(nfc->dev, "read page: %x ecc error!\n", page); in rk_nfc_read_page_hwecc()
875 static inline void rk_nfc_hw_init(struct rk_nfc *nfc) in rk_nfc_hw_init() argument
878 writel(FMCTL_WP, nfc->regs + NFC_FMCTL); in rk_nfc_hw_init()
879 /* Config default timing 40ns at 150 Mhz NFC clock. */ in rk_nfc_hw_init()
880 writel(0x1081, nfc->regs + NFC_FMWAIT); in rk_nfc_hw_init()
881 nfc->cur_timing = 0x1081; in rk_nfc_hw_init()
883 writel(0, nfc->regs + nfc->cfg->randmz_off); in rk_nfc_hw_init()
884 writel(0, nfc->regs + nfc->cfg->dma_cfg_off); in rk_nfc_hw_init()
885 writel(FLCTL_RST, nfc->regs + nfc->cfg->flctl_off); in rk_nfc_hw_init()
890 struct rk_nfc *nfc = id; in rk_nfc_irq() local
893 sta = readl_relaxed(nfc->regs + nfc->cfg->int_st_off); in rk_nfc_irq()
894 ien = readl_relaxed(nfc->regs + nfc->cfg->int_en_off); in rk_nfc_irq()
899 writel(sta, nfc->regs + nfc->cfg->int_clr_off); in rk_nfc_irq()
900 writel(~sta & ien, nfc->regs + nfc->cfg->int_en_off); in rk_nfc_irq()
902 complete(&nfc->done); in rk_nfc_irq()
907 static int rk_nfc_enable_clks(struct device *dev, struct rk_nfc *nfc) in rk_nfc_enable_clks() argument
911 if (!IS_ERR(nfc->nfc_clk)) { in rk_nfc_enable_clks()
912 ret = clk_prepare_enable(nfc->nfc_clk); in rk_nfc_enable_clks()
914 dev_err(dev, "failed to enable NFC clk\n"); in rk_nfc_enable_clks()
919 ret = clk_prepare_enable(nfc->ahb_clk); in rk_nfc_enable_clks()
922 clk_disable_unprepare(nfc->nfc_clk); in rk_nfc_enable_clks()
929 static void rk_nfc_disable_clks(struct rk_nfc *nfc) in rk_nfc_disable_clks() argument
931 clk_disable_unprepare(nfc->nfc_clk); in rk_nfc_disable_clks()
932 clk_disable_unprepare(nfc->ahb_clk); in rk_nfc_disable_clks()
973 struct rk_nfc *nfc = nand_get_controller_data(chip); in rk_nfc_ecc_init() local
975 const u8 *strengths = nfc->cfg->ecc_strengths; in rk_nfc_ecc_init()
979 nfc_max_strength = nfc->cfg->ecc_strengths[0]; in rk_nfc_ecc_init()
1001 dev_err(nfc->dev, "unsupported ECC strength\n"); in rk_nfc_ecc_init()
1017 struct rk_nfc *nfc = nand_get_controller_data(chip); in rk_nfc_attach_chip() local
1047 if (nfc->page_buf && new_page_len > nfc->page_buf_size) { in rk_nfc_attach_chip()
1048 buf = krealloc(nfc->page_buf, new_page_len, in rk_nfc_attach_chip()
1052 nfc->page_buf = buf; in rk_nfc_attach_chip()
1053 nfc->page_buf_size = new_page_len; in rk_nfc_attach_chip()
1057 if (nfc->oob_buf && new_oob_len > nfc->oob_buf_size) { in rk_nfc_attach_chip()
1058 buf = krealloc(nfc->oob_buf, new_oob_len, in rk_nfc_attach_chip()
1061 kfree(nfc->page_buf); in rk_nfc_attach_chip()
1062 nfc->page_buf = NULL; in rk_nfc_attach_chip()
1065 nfc->oob_buf = buf; in rk_nfc_attach_chip()
1066 nfc->oob_buf_size = new_oob_len; in rk_nfc_attach_chip()
1069 if (!nfc->page_buf) { in rk_nfc_attach_chip()
1070 nfc->page_buf = kzalloc(new_page_len, GFP_KERNEL | GFP_DMA); in rk_nfc_attach_chip()
1071 if (!nfc->page_buf) in rk_nfc_attach_chip()
1073 nfc->page_buf_size = new_page_len; in rk_nfc_attach_chip()
1076 if (!nfc->oob_buf) { in rk_nfc_attach_chip()
1077 nfc->oob_buf = kzalloc(new_oob_len, GFP_KERNEL | GFP_DMA); in rk_nfc_attach_chip()
1078 if (!nfc->oob_buf) { in rk_nfc_attach_chip()
1079 kfree(nfc->page_buf); in rk_nfc_attach_chip()
1080 nfc->page_buf = NULL; in rk_nfc_attach_chip()
1083 nfc->oob_buf_size = new_oob_len; in rk_nfc_attach_chip()
1103 static int rk_nfc_nand_chip_init(struct device *dev, struct rk_nfc *nfc, in rk_nfc_nand_chip_init() argument
1140 if (test_and_set_bit(tmp, &nfc->assigned_cs)) { in rk_nfc_nand_chip_init()
1149 chip->controller = &nfc->controller; in rk_nfc_nand_chip_init()
1153 nand_set_controller_data(chip, nfc); in rk_nfc_nand_chip_init()
1166 dev_err(nfc->dev, "NAND label property is mandatory\n"); in rk_nfc_nand_chip_init()
1171 rk_nfc_hw_init(nfc); in rk_nfc_nand_chip_init()
1192 list_add_tail(&rknand->node, &nfc->chips); in rk_nfc_nand_chip_init()
1197 static void rk_nfc_chips_cleanup(struct rk_nfc *nfc) in rk_nfc_chips_cleanup() argument
1203 list_for_each_entry_safe(rknand, tmp, &nfc->chips, node) { in rk_nfc_chips_cleanup()
1212 static int rk_nfc_nand_chips_init(struct device *dev, struct rk_nfc *nfc) in rk_nfc_nand_chips_init() argument
1219 dev_err(nfc->dev, "incorrect number of NAND chips (%d)\n", in rk_nfc_nand_chips_init()
1225 ret = rk_nfc_nand_chip_init(dev, nfc, nand_np); in rk_nfc_nand_chips_init()
1228 rk_nfc_chips_cleanup(nfc); in rk_nfc_nand_chips_init()
1349 .compatible = "rockchip,px30-nfc",
1353 .compatible = "rockchip,rk2928-nfc",
1357 .compatible = "rockchip,rv1108-nfc",
1367 struct rk_nfc *nfc; in rk_nfc_probe() local
1370 nfc = devm_kzalloc(dev, sizeof(*nfc), GFP_KERNEL); in rk_nfc_probe()
1371 if (!nfc) in rk_nfc_probe()
1374 nand_controller_init(&nfc->controller); in rk_nfc_probe()
1375 INIT_LIST_HEAD(&nfc->chips); in rk_nfc_probe()
1376 nfc->controller.ops = &rk_nfc_controller_ops; in rk_nfc_probe()
1378 nfc->cfg = of_device_get_match_data(dev); in rk_nfc_probe()
1379 nfc->dev = dev; in rk_nfc_probe()
1381 init_completion(&nfc->done); in rk_nfc_probe()
1383 nfc->regs = devm_platform_ioremap_resource(pdev, 0); in rk_nfc_probe()
1384 if (IS_ERR(nfc->regs)) { in rk_nfc_probe()
1385 ret = PTR_ERR(nfc->regs); in rk_nfc_probe()
1389 nfc->nfc_clk = devm_clk_get(dev, "nfc"); in rk_nfc_probe()
1390 if (IS_ERR(nfc->nfc_clk)) { in rk_nfc_probe()
1391 dev_dbg(dev, "no NFC clk\n"); in rk_nfc_probe()
1392 /* Some earlier models, such as rk3066, have no NFC clk. */ in rk_nfc_probe()
1395 nfc->ahb_clk = devm_clk_get(dev, "ahb"); in rk_nfc_probe()
1396 if (IS_ERR(nfc->ahb_clk)) { in rk_nfc_probe()
1398 ret = PTR_ERR(nfc->ahb_clk); in rk_nfc_probe()
1402 ret = rk_nfc_enable_clks(dev, nfc); in rk_nfc_probe()
1412 writel(0, nfc->regs + nfc->cfg->int_en_off); in rk_nfc_probe()
1413 ret = devm_request_irq(dev, irq, rk_nfc_irq, 0x0, "rk-nand", nfc); in rk_nfc_probe()
1415 dev_err(dev, "failed to request NFC irq\n"); in rk_nfc_probe()
1419 platform_set_drvdata(pdev, nfc); in rk_nfc_probe()
1421 ret = rk_nfc_nand_chips_init(dev, nfc); in rk_nfc_probe()
1429 rk_nfc_disable_clks(nfc); in rk_nfc_probe()
1436 struct rk_nfc *nfc = platform_get_drvdata(pdev); in rk_nfc_remove() local
1438 kfree(nfc->page_buf); in rk_nfc_remove()
1439 kfree(nfc->oob_buf); in rk_nfc_remove()
1440 rk_nfc_chips_cleanup(nfc); in rk_nfc_remove()
1441 rk_nfc_disable_clks(nfc); in rk_nfc_remove()
1446 struct rk_nfc *nfc = dev_get_drvdata(dev); in rk_nfc_suspend() local
1448 rk_nfc_disable_clks(nfc); in rk_nfc_suspend()
1455 struct rk_nfc *nfc = dev_get_drvdata(dev); in rk_nfc_resume() local
1461 ret = rk_nfc_enable_clks(dev, nfc); in rk_nfc_resume()
1466 list_for_each_entry(rknand, &nfc->chips, node) { in rk_nfc_resume()
1483 .name = "rockchip-nfc",