Lines Matching +full:clk +full:- +full:out +full:- +full:strength

1 // SPDX-License-Identifier: GPL-2.0-only
8 #include <linux/clk.h>
13 #include <linux/dma-mapping.h>
16 /* Offsets relative to chip->base */
110 #define PKT_CFG(size, strength) ((size) << 16 | (strength)) argument
118 struct tango_nfc *nfc = to_tango_nfc(chip->controller); in tango_select_target()
121 writel_relaxed(tchip->timing1, nfc->reg_base + NFC_TIMING1); in tango_select_target()
122 writel_relaxed(tchip->timing2, nfc->reg_base + NFC_TIMING2); in tango_select_target()
123 writel_relaxed(tchip->xfer_cfg, nfc->reg_base + NFC_XFER_CFG); in tango_select_target()
124 writel_relaxed(tchip->pkt_0_cfg, nfc->reg_base + NFC_PKT_0_CFG); in tango_select_target()
125 writel_relaxed(tchip->pkt_n_cfg, nfc->reg_base + NFC_PKT_N_CFG); in tango_select_target()
126 writel_relaxed(tchip->bb_cfg, nfc->reg_base + NFC_BB_CFG); in tango_select_target()
131 struct tango_nfc *nfc = to_tango_nfc(chip->controller); in tango_waitrdy()
134 return readl_relaxed_poll_timeout(nfc->pbus_base + PBUS_CS_CTRL, in tango_waitrdy()
145 switch (instr->type) { in tango_exec_instr()
147 writeb_relaxed(instr->ctx.cmd.opcode, tchip->base + PBUS_CMD); in tango_exec_instr()
150 for (i = 0; i < instr->ctx.addr.naddrs; i++) in tango_exec_instr()
151 writeb_relaxed(instr->ctx.addr.addrs[i], in tango_exec_instr()
152 tchip->base + PBUS_ADDR); in tango_exec_instr()
155 ioread8_rep(tchip->base + PBUS_DATA, instr->ctx.data.buf.in, in tango_exec_instr()
156 instr->ctx.data.len); in tango_exec_instr()
159 iowrite8_rep(tchip->base + PBUS_DATA, instr->ctx.data.buf.out, in tango_exec_instr()
160 instr->ctx.data.len); in tango_exec_instr()
164 instr->ctx.waitrdy.timeout_ms); in tango_exec_instr()
169 return -EINVAL; in tango_exec_instr()
182 tango_select_target(chip, op->cs); in tango_exec_op()
183 for (i = 0; i < op->ninstrs; i++) { in tango_exec_op()
184 ret = tango_exec_instr(chip, &op->instrs[i]); in tango_exec_op()
199 u8 *meta = chip->oob_poi + BBM_SIZE; in check_erased_page()
200 u8 *ecc = chip->oob_poi + BBM_SIZE + METADATA_SIZE; in check_erased_page()
201 const int ecc_size = chip->ecc.bytes; in check_erased_page()
202 const int pkt_size = chip->ecc.size; in check_erased_page()
205 for (i = 0; i < chip->ecc.steps; ++i) { in check_erased_page()
209 chip->ecc.strength); in check_erased_page()
211 mtd->ecc_stats.failed++; in check_erased_page()
213 mtd->ecc_stats.corrected += res; in check_erased_page()
227 struct tango_nfc *nfc = to_tango_nfc(chip->controller); in decode_error_report()
229 status = readl_relaxed(nfc->reg_base + NFC_XFER_STATUS); in decode_error_report()
233 res = readl_relaxed(nfc->mem_base + ERROR_REPORT); in decode_error_report()
236 return -EBADMSG; in decode_error_report()
239 mtd->ecc_stats.corrected += in decode_error_report()
253 void __iomem *addr = nfc->reg_base + NFC_STATUS; in do_dma()
254 struct dma_chan *chan = nfc->chan; in do_dma()
259 int err = -EIO; in do_dma()
263 if (dma_map_sg(chan->device->dev, &sg, 1, dir) != 1) in do_dma()
264 return -EIO; in do_dma()
271 desc->callback = tango_dma_callback; in do_dma()
272 desc->callback_param = &tx_done; in do_dma()
275 writel_relaxed(MODE_NFC, nfc->pbus_base + PBUS_PAD_MODE); in do_dma()
277 writel_relaxed(page, nfc->reg_base + NFC_ADDR_PAGE); in do_dma()
278 writel_relaxed(0, nfc->reg_base + NFC_ADDR_OFFSET); in do_dma()
279 writel_relaxed(cmd, nfc->reg_base + NFC_FLASH_CMD); in do_dma()
288 writel_relaxed(MODE_RAW, nfc->pbus_base + PBUS_PAD_MODE); in do_dma()
291 dma_unmap_sg(chan->device->dev, &sg, 1, dir); in do_dma()
300 struct tango_nfc *nfc = to_tango_nfc(chip->controller); in tango_read_page()
301 int err, res, len = mtd->writesize; in tango_read_page()
303 tango_select_target(chip, chip->cur_cs); in tango_read_page()
305 chip->ecc.read_oob(chip, page); in tango_read_page()
313 chip->ecc.read_oob_raw(chip, page); in tango_read_page()
324 struct tango_nfc *nfc = to_tango_nfc(chip->controller); in tango_write_page()
326 int err, len = mtd->writesize; in tango_write_page()
331 return -ENOTSUPP; in tango_write_page()
333 tango_select_target(chip, chip->cur_cs); in tango_write_page()
334 writel_relaxed(0xffffffff, nfc->mem_base + METADATA); in tango_write_page()
340 err = tango_waitrdy(chip, PSEC_TO_MSEC(timings->tR_max)); in tango_write_page()
348 return (status & NAND_STATUS_FAIL) ? -EIO : 0; in tango_write_page()
361 ioread8_rep(tchip->base + PBUS_DATA, *buf, len); in aux_read()
376 iowrite8_rep(tchip->base + PBUS_DATA, *buf, len); in aux_write()
386 * +---+-----------------+-------+-----+-----------+-----+----+-------+
388 * +---+-----------------+-------+-----+-----------+-----+----+-------+
392 * +-----+---+-------+-----+-------+
394 * +-----+---+-------+-----+-------+
396 * +-----------------+-----+-----------------+
398 * +-----------------+-----+-----------------+
404 const int page_size = mtd->writesize; in raw_read()
405 const int ecc_size = chip->ecc.bytes; in raw_read()
406 const int pkt_size = chip->ecc.size; in raw_read()
418 rem = page_size - pos; in raw_read()
423 aux_read(chip, &buf, pkt_size - rem, &pos); in raw_read()
431 const int page_size = mtd->writesize; in raw_write()
432 const int ecc_size = chip->ecc.bytes; in raw_write()
433 const int pkt_size = chip->ecc.size; in raw_write()
445 rem = page_size - pos; in raw_write()
450 aux_write(chip, &buf, pkt_size - rem, &pos); in raw_write()
457 tango_select_target(chip, chip->cur_cs); in tango_read_page_raw()
459 raw_read(chip, buf, chip->oob_poi); in tango_read_page_raw()
466 tango_select_target(chip, chip->cur_cs); in tango_write_page_raw()
468 raw_write(chip, buf, chip->oob_poi); in tango_write_page_raw()
474 tango_select_target(chip, chip->cur_cs); in tango_read_oob()
476 raw_read(chip, NULL, chip->oob_poi); in tango_read_oob()
482 tango_select_target(chip, chip->cur_cs); in tango_write_oob()
484 raw_write(chip, NULL, chip->oob_poi); in tango_write_oob()
491 struct nand_ecc_ctrl *ecc = &chip->ecc; in oob_ecc()
493 if (idx >= ecc->steps) in oob_ecc()
494 return -ERANGE; in oob_ecc()
496 res->offset = BBM_SIZE + METADATA_SIZE + ecc->bytes * idx; in oob_ecc()
497 res->length = ecc->bytes; in oob_ecc()
504 return -ERANGE; /* no free space in spare area */ in oob_free()
521 struct tango_nfc *nfc = to_tango_nfc(chip->controller); in tango_set_timings()
524 int kHz = nfc->freq_kHz; in tango_set_timings()
532 Trdy = to_ticks(kHz, sdr->tCEA_max - sdr->tREA_max); in tango_set_timings()
533 Textw = to_ticks(kHz, sdr->tWB_max); in tango_set_timings()
534 Twc = to_ticks(kHz, sdr->tWC_min); in tango_set_timings()
535 Twpw = to_ticks(kHz, sdr->tWC_min - sdr->tWP_min); in tango_set_timings()
537 Tacc = to_ticks(kHz, sdr->tREA_max); in tango_set_timings()
538 Thold = to_ticks(kHz, sdr->tREH_min); in tango_set_timings()
539 Trpw = to_ticks(kHz, sdr->tRC_min - sdr->tREH_min); in tango_set_timings()
540 Textr = to_ticks(kHz, sdr->tRHZ_max); in tango_set_timings()
542 tchip->timing1 = TIMING(Trdy, Textw, Twc, Twpw); in tango_set_timings()
543 tchip->timing2 = TIMING(Tacc, Thold, Trpw, Textr); in tango_set_timings()
550 struct nand_ecc_ctrl *ecc = &chip->ecc; in tango_attach_chip()
552 ecc->engine_type = NAND_ECC_ENGINE_TYPE_ON_HOST; in tango_attach_chip()
553 ecc->algo = NAND_ECC_ALGO_BCH; in tango_attach_chip()
554 ecc->bytes = DIV_ROUND_UP(ecc->strength * FIELD_ORDER, BITS_PER_BYTE); in tango_attach_chip()
556 ecc->read_page_raw = tango_read_page_raw; in tango_attach_chip()
557 ecc->write_page_raw = tango_write_page_raw; in tango_attach_chip()
558 ecc->read_page = tango_read_page; in tango_attach_chip()
559 ecc->write_page = tango_write_page; in tango_attach_chip()
560 ecc->read_oob = tango_read_oob; in tango_attach_chip()
561 ecc->write_oob = tango_write_oob; in tango_attach_chip()
584 return -ENOMEM; in chip_init()
591 return -ENOTSUPP; /* Multi-CS chips are not supported */ in chip_init()
598 return -EINVAL; in chip_init()
600 chip = &tchip->nand_chip; in chip_init()
601 ecc = &chip->ecc; in chip_init()
604 chip->options = NAND_USES_DMA | in chip_init()
607 chip->controller = &nfc->hw; in chip_init()
608 tchip->base = nfc->pbus_base + (cs * 256); in chip_init()
612 mtd->dev.parent = dev; in chip_init()
618 tchip->xfer_cfg = XFER_CFG(cs, 1, ecc->steps, METADATA_SIZE); in chip_init()
619 tchip->pkt_0_cfg = PKT_CFG(ecc->size + METADATA_SIZE, ecc->strength); in chip_init()
620 tchip->pkt_n_cfg = PKT_CFG(ecc->size, ecc->strength); in chip_init()
621 tchip->bb_cfg = BB_CFG(mtd->writesize, BBM_SIZE); in chip_init()
629 nfc->chips[cs] = tchip; in chip_init()
640 dma_release_channel(nfc->chan); in tango_nand_remove()
643 if (nfc->chips[cs]) { in tango_nand_remove()
644 chip = &nfc->chips[cs]->nand_chip; in tango_nand_remove()
657 struct clk *clk; in tango_nand_probe() local
662 nfc = devm_kzalloc(&pdev->dev, sizeof(*nfc), GFP_KERNEL); in tango_nand_probe()
664 return -ENOMEM; in tango_nand_probe()
667 nfc->reg_base = devm_ioremap_resource(&pdev->dev, res); in tango_nand_probe()
668 if (IS_ERR(nfc->reg_base)) in tango_nand_probe()
669 return PTR_ERR(nfc->reg_base); in tango_nand_probe()
672 nfc->mem_base = devm_ioremap_resource(&pdev->dev, res); in tango_nand_probe()
673 if (IS_ERR(nfc->mem_base)) in tango_nand_probe()
674 return PTR_ERR(nfc->mem_base); in tango_nand_probe()
677 nfc->pbus_base = devm_ioremap_resource(&pdev->dev, res); in tango_nand_probe()
678 if (IS_ERR(nfc->pbus_base)) in tango_nand_probe()
679 return PTR_ERR(nfc->pbus_base); in tango_nand_probe()
681 writel_relaxed(MODE_RAW, nfc->pbus_base + PBUS_PAD_MODE); in tango_nand_probe()
683 clk = devm_clk_get(&pdev->dev, NULL); in tango_nand_probe()
684 if (IS_ERR(clk)) in tango_nand_probe()
685 return PTR_ERR(clk); in tango_nand_probe()
687 nfc->chan = dma_request_chan(&pdev->dev, "rxtx"); in tango_nand_probe()
688 if (IS_ERR(nfc->chan)) in tango_nand_probe()
689 return PTR_ERR(nfc->chan); in tango_nand_probe()
692 nand_controller_init(&nfc->hw); in tango_nand_probe()
693 nfc->hw.ops = &tango_controller_ops; in tango_nand_probe()
694 nfc->freq_kHz = clk_get_rate(clk) / 1000; in tango_nand_probe()
696 for_each_child_of_node(pdev->dev.of_node, np) { in tango_nand_probe()
697 err = chip_init(&pdev->dev, np); in tango_nand_probe()
709 { .compatible = "sigma,smp8758-nand" },
718 .name = "tango-nand",