Lines Matching refs:denali

104 static void clear_interrupts(struct denali_nand_info *denali);
105 static uint32_t wait_for_irq(struct denali_nand_info *denali,
107 static void denali_irq_enable(struct denali_nand_info *denali,
109 static uint32_t read_interrupt_status(struct denali_nand_info *denali);
117 static void index_addr(struct denali_nand_info *denali, in index_addr() argument
120 iowrite32(address, denali->flash_mem); in index_addr()
121 iowrite32(data, denali->flash_mem + 0x10); in index_addr()
125 static void index_addr_read_data(struct denali_nand_info *denali, in index_addr_read_data() argument
128 iowrite32(address, denali->flash_mem); in index_addr_read_data()
129 *pdata = ioread32(denali->flash_mem + 0x10); in index_addr_read_data()
136 static void reset_buf(struct denali_nand_info *denali) in reset_buf() argument
138 denali->buf.head = denali->buf.tail = 0; in reset_buf()
141 static void write_byte_to_buf(struct denali_nand_info *denali, uint8_t byte) in write_byte_to_buf() argument
143 denali->buf.buf[denali->buf.tail++] = byte; in write_byte_to_buf()
147 static void read_status(struct denali_nand_info *denali) in read_status() argument
152 reset_buf(denali); in read_status()
154 cmd = ioread32(denali->flash_reg + WRITE_PROTECT); in read_status()
156 write_byte_to_buf(denali, NAND_STATUS_WP); in read_status()
158 write_byte_to_buf(denali, 0); in read_status()
162 static void reset_bank(struct denali_nand_info *denali) in reset_bank() argument
167 clear_interrupts(denali); in reset_bank()
169 iowrite32(1 << denali->flash_bank, denali->flash_reg + DEVICE_RESET); in reset_bank()
171 irq_status = wait_for_irq(denali, irq_mask); in reset_bank()
174 dev_err(denali->dev, "reset bank failed.\n"); in reset_bank()
178 static uint16_t denali_nand_reset(struct denali_nand_info *denali) in denali_nand_reset() argument
182 dev_dbg(denali->dev, "%s, Line %d, Function: %s\n", in denali_nand_reset()
185 for (i = 0; i < denali->max_banks; i++) in denali_nand_reset()
187 denali->flash_reg + INTR_STATUS(i)); in denali_nand_reset()
189 for (i = 0; i < denali->max_banks; i++) { in denali_nand_reset()
190 iowrite32(1 << i, denali->flash_reg + DEVICE_RESET); in denali_nand_reset()
191 while (!(ioread32(denali->flash_reg + INTR_STATUS(i)) & in denali_nand_reset()
194 if (ioread32(denali->flash_reg + INTR_STATUS(i)) & in denali_nand_reset()
196 dev_dbg(denali->dev, in denali_nand_reset()
200 for (i = 0; i < denali->max_banks; i++) in denali_nand_reset()
202 denali->flash_reg + INTR_STATUS(i)); in denali_nand_reset()
212 static void nand_onfi_timing_set(struct denali_nand_info *denali, in nand_onfi_timing_set() argument
234 dev_dbg(denali->dev, "%s, Line %d, Function: %s\n", in nand_onfi_timing_set()
270 dev_warn(denali->dev, "%s, Line %d: Warning!\n", in nand_onfi_timing_set()
292 if (ioread32(denali->flash_reg + MANUFACTURER_ID) == 0 && in nand_onfi_timing_set()
293 ioread32(denali->flash_reg + DEVICE_ID) == 0x88) in nand_onfi_timing_set()
296 iowrite32(acc_clks, denali->flash_reg + ACC_CLKS); in nand_onfi_timing_set()
297 iowrite32(re_2_we, denali->flash_reg + RE_2_WE); in nand_onfi_timing_set()
298 iowrite32(re_2_re, denali->flash_reg + RE_2_RE); in nand_onfi_timing_set()
299 iowrite32(we_2_re, denali->flash_reg + WE_2_RE); in nand_onfi_timing_set()
300 iowrite32(addr_2_data, denali->flash_reg + ADDR_2_DATA); in nand_onfi_timing_set()
301 iowrite32(en_lo, denali->flash_reg + RDWR_EN_LO_CNT); in nand_onfi_timing_set()
302 iowrite32(en_hi, denali->flash_reg + RDWR_EN_HI_CNT); in nand_onfi_timing_set()
303 iowrite32(cs_cnt, denali->flash_reg + CS_SETUP_CNT); in nand_onfi_timing_set()
307 static uint16_t get_onfi_nand_para(struct denali_nand_info *denali) in get_onfi_nand_para() argument
315 if (!(ioread32(denali->flash_reg + ONFI_TIMING_MODE) & in get_onfi_nand_para()
320 if (ioread32(denali->flash_reg + ONFI_TIMING_MODE) & in get_onfi_nand_para()
325 nand_onfi_timing_set(denali, i); in get_onfi_nand_para()
337 static void get_samsung_nand_para(struct denali_nand_info *denali, in get_samsung_nand_para() argument
342 iowrite32(5, denali->flash_reg + ACC_CLKS); in get_samsung_nand_para()
343 iowrite32(20, denali->flash_reg + RE_2_WE); in get_samsung_nand_para()
344 iowrite32(12, denali->flash_reg + WE_2_RE); in get_samsung_nand_para()
345 iowrite32(14, denali->flash_reg + ADDR_2_DATA); in get_samsung_nand_para()
346 iowrite32(3, denali->flash_reg + RDWR_EN_LO_CNT); in get_samsung_nand_para()
347 iowrite32(2, denali->flash_reg + RDWR_EN_HI_CNT); in get_samsung_nand_para()
348 iowrite32(2, denali->flash_reg + CS_SETUP_CNT); in get_samsung_nand_para()
352 static void get_toshiba_nand_para(struct denali_nand_info *denali) in get_toshiba_nand_para() argument
360 if ((ioread32(denali->flash_reg + DEVICE_MAIN_AREA_SIZE) == 4096) && in get_toshiba_nand_para()
361 (ioread32(denali->flash_reg + DEVICE_SPARE_AREA_SIZE) == 64)) { in get_toshiba_nand_para()
362 iowrite32(216, denali->flash_reg + DEVICE_SPARE_AREA_SIZE); in get_toshiba_nand_para()
363 tmp = ioread32(denali->flash_reg + DEVICES_CONNECTED) * in get_toshiba_nand_para()
364 ioread32(denali->flash_reg + DEVICE_SPARE_AREA_SIZE); in get_toshiba_nand_para()
366 denali->flash_reg + LOGICAL_PAGE_SPARE_SIZE); in get_toshiba_nand_para()
368 iowrite32(15, denali->flash_reg + ECC_CORRECTION); in get_toshiba_nand_para()
370 iowrite32(8, denali->flash_reg + ECC_CORRECTION); in get_toshiba_nand_para()
375 static void get_hynix_nand_para(struct denali_nand_info *denali, in get_hynix_nand_para() argument
383 iowrite32(128, denali->flash_reg + PAGES_PER_BLOCK); in get_hynix_nand_para()
384 iowrite32(4096, denali->flash_reg + DEVICE_MAIN_AREA_SIZE); in get_hynix_nand_para()
385 iowrite32(224, denali->flash_reg + DEVICE_SPARE_AREA_SIZE); in get_hynix_nand_para()
387 ioread32(denali->flash_reg + DEVICES_CONNECTED); in get_hynix_nand_para()
389 ioread32(denali->flash_reg + DEVICES_CONNECTED); in get_hynix_nand_para()
391 denali->flash_reg + LOGICAL_PAGE_DATA_SIZE); in get_hynix_nand_para()
393 denali->flash_reg + LOGICAL_PAGE_SPARE_SIZE); in get_hynix_nand_para()
394 iowrite32(0, denali->flash_reg + DEVICE_WIDTH); in get_hynix_nand_para()
396 iowrite32(15, denali->flash_reg + ECC_CORRECTION); in get_hynix_nand_para()
398 iowrite32(8, denali->flash_reg + ECC_CORRECTION); in get_hynix_nand_para()
402 dev_warn(denali->dev, in get_hynix_nand_para()
413 static void find_valid_banks(struct denali_nand_info *denali) in find_valid_banks() argument
415 uint32_t id[denali->max_banks]; in find_valid_banks()
418 denali->total_used_banks = 1; in find_valid_banks()
419 for (i = 0; i < denali->max_banks; i++) { in find_valid_banks()
420 index_addr(denali, MODE_11 | (i << 24) | 0, 0x90); in find_valid_banks()
421 index_addr(denali, MODE_11 | (i << 24) | 1, 0); in find_valid_banks()
422 index_addr_read_data(denali, MODE_11 | (i << 24) | 2, &id[i]); in find_valid_banks()
424 dev_dbg(denali->dev, in find_valid_banks()
432 denali->total_used_banks++; in find_valid_banks()
438 if (denali->platform == INTEL_CE4100) { in find_valid_banks()
444 if (denali->total_used_banks != 1) { in find_valid_banks()
445 dev_err(denali->dev, in find_valid_banks()
450 dev_dbg(denali->dev, in find_valid_banks()
451 "denali->total_used_banks: %d\n", denali->total_used_banks); in find_valid_banks()
458 static void detect_max_banks(struct denali_nand_info *denali) in detect_max_banks() argument
460 uint32_t features = ioread32(denali->flash_reg + FEATURES); in detect_max_banks()
462 denali->max_banks = 2 << (features & FEATURES__N_BANKS); in detect_max_banks()
465 static void detect_partition_feature(struct denali_nand_info *denali) in detect_partition_feature() argument
474 if (ioread32(denali->flash_reg + FEATURES) & FEATURES__PARTITION) { in detect_partition_feature()
475 if ((ioread32(denali->flash_reg + PERM_SRC_ID(1)) & in detect_partition_feature()
477 denali->fwblks = in detect_partition_feature()
478 ((ioread32(denali->flash_reg + MIN_MAX_BANK(1)) & in detect_partition_feature()
480 denali->blksperchip) in detect_partition_feature()
482 (ioread32(denali->flash_reg + MIN_BLK_ADDR(1)) & in detect_partition_feature()
485 denali->fwblks = SPECTRA_START_BLOCK; in detect_partition_feature()
488 denali->fwblks = SPECTRA_START_BLOCK; in detect_partition_feature()
492 static uint16_t denali_nand_timing_set(struct denali_nand_info *denali) in denali_nand_timing_set() argument
499 dev_dbg(denali->dev, "%s, Line %d, Function: %s\n", in denali_nand_timing_set()
507 addr = MODE_11 | BANK(denali->flash_bank); in denali_nand_timing_set()
508 index_addr(denali, addr | 0, 0x90); in denali_nand_timing_set()
509 index_addr(denali, addr | 1, 0); in denali_nand_timing_set()
511 index_addr_read_data(denali, addr | 2, &id_bytes[i]); in denali_nand_timing_set()
515 if (ioread32(denali->flash_reg + ONFI_DEVICE_NO_OF_LUNS) & in denali_nand_timing_set()
517 if (FAIL == get_onfi_nand_para(denali)) in denali_nand_timing_set()
520 get_samsung_nand_para(denali, device_id); in denali_nand_timing_set()
522 get_toshiba_nand_para(denali); in denali_nand_timing_set()
524 get_hynix_nand_para(denali, device_id); in denali_nand_timing_set()
527 dev_info(denali->dev, in denali_nand_timing_set()
532 ioread32(denali->flash_reg + ACC_CLKS), in denali_nand_timing_set()
533 ioread32(denali->flash_reg + RE_2_WE), in denali_nand_timing_set()
534 ioread32(denali->flash_reg + RE_2_RE), in denali_nand_timing_set()
535 ioread32(denali->flash_reg + WE_2_RE), in denali_nand_timing_set()
536 ioread32(denali->flash_reg + ADDR_2_DATA), in denali_nand_timing_set()
537 ioread32(denali->flash_reg + RDWR_EN_LO_CNT), in denali_nand_timing_set()
538 ioread32(denali->flash_reg + RDWR_EN_HI_CNT), in denali_nand_timing_set()
539 ioread32(denali->flash_reg + CS_SETUP_CNT)); in denali_nand_timing_set()
541 find_valid_banks(denali); in denali_nand_timing_set()
543 detect_partition_feature(denali); in denali_nand_timing_set()
550 nand_onfi_timing_set(denali, onfi_timing_mode); in denali_nand_timing_set()
555 static void denali_set_intr_modes(struct denali_nand_info *denali, in denali_set_intr_modes() argument
558 dev_dbg(denali->dev, "%s, Line %d, Function: %s\n", in denali_set_intr_modes()
562 iowrite32(1, denali->flash_reg + GLOBAL_INT_ENABLE); in denali_set_intr_modes()
564 iowrite32(0, denali->flash_reg + GLOBAL_INT_ENABLE); in denali_set_intr_modes()
576 static void denali_irq_init(struct denali_nand_info *denali) in denali_irq_init() argument
582 denali_set_intr_modes(denali, false); in denali_irq_init()
587 for (i = 0; i < denali->max_banks; ++i) in denali_irq_init()
588 iowrite32(0xFFFF, denali->flash_reg + INTR_STATUS(i)); in denali_irq_init()
590 denali_irq_enable(denali, int_mask); in denali_irq_init()
593 static void denali_irq_cleanup(int irqnum, struct denali_nand_info *denali) in denali_irq_cleanup() argument
595 denali_set_intr_modes(denali, false); in denali_irq_cleanup()
596 free_irq(irqnum, denali); in denali_irq_cleanup()
599 static void denali_irq_enable(struct denali_nand_info *denali, in denali_irq_enable() argument
604 for (i = 0; i < denali->max_banks; ++i) in denali_irq_enable()
605 iowrite32(int_mask, denali->flash_reg + INTR_EN(i)); in denali_irq_enable()
612 static inline uint32_t denali_irq_detected(struct denali_nand_info *denali) in denali_irq_detected() argument
614 return read_interrupt_status(denali) & DENALI_IRQ_ALL; in denali_irq_detected()
618 static inline void clear_interrupt(struct denali_nand_info *denali, in clear_interrupt() argument
623 intr_status_reg = INTR_STATUS(denali->flash_bank); in clear_interrupt()
625 iowrite32(irq_mask, denali->flash_reg + intr_status_reg); in clear_interrupt()
628 static void clear_interrupts(struct denali_nand_info *denali) in clear_interrupts() argument
632 spin_lock_irq(&denali->irq_lock); in clear_interrupts()
634 status = read_interrupt_status(denali); in clear_interrupts()
635 clear_interrupt(denali, status); in clear_interrupts()
637 denali->irq_status = 0x0; in clear_interrupts()
638 spin_unlock_irq(&denali->irq_lock); in clear_interrupts()
641 static uint32_t read_interrupt_status(struct denali_nand_info *denali) in read_interrupt_status() argument
645 intr_status_reg = INTR_STATUS(denali->flash_bank); in read_interrupt_status()
647 return ioread32(denali->flash_reg + intr_status_reg); in read_interrupt_status()
656 struct denali_nand_info *denali = dev_id; in denali_isr() local
660 spin_lock(&denali->irq_lock); in denali_isr()
663 if (is_flash_bank_valid(denali->flash_bank)) { in denali_isr()
668 irq_status = denali_irq_detected(denali); in denali_isr()
672 clear_interrupt(denali, irq_status); in denali_isr()
677 denali->irq_status |= irq_status; in denali_isr()
679 complete(&denali->complete); in denali_isr()
684 spin_unlock(&denali->irq_lock); in denali_isr()
689 static uint32_t wait_for_irq(struct denali_nand_info *denali, uint32_t irq_mask) in wait_for_irq() argument
697 wait_for_completion_timeout(&denali->complete, timeout); in wait_for_irq()
698 spin_lock_irq(&denali->irq_lock); in wait_for_irq()
699 intr_status = denali->irq_status; in wait_for_irq()
702 denali->irq_status &= ~irq_mask; in wait_for_irq()
703 spin_unlock_irq(&denali->irq_lock); in wait_for_irq()
712 spin_unlock_irq(&denali->irq_lock); in wait_for_irq()
729 static void setup_ecc_for_xfer(struct denali_nand_info *denali, bool ecc_en, in setup_ecc_for_xfer() argument
739 iowrite32(ecc_en_flag, denali->flash_reg + ECC_ENABLE); in setup_ecc_for_xfer()
740 iowrite32(transfer_spare_flag, denali->flash_reg + TRANSFER_SPARE_REG); in setup_ecc_for_xfer()
747 static int denali_send_pipeline_cmd(struct denali_nand_info *denali, in denali_send_pipeline_cmd() argument
762 setup_ecc_for_xfer(denali, ecc_en, transfer_spare); in denali_send_pipeline_cmd()
764 clear_interrupts(denali); in denali_send_pipeline_cmd()
766 addr = BANK(denali->flash_bank) | denali->page; in denali_send_pipeline_cmd()
770 iowrite32(cmd, denali->flash_mem); in denali_send_pipeline_cmd()
774 index_addr(denali, cmd, access_type); in denali_send_pipeline_cmd()
777 iowrite32(cmd, denali->flash_mem); in denali_send_pipeline_cmd()
781 index_addr(denali, cmd, access_type); in denali_send_pipeline_cmd()
790 iowrite32(cmd, denali->flash_mem); in denali_send_pipeline_cmd()
792 index_addr(denali, cmd, in denali_send_pipeline_cmd()
800 irq_status = wait_for_irq(denali, irq_mask); in denali_send_pipeline_cmd()
803 dev_err(denali->dev, in denali_send_pipeline_cmd()
805 cmd, denali->page, addr); in denali_send_pipeline_cmd()
809 iowrite32(cmd, denali->flash_mem); in denali_send_pipeline_cmd()
817 static int write_data_to_flash_mem(struct denali_nand_info *denali, in write_data_to_flash_mem() argument
832 iowrite32(*buf32++, denali->flash_mem + 0x10); in write_data_to_flash_mem()
837 static int read_data_from_flash_mem(struct denali_nand_info *denali, in read_data_from_flash_mem() argument
854 *buf32++ = ioread32(denali->flash_mem + 0x10); in read_data_from_flash_mem()
861 struct denali_nand_info *denali = mtd_to_denali(mtd); in write_oob_data() local
867 denali->page = page; in write_oob_data()
869 if (denali_send_pipeline_cmd(denali, false, false, SPARE_ACCESS, in write_oob_data()
871 write_data_to_flash_mem(denali, buf, mtd->oobsize); in write_oob_data()
874 irq_status = wait_for_irq(denali, irq_mask); in write_oob_data()
877 dev_err(denali->dev, "OOB write failed\n"); in write_oob_data()
881 dev_err(denali->dev, "unable to send pipeline command\n"); in write_oob_data()
890 struct denali_nand_info *denali = mtd_to_denali(mtd); in read_oob_data() local
894 denali->page = page; in read_oob_data()
896 if (denali_send_pipeline_cmd(denali, false, true, SPARE_ACCESS, in read_oob_data()
898 read_data_from_flash_mem(denali, buf, mtd->oobsize); in read_oob_data()
905 irq_status = wait_for_irq(denali, irq_mask); in read_oob_data()
908 dev_err(denali->dev, "page on OOB timeout %d\n", in read_oob_data()
909 denali->page); in read_oob_data()
918 addr = BANK(denali->flash_bank) | denali->page; in read_oob_data()
920 index_addr(denali, cmd, MAIN_ACCESS); in read_oob_data()
946 static bool handle_ecc(struct denali_nand_info *denali, uint8_t *buf, in handle_ecc() argument
956 denali_set_intr_modes(denali, false); in handle_ecc()
959 err_address = ioread32(denali->flash_reg + in handle_ecc()
964 err_correction_info = ioread32(denali->flash_reg + in handle_ecc()
985 denali->devnum + in handle_ecc()
989 denali->mtd.ecc_stats.corrected++; in handle_ecc()
1006 while (!(read_interrupt_status(denali) & in handle_ecc()
1009 clear_interrupts(denali); in handle_ecc()
1010 denali_set_intr_modes(denali, true); in handle_ecc()
1017 static void denali_enable_dma(struct denali_nand_info *denali, bool en) in denali_enable_dma() argument
1019 iowrite32(en ? DMA_ENABLE__FLAG : 0, denali->flash_reg + DMA_ENABLE); in denali_enable_dma()
1020 ioread32(denali->flash_reg + DMA_ENABLE); in denali_enable_dma()
1024 static void denali_setup_dma(struct denali_nand_info *denali, int op) in denali_setup_dma() argument
1028 uint32_t addr = denali->buf.dma_buf; in denali_setup_dma()
1030 mode = MODE_10 | BANK(denali->flash_bank); in denali_setup_dma()
1035 index_addr(denali, mode | denali->page, 0x2000 | op | page_count); in denali_setup_dma()
1038 index_addr(denali, mode | ((addr >> 16) << 8), 0x2200); in denali_setup_dma()
1041 index_addr(denali, mode | ((addr & 0xffff) << 8), 0x2300); in denali_setup_dma()
1044 index_addr(denali, mode | 0x14000, 0x2400); in denali_setup_dma()
1054 struct denali_nand_info *denali = mtd_to_denali(mtd); in write_page() local
1055 dma_addr_t addr = denali->buf.dma_buf; in write_page()
1056 size_t size = denali->mtd.writesize + denali->mtd.oobsize; in write_page()
1066 setup_ecc_for_xfer(denali, !raw_xfer, raw_xfer); in write_page()
1069 memcpy(denali->buf.buf, buf, mtd->writesize); in write_page()
1073 memcpy(denali->buf.buf + mtd->writesize, in write_page()
1078 dma_sync_single_for_device(denali->dev, addr, size, DMA_TO_DEVICE); in write_page()
1080 clear_interrupts(denali); in write_page()
1081 denali_enable_dma(denali, true); in write_page()
1083 denali_setup_dma(denali, DENALI_WRITE); in write_page()
1086 irq_status = wait_for_irq(denali, irq_mask); in write_page()
1089 dev_err(denali->dev, "timeout on write_page (type = %d)\n", in write_page()
1091 denali->status = NAND_STATUS_FAIL; in write_page()
1094 denali_enable_dma(denali, false); in write_page()
1095 dma_sync_single_for_cpu(denali->dev, addr, size, DMA_TO_DEVICE); in write_page()
1150 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_read_page() local
1152 dma_addr_t addr = denali->buf.dma_buf; in denali_read_page()
1153 size_t size = denali->mtd.writesize + denali->mtd.oobsize; in denali_read_page()
1160 if (page != denali->page) { in denali_read_page()
1161 dev_err(denali->dev, in denali_read_page()
1163 __func__, page, denali->page); in denali_read_page()
1167 setup_ecc_for_xfer(denali, true, false); in denali_read_page()
1169 denali_enable_dma(denali, true); in denali_read_page()
1170 dma_sync_single_for_device(denali->dev, addr, size, DMA_FROM_DEVICE); in denali_read_page()
1172 clear_interrupts(denali); in denali_read_page()
1173 denali_setup_dma(denali, DENALI_READ); in denali_read_page()
1176 irq_status = wait_for_irq(denali, irq_mask); in denali_read_page()
1178 dma_sync_single_for_cpu(denali->dev, addr, size, DMA_FROM_DEVICE); in denali_read_page()
1180 memcpy(buf, denali->buf.buf, mtd->writesize); in denali_read_page()
1182 check_erased_page = handle_ecc(denali, buf, irq_status, &max_bitflips); in denali_read_page()
1183 denali_enable_dma(denali, false); in denali_read_page()
1186 read_oob_data(&denali->mtd, chip->oob_poi, denali->page); in denali_read_page()
1190 if (!is_erased(buf, denali->mtd.writesize)) in denali_read_page()
1191 denali->mtd.ecc_stats.failed++; in denali_read_page()
1192 if (!is_erased(buf, denali->mtd.oobsize)) in denali_read_page()
1193 denali->mtd.ecc_stats.failed++; in denali_read_page()
1202 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_read_page_raw() local
1203 dma_addr_t addr = denali->buf.dma_buf; in denali_read_page_raw()
1204 size_t size = denali->mtd.writesize + denali->mtd.oobsize; in denali_read_page_raw()
1207 if (page != denali->page) { in denali_read_page_raw()
1208 dev_err(denali->dev, in denali_read_page_raw()
1210 __func__, page, denali->page); in denali_read_page_raw()
1214 setup_ecc_for_xfer(denali, false, true); in denali_read_page_raw()
1215 denali_enable_dma(denali, true); in denali_read_page_raw()
1217 dma_sync_single_for_device(denali->dev, addr, size, DMA_FROM_DEVICE); in denali_read_page_raw()
1219 clear_interrupts(denali); in denali_read_page_raw()
1220 denali_setup_dma(denali, DENALI_READ); in denali_read_page_raw()
1223 wait_for_irq(denali, irq_mask); in denali_read_page_raw()
1225 dma_sync_single_for_cpu(denali->dev, addr, size, DMA_FROM_DEVICE); in denali_read_page_raw()
1227 denali_enable_dma(denali, false); in denali_read_page_raw()
1229 memcpy(buf, denali->buf.buf, mtd->writesize); in denali_read_page_raw()
1230 memcpy(chip->oob_poi, denali->buf.buf + mtd->writesize, mtd->oobsize); in denali_read_page_raw()
1237 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_read_byte() local
1240 if (denali->buf.head < denali->buf.tail) in denali_read_byte()
1241 result = denali->buf.buf[denali->buf.head++]; in denali_read_byte()
1248 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_select_chip() local
1250 spin_lock_irq(&denali->irq_lock); in denali_select_chip()
1251 denali->flash_bank = chip; in denali_select_chip()
1252 spin_unlock_irq(&denali->irq_lock); in denali_select_chip()
1257 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_waitfunc() local
1258 int status = denali->status; in denali_waitfunc()
1260 denali->status = 0; in denali_waitfunc()
1267 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_erase() local
1271 clear_interrupts(denali); in denali_erase()
1274 cmd = MODE_10 | BANK(denali->flash_bank) | page; in denali_erase()
1275 index_addr(denali, cmd, 0x1); in denali_erase()
1278 irq_status = wait_for_irq(denali, INTR_STATUS__ERASE_COMP | in denali_erase()
1287 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_cmdfunc() local
1295 read_status(denali); in denali_cmdfunc()
1299 reset_buf(denali); in denali_cmdfunc()
1305 addr = MODE_11 | BANK(denali->flash_bank); in denali_cmdfunc()
1306 index_addr(denali, addr | 0, 0x90); in denali_cmdfunc()
1307 index_addr(denali, addr | 1, 0); in denali_cmdfunc()
1309 index_addr_read_data(denali, addr | 2, &id); in denali_cmdfunc()
1310 write_byte_to_buf(denali, id); in denali_cmdfunc()
1315 denali->page = page; in denali_cmdfunc()
1318 reset_bank(denali); in denali_cmdfunc()
1331 static void denali_hw_init(struct denali_nand_info *denali) in denali_hw_init() argument
1339 denali->bbtskipbytes = ioread32(denali->flash_reg + in denali_hw_init()
1341 detect_max_banks(denali); in denali_hw_init()
1342 denali_nand_reset(denali); in denali_hw_init()
1343 iowrite32(0x0F, denali->flash_reg + RB_PIN_ENABLED); in denali_hw_init()
1345 denali->flash_reg + CHIP_ENABLE_DONT_CARE); in denali_hw_init()
1347 iowrite32(0xffff, denali->flash_reg + SPARE_AREA_MARKER); in denali_hw_init()
1350 iowrite32(0, denali->flash_reg + TWO_ROW_ADDR_CYCLES); in denali_hw_init()
1351 iowrite32(1, denali->flash_reg + ECC_ENABLE); in denali_hw_init()
1352 denali_nand_timing_set(denali); in denali_hw_init()
1353 denali_irq_init(denali); in denali_hw_init()
1395 static void denali_drv_init(struct denali_nand_info *denali) in denali_drv_init() argument
1397 denali->idx = 0; in denali_drv_init()
1404 init_completion(&denali->complete); in denali_drv_init()
1410 spin_lock_init(&denali->irq_lock); in denali_drv_init()
1413 denali->flash_bank = CHIP_SELECT_INVALID; in denali_drv_init()
1416 denali->irq_status = 0; in denali_drv_init()
1419 int denali_init(struct denali_nand_info *denali) in denali_init() argument
1423 if (denali->platform == INTEL_CE4100) { in denali_init()
1435 denali->buf.buf = devm_kzalloc(denali->dev, PAGE_SIZE, in denali_init()
1437 if (!denali->buf.buf) in denali_init()
1440 denali->mtd.dev.parent = denali->dev; in denali_init()
1441 denali_hw_init(denali); in denali_init()
1442 denali_drv_init(denali); in denali_init()
1448 if (request_irq(denali->irq, denali_isr, IRQF_SHARED, in denali_init()
1449 DENALI_NAND_NAME, denali)) { in denali_init()
1455 denali_set_intr_modes(denali, true); in denali_init()
1456 denali->mtd.name = "denali-nand"; in denali_init()
1457 denali->mtd.owner = THIS_MODULE; in denali_init()
1458 denali->mtd.priv = &denali->nand; in denali_init()
1461 denali->nand.select_chip = denali_select_chip; in denali_init()
1462 denali->nand.cmdfunc = denali_cmdfunc; in denali_init()
1463 denali->nand.read_byte = denali_read_byte; in denali_init()
1464 denali->nand.waitfunc = denali_waitfunc; in denali_init()
1471 if (nand_scan_ident(&denali->mtd, denali->max_banks, NULL)) { in denali_init()
1477 devm_kfree(denali->dev, denali->buf.buf); in denali_init()
1478 denali->buf.buf = devm_kzalloc(denali->dev, in denali_init()
1479 denali->mtd.writesize + denali->mtd.oobsize, in denali_init()
1481 if (!denali->buf.buf) { in denali_init()
1487 ret = dma_set_mask(denali->dev, DMA_BIT_MASK(32)); in denali_init()
1493 denali->buf.dma_buf = dma_map_single(denali->dev, denali->buf.buf, in denali_init()
1494 denali->mtd.writesize + denali->mtd.oobsize, in denali_init()
1496 if (dma_mapping_error(denali->dev, denali->buf.dma_buf)) { in denali_init()
1497 dev_err(denali->dev, "Spectra: failed to map DMA buffer\n"); in denali_init()
1507 denali->devnum = ioread32(denali->flash_reg + DEVICES_CONNECTED); in denali_init()
1508 denali->nand.chipsize <<= (denali->devnum - 1); in denali_init()
1509 denali->nand.page_shift += (denali->devnum - 1); in denali_init()
1510 denali->nand.pagemask = (denali->nand.chipsize >> in denali_init()
1511 denali->nand.page_shift) - 1; in denali_init()
1512 denali->nand.bbt_erase_shift += (denali->devnum - 1); in denali_init()
1513 denali->nand.phys_erase_shift = denali->nand.bbt_erase_shift; in denali_init()
1514 denali->nand.chip_shift += (denali->devnum - 1); in denali_init()
1515 denali->mtd.writesize <<= (denali->devnum - 1); in denali_init()
1516 denali->mtd.oobsize <<= (denali->devnum - 1); in denali_init()
1517 denali->mtd.erasesize <<= (denali->devnum - 1); in denali_init()
1518 denali->mtd.size = denali->nand.numchips * denali->nand.chipsize; in denali_init()
1519 denali->bbtskipbytes *= denali->devnum; in denali_init()
1528 denali->nand.bbt_td = &bbt_main_descr; in denali_init()
1529 denali->nand.bbt_md = &bbt_mirror_descr; in denali_init()
1532 denali->nand.bbt_options |= NAND_BBT_USE_FLASH; in denali_init()
1533 denali->nand.options |= NAND_SKIP_BBTSCAN; in denali_init()
1534 denali->nand.ecc.mode = NAND_ECC_HW_SYNDROME; in denali_init()
1537 denali->nand.options |= NAND_NO_SUBPAGE_WRITE; in denali_init()
1544 if (!nand_is_slc(&denali->nand) && in denali_init()
1545 (denali->mtd.oobsize > (denali->bbtskipbytes + in denali_init()
1546 ECC_15BITS * (denali->mtd.writesize / in denali_init()
1549 denali->nand.ecc.strength = 15; in denali_init()
1550 denali->nand.ecc.layout = &nand_15bit_oob; in denali_init()
1551 denali->nand.ecc.bytes = ECC_15BITS; in denali_init()
1552 iowrite32(15, denali->flash_reg + ECC_CORRECTION); in denali_init()
1553 } else if (denali->mtd.oobsize < (denali->bbtskipbytes + in denali_init()
1554 ECC_8BITS * (denali->mtd.writesize / in denali_init()
1559 denali->nand.ecc.strength = 8; in denali_init()
1560 denali->nand.ecc.layout = &nand_8bit_oob; in denali_init()
1561 denali->nand.ecc.bytes = ECC_8BITS; in denali_init()
1562 iowrite32(8, denali->flash_reg + ECC_CORRECTION); in denali_init()
1565 denali->nand.ecc.bytes *= denali->devnum; in denali_init()
1566 denali->nand.ecc.strength *= denali->devnum; in denali_init()
1567 denali->nand.ecc.layout->eccbytes *= in denali_init()
1568 denali->mtd.writesize / ECC_SECTOR_SIZE; in denali_init()
1569 denali->nand.ecc.layout->oobfree[0].offset = in denali_init()
1570 denali->bbtskipbytes + denali->nand.ecc.layout->eccbytes; in denali_init()
1571 denali->nand.ecc.layout->oobfree[0].length = in denali_init()
1572 denali->mtd.oobsize - denali->nand.ecc.layout->eccbytes - in denali_init()
1573 denali->bbtskipbytes; in denali_init()
1580 denali->totalblks = denali->mtd.size >> denali->nand.phys_erase_shift; in denali_init()
1581 denali->blksperchip = denali->totalblks / denali->nand.numchips; in denali_init()
1584 denali->nand.ecc.size = ECC_SECTOR_SIZE * denali->devnum; in denali_init()
1585 denali->nand.ecc.read_page = denali_read_page; in denali_init()
1586 denali->nand.ecc.read_page_raw = denali_read_page_raw; in denali_init()
1587 denali->nand.ecc.write_page = denali_write_page; in denali_init()
1588 denali->nand.ecc.write_page_raw = denali_write_page_raw; in denali_init()
1589 denali->nand.ecc.read_oob = denali_read_oob; in denali_init()
1590 denali->nand.ecc.write_oob = denali_write_oob; in denali_init()
1591 denali->nand.erase = denali_erase; in denali_init()
1593 if (nand_scan_tail(&denali->mtd)) { in denali_init()
1598 ret = mtd_device_register(&denali->mtd, NULL, 0); in denali_init()
1600 dev_err(denali->dev, "Spectra: Failed to register MTD: %d\n", in denali_init()
1607 denali_irq_cleanup(denali->irq, denali); in denali_init()
1614 void denali_remove(struct denali_nand_info *denali) in denali_remove() argument
1616 denali_irq_cleanup(denali->irq, denali); in denali_remove()
1617 dma_unmap_single(denali->dev, denali->buf.dma_buf, in denali_remove()
1618 denali->mtd.writesize + denali->mtd.oobsize, in denali_remove()