Lines Matching refs:nfc

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