Lines Matching full:nfc
205 static int anfc_wait_for_event(struct arasan_nfc *nfc, unsigned int event) in anfc_wait_for_event() argument
210 ret = readl_relaxed_poll_timeout(nfc->base + INTR_STS_REG, val, in anfc_wait_for_event()
214 dev_err(nfc->dev, "Timeout waiting for event 0x%x\n", event); in anfc_wait_for_event()
218 writel_relaxed(event, nfc->base + INTR_STS_REG); in anfc_wait_for_event()
223 static int anfc_wait_for_rb(struct arasan_nfc *nfc, struct nand_chip *chip, in anfc_wait_for_rb() argument
231 ret = readl_relaxed_poll_timeout(nfc->base + READY_STS_REG, val, in anfc_wait_for_rb()
235 dev_err(nfc->dev, "Timeout waiting for R/B 0x%x\n", in anfc_wait_for_rb()
236 readl_relaxed(nfc->base + READY_STS_REG)); in anfc_wait_for_rb()
243 static void anfc_trigger_op(struct arasan_nfc *nfc, struct anfc_op *nfc_op) in anfc_trigger_op() argument
245 writel_relaxed(nfc_op->pkt_reg, nfc->base + PKT_REG); in anfc_trigger_op()
246 writel_relaxed(nfc_op->addr1_reg, nfc->base + MEM_ADDR1_REG); in anfc_trigger_op()
247 writel_relaxed(nfc_op->addr2_reg, nfc->base + MEM_ADDR2_REG); in anfc_trigger_op()
248 writel_relaxed(nfc_op->cmd_reg, nfc->base + CMD_REG); in anfc_trigger_op()
249 writel_relaxed(nfc_op->prog_reg, nfc->base + PROG_REG); in anfc_trigger_op()
278 struct arasan_nfc *nfc = to_anfc(chip->controller); in anfc_select_target() local
282 writel_relaxed(anand->timings, nfc->base + DATA_INTERFACE_REG); in anfc_select_target()
285 if (nfc->cur_clk != anand->clk) { in anfc_select_target()
286 clk_disable_unprepare(nfc->bus_clk); in anfc_select_target()
287 ret = clk_set_rate(nfc->bus_clk, anand->clk); in anfc_select_target()
289 dev_err(nfc->dev, "Failed to change clock rate\n"); in anfc_select_target()
293 ret = clk_prepare_enable(nfc->bus_clk); in anfc_select_target()
295 dev_err(nfc->dev, in anfc_select_target()
300 nfc->cur_clk = anand->clk; in anfc_select_target()
331 struct arasan_nfc *nfc = to_anfc(chip->controller); in anfc_read_page_hw_ecc() local
359 dma_addr = dma_map_single(nfc->dev, (void *)buf, len, DMA_FROM_DEVICE); in anfc_read_page_hw_ecc()
360 if (dma_mapping_error(nfc->dev, dma_addr)) { in anfc_read_page_hw_ecc()
361 dev_err(nfc->dev, "Buffer mapping error"); in anfc_read_page_hw_ecc()
365 writel_relaxed(lower_32_bits(dma_addr), nfc->base + DMA_ADDR0_REG); in anfc_read_page_hw_ecc()
366 writel_relaxed(upper_32_bits(dma_addr), nfc->base + DMA_ADDR1_REG); in anfc_read_page_hw_ecc()
368 anfc_trigger_op(nfc, &nfc_op); in anfc_read_page_hw_ecc()
370 ret = anfc_wait_for_event(nfc, XFER_COMPLETE); in anfc_read_page_hw_ecc()
371 dma_unmap_single(nfc->dev, dma_addr, len, DMA_FROM_DEVICE); in anfc_read_page_hw_ecc()
373 dev_err(nfc->dev, "Error reading page %d\n", page); in anfc_read_page_hw_ecc()
450 struct arasan_nfc *nfc = to_anfc(chip->controller); in anfc_write_page_hw_ecc() local
478 writel_relaxed(anand->ecc_conf, nfc->base + ECC_CONF_REG); in anfc_write_page_hw_ecc()
481 nfc->base + ECC_SP_REG); in anfc_write_page_hw_ecc()
483 dma_addr = dma_map_single(nfc->dev, (void *)buf, len, DMA_TO_DEVICE); in anfc_write_page_hw_ecc()
484 if (dma_mapping_error(nfc->dev, dma_addr)) { in anfc_write_page_hw_ecc()
485 dev_err(nfc->dev, "Buffer mapping error"); in anfc_write_page_hw_ecc()
489 writel_relaxed(lower_32_bits(dma_addr), nfc->base + DMA_ADDR0_REG); in anfc_write_page_hw_ecc()
490 writel_relaxed(upper_32_bits(dma_addr), nfc->base + DMA_ADDR1_REG); in anfc_write_page_hw_ecc()
492 anfc_trigger_op(nfc, &nfc_op); in anfc_write_page_hw_ecc()
493 ret = anfc_wait_for_event(nfc, XFER_COMPLETE); in anfc_write_page_hw_ecc()
494 dma_unmap_single(nfc->dev, dma_addr, len, DMA_TO_DEVICE); in anfc_write_page_hw_ecc()
496 dev_err(nfc->dev, "Error writing page %d\n", page); in anfc_write_page_hw_ecc()
615 static int anfc_rw_pio_op(struct arasan_nfc *nfc, struct anfc_op *nfc_op) in anfc_rw_pio_op() argument
625 ret = anfc_wait_for_event(nfc, dir); in anfc_rw_pio_op()
627 dev_err(nfc->dev, "PIO %s ready signal not received\n", in anfc_rw_pio_op()
634 ioread32_rep(nfc->base + DATA_PORT_REG, &buf[offset], in anfc_rw_pio_op()
637 iowrite32_rep(nfc->base + DATA_PORT_REG, &buf[offset], in anfc_rw_pio_op()
647 remainder = readl_relaxed(nfc->base + DATA_PORT_REG); in anfc_rw_pio_op()
651 writel_relaxed(remainder, nfc->base + DATA_PORT_REG); in anfc_rw_pio_op()
655 return anfc_wait_for_event(nfc, XFER_COMPLETE); in anfc_rw_pio_op()
662 struct arasan_nfc *nfc = to_anfc(chip->controller); in anfc_misc_data_type_exec() local
671 anfc_trigger_op(nfc, &nfc_op); in anfc_misc_data_type_exec()
674 ret = anfc_wait_for_rb(nfc, chip, nfc_op.rdy_timeout_ms); in anfc_misc_data_type_exec()
679 return anfc_rw_pio_op(nfc, &nfc_op); in anfc_misc_data_type_exec()
710 struct arasan_nfc *nfc = to_anfc(chip->controller); in anfc_misc_zerolen_type_exec() local
719 anfc_trigger_op(nfc, &nfc_op); in anfc_misc_zerolen_type_exec()
721 ret = anfc_wait_for_event(nfc, XFER_COMPLETE); in anfc_misc_zerolen_type_exec()
726 ret = anfc_wait_for_rb(nfc, chip, nfc_op.rdy_timeout_ms); in anfc_misc_zerolen_type_exec()
734 struct arasan_nfc *nfc = to_anfc(chip->controller); in anfc_status_type_exec() local
746 tmp = readl_relaxed(nfc->base + FLASH_STS_REG); in anfc_status_type_exec()
767 struct arasan_nfc *nfc = to_anfc(chip->controller); in anfc_wait_type_exec() local
775 return anfc_wait_for_rb(nfc, chip, nfc_op.rdy_timeout_ms); in anfc_wait_type_exec()
897 struct arasan_nfc *nfc = to_anfc(chip->controller); in anfc_setup_interface() local
898 struct device_node *np = nfc->dev->of_node; in anfc_setup_interface()
1001 static int anfc_init_hw_ecc_controller(struct arasan_nfc *nfc, in anfc_init_hw_ecc_controller() argument
1018 dev_err(nfc->dev, "Unsupported page size %d\n", mtd->writesize); in anfc_init_hw_ecc_controller()
1040 dev_err(nfc->dev, "Unsupported strength %d\n", ecc->strength); in anfc_init_hw_ecc_controller()
1054 dev_err(nfc->dev, "Unsupported step size %d\n", ecc->strength); in anfc_init_hw_ecc_controller()
1070 anand->errloc = devm_kmalloc_array(nfc->dev, ecc->strength, in anfc_init_hw_ecc_controller()
1075 anand->hw_ecc = devm_kmalloc(nfc->dev, ecc->bytes, GFP_KERNEL); in anfc_init_hw_ecc_controller()
1093 struct arasan_nfc *nfc = to_anfc(chip->controller); in anfc_attach_chip() local
1140 ret = anfc_init_hw_ecc_controller(nfc, chip); in anfc_attach_chip()
1143 dev_err(nfc->dev, "Unsupported ECC mode: %d\n", in anfc_attach_chip()
1166 static int anfc_chip_init(struct arasan_nfc *nfc, struct device_node *np) in anfc_chip_init() argument
1173 anand = devm_kzalloc(nfc->dev, sizeof(*anand), GFP_KERNEL); in anfc_chip_init()
1179 dev_err(nfc->dev, "Invalid reg property\n"); in anfc_chip_init()
1192 dev_err(nfc->dev, "Wrong CS %d or RB %d\n", cs, rb); in anfc_chip_init()
1196 if (test_and_set_bit(cs, &nfc->assigned_cs)) { in anfc_chip_init()
1197 dev_err(nfc->dev, "Already assigned CS %d\n", cs); in anfc_chip_init()
1206 mtd->dev.parent = nfc->dev; in anfc_chip_init()
1207 chip->controller = &nfc->controller; in anfc_chip_init()
1213 dev_err(nfc->dev, "NAND label property is mandatory\n"); in anfc_chip_init()
1219 dev_err(nfc->dev, "Scan operation failed\n"); in anfc_chip_init()
1229 list_add_tail(&anand->node, &nfc->chips); in anfc_chip_init()
1234 static void anfc_chips_cleanup(struct arasan_nfc *nfc) in anfc_chips_cleanup() argument
1240 list_for_each_entry_safe(anand, tmp, &nfc->chips, node) { in anfc_chips_cleanup()
1249 static int anfc_chips_init(struct arasan_nfc *nfc) in anfc_chips_init() argument
1251 struct device_node *np = nfc->dev->of_node, *nand_np; in anfc_chips_init()
1256 dev_err(nfc->dev, "Incorrect number of NAND chips (%d)\n", in anfc_chips_init()
1262 ret = anfc_chip_init(nfc, nand_np); in anfc_chips_init()
1265 anfc_chips_cleanup(nfc); in anfc_chips_init()
1273 static void anfc_reset(struct arasan_nfc *nfc) in anfc_reset() argument
1276 writel_relaxed(0, nfc->base + INTR_SIG_EN_REG); in anfc_reset()
1279 writel_relaxed(EVENT_MASK, nfc->base + INTR_STS_EN_REG); in anfc_reset()
1284 struct arasan_nfc *nfc; in anfc_probe() local
1287 nfc = devm_kzalloc(&pdev->dev, sizeof(*nfc), GFP_KERNEL); in anfc_probe()
1288 if (!nfc) in anfc_probe()
1291 nfc->dev = &pdev->dev; in anfc_probe()
1292 nand_controller_init(&nfc->controller); in anfc_probe()
1293 nfc->controller.ops = &anfc_ops; in anfc_probe()
1294 INIT_LIST_HEAD(&nfc->chips); in anfc_probe()
1296 nfc->base = devm_platform_ioremap_resource(pdev, 0); in anfc_probe()
1297 if (IS_ERR(nfc->base)) in anfc_probe()
1298 return PTR_ERR(nfc->base); in anfc_probe()
1300 anfc_reset(nfc); in anfc_probe()
1302 nfc->controller_clk = devm_clk_get(&pdev->dev, "controller"); in anfc_probe()
1303 if (IS_ERR(nfc->controller_clk)) in anfc_probe()
1304 return PTR_ERR(nfc->controller_clk); in anfc_probe()
1306 nfc->bus_clk = devm_clk_get(&pdev->dev, "bus"); in anfc_probe()
1307 if (IS_ERR(nfc->bus_clk)) in anfc_probe()
1308 return PTR_ERR(nfc->bus_clk); in anfc_probe()
1310 ret = clk_prepare_enable(nfc->controller_clk); in anfc_probe()
1314 ret = clk_prepare_enable(nfc->bus_clk); in anfc_probe()
1318 ret = anfc_chips_init(nfc); in anfc_probe()
1322 platform_set_drvdata(pdev, nfc); in anfc_probe()
1327 clk_disable_unprepare(nfc->bus_clk); in anfc_probe()
1330 clk_disable_unprepare(nfc->controller_clk); in anfc_probe()
1337 struct arasan_nfc *nfc = platform_get_drvdata(pdev); in anfc_remove() local
1339 anfc_chips_cleanup(nfc); in anfc_remove()
1341 clk_disable_unprepare(nfc->bus_clk); in anfc_remove()
1342 clk_disable_unprepare(nfc->controller_clk); in anfc_remove()
1352 .compatible = "arasan,nfc-v3p10",