Lines Matching refs:flctl

84 static void empty_fifo(struct sh_flctl *flctl)  in empty_fifo()  argument
86 writel(flctl->flintdmacr_base | AC1CLR | AC0CLR, FLINTDMACR(flctl)); in empty_fifo()
87 writel(flctl->flintdmacr_base, FLINTDMACR(flctl)); in empty_fifo()
90 static void start_translation(struct sh_flctl *flctl) in start_translation() argument
92 writeb(TRSTRT, FLTRCR(flctl)); in start_translation()
95 static void timeout_error(struct sh_flctl *flctl, const char *str) in timeout_error() argument
97 dev_err(&flctl->pdev->dev, "Timeout occurred in %s\n", str); in timeout_error()
100 static void wait_completion(struct sh_flctl *flctl) in wait_completion() argument
105 if (readb(FLTRCR(flctl)) & TREND) { in wait_completion()
106 writeb(0x0, FLTRCR(flctl)); in wait_completion()
112 timeout_error(flctl, __func__); in wait_completion()
113 writeb(0x0, FLTRCR(flctl)); in wait_completion()
118 struct sh_flctl *flctl = param; in flctl_dma_complete() local
120 complete(&flctl->dma_complete); in flctl_dma_complete()
123 static void flctl_release_dma(struct sh_flctl *flctl) in flctl_release_dma() argument
125 if (flctl->chan_fifo0_rx) { in flctl_release_dma()
126 dma_release_channel(flctl->chan_fifo0_rx); in flctl_release_dma()
127 flctl->chan_fifo0_rx = NULL; in flctl_release_dma()
129 if (flctl->chan_fifo0_tx) { in flctl_release_dma()
130 dma_release_channel(flctl->chan_fifo0_tx); in flctl_release_dma()
131 flctl->chan_fifo0_tx = NULL; in flctl_release_dma()
135 static void flctl_setup_dma(struct sh_flctl *flctl) in flctl_setup_dma() argument
139 struct platform_device *pdev = flctl->pdev; in flctl_setup_dma()
153 flctl->chan_fifo0_tx = dma_request_channel(mask, shdma_chan_filter, in flctl_setup_dma()
156 flctl->chan_fifo0_tx); in flctl_setup_dma()
158 if (!flctl->chan_fifo0_tx) in flctl_setup_dma()
163 cfg.dst_addr = (dma_addr_t)FLDTFIFO(flctl); in flctl_setup_dma()
165 ret = dmaengine_slave_config(flctl->chan_fifo0_tx, &cfg); in flctl_setup_dma()
169 flctl->chan_fifo0_rx = dma_request_channel(mask, shdma_chan_filter, in flctl_setup_dma()
172 flctl->chan_fifo0_rx); in flctl_setup_dma()
174 if (!flctl->chan_fifo0_rx) in flctl_setup_dma()
179 cfg.src_addr = (dma_addr_t)FLDTFIFO(flctl); in flctl_setup_dma()
180 ret = dmaengine_slave_config(flctl->chan_fifo0_rx, &cfg); in flctl_setup_dma()
184 init_completion(&flctl->dma_complete); in flctl_setup_dma()
189 flctl_release_dma(flctl); in flctl_setup_dma()
194 struct sh_flctl *flctl = mtd_to_flctl(mtd); in set_addr() local
201 if (flctl->chip.options & NAND_BUSWIDTH_16) in set_addr()
203 if (flctl->page_size) { in set_addr()
208 if (flctl->rw_ADRCNT == ADRCNT2_E) { in set_addr()
211 writel(addr2, FLADR2(flctl)); in set_addr()
220 writel(addr, FLADR(flctl)); in set_addr()
223 static void wait_rfifo_ready(struct sh_flctl *flctl) in wait_rfifo_ready() argument
230 val = readl(FLDTCNTR(flctl)) >> 16; in wait_rfifo_ready()
235 timeout_error(flctl, __func__); in wait_rfifo_ready()
238 static void wait_wfifo_ready(struct sh_flctl *flctl) in wait_wfifo_ready() argument
244 len = (readl(FLDTCNTR(flctl)) >> 16) & 0xFF; in wait_wfifo_ready()
249 timeout_error(flctl, __func__); in wait_wfifo_ready()
253 (struct sh_flctl *flctl, int sector_number) in wait_recfifo_ready() argument
270 size = readl(FLDTCNTR(flctl)) >> 24; in wait_recfifo_ready()
275 if (!(readl(FL4ECCCR(flctl)) & _4ECCEND)) { in wait_recfifo_ready()
285 if (readl(FL4ECCCR(flctl)) & _4ECCFA) { in wait_recfifo_ready()
288 if (flctl->done_buff[i] != 0xff) { in wait_recfifo_ready()
295 dev_dbg(&flctl->pdev->dev, in wait_recfifo_ready()
299 writel(0, FL4ECCCR(flctl)); in wait_recfifo_ready()
304 ecc_reg[0] = FL4ECCRESULT0(flctl); in wait_recfifo_ready()
305 ecc_reg[1] = FL4ECCRESULT1(flctl); in wait_recfifo_ready()
306 ecc_reg[2] = FL4ECCRESULT2(flctl); in wait_recfifo_ready()
307 ecc_reg[3] = FL4ECCRESULT3(flctl); in wait_recfifo_ready()
315 if (flctl->page_size) in wait_recfifo_ready()
321 org = flctl->done_buff[index]; in wait_recfifo_ready()
322 flctl->done_buff[index] = org ^ (data & 0xFF); in wait_recfifo_ready()
325 writel(0, FL4ECCCR(flctl)); in wait_recfifo_ready()
328 timeout_error(flctl, __func__); in wait_recfifo_ready()
332 static void wait_wecfifo_ready(struct sh_flctl *flctl) in wait_wecfifo_ready() argument
339 len = (readl(FLDTCNTR(flctl)) >> 24) & 0xFF; in wait_wecfifo_ready()
344 timeout_error(flctl, __func__); in wait_wecfifo_ready()
347 static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf, in flctl_dma_fifo0_transfer() argument
359 chan = flctl->chan_fifo0_rx; in flctl_dma_fifo0_transfer()
362 chan = flctl->chan_fifo0_tx; in flctl_dma_fifo0_transfer()
373 reg = readl(FLINTDMACR(flctl)); in flctl_dma_fifo0_transfer()
375 writel(reg, FLINTDMACR(flctl)); in flctl_dma_fifo0_transfer()
378 desc->callback_param = flctl; in flctl_dma_fifo0_transfer()
384 flctl_release_dma(flctl); in flctl_dma_fifo0_transfer()
385 dev_warn(&flctl->pdev->dev, in flctl_dma_fifo0_transfer()
392 wait_for_completion_timeout(&flctl->dma_complete, in flctl_dma_fifo0_transfer()
397 dev_err(&flctl->pdev->dev, "wait_for_completion_timeout\n"); in flctl_dma_fifo0_transfer()
401 reg = readl(FLINTDMACR(flctl)); in flctl_dma_fifo0_transfer()
403 writel(reg, FLINTDMACR(flctl)); in flctl_dma_fifo0_transfer()
411 static void read_datareg(struct sh_flctl *flctl, int offset) in read_datareg() argument
414 unsigned long *buf = (unsigned long *)&flctl->done_buff[offset]; in read_datareg()
416 wait_completion(flctl); in read_datareg()
418 data = readl(FLDATAR(flctl)); in read_datareg()
422 static void read_fiforeg(struct sh_flctl *flctl, int rlen, int offset) in read_fiforeg() argument
425 unsigned long *buf = (unsigned long *)&flctl->done_buff[offset]; in read_fiforeg()
430 if (flctl->chan_fifo0_rx && rlen >= 32 && in read_fiforeg()
431 flctl_dma_fifo0_transfer(flctl, buf, rlen, DMA_DEV_TO_MEM) > 0) in read_fiforeg()
436 wait_rfifo_ready(flctl); in read_fiforeg()
437 buf[i] = readl(FLDTFIFO(flctl)); in read_fiforeg()
446 (struct sh_flctl *flctl, uint8_t *buff, int sector) in read_ecfiforeg() argument
452 res = wait_recfifo_ready(flctl , sector); in read_ecfiforeg()
456 ecc_buf[i] = readl(FLECFIFO(flctl)); in read_ecfiforeg()
464 static void write_fiforeg(struct sh_flctl *flctl, int rlen, in write_fiforeg() argument
468 unsigned long *buf = (unsigned long *)&flctl->done_buff[offset]; in write_fiforeg()
472 wait_wfifo_ready(flctl); in write_fiforeg()
473 writel(cpu_to_be32(buf[i]), FLDTFIFO(flctl)); in write_fiforeg()
477 static void write_ec_fiforeg(struct sh_flctl *flctl, int rlen, in write_ec_fiforeg() argument
481 unsigned long *buf = (unsigned long *)&flctl->done_buff[offset]; in write_ec_fiforeg()
489 if (flctl->chan_fifo0_tx && rlen >= 32 && in write_ec_fiforeg()
490 flctl_dma_fifo0_transfer(flctl, buf, rlen, DMA_MEM_TO_DEV) > 0) in write_ec_fiforeg()
495 wait_wecfifo_ready(flctl); in write_ec_fiforeg()
496 writel(buf[i], FLECFIFO(flctl)); in write_ec_fiforeg()
502 struct sh_flctl *flctl = mtd_to_flctl(mtd); in set_cmd_regs() local
503 uint32_t flcmncr_val = flctl->flcmncr_base & ~SEL_16BIT; in set_cmd_regs()
507 if (flctl->page_size) in set_cmd_regs()
518 addr_len_bytes = flctl->erase_ADRCNT; in set_cmd_regs()
524 addr_len_bytes = flctl->rw_ADRCNT; in set_cmd_regs()
526 if (flctl->chip.options & NAND_BUSWIDTH_16) in set_cmd_regs()
534 addr_len_bytes = flctl->rw_ADRCNT; in set_cmd_regs()
536 if (flctl->chip.options & NAND_BUSWIDTH_16) in set_cmd_regs()
557 writel(flcmncr_val, FLCMNCR(flctl)); in set_cmd_regs()
558 writel(flcmdcr_val, FLCMDCR(flctl)); in set_cmd_regs()
559 writel(flcmcdr_val, FLCMCDR(flctl)); in set_cmd_regs()
582 struct sh_flctl *flctl = mtd_to_flctl(mtd); in execmd_read_page_sector() local
586 page_sectors = flctl->page_size ? 4 : 1; in execmd_read_page_sector()
591 writel(readl(FLCMNCR(flctl)) | ACM_SACCES_MODE | _4ECCCORRECT, in execmd_read_page_sector()
592 FLCMNCR(flctl)); in execmd_read_page_sector()
593 writel(readl(FLCMDCR(flctl)) | page_sectors, FLCMDCR(flctl)); in execmd_read_page_sector()
594 writel(page_addr << 2, FLADR(flctl)); in execmd_read_page_sector()
596 empty_fifo(flctl); in execmd_read_page_sector()
597 start_translation(flctl); in execmd_read_page_sector()
600 read_fiforeg(flctl, 512, 512 * sector); in execmd_read_page_sector()
602 ecc_result = read_ecfiforeg(flctl, in execmd_read_page_sector()
603 &flctl->done_buff[mtd->writesize + 16 * sector], in execmd_read_page_sector()
608 dev_info(&flctl->pdev->dev, in execmd_read_page_sector()
610 flctl->mtd.ecc_stats.corrected++; in execmd_read_page_sector()
613 dev_warn(&flctl->pdev->dev, in execmd_read_page_sector()
616 flctl->mtd.ecc_stats.failed++; in execmd_read_page_sector()
623 wait_completion(flctl); in execmd_read_page_sector()
625 writel(readl(FLCMNCR(flctl)) & ~(ACM_SACCES_MODE | _4ECCCORRECT), in execmd_read_page_sector()
626 FLCMNCR(flctl)); in execmd_read_page_sector()
631 struct sh_flctl *flctl = mtd_to_flctl(mtd); in execmd_read_oob() local
632 int page_sectors = flctl->page_size ? 4 : 1; in execmd_read_oob()
638 empty_fifo(flctl); in execmd_read_oob()
642 writel(16, FLDTCNTR(flctl)); in execmd_read_oob()
644 start_translation(flctl); in execmd_read_oob()
645 read_fiforeg(flctl, 16, 16 * i); in execmd_read_oob()
646 wait_completion(flctl); in execmd_read_oob()
652 struct sh_flctl *flctl = mtd_to_flctl(mtd); in execmd_write_page_sector() local
653 int page_addr = flctl->seqin_page_addr; in execmd_write_page_sector()
656 page_sectors = flctl->page_size ? 4 : 1; in execmd_write_page_sector()
661 empty_fifo(flctl); in execmd_write_page_sector()
662 writel(readl(FLCMNCR(flctl)) | ACM_SACCES_MODE, FLCMNCR(flctl)); in execmd_write_page_sector()
663 writel(readl(FLCMDCR(flctl)) | page_sectors, FLCMDCR(flctl)); in execmd_write_page_sector()
664 writel(page_addr << 2, FLADR(flctl)); in execmd_write_page_sector()
665 start_translation(flctl); in execmd_write_page_sector()
668 write_fiforeg(flctl, 512, 512 * sector); in execmd_write_page_sector()
669 write_ec_fiforeg(flctl, 16, mtd->writesize + 16 * sector); in execmd_write_page_sector()
672 wait_completion(flctl); in execmd_write_page_sector()
673 writel(readl(FLCMNCR(flctl)) & ~ACM_SACCES_MODE, FLCMNCR(flctl)); in execmd_write_page_sector()
678 struct sh_flctl *flctl = mtd_to_flctl(mtd); in execmd_write_oob() local
679 int page_addr = flctl->seqin_page_addr; in execmd_write_oob()
682 page_sectors = flctl->page_size ? 4 : 1; in execmd_write_oob()
688 empty_fifo(flctl); in execmd_write_oob()
690 writel(16, FLDTCNTR(flctl)); /* set read size */ in execmd_write_oob()
692 start_translation(flctl); in execmd_write_oob()
693 write_fiforeg(flctl, 16, 16 * sector); in execmd_write_oob()
694 wait_completion(flctl); in execmd_write_oob()
701 struct sh_flctl *flctl = mtd_to_flctl(mtd); in flctl_cmdfunc() local
704 pm_runtime_get_sync(&flctl->pdev->dev); in flctl_cmdfunc()
706 flctl->read_bytes = 0; in flctl_cmdfunc()
708 flctl->index = 0; in flctl_cmdfunc()
713 if (flctl->hwecc) { in flctl_cmdfunc()
718 if (flctl->page_size) in flctl_cmdfunc()
726 flctl->read_bytes = mtd->writesize + mtd->oobsize; in flctl_cmdfunc()
727 if (flctl->chip.options & NAND_BUSWIDTH_16) in flctl_cmdfunc()
729 flctl->index += column; in flctl_cmdfunc()
733 if (flctl->hwecc) { in flctl_cmdfunc()
739 if (flctl->page_size) { in flctl_cmdfunc()
747 flctl->read_bytes = mtd->oobsize; in flctl_cmdfunc()
751 if (flctl->hwecc) in flctl_cmdfunc()
754 if (flctl->page_size) in flctl_cmdfunc()
762 flctl->read_bytes = mtd->writesize + mtd->oobsize - column; in flctl_cmdfunc()
769 if (flctl->chip.options & NAND_BUSWIDTH_16) in flctl_cmdfunc()
773 flctl->read_bytes = 8; in flctl_cmdfunc()
774 writel(flctl->read_bytes, FLDTCNTR(flctl)); /* set read size */ in flctl_cmdfunc()
775 empty_fifo(flctl); in flctl_cmdfunc()
776 start_translation(flctl); in flctl_cmdfunc()
777 read_fiforeg(flctl, flctl->read_bytes, 0); in flctl_cmdfunc()
778 wait_completion(flctl); in flctl_cmdfunc()
782 flctl->erase1_page_addr = page_addr; in flctl_cmdfunc()
788 set_addr(mtd, -1, flctl->erase1_page_addr); in flctl_cmdfunc()
789 start_translation(flctl); in flctl_cmdfunc()
790 wait_completion(flctl); in flctl_cmdfunc()
794 if (!flctl->page_size) { in flctl_cmdfunc()
806 flctl->seqin_column = column; in flctl_cmdfunc()
807 flctl->seqin_page_addr = page_addr; in flctl_cmdfunc()
808 flctl->seqin_read_cmd = read_cmd; in flctl_cmdfunc()
812 empty_fifo(flctl); in flctl_cmdfunc()
813 if (!flctl->page_size) { in flctl_cmdfunc()
815 flctl->seqin_read_cmd); in flctl_cmdfunc()
817 writel(0, FLDTCNTR(flctl)); /* set 0 size */ in flctl_cmdfunc()
818 start_translation(flctl); in flctl_cmdfunc()
819 wait_completion(flctl); in flctl_cmdfunc()
821 if (flctl->hwecc) { in flctl_cmdfunc()
823 if (flctl->seqin_column == mtd->writesize) in flctl_cmdfunc()
825 else if (!flctl->seqin_column) in flctl_cmdfunc()
832 set_addr(mtd, flctl->seqin_column, flctl->seqin_page_addr); in flctl_cmdfunc()
833 writel(flctl->index, FLDTCNTR(flctl)); /* set write size */ in flctl_cmdfunc()
834 start_translation(flctl); in flctl_cmdfunc()
835 write_fiforeg(flctl, flctl->index, 0); in flctl_cmdfunc()
836 wait_completion(flctl); in flctl_cmdfunc()
843 flctl->read_bytes = 1; in flctl_cmdfunc()
844 writel(flctl->read_bytes, FLDTCNTR(flctl)); /* set read size */ in flctl_cmdfunc()
845 start_translation(flctl); in flctl_cmdfunc()
846 read_datareg(flctl, 0); /* read and end */ in flctl_cmdfunc()
853 writel(0, FLDTCNTR(flctl)); /* set 0 size */ in flctl_cmdfunc()
854 start_translation(flctl); in flctl_cmdfunc()
855 wait_completion(flctl); in flctl_cmdfunc()
864 writel(flctl->read_bytes, FLDTCNTR(flctl)); /* set read size */ in flctl_cmdfunc()
865 empty_fifo(flctl); in flctl_cmdfunc()
866 start_translation(flctl); in flctl_cmdfunc()
867 read_fiforeg(flctl, flctl->read_bytes, 0); in flctl_cmdfunc()
868 wait_completion(flctl); in flctl_cmdfunc()
870 pm_runtime_put_sync(&flctl->pdev->dev); in flctl_cmdfunc()
876 struct sh_flctl *flctl = mtd_to_flctl(mtd); in flctl_select_chip() local
881 flctl->flcmncr_base &= ~CE0_ENABLE; in flctl_select_chip()
883 pm_runtime_get_sync(&flctl->pdev->dev); in flctl_select_chip()
884 writel(flctl->flcmncr_base, FLCMNCR(flctl)); in flctl_select_chip()
886 if (flctl->qos_request) { in flctl_select_chip()
887 dev_pm_qos_remove_request(&flctl->pm_qos); in flctl_select_chip()
888 flctl->qos_request = 0; in flctl_select_chip()
891 pm_runtime_put_sync(&flctl->pdev->dev); in flctl_select_chip()
894 flctl->flcmncr_base |= CE0_ENABLE; in flctl_select_chip()
896 if (!flctl->qos_request) { in flctl_select_chip()
897 ret = dev_pm_qos_add_request(&flctl->pdev->dev, in flctl_select_chip()
898 &flctl->pm_qos, in flctl_select_chip()
902 dev_err(&flctl->pdev->dev, in flctl_select_chip()
904 flctl->qos_request = 1; in flctl_select_chip()
907 if (flctl->holden) { in flctl_select_chip()
908 pm_runtime_get_sync(&flctl->pdev->dev); in flctl_select_chip()
909 writel(HOLDEN, FLHOLDCR(flctl)); in flctl_select_chip()
910 pm_runtime_put_sync(&flctl->pdev->dev); in flctl_select_chip()
920 struct sh_flctl *flctl = mtd_to_flctl(mtd); in flctl_write_buf() local
922 memcpy(&flctl->done_buff[flctl->index], buf, len); in flctl_write_buf()
923 flctl->index += len; in flctl_write_buf()
928 struct sh_flctl *flctl = mtd_to_flctl(mtd); in flctl_read_byte() local
931 data = flctl->done_buff[flctl->index]; in flctl_read_byte()
932 flctl->index++; in flctl_read_byte()
938 struct sh_flctl *flctl = mtd_to_flctl(mtd); in flctl_read_word() local
939 uint16_t *buf = (uint16_t *)&flctl->done_buff[flctl->index]; in flctl_read_word()
941 flctl->index += 2; in flctl_read_word()
947 struct sh_flctl *flctl = mtd_to_flctl(mtd); in flctl_read_buf() local
949 memcpy(buf, &flctl->done_buff[flctl->index], len); in flctl_read_buf()
950 flctl->index += len; in flctl_read_buf()
955 struct sh_flctl *flctl = mtd_to_flctl(mtd); in flctl_chip_init_tail() local
956 struct nand_chip *chip = &flctl->chip; in flctl_chip_init_tail()
959 flctl->page_size = 0; in flctl_chip_init_tail()
962 flctl->rw_ADRCNT = ADRCNT_4; in flctl_chip_init_tail()
963 flctl->erase_ADRCNT = ADRCNT_3; in flctl_chip_init_tail()
966 flctl->rw_ADRCNT = ADRCNT_3; in flctl_chip_init_tail()
967 flctl->erase_ADRCNT = ADRCNT_2; in flctl_chip_init_tail()
969 flctl->rw_ADRCNT = ADRCNT_2; in flctl_chip_init_tail()
970 flctl->erase_ADRCNT = ADRCNT_1; in flctl_chip_init_tail()
973 flctl->page_size = 1; in flctl_chip_init_tail()
976 flctl->rw_ADRCNT = ADRCNT2_E; in flctl_chip_init_tail()
977 flctl->erase_ADRCNT = ADRCNT_3; in flctl_chip_init_tail()
980 flctl->rw_ADRCNT = ADRCNT_4; in flctl_chip_init_tail()
981 flctl->erase_ADRCNT = ADRCNT_2; in flctl_chip_init_tail()
983 flctl->rw_ADRCNT = ADRCNT_3; in flctl_chip_init_tail()
984 flctl->erase_ADRCNT = ADRCNT_1; in flctl_chip_init_tail()
988 if (flctl->hwecc) { in flctl_chip_init_tail()
1005 flctl->flcmncr_base |= _4ECCEN; in flctl_chip_init_tail()
1015 struct sh_flctl *flctl = dev_id; in flctl_handle_flste() local
1017 dev_err(&flctl->pdev->dev, "flste irq: %x\n", readl(FLINTDMACR(flctl))); in flctl_handle_flste()
1018 writel(flctl->flintdmacr_base, FLINTDMACR(flctl)); in flctl_handle_flste()
1083 struct sh_flctl *flctl; in flctl_probe() local
1091 flctl = devm_kzalloc(&pdev->dev, sizeof(struct sh_flctl), GFP_KERNEL); in flctl_probe()
1092 if (!flctl) in flctl_probe()
1096 flctl->reg = devm_ioremap_resource(&pdev->dev, res); in flctl_probe()
1097 if (IS_ERR(flctl->reg)) in flctl_probe()
1098 return PTR_ERR(flctl->reg); in flctl_probe()
1107 "flste", flctl); in flctl_probe()
1123 platform_set_drvdata(pdev, flctl); in flctl_probe()
1124 flctl_mtd = &flctl->mtd; in flctl_probe()
1125 nand = &flctl->chip; in flctl_probe()
1128 flctl->pdev = pdev; in flctl_probe()
1129 flctl->hwecc = pdata->has_hwecc; in flctl_probe()
1130 flctl->holden = pdata->use_holden; in flctl_probe()
1131 flctl->flcmncr_base = pdata->flcmncr_val; in flctl_probe()
1132 flctl->flintdmacr_base = flctl->hwecc ? (STERINTE | ECERB) : STERINTE; in flctl_probe()
1152 flctl_setup_dma(flctl); in flctl_probe()
1173 flctl_release_dma(flctl); in flctl_probe()
1180 struct sh_flctl *flctl = platform_get_drvdata(pdev); in flctl_remove() local
1182 flctl_release_dma(flctl); in flctl_remove()
1183 nand_release(&flctl->mtd); in flctl_remove()