Lines Matching refs:mxic

174 static void mxic_ecc_disable_engine(struct mxic_ecc_engine *mxic)  in mxic_ecc_disable_engine()  argument
178 reg = readl(mxic->regs + DP_CONFIG); in mxic_ecc_disable_engine()
180 writel(reg, mxic->regs + DP_CONFIG); in mxic_ecc_disable_engine()
183 static void mxic_ecc_enable_engine(struct mxic_ecc_engine *mxic) in mxic_ecc_enable_engine() argument
187 reg = readl(mxic->regs + DP_CONFIG); in mxic_ecc_enable_engine()
189 writel(reg, mxic->regs + DP_CONFIG); in mxic_ecc_enable_engine()
192 static void mxic_ecc_disable_int(struct mxic_ecc_engine *mxic) in mxic_ecc_disable_int() argument
194 writel(0, mxic->regs + INTRPT_SIG_EN); in mxic_ecc_disable_int()
197 static void mxic_ecc_enable_int(struct mxic_ecc_engine *mxic) in mxic_ecc_enable_int() argument
199 writel(TRANS_CMPLT, mxic->regs + INTRPT_SIG_EN); in mxic_ecc_enable_int()
204 struct mxic_ecc_engine *mxic = dev_id; in mxic_ecc_isr() local
207 sts = readl(mxic->regs + INTRPT_STS); in mxic_ecc_isr()
212 complete(&mxic->complete); in mxic_ecc_isr()
214 writel(sts, mxic->regs + INTRPT_STS); in mxic_ecc_isr()
221 struct mxic_ecc_engine *mxic = nand_to_mxic(nand); in mxic_ecc_init_ctx() local
249 TO_SPARE | TO_MAIN, mxic->regs + INTRPT_STS_EN); in mxic_ecc_init_ctx()
298 writel(ECC_TYP(idx), mxic->regs + DP_CONFIG); in mxic_ecc_init_ctx()
300 spare_reg = readl(mxic->regs + SPARE_SIZE); in mxic_ecc_init_ctx()
326 readl(mxic->regs + DP_VER) >> DP_VER_OFFSET); in mxic_ecc_init_ctx()
327 dev_err(dev, "Chunk size: %d\n", readl(mxic->regs + CHUNK_SIZE)); in mxic_ecc_init_ctx()
328 dev_err(dev, "Main size: %d\n", readl(mxic->regs + MAIN_SIZE)); in mxic_ecc_init_ctx()
362 struct mxic_ecc_engine *mxic = nand_to_mxic(nand); in mxic_ecc_init_ctx_external() local
373 writel(1, mxic->regs + CHUNK_CNT); in mxic_ecc_init_ctx_external()
375 mxic->regs + HC_CONFIG); in mxic_ecc_init_ctx_external()
382 struct mxic_ecc_engine *mxic = nand_to_mxic(nand); in mxic_ecc_init_ctx_pipelined() local
400 writel(ctx->steps, mxic->regs + CHUNK_CNT); in mxic_ecc_init_ctx_pipelined()
407 mxic->regs + HC_CONFIG); in mxic_ecc_init_ctx_pipelined()
422 static int mxic_ecc_data_xfer_wait_for_completion(struct mxic_ecc_engine *mxic) in mxic_ecc_data_xfer_wait_for_completion() argument
427 if (mxic->irq) { in mxic_ecc_data_xfer_wait_for_completion()
428 reinit_completion(&mxic->complete); in mxic_ecc_data_xfer_wait_for_completion()
429 mxic_ecc_enable_int(mxic); in mxic_ecc_data_xfer_wait_for_completion()
430 ret = wait_for_completion_timeout(&mxic->complete, in mxic_ecc_data_xfer_wait_for_completion()
433 mxic_ecc_disable_int(mxic); in mxic_ecc_data_xfer_wait_for_completion()
435 ret = readl_poll_timeout(mxic->regs + INTRPT_STS, val, in mxic_ecc_data_xfer_wait_for_completion()
437 writel(val, mxic->regs + INTRPT_STS); in mxic_ecc_data_xfer_wait_for_completion()
441 dev_err(mxic->dev, "Timeout on data xfer completion\n"); in mxic_ecc_data_xfer_wait_for_completion()
448 static int mxic_ecc_process_data(struct mxic_ecc_engine *mxic, in mxic_ecc_process_data() argument
455 mxic_ecc_enable_engine(mxic); in mxic_ecc_process_data()
458 writel(SDMA_STRT | dir, mxic->regs + SDMA_CTRL); in mxic_ecc_process_data()
461 ret = mxic_ecc_data_xfer_wait_for_completion(mxic); in mxic_ecc_process_data()
463 mxic_ecc_disable_engine(mxic); in mxic_ecc_process_data()
471 struct mxic_ecc_engine *mxic = pip_ecc_eng_to_mxic(eng); in mxic_ecc_process_data_pipelined() local
474 writel(dirmap, mxic->regs + HC_SLV_ADDR); in mxic_ecc_process_data_pipelined()
476 return mxic_ecc_process_data(mxic, direction); in mxic_ecc_process_data_pipelined()
519 static int mxic_ecc_count_biterrs(struct mxic_ecc_engine *mxic, in mxic_ecc_count_biterrs() argument
524 struct device *dev = mxic->dev; in mxic_ecc_count_biterrs()
555 struct mxic_ecc_engine *mxic = nand_to_mxic(nand); in mxic_ecc_prepare_io_req_external() local
576 nents = dma_map_sg(mxic->dev, ctx->sg, 2, DMA_BIDIRECTIONAL); in mxic_ecc_prepare_io_req_external()
580 mutex_lock(&mxic->lock); in mxic_ecc_prepare_io_req_external()
584 mxic->regs + SDMA_MAIN_ADDR); in mxic_ecc_prepare_io_req_external()
586 mxic->regs + SDMA_SPARE_ADDR); in mxic_ecc_prepare_io_req_external()
587 ret = mxic_ecc_process_data(mxic, ctx->req->type); in mxic_ecc_prepare_io_req_external()
592 mutex_unlock(&mxic->lock); in mxic_ecc_prepare_io_req_external()
594 dma_unmap_sg(mxic->dev, ctx->sg, 2, DMA_BIDIRECTIONAL); in mxic_ecc_prepare_io_req_external()
615 struct mxic_ecc_engine *mxic = nand_to_mxic(nand); in mxic_ecc_finish_io_req_external() local
633 nents = dma_map_sg(mxic->dev, ctx->sg, 2, DMA_BIDIRECTIONAL); in mxic_ecc_finish_io_req_external()
637 mutex_lock(&mxic->lock); in mxic_ecc_finish_io_req_external()
641 mxic->regs + SDMA_MAIN_ADDR); in mxic_ecc_finish_io_req_external()
643 mxic->regs + SDMA_SPARE_ADDR); in mxic_ecc_finish_io_req_external()
644 ret = mxic_ecc_process_data(mxic, ctx->req->type); in mxic_ecc_finish_io_req_external()
649 mutex_unlock(&mxic->lock); in mxic_ecc_finish_io_req_external()
651 dma_unmap_sg(mxic->dev, ctx->sg, 2, DMA_BIDIRECTIONAL); in mxic_ecc_finish_io_req_external()
664 return mxic_ecc_count_biterrs(mxic, nand); in mxic_ecc_finish_io_req_external()
671 struct mxic_ecc_engine *mxic = nand_to_mxic(nand); in mxic_ecc_prepare_io_req_pipelined() local
688 nents = dma_map_sg(mxic->dev, ctx->sg, 2, DMA_BIDIRECTIONAL); in mxic_ecc_prepare_io_req_pipelined()
692 mutex_lock(&mxic->lock); in mxic_ecc_prepare_io_req_pipelined()
694 writel(sg_dma_address(&ctx->sg[0]), mxic->regs + SDMA_MAIN_ADDR); in mxic_ecc_prepare_io_req_pipelined()
695 writel(sg_dma_address(&ctx->sg[1]), mxic->regs + SDMA_SPARE_ADDR); in mxic_ecc_prepare_io_req_pipelined()
703 struct mxic_ecc_engine *mxic = nand_to_mxic(nand); in mxic_ecc_finish_io_req_pipelined() local
710 mutex_unlock(&mxic->lock); in mxic_ecc_finish_io_req_pipelined()
712 dma_unmap_sg(mxic->dev, ctx->sg, 2, DMA_BIDIRECTIONAL); in mxic_ecc_finish_io_req_pipelined()
718 ret = mxic_ecc_count_biterrs(mxic, nand); in mxic_ecc_finish_io_req_pipelined()
766 struct mxic_ecc_engine *mxic = pip_ecc_eng_to_mxic(eng); in mxic_ecc_put_pipelined_engine() local
768 platform_device_put(to_platform_device(mxic->dev)); in mxic_ecc_put_pipelined_engine()
776 struct mxic_ecc_engine *mxic; in mxic_ecc_get_pipelined_engine() local
782 mxic = platform_get_drvdata(eng_pdev); in mxic_ecc_get_pipelined_engine()
783 if (!mxic) { in mxic_ecc_get_pipelined_engine()
788 return &mxic->pipelined_engine; in mxic_ecc_get_pipelined_engine()
799 struct mxic_ecc_engine *mxic; in mxic_ecc_probe() local
802 mxic = devm_kzalloc(&pdev->dev, sizeof(*mxic), GFP_KERNEL); in mxic_ecc_probe()
803 if (!mxic) in mxic_ecc_probe()
806 mxic->dev = &pdev->dev; in mxic_ecc_probe()
812 mxic->regs = devm_platform_ioremap_resource(pdev, 0); in mxic_ecc_probe()
813 if (IS_ERR(mxic->regs)) { in mxic_ecc_probe()
815 return PTR_ERR(mxic->regs); in mxic_ecc_probe()
818 mxic_ecc_disable_engine(mxic); in mxic_ecc_probe()
819 mxic_ecc_disable_int(mxic); in mxic_ecc_probe()
822 mxic->irq = platform_get_irq_byname_optional(pdev, "ecc-engine"); in mxic_ecc_probe()
823 if (mxic->irq > 0) { in mxic_ecc_probe()
824 ret = devm_request_irq(&pdev->dev, mxic->irq, mxic_ecc_isr, 0, in mxic_ecc_probe()
825 "mxic-ecc", mxic); in mxic_ecc_probe()
830 mxic->irq = 0; in mxic_ecc_probe()
833 mutex_init(&mxic->lock); in mxic_ecc_probe()
840 mxic->external_engine.dev = &pdev->dev; in mxic_ecc_probe()
841 mxic->external_engine.integration = NAND_ECC_ENGINE_INTEGRATION_EXTERNAL; in mxic_ecc_probe()
842 mxic->external_engine.ops = &mxic_ecc_engine_external_ops; in mxic_ecc_probe()
844 nand_ecc_register_on_host_hw_engine(&mxic->external_engine); in mxic_ecc_probe()
846 platform_set_drvdata(pdev, mxic); in mxic_ecc_probe()
853 struct mxic_ecc_engine *mxic = platform_get_drvdata(pdev); in mxic_ecc_remove() local
855 nand_ecc_unregister_on_host_hw_engine(&mxic->external_engine); in mxic_ecc_remove()