Lines Matching refs:denali
51 #define DENALI_BANK(denali) ((denali)->active_bank << 24) argument
73 static void denali_host_write(struct denali_nand_info *denali, in denali_host_write() argument
76 iowrite32(addr, denali->host + DENALI_HOST_ADDR); in denali_host_write()
77 iowrite32(data, denali->host + DENALI_HOST_DATA); in denali_host_write()
84 static void detect_max_banks(struct denali_nand_info *denali) in detect_max_banks() argument
86 uint32_t features = ioread32(denali->reg + FEATURES); in detect_max_banks()
88 denali->max_banks = 1 << (features & FEATURES__N_BANKS); in detect_max_banks()
91 if (denali->revision < 0x0501) in detect_max_banks()
92 denali->max_banks <<= 1; in detect_max_banks()
95 static void denali_enable_irq(struct denali_nand_info *denali) in denali_enable_irq() argument
100 iowrite32(U32_MAX, denali->reg + INTR_EN(i)); in denali_enable_irq()
101 iowrite32(GLOBAL_INT_EN_FLAG, denali->reg + GLOBAL_INT_ENABLE); in denali_enable_irq()
104 static void denali_disable_irq(struct denali_nand_info *denali) in denali_disable_irq() argument
109 iowrite32(0, denali->reg + INTR_EN(i)); in denali_disable_irq()
110 iowrite32(0, denali->reg + GLOBAL_INT_ENABLE); in denali_disable_irq()
113 static void denali_clear_irq(struct denali_nand_info *denali, in denali_clear_irq() argument
117 iowrite32(irq_status, denali->reg + INTR_STATUS(bank)); in denali_clear_irq()
120 static void denali_clear_irq_all(struct denali_nand_info *denali) in denali_clear_irq_all() argument
125 denali_clear_irq(denali, i, U32_MAX); in denali_clear_irq_all()
130 struct denali_nand_info *denali = dev_id; in denali_isr() local
135 spin_lock(&denali->irq_lock); in denali_isr()
138 irq_status = ioread32(denali->reg + INTR_STATUS(i)); in denali_isr()
142 denali_clear_irq(denali, i, irq_status); in denali_isr()
144 if (i != denali->active_bank) in denali_isr()
147 denali->irq_status |= irq_status; in denali_isr()
149 if (denali->irq_status & denali->irq_mask) in denali_isr()
150 complete(&denali->complete); in denali_isr()
153 spin_unlock(&denali->irq_lock); in denali_isr()
158 static void denali_reset_irq(struct denali_nand_info *denali) in denali_reset_irq() argument
162 spin_lock_irqsave(&denali->irq_lock, flags); in denali_reset_irq()
163 denali->irq_status = 0; in denali_reset_irq()
164 denali->irq_mask = 0; in denali_reset_irq()
165 spin_unlock_irqrestore(&denali->irq_lock, flags); in denali_reset_irq()
168 static uint32_t denali_wait_for_irq(struct denali_nand_info *denali, in denali_wait_for_irq() argument
174 spin_lock_irqsave(&denali->irq_lock, flags); in denali_wait_for_irq()
176 irq_status = denali->irq_status; in denali_wait_for_irq()
180 spin_unlock_irqrestore(&denali->irq_lock, flags); in denali_wait_for_irq()
184 denali->irq_mask = irq_mask; in denali_wait_for_irq()
185 reinit_completion(&denali->complete); in denali_wait_for_irq()
186 spin_unlock_irqrestore(&denali->irq_lock, flags); in denali_wait_for_irq()
188 time_left = wait_for_completion_timeout(&denali->complete, in denali_wait_for_irq()
191 dev_err(denali->dev, "timeout while waiting for irq 0x%x\n", in denali_wait_for_irq()
192 denali->irq_mask); in denali_wait_for_irq()
196 return denali->irq_status; in denali_wait_for_irq()
199 static uint32_t denali_check_irq(struct denali_nand_info *denali) in denali_check_irq() argument
204 spin_lock_irqsave(&denali->irq_lock, flags); in denali_check_irq()
205 irq_status = denali->irq_status; in denali_check_irq()
206 spin_unlock_irqrestore(&denali->irq_lock, flags); in denali_check_irq()
215 static void setup_ecc_for_xfer(struct denali_nand_info *denali, bool ecc_en, in setup_ecc_for_xfer() argument
225 iowrite32(ecc_en_flag, denali->reg + ECC_ENABLE); in setup_ecc_for_xfer()
226 iowrite32(transfer_spare_flag, denali->reg + TRANSFER_SPARE_REG); in setup_ecc_for_xfer()
231 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_read_buf() local
234 iowrite32(DENALI_MAP11_DATA | DENALI_BANK(denali), in denali_read_buf()
235 denali->host + DENALI_HOST_ADDR); in denali_read_buf()
238 buf[i] = ioread32(denali->host + DENALI_HOST_DATA); in denali_read_buf()
243 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_write_buf() local
246 iowrite32(DENALI_MAP11_DATA | DENALI_BANK(denali), in denali_write_buf()
247 denali->host + DENALI_HOST_ADDR); in denali_write_buf()
250 iowrite32(buf[i], denali->host + DENALI_HOST_DATA); in denali_write_buf()
255 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_read_buf16() local
259 iowrite32(DENALI_MAP11_DATA | DENALI_BANK(denali), in denali_read_buf16()
260 denali->host + DENALI_HOST_ADDR); in denali_read_buf16()
263 buf16[i] = ioread32(denali->host + DENALI_HOST_DATA); in denali_read_buf16()
269 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_write_buf16() local
273 iowrite32(DENALI_MAP11_DATA | DENALI_BANK(denali), in denali_write_buf16()
274 denali->host + DENALI_HOST_ADDR); in denali_write_buf16()
277 iowrite32(buf16[i], denali->host + DENALI_HOST_DATA); in denali_write_buf16()
305 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_cmd_ctrl() local
320 denali_reset_irq(denali); in denali_cmd_ctrl()
322 denali_host_write(denali, DENALI_BANK(denali) | type, dat); in denali_cmd_ctrl()
327 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_dev_ready() local
329 return !!(denali_check_irq(denali) & INTR__INT_ACT); in denali_dev_ready()
371 struct denali_nand_info *denali, in denali_hw_ecc_fixup() argument
375 int bank = denali->active_bank; in denali_hw_ecc_fixup()
379 ecc_cor = ioread32(denali->reg + ECC_COR_INFO(bank)); in denali_hw_ecc_fixup()
413 struct denali_nand_info *denali, in denali_sw_ecc_fixup() argument
416 unsigned int ecc_size = denali->nand.ecc.size; in denali_sw_ecc_fixup()
425 denali_reset_irq(denali); in denali_sw_ecc_fixup()
428 err_addr = ioread32(denali->reg + ECC_ERROR_ADDRESS); in denali_sw_ecc_fixup()
432 err_cor_info = ioread32(denali->reg + ERR_CORRECTION_INFO); in denali_sw_ecc_fixup()
458 denali->devs_per_cs + err_device; in denali_sw_ecc_fixup()
477 irq_status = denali_wait_for_irq(denali, INTR__ECC_TRANSACTION_DONE); in denali_sw_ecc_fixup()
485 static void denali_enable_dma(struct denali_nand_info *denali, bool en) in denali_enable_dma() argument
487 iowrite32(en ? DMA_ENABLE__FLAG : 0, denali->reg + DMA_ENABLE); in denali_enable_dma()
488 ioread32(denali->reg + DMA_ENABLE); in denali_enable_dma()
491 static void denali_setup_dma64(struct denali_nand_info *denali, in denali_setup_dma64() argument
497 mode = DENALI_MAP10 | DENALI_BANK(denali) | page; in denali_setup_dma64()
505 denali_host_write(denali, mode, in denali_setup_dma64()
509 denali_host_write(denali, mode, dma_addr); in denali_setup_dma64()
512 denali_host_write(denali, mode, (uint64_t)dma_addr >> 32); in denali_setup_dma64()
515 static void denali_setup_dma32(struct denali_nand_info *denali, in denali_setup_dma32() argument
521 mode = DENALI_MAP10 | DENALI_BANK(denali); in denali_setup_dma32()
526 denali_host_write(denali, mode | page, in denali_setup_dma32()
530 denali_host_write(denali, mode | ((dma_addr >> 16) << 8), 0x2200); in denali_setup_dma32()
533 denali_host_write(denali, mode | ((dma_addr & 0xffff) << 8), 0x2300); in denali_setup_dma32()
536 denali_host_write(denali, mode | 0x14000, 0x2400); in denali_setup_dma32()
539 static void denali_setup_dma(struct denali_nand_info *denali, in denali_setup_dma() argument
542 if (denali->caps & DENALI_CAP_DMA_64BIT) in denali_setup_dma()
543 denali_setup_dma64(denali, dma_addr, page, write); in denali_setup_dma()
545 denali_setup_dma32(denali, dma_addr, page, write); in denali_setup_dma()
548 static int denali_pio_read(struct denali_nand_info *denali, void *buf, in denali_pio_read() argument
551 uint32_t addr = DENALI_BANK(denali) | page; in denali_pio_read()
556 if (denali->caps & DENALI_CAP_HW_ECC_FIXUP) in denali_pio_read()
561 denali_reset_irq(denali); in denali_pio_read()
563 iowrite32(DENALI_MAP01 | addr, denali->host + DENALI_HOST_ADDR); in denali_pio_read()
565 *buf32++ = ioread32(denali->host + DENALI_HOST_DATA); in denali_pio_read()
567 irq_status = denali_wait_for_irq(denali, INTR__PAGE_XFER_INC); in denali_pio_read()
577 static int denali_pio_write(struct denali_nand_info *denali, in denali_pio_write() argument
580 uint32_t addr = DENALI_BANK(denali) | page; in denali_pio_write()
585 denali_reset_irq(denali); in denali_pio_write()
587 iowrite32(DENALI_MAP01 | addr, denali->host + DENALI_HOST_ADDR); in denali_pio_write()
589 iowrite32(*buf32++, denali->host + DENALI_HOST_DATA); in denali_pio_write()
591 irq_status = denali_wait_for_irq(denali, in denali_pio_write()
599 static int denali_pio_xfer(struct denali_nand_info *denali, void *buf, in denali_pio_xfer() argument
603 return denali_pio_write(denali, buf, size, page, raw); in denali_pio_xfer()
605 return denali_pio_read(denali, buf, size, page, raw); in denali_pio_xfer()
608 static int denali_dma_xfer(struct denali_nand_info *denali, void *buf, in denali_dma_xfer() argument
616 dma_addr = dma_map_single(denali->dev, buf, size, dir); in denali_dma_xfer()
617 if (dma_mapping_error(denali->dev, dma_addr)) { in denali_dma_xfer()
618 dev_dbg(denali->dev, "Failed to DMA-map buffer. Trying PIO.\n"); in denali_dma_xfer()
619 return denali_pio_xfer(denali, buf, size, page, raw, write); in denali_dma_xfer()
630 } else if (denali->caps & DENALI_CAP_HW_ECC_FIXUP) { in denali_dma_xfer()
638 denali_enable_dma(denali, true); in denali_dma_xfer()
640 denali_reset_irq(denali); in denali_dma_xfer()
641 denali_setup_dma(denali, dma_addr, page, write); in denali_dma_xfer()
644 irq_status = denali_wait_for_irq(denali, irq_mask); in denali_dma_xfer()
650 denali_enable_dma(denali, false); in denali_dma_xfer()
651 dma_unmap_single(denali->dev, dma_addr, size, dir); in denali_dma_xfer()
659 static int denali_data_xfer(struct denali_nand_info *denali, void *buf, in denali_data_xfer() argument
662 setup_ecc_for_xfer(denali, !raw, raw); in denali_data_xfer()
664 if (denali->dma_avail) in denali_data_xfer()
665 return denali_dma_xfer(denali, buf, size, page, raw, write); in denali_data_xfer()
667 return denali_pio_xfer(denali, buf, size, page, raw, write); in denali_data_xfer()
673 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_oob_xfer() local
682 int oob_skip = denali->oob_skip_bytes; in denali_oob_xfer()
733 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_read_page_raw() local
739 void *dma_buf = denali->buf; in denali_read_page_raw()
740 int oob_skip = denali->oob_skip_bytes; in denali_read_page_raw()
744 ret = denali_data_xfer(denali, dma_buf, size, page, 1, 0); in denali_read_page_raw()
816 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_write_oob() local
819 denali_reset_irq(denali); in denali_write_oob()
832 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_read_page() local
837 ret = denali_data_xfer(denali, buf, mtd->writesize, page, 0, 0); in denali_read_page()
841 if (denali->caps & DENALI_CAP_HW_ECC_FIXUP) in denali_read_page()
842 stat = denali_hw_ecc_fixup(mtd, denali, &uncor_ecc_flags); in denali_read_page()
844 stat = denali_sw_ecc_fixup(mtd, denali, &uncor_ecc_flags, buf); in denali_read_page()
864 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_write_page_raw() local
870 void *dma_buf = denali->buf; in denali_write_page_raw()
871 int oob_skip = denali->oob_skip_bytes; in denali_write_page_raw()
936 return denali_data_xfer(denali, dma_buf, size, page, 1, 1); in denali_write_page_raw()
942 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_write_page() local
944 return denali_data_xfer(denali, (void *)buf, mtd->writesize, in denali_write_page()
950 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_select_chip() local
952 denali->active_bank = chip; in denali_select_chip()
957 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_waitfunc() local
961 irq_status = denali_wait_for_irq(denali, INTR__INT_ACT); in denali_waitfunc()
968 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_erase() local
971 denali_reset_irq(denali); in denali_erase()
973 denali_host_write(denali, DENALI_MAP10 | DENALI_BANK(denali) | page, in denali_erase()
977 irq_status = denali_wait_for_irq(denali, in denali_erase()
986 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_setup_data_interface() local
999 t_clk = DIV_ROUND_DOWN_ULL(1000000000000ULL, denali->clk_x_rate); in denali_setup_data_interface()
1010 tmp = ioread32(denali->reg + ACC_CLKS); in denali_setup_data_interface()
1013 iowrite32(tmp, denali->reg + ACC_CLKS); in denali_setup_data_interface()
1019 tmp = ioread32(denali->reg + RE_2_WE); in denali_setup_data_interface()
1022 iowrite32(tmp, denali->reg + RE_2_WE); in denali_setup_data_interface()
1028 tmp = ioread32(denali->reg + RE_2_RE); in denali_setup_data_interface()
1031 iowrite32(tmp, denali->reg + RE_2_RE); in denali_setup_data_interface()
1037 tmp = ioread32(denali->reg + TWHR2_AND_WE_2_RE); in denali_setup_data_interface()
1040 iowrite32(tmp, denali->reg + TWHR2_AND_WE_2_RE); in denali_setup_data_interface()
1046 if (denali->revision < 0x0501) in denali_setup_data_interface()
1052 tmp = ioread32(denali->reg + TCWAW_AND_ADDR_2_DATA); in denali_setup_data_interface()
1055 iowrite32(tmp, denali->reg + TCWAW_AND_ADDR_2_DATA); in denali_setup_data_interface()
1062 tmp = ioread32(denali->reg + RDWR_EN_HI_CNT); in denali_setup_data_interface()
1065 iowrite32(tmp, denali->reg + RDWR_EN_HI_CNT); in denali_setup_data_interface()
1076 tmp = ioread32(denali->reg + RDWR_EN_LO_CNT); in denali_setup_data_interface()
1079 iowrite32(tmp, denali->reg + RDWR_EN_LO_CNT); in denali_setup_data_interface()
1087 tmp = ioread32(denali->reg + CS_SETUP_CNT); in denali_setup_data_interface()
1090 iowrite32(tmp, denali->reg + CS_SETUP_CNT); in denali_setup_data_interface()
1095 static void denali_reset_banks(struct denali_nand_info *denali) in denali_reset_banks() argument
1100 for (i = 0; i < denali->max_banks; i++) { in denali_reset_banks()
1101 denali->active_bank = i; in denali_reset_banks()
1103 denali_reset_irq(denali); in denali_reset_banks()
1106 denali->reg + DEVICE_RESET); in denali_reset_banks()
1108 irq_status = denali_wait_for_irq(denali, in denali_reset_banks()
1114 dev_dbg(denali->dev, "%d chips connected\n", i); in denali_reset_banks()
1115 denali->max_banks = i; in denali_reset_banks()
1118 static void denali_hw_init(struct denali_nand_info *denali) in denali_hw_init() argument
1124 if (!denali->revision) in denali_hw_init()
1125 denali->revision = swab16(ioread32(denali->reg + REVISION)); in denali_hw_init()
1133 denali->oob_skip_bytes = ioread32(denali->reg + SPARE_AREA_SKIP_BYTES); in denali_hw_init()
1134 detect_max_banks(denali); in denali_hw_init()
1135 iowrite32(0x0F, denali->reg + RB_PIN_ENABLED); in denali_hw_init()
1136 iowrite32(CHIP_EN_DONT_CARE__FLAG, denali->reg + CHIP_ENABLE_DONT_CARE); in denali_hw_init()
1138 iowrite32(0xffff, denali->reg + SPARE_AREA_MARKER); in denali_hw_init()
1141 iowrite32(0, denali->reg + TWO_ROW_ADDR_CYCLES); in denali_hw_init()
1142 iowrite32(1, denali->reg + ECC_ENABLE); in denali_hw_init()
1153 struct denali_nand_info *denali) in denali_ecc_setup() argument
1155 int oobavail = mtd->oobsize - denali->oob_skip_bytes; in denali_ecc_setup()
1163 return nand_check_ecc_caps(chip, denali->ecc_caps, oobavail); in denali_ecc_setup()
1170 ret = nand_match_ecc_req(chip, denali->ecc_caps, oobavail); in denali_ecc_setup()
1176 return nand_maximize_ecc(chip, denali->ecc_caps, oobavail); in denali_ecc_setup()
1182 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_ooblayout_ecc() local
1188 oobregion->offset = denali->oob_skip_bytes; in denali_ooblayout_ecc()
1197 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_ooblayout_free() local
1203 oobregion->offset = chip->ecc.total + denali->oob_skip_bytes; in denali_ooblayout_free()
1215 static void denali_drv_init(struct denali_nand_info *denali) in denali_drv_init() argument
1221 init_completion(&denali->complete); in denali_drv_init()
1227 spin_lock_init(&denali->irq_lock); in denali_drv_init()
1230 static int denali_multidev_fixup(struct denali_nand_info *denali) in denali_multidev_fixup() argument
1232 struct nand_chip *chip = &denali->nand; in denali_multidev_fixup()
1242 denali->devs_per_cs = ioread32(denali->reg + DEVICES_CONNECTED); in denali_multidev_fixup()
1248 if (denali->devs_per_cs == 0) { in denali_multidev_fixup()
1249 denali->devs_per_cs = 1; in denali_multidev_fixup()
1250 iowrite32(1, denali->reg + DEVICES_CONNECTED); in denali_multidev_fixup()
1253 if (denali->devs_per_cs == 1) in denali_multidev_fixup()
1256 if (denali->devs_per_cs != 2) { in denali_multidev_fixup()
1257 dev_err(denali->dev, "unsupported number of devices %d\n", in denali_multidev_fixup()
1258 denali->devs_per_cs); in denali_multidev_fixup()
1276 denali->oob_skip_bytes <<= 1; in denali_multidev_fixup()
1281 int denali_init(struct denali_nand_info *denali) in denali_init() argument
1283 struct nand_chip *chip = &denali->nand; in denali_init()
1287 mtd->dev.parent = denali->dev; in denali_init()
1288 denali_hw_init(denali); in denali_init()
1289 denali_drv_init(denali); in denali_init()
1291 denali_clear_irq_all(denali); in denali_init()
1294 ret = devm_request_irq(denali->dev, denali->irq, denali_isr, in denali_init()
1295 IRQF_SHARED, DENALI_NAND_NAME, denali); in denali_init()
1297 dev_err(denali->dev, "Unable to request IRQ\n"); in denali_init()
1301 denali_enable_irq(denali); in denali_init()
1302 denali_reset_banks(denali); in denali_init()
1304 denali->active_bank = DENALI_INVALID_BANK; in denali_init()
1306 nand_set_flash_node(chip, denali->dev->of_node); in denali_init()
1321 if (denali->clk_x_rate) in denali_init()
1329 ret = nand_scan_ident(mtd, denali->max_banks, NULL); in denali_init()
1333 if (ioread32(denali->reg + FEATURES) & FEATURES__DMA) in denali_init()
1334 denali->dma_avail = 1; in denali_init()
1336 if (denali->dma_avail) { in denali_init()
1337 int dma_bit = denali->caps & DENALI_CAP_DMA_64BIT ? 64 : 32; in denali_init()
1339 ret = dma_set_mask(denali->dev, DMA_BIT_MASK(dma_bit)); in denali_init()
1341 dev_info(denali->dev, in denali_init()
1343 denali->dma_avail = 0; in denali_init()
1347 if (denali->dma_avail) { in denali_init()
1366 ret = denali_ecc_setup(mtd, chip, denali); in denali_init()
1368 dev_err(denali->dev, "Failed to setup ECC settings.\n"); in denali_init()
1372 dev_dbg(denali->dev, in denali_init()
1377 denali->reg + ECC_CORRECTION); in denali_init()
1379 denali->reg + PAGES_PER_BLOCK); in denali_init()
1381 denali->reg + DEVICE_WIDTH); in denali_init()
1382 iowrite32(mtd->writesize, denali->reg + DEVICE_MAIN_AREA_SIZE); in denali_init()
1383 iowrite32(mtd->oobsize, denali->reg + DEVICE_SPARE_AREA_SIZE); in denali_init()
1385 iowrite32(chip->ecc.size, denali->reg + CFG_DATA_BLOCK_SIZE); in denali_init()
1386 iowrite32(chip->ecc.size, denali->reg + CFG_LAST_DATA_BLOCK_SIZE); in denali_init()
1389 denali->reg + CFG_NUM_DATA_BLOCKS); in denali_init()
1409 ret = denali_multidev_fixup(denali); in denali_init()
1418 denali->buf = kmalloc(mtd->writesize + mtd->oobsize, GFP_KERNEL); in denali_init()
1419 if (!denali->buf) { in denali_init()
1430 dev_err(denali->dev, "Failed to register MTD: %d\n", ret); in denali_init()
1436 kfree(denali->buf); in denali_init()
1438 denali_disable_irq(denali); in denali_init()
1445 void denali_remove(struct denali_nand_info *denali) in denali_remove() argument
1447 struct mtd_info *mtd = nand_to_mtd(&denali->nand); in denali_remove()
1450 kfree(denali->buf); in denali_remove()
1451 denali_disable_irq(denali); in denali_remove()