Lines Matching full:nfc

266 	struct meson_nfc *nfc = nand_get_controller_data(nand);  in meson_nfc_select_chip()  local
272 nfc->param.chip_select = meson_chip->sels[chip] ? NAND_CE1 : NAND_CE0; in meson_nfc_select_chip()
273 nfc->param.rb_select = nfc->param.chip_select; in meson_nfc_select_chip()
274 nfc->timing.twb = meson_chip->twb; in meson_nfc_select_chip()
275 nfc->timing.tadl = meson_chip->tadl; in meson_nfc_select_chip()
276 nfc->timing.tbers_max = meson_chip->tbers_max; in meson_nfc_select_chip()
278 if (nfc->clk_rate != meson_chip->clk_rate) { in meson_nfc_select_chip()
279 ret = clk_set_rate(nfc->nand_clk, meson_chip->clk_rate); in meson_nfc_select_chip()
281 dev_err(nfc->dev, "failed to set clock rate\n"); in meson_nfc_select_chip()
284 nfc->clk_rate = meson_chip->clk_rate; in meson_nfc_select_chip()
286 if (nfc->bus_timing != meson_chip->bus_timing) { in meson_nfc_select_chip()
288 writel(value, nfc->reg_base + NFC_REG_CFG); in meson_nfc_select_chip()
289 writel((1 << 31), nfc->reg_base + NFC_REG_CMD); in meson_nfc_select_chip()
290 nfc->bus_timing = meson_chip->bus_timing; in meson_nfc_select_chip()
294 static void meson_nfc_cmd_idle(struct meson_nfc *nfc, u32 time) in meson_nfc_cmd_idle() argument
296 writel(nfc->param.chip_select | NFC_CMD_IDLE | (time & 0x3ff), in meson_nfc_cmd_idle()
297 nfc->reg_base + NFC_REG_CMD); in meson_nfc_cmd_idle()
300 static void meson_nfc_cmd_seed(struct meson_nfc *nfc, u32 seed) in meson_nfc_cmd_seed() argument
303 nfc->reg_base + NFC_REG_CMD); in meson_nfc_cmd_seed()
319 struct meson_nfc *nfc = nand_get_controller_data(mtd_to_nand(mtd)); in meson_nfc_cmd_access() local
348 meson_nfc_cmd_seed(nfc, page); in meson_nfc_cmd_access()
350 writel(cmd, nfc->reg_base + NFC_REG_CMD); in meson_nfc_cmd_access()
353 static void meson_nfc_drain_cmd(struct meson_nfc *nfc) in meson_nfc_drain_cmd() argument
362 * one is fetched into NFC request queue (ready to run), and another in meson_nfc_drain_cmd()
366 meson_nfc_cmd_idle(nfc, 0); in meson_nfc_drain_cmd()
367 meson_nfc_cmd_idle(nfc, 0); in meson_nfc_drain_cmd()
370 static int meson_nfc_wait_cmd_finish(struct meson_nfc *nfc, in meson_nfc_wait_cmd_finish() argument
377 ret = readl_relaxed_poll_timeout(nfc->reg_base + NFC_REG_CMD, cmd_size, in meson_nfc_wait_cmd_finish()
381 dev_err(nfc->dev, "wait for empty CMD FIFO time out\n"); in meson_nfc_wait_cmd_finish()
386 static int meson_nfc_wait_dma_finish(struct meson_nfc *nfc) in meson_nfc_wait_dma_finish() argument
388 meson_nfc_drain_cmd(nfc); in meson_nfc_wait_dma_finish()
390 return meson_nfc_wait_cmd_finish(nfc, DMA_BUSY_TIMEOUT); in meson_nfc_wait_dma_finish()
455 struct meson_nfc *nfc = nand_get_controller_data(nand); in meson_nfc_wait_no_rb_pin() local
458 meson_nfc_cmd_idle(nfc, nfc->timing.twb); in meson_nfc_wait_no_rb_pin()
459 meson_nfc_drain_cmd(nfc); in meson_nfc_wait_no_rb_pin()
460 meson_nfc_wait_cmd_finish(nfc, CMD_FIFO_EMPTY_TIMEOUT); in meson_nfc_wait_no_rb_pin()
462 cfg = readl(nfc->reg_base + NFC_REG_CFG); in meson_nfc_wait_no_rb_pin()
464 writel(cfg, nfc->reg_base + NFC_REG_CFG); in meson_nfc_wait_no_rb_pin()
466 reinit_completion(&nfc->completion); in meson_nfc_wait_no_rb_pin()
470 cmd = NFC_CMD_RB | NFC_CMD_RB_INT_NO_PIN | nfc->timing.tbers_max; in meson_nfc_wait_no_rb_pin()
471 writel(cmd, nfc->reg_base + NFC_REG_CMD); in meson_nfc_wait_no_rb_pin()
473 if (!wait_for_completion_timeout(&nfc->completion, in meson_nfc_wait_no_rb_pin()
483 static int meson_nfc_wait_rb_pin(struct meson_nfc *nfc, int timeout_ms) in meson_nfc_wait_rb_pin() argument
488 meson_nfc_cmd_idle(nfc, nfc->timing.twb); in meson_nfc_wait_rb_pin()
489 meson_nfc_drain_cmd(nfc); in meson_nfc_wait_rb_pin()
490 meson_nfc_wait_cmd_finish(nfc, CMD_FIFO_EMPTY_TIMEOUT); in meson_nfc_wait_rb_pin()
492 cfg = readl(nfc->reg_base + NFC_REG_CFG); in meson_nfc_wait_rb_pin()
494 writel(cfg, nfc->reg_base + NFC_REG_CFG); in meson_nfc_wait_rb_pin()
496 reinit_completion(&nfc->completion); in meson_nfc_wait_rb_pin()
500 | nfc->param.chip_select | nfc->timing.tbers_max; in meson_nfc_wait_rb_pin()
501 writel(cmd, nfc->reg_base + NFC_REG_CMD); in meson_nfc_wait_rb_pin()
503 ret = wait_for_completion_timeout(&nfc->completion, in meson_nfc_wait_rb_pin()
514 struct meson_nfc *nfc = nand_get_controller_data(nand); in meson_nfc_queue_rb() local
516 if (nfc->no_rb_pin) { in meson_nfc_queue_rb()
530 return meson_nfc_wait_rb_pin(nfc, timeout_ms); in meson_nfc_queue_rb()
593 struct meson_nfc *nfc = nand_get_controller_data(nand); in meson_nfc_dma_buffer_setup() local
597 nfc->daddr = dma_map_single(nfc->dev, databuf, datalen, dir); in meson_nfc_dma_buffer_setup()
598 ret = dma_mapping_error(nfc->dev, nfc->daddr); in meson_nfc_dma_buffer_setup()
600 dev_err(nfc->dev, "DMA mapping error\n"); in meson_nfc_dma_buffer_setup()
603 cmd = GENCMDDADDRL(NFC_CMD_ADL, nfc->daddr); in meson_nfc_dma_buffer_setup()
604 writel(cmd, nfc->reg_base + NFC_REG_CMD); in meson_nfc_dma_buffer_setup()
606 cmd = GENCMDDADDRH(NFC_CMD_ADH, nfc->daddr); in meson_nfc_dma_buffer_setup()
607 writel(cmd, nfc->reg_base + NFC_REG_CMD); in meson_nfc_dma_buffer_setup()
610 nfc->iaddr = dma_map_single(nfc->dev, infobuf, infolen, dir); in meson_nfc_dma_buffer_setup()
611 ret = dma_mapping_error(nfc->dev, nfc->iaddr); in meson_nfc_dma_buffer_setup()
613 dev_err(nfc->dev, "DMA mapping error\n"); in meson_nfc_dma_buffer_setup()
614 dma_unmap_single(nfc->dev, in meson_nfc_dma_buffer_setup()
615 nfc->daddr, datalen, dir); in meson_nfc_dma_buffer_setup()
618 nfc->info_bytes = infolen; in meson_nfc_dma_buffer_setup()
619 cmd = GENCMDIADDRL(NFC_CMD_AIL, nfc->iaddr); in meson_nfc_dma_buffer_setup()
620 writel(cmd, nfc->reg_base + NFC_REG_CMD); in meson_nfc_dma_buffer_setup()
622 cmd = GENCMDIADDRH(NFC_CMD_AIH, nfc->iaddr); in meson_nfc_dma_buffer_setup()
623 writel(cmd, nfc->reg_base + NFC_REG_CMD); in meson_nfc_dma_buffer_setup()
633 struct meson_nfc *nfc = nand_get_controller_data(nand); in meson_nfc_dma_buffer_release() local
635 dma_unmap_single(nfc->dev, nfc->daddr, datalen, dir); in meson_nfc_dma_buffer_release()
637 dma_unmap_single(nfc->dev, nfc->iaddr, infolen, dir); in meson_nfc_dma_buffer_release()
638 nfc->info_bytes = 0; in meson_nfc_dma_buffer_release()
644 struct meson_nfc *nfc = nand_get_controller_data(nand); in meson_nfc_read_buf() local
659 writel(cmd, nfc->reg_base + NFC_REG_CMD); in meson_nfc_read_buf()
661 meson_nfc_drain_cmd(nfc); in meson_nfc_read_buf()
662 meson_nfc_wait_cmd_finish(nfc, 1000); in meson_nfc_read_buf()
673 struct meson_nfc *nfc = nand_get_controller_data(nand); in meson_nfc_write_buf() local
683 writel(cmd, nfc->reg_base + NFC_REG_CMD); in meson_nfc_write_buf()
685 meson_nfc_drain_cmd(nfc); in meson_nfc_write_buf()
686 meson_nfc_wait_cmd_finish(nfc, 1000); in meson_nfc_write_buf()
698 struct meson_nfc *nfc = nand_get_controller_data(nand); in meson_nfc_rw_cmd_prepare_and_execute() local
699 u32 *addrs = nfc->cmdfifo.rw.addrs; in meson_nfc_rw_cmd_prepare_and_execute()
700 u32 cs = nfc->param.chip_select; in meson_nfc_rw_cmd_prepare_and_execute()
707 nfc->cmdfifo.rw.cmd0 = cs | NFC_CMD_CLE | cmd0; in meson_nfc_rw_cmd_prepare_and_execute()
731 writel_relaxed(nfc->cmdfifo.cmd[i], in meson_nfc_rw_cmd_prepare_and_execute()
732 nfc->reg_base + NFC_REG_CMD); in meson_nfc_rw_cmd_prepare_and_execute()
735 nfc->cmdfifo.rw.cmd1 = cs | NFC_CMD_CLE | NAND_CMD_READSTART; in meson_nfc_rw_cmd_prepare_and_execute()
736 writel(nfc->cmdfifo.rw.cmd1, nfc->reg_base + NFC_REG_CMD); in meson_nfc_rw_cmd_prepare_and_execute()
739 meson_nfc_cmd_idle(nfc, nfc->timing.tadl); in meson_nfc_rw_cmd_prepare_and_execute()
752 struct meson_nfc *nfc = nand_get_controller_data(nand); in meson_nfc_write_page_sub() local
774 cmd = nfc->param.chip_select | NFC_CMD_CLE | NAND_CMD_PAGEPROG; in meson_nfc_write_page_sub()
775 writel(cmd, nfc->reg_base + NFC_REG_CMD); in meson_nfc_write_page_sub()
807 static void meson_nfc_check_ecc_pages_valid(struct meson_nfc *nfc, in meson_nfc_check_ecc_pages_valid() argument
819 /* info is updated by nfc dma engine*/ in meson_nfc_check_ecc_pages_valid()
821 dma_sync_single_for_cpu(nfc->dev, nfc->iaddr, nfc->info_bytes, in meson_nfc_check_ecc_pages_valid()
831 struct meson_nfc *nfc = nand_get_controller_data(nand); in meson_nfc_read_page_sub() local
853 ret = meson_nfc_wait_dma_finish(nfc); in meson_nfc_read_page_sub()
854 meson_nfc_check_ecc_pages_valid(nfc, nand, raw); in meson_nfc_read_page_sub()
1031 struct meson_nfc *nfc = nand_get_controller_data(nand); in meson_nfc_exec_op() local
1053 cmd = nfc->param.chip_select | NFC_CMD_CLE; in meson_nfc_exec_op()
1055 writel(cmd, nfc->reg_base + NFC_REG_CMD); in meson_nfc_exec_op()
1056 meson_nfc_cmd_idle(nfc, delay_idle); in meson_nfc_exec_op()
1061 cmd = nfc->param.chip_select | NFC_CMD_ALE; in meson_nfc_exec_op()
1063 writel(cmd, nfc->reg_base + NFC_REG_CMD); in meson_nfc_exec_op()
1065 meson_nfc_cmd_idle(nfc, delay_idle); in meson_nfc_exec_op()
1088 meson_nfc_cmd_idle(nfc, delay_idle); in meson_nfc_exec_op()
1092 meson_nfc_wait_cmd_finish(nfc, 1000); in meson_nfc_exec_op()
1129 static int meson_nfc_clk_init(struct meson_nfc *nfc) in meson_nfc_clk_init() argument
1136 nfc->core_clk = devm_clk_get(nfc->dev, "core"); in meson_nfc_clk_init()
1137 if (IS_ERR(nfc->core_clk)) { in meson_nfc_clk_init()
1138 dev_err(nfc->dev, "failed to get core clock\n"); in meson_nfc_clk_init()
1139 return PTR_ERR(nfc->core_clk); in meson_nfc_clk_init()
1142 nfc->device_clk = devm_clk_get(nfc->dev, "device"); in meson_nfc_clk_init()
1143 if (IS_ERR(nfc->device_clk)) { in meson_nfc_clk_init()
1144 dev_err(nfc->dev, "failed to get device clock\n"); in meson_nfc_clk_init()
1145 return PTR_ERR(nfc->device_clk); in meson_nfc_clk_init()
1148 init.name = devm_kasprintf(nfc->dev, in meson_nfc_clk_init()
1150 dev_name(nfc->dev)); in meson_nfc_clk_init()
1158 nfc->nand_divider.reg = nfc->reg_clk; in meson_nfc_clk_init()
1159 nfc->nand_divider.shift = CLK_DIV_SHIFT; in meson_nfc_clk_init()
1160 nfc->nand_divider.width = CLK_DIV_WIDTH; in meson_nfc_clk_init()
1161 nfc->nand_divider.hw.init = &init; in meson_nfc_clk_init()
1162 nfc->nand_divider.flags = CLK_DIVIDER_ONE_BASED | in meson_nfc_clk_init()
1166 nfc->nand_clk = devm_clk_register(nfc->dev, &nfc->nand_divider.hw); in meson_nfc_clk_init()
1167 if (IS_ERR(nfc->nand_clk)) in meson_nfc_clk_init()
1168 return PTR_ERR(nfc->nand_clk); in meson_nfc_clk_init()
1172 nfc->reg_clk); in meson_nfc_clk_init()
1174 ret = clk_prepare_enable(nfc->core_clk); in meson_nfc_clk_init()
1176 dev_err(nfc->dev, "failed to enable core clock\n"); in meson_nfc_clk_init()
1180 ret = clk_prepare_enable(nfc->device_clk); in meson_nfc_clk_init()
1182 dev_err(nfc->dev, "failed to enable device clock\n"); in meson_nfc_clk_init()
1186 ret = clk_prepare_enable(nfc->nand_clk); in meson_nfc_clk_init()
1188 dev_err(nfc->dev, "pre enable NFC divider fail\n"); in meson_nfc_clk_init()
1192 ret = clk_set_rate(nfc->nand_clk, 24000000); in meson_nfc_clk_init()
1199 clk_disable_unprepare(nfc->nand_clk); in meson_nfc_clk_init()
1201 clk_disable_unprepare(nfc->device_clk); in meson_nfc_clk_init()
1203 clk_disable_unprepare(nfc->core_clk); in meson_nfc_clk_init()
1207 static void meson_nfc_disable_clk(struct meson_nfc *nfc) in meson_nfc_disable_clk() argument
1209 clk_disable_unprepare(nfc->nand_clk); in meson_nfc_disable_clk()
1210 clk_disable_unprepare(nfc->device_clk); in meson_nfc_disable_clk()
1211 clk_disable_unprepare(nfc->core_clk); in meson_nfc_disable_clk()
1315 struct meson_nfc *nfc = nand_get_controller_data(nand); in meson_nand_attach_chip() local
1322 mtd->name = devm_kasprintf(nfc->dev, GFP_KERNEL, in meson_nand_attach_chip()
1324 dev_name(nfc->dev), in meson_nand_attach_chip()
1332 dev_err(nfc->dev, "too big write size in raw mode: %d > %ld\n", in meson_nand_attach_chip()
1342 ret = nand_ecc_choose_conf(nand, nfc->data->ecc_caps, in meson_nand_attach_chip()
1345 dev_err(nfc->dev, "failed to ECC init\n"); in meson_nand_attach_chip()
1367 dev_err(nfc->dev, "16bits bus width not supported"); in meson_nand_attach_chip()
1386 struct meson_nfc *nfc, struct device_node *np) in meson_nfc_nand_chip_init() argument
1416 if (test_and_set_bit(tmp, &nfc->assigned_cs)) { in meson_nfc_nand_chip_init()
1423 nand->controller = &nfc->controller; in meson_nfc_nand_chip_init()
1426 nand_set_controller_data(nand, nfc); in meson_nfc_nand_chip_init()
1435 nfc->no_rb_pin = true; in meson_nfc_nand_chip_init()
1473 list_add_tail(&meson_chip->node, &nfc->chips); in meson_nfc_nand_chip_init()
1478 static void meson_nfc_nand_chips_cleanup(struct meson_nfc *nfc) in meson_nfc_nand_chips_cleanup() argument
1483 while (!list_empty(&nfc->chips)) { in meson_nfc_nand_chips_cleanup()
1484 meson_chip = list_first_entry(&nfc->chips, in meson_nfc_nand_chips_cleanup()
1495 struct meson_nfc *nfc) in meson_nfc_nand_chips_init() argument
1501 ret = meson_nfc_nand_chip_init(dev, nfc, nand_np); in meson_nfc_nand_chips_init()
1503 meson_nfc_nand_chips_cleanup(nfc); in meson_nfc_nand_chips_init()
1513 struct meson_nfc *nfc = id; in meson_nfc_irq() local
1516 cfg = readl(nfc->reg_base + NFC_REG_CFG); in meson_nfc_irq()
1521 writel(cfg, nfc->reg_base + NFC_REG_CFG); in meson_nfc_irq()
1523 complete(&nfc->completion); in meson_nfc_irq()
1537 .compatible = "amlogic,meson-gxl-nfc",
1540 .compatible = "amlogic,meson-axg-nfc",
1550 struct meson_nfc *nfc; in meson_nfc_probe() local
1553 nfc = devm_kzalloc(dev, sizeof(*nfc), GFP_KERNEL); in meson_nfc_probe()
1554 if (!nfc) in meson_nfc_probe()
1557 nfc->data = of_device_get_match_data(&pdev->dev); in meson_nfc_probe()
1558 if (!nfc->data) in meson_nfc_probe()
1561 nand_controller_init(&nfc->controller); in meson_nfc_probe()
1562 INIT_LIST_HEAD(&nfc->chips); in meson_nfc_probe()
1563 init_completion(&nfc->completion); in meson_nfc_probe()
1565 nfc->dev = dev; in meson_nfc_probe()
1567 nfc->reg_base = devm_platform_ioremap_resource_byname(pdev, "nfc"); in meson_nfc_probe()
1568 if (IS_ERR(nfc->reg_base)) in meson_nfc_probe()
1569 return PTR_ERR(nfc->reg_base); in meson_nfc_probe()
1571 nfc->reg_clk = devm_platform_ioremap_resource_byname(pdev, "emmc"); in meson_nfc_probe()
1572 if (IS_ERR(nfc->reg_clk)) in meson_nfc_probe()
1573 return PTR_ERR(nfc->reg_clk); in meson_nfc_probe()
1579 ret = meson_nfc_clk_init(nfc); in meson_nfc_probe()
1585 writel(0, nfc->reg_base + NFC_REG_CFG); in meson_nfc_probe()
1586 ret = devm_request_irq(dev, irq, meson_nfc_irq, 0, dev_name(dev), nfc); in meson_nfc_probe()
1588 dev_err(dev, "failed to request NFC IRQ\n"); in meson_nfc_probe()
1599 platform_set_drvdata(pdev, nfc); in meson_nfc_probe()
1601 ret = meson_nfc_nand_chips_init(dev, nfc); in meson_nfc_probe()
1609 meson_nfc_disable_clk(nfc); in meson_nfc_probe()
1615 struct meson_nfc *nfc = platform_get_drvdata(pdev); in meson_nfc_remove() local
1617 meson_nfc_nand_chips_cleanup(nfc); in meson_nfc_remove()
1619 meson_nfc_disable_clk(nfc); in meson_nfc_remove()