Lines Matching refs:denali
39 #define DENALI_BANK(denali) ((denali)->active_bank << 24) argument
59 static u32 denali_direct_read(struct denali_controller *denali, u32 addr) in denali_direct_read() argument
61 return ioread32(denali->host + addr); in denali_direct_read()
64 static void denali_direct_write(struct denali_controller *denali, u32 addr, in denali_direct_write() argument
67 iowrite32(data, denali->host + addr); in denali_direct_write()
76 static u32 denali_indexed_read(struct denali_controller *denali, u32 addr) in denali_indexed_read() argument
78 iowrite32(addr, denali->host + DENALI_INDEXED_CTRL); in denali_indexed_read()
79 return ioread32(denali->host + DENALI_INDEXED_DATA); in denali_indexed_read()
82 static void denali_indexed_write(struct denali_controller *denali, u32 addr, in denali_indexed_write() argument
85 iowrite32(addr, denali->host + DENALI_INDEXED_CTRL); in denali_indexed_write()
86 iowrite32(data, denali->host + DENALI_INDEXED_DATA); in denali_indexed_write()
89 static void denali_enable_irq(struct denali_controller *denali) in denali_enable_irq() argument
93 for (i = 0; i < denali->nbanks; i++) in denali_enable_irq()
94 iowrite32(U32_MAX, denali->reg + INTR_EN(i)); in denali_enable_irq()
95 iowrite32(GLOBAL_INT_EN_FLAG, denali->reg + GLOBAL_INT_ENABLE); in denali_enable_irq()
98 static void denali_disable_irq(struct denali_controller *denali) in denali_disable_irq() argument
102 for (i = 0; i < denali->nbanks; i++) in denali_disable_irq()
103 iowrite32(0, denali->reg + INTR_EN(i)); in denali_disable_irq()
104 iowrite32(0, denali->reg + GLOBAL_INT_ENABLE); in denali_disable_irq()
107 static void denali_clear_irq(struct denali_controller *denali, in denali_clear_irq() argument
111 iowrite32(irq_status, denali->reg + INTR_STATUS(bank)); in denali_clear_irq()
114 static void denali_clear_irq_all(struct denali_controller *denali) in denali_clear_irq_all() argument
118 for (i = 0; i < denali->nbanks; i++) in denali_clear_irq_all()
119 denali_clear_irq(denali, i, U32_MAX); in denali_clear_irq_all()
124 struct denali_controller *denali = dev_id; in denali_isr() local
129 spin_lock(&denali->irq_lock); in denali_isr()
131 for (i = 0; i < denali->nbanks; i++) { in denali_isr()
132 irq_status = ioread32(denali->reg + INTR_STATUS(i)); in denali_isr()
136 denali_clear_irq(denali, i, irq_status); in denali_isr()
138 if (i != denali->active_bank) in denali_isr()
141 denali->irq_status |= irq_status; in denali_isr()
143 if (denali->irq_status & denali->irq_mask) in denali_isr()
144 complete(&denali->complete); in denali_isr()
147 spin_unlock(&denali->irq_lock); in denali_isr()
152 static void denali_reset_irq(struct denali_controller *denali) in denali_reset_irq() argument
156 spin_lock_irqsave(&denali->irq_lock, flags); in denali_reset_irq()
157 denali->irq_status = 0; in denali_reset_irq()
158 denali->irq_mask = 0; in denali_reset_irq()
159 spin_unlock_irqrestore(&denali->irq_lock, flags); in denali_reset_irq()
162 static u32 denali_wait_for_irq(struct denali_controller *denali, u32 irq_mask) in denali_wait_for_irq() argument
167 spin_lock_irqsave(&denali->irq_lock, flags); in denali_wait_for_irq()
169 irq_status = denali->irq_status; in denali_wait_for_irq()
173 spin_unlock_irqrestore(&denali->irq_lock, flags); in denali_wait_for_irq()
177 denali->irq_mask = irq_mask; in denali_wait_for_irq()
178 reinit_completion(&denali->complete); in denali_wait_for_irq()
179 spin_unlock_irqrestore(&denali->irq_lock, flags); in denali_wait_for_irq()
181 time_left = wait_for_completion_timeout(&denali->complete, in denali_wait_for_irq()
184 dev_err(denali->dev, "timeout while waiting for irq 0x%x\n", in denali_wait_for_irq()
189 return denali->irq_status; in denali_wait_for_irq()
194 struct denali_controller *denali = to_denali_controller(chip); in denali_select_target() local
198 denali->active_bank = sel->bank; in denali_select_target()
201 denali->reg + PAGES_PER_BLOCK); in denali_select_target()
203 denali->reg + DEVICE_WIDTH); in denali_select_target()
204 iowrite32(mtd->writesize, denali->reg + DEVICE_MAIN_AREA_SIZE); in denali_select_target()
205 iowrite32(mtd->oobsize, denali->reg + DEVICE_SPARE_AREA_SIZE); in denali_select_target()
208 denali->reg + TWO_ROW_ADDR_CYCLES); in denali_select_target()
211 denali->reg + ECC_CORRECTION); in denali_select_target()
212 iowrite32(chip->ecc.size, denali->reg + CFG_DATA_BLOCK_SIZE); in denali_select_target()
213 iowrite32(chip->ecc.size, denali->reg + CFG_LAST_DATA_BLOCK_SIZE); in denali_select_target()
214 iowrite32(chip->ecc.steps, denali->reg + CFG_NUM_DATA_BLOCKS); in denali_select_target()
220 iowrite32(sel->hwhr2_and_we_2_re, denali->reg + TWHR2_AND_WE_2_RE); in denali_select_target()
222 denali->reg + TCWAW_AND_ADDR_2_DATA); in denali_select_target()
223 iowrite32(sel->re_2_we, denali->reg + RE_2_WE); in denali_select_target()
224 iowrite32(sel->acc_clks, denali->reg + ACC_CLKS); in denali_select_target()
225 iowrite32(sel->rdwr_en_lo_cnt, denali->reg + RDWR_EN_LO_CNT); in denali_select_target()
226 iowrite32(sel->rdwr_en_hi_cnt, denali->reg + RDWR_EN_HI_CNT); in denali_select_target()
227 iowrite32(sel->cs_setup_cnt, denali->reg + CS_SETUP_CNT); in denali_select_target()
228 iowrite32(sel->re_2_re, denali->reg + RE_2_RE); in denali_select_target()
244 struct denali_controller *denali = to_denali_controller(chip); in denali_payload_xfer() local
248 int oob_skip = denali->oob_skip_bytes; in denali_payload_xfer()
281 struct denali_controller *denali = to_denali_controller(chip); in denali_oob_xfer() local
286 int oob_skip = denali->oob_skip_bytes; in denali_oob_xfer()
411 struct denali_controller *denali = to_denali_controller(chip); in denali_check_erased_page() local
414 u8 *ecc_code = chip->oob_poi + denali->oob_skip_bytes; in denali_check_erased_page()
441 struct denali_controller *denali = to_denali_controller(chip); in denali_hw_ecc_fixup() local
443 int bank = denali->active_bank; in denali_hw_ecc_fixup()
447 ecc_cor = ioread32(denali->reg + ECC_COR_INFO(bank)); in denali_hw_ecc_fixup()
476 struct denali_controller *denali = to_denali_controller(chip); in denali_sw_ecc_fixup() local
487 denali_reset_irq(denali); in denali_sw_ecc_fixup()
490 err_addr = ioread32(denali->reg + ECC_ERROR_ADDRESS); in denali_sw_ecc_fixup()
494 err_cor_info = ioread32(denali->reg + ERR_CORRECTION_INFO); in denali_sw_ecc_fixup()
522 denali->devs_per_cs + err_device; in denali_sw_ecc_fixup()
540 irq_status = denali_wait_for_irq(denali, INTR__ECC_TRANSACTION_DONE); in denali_sw_ecc_fixup()
547 static void denali_setup_dma64(struct denali_controller *denali, in denali_setup_dma64() argument
553 mode = DENALI_MAP10 | DENALI_BANK(denali) | page; in denali_setup_dma64()
561 denali->host_write(denali, mode, in denali_setup_dma64()
566 denali->host_write(denali, mode, lower_32_bits(dma_addr)); in denali_setup_dma64()
569 denali->host_write(denali, mode, upper_32_bits(dma_addr)); in denali_setup_dma64()
572 static void denali_setup_dma32(struct denali_controller *denali, in denali_setup_dma32() argument
578 mode = DENALI_MAP10 | DENALI_BANK(denali); in denali_setup_dma32()
583 denali->host_write(denali, mode | page, in denali_setup_dma32()
587 denali->host_write(denali, mode | ((dma_addr >> 16) << 8), 0x2200); in denali_setup_dma32()
590 denali->host_write(denali, mode | ((dma_addr & 0xffff) << 8), 0x2300); in denali_setup_dma32()
593 denali->host_write(denali, mode | 0x14000, 0x2400); in denali_setup_dma32()
596 static int denali_pio_read(struct denali_controller *denali, u32 *buf, in denali_pio_read() argument
599 u32 addr = DENALI_MAP01 | DENALI_BANK(denali) | page; in denali_pio_read()
603 if (denali->caps & DENALI_CAP_HW_ECC_FIXUP) in denali_pio_read()
608 denali_reset_irq(denali); in denali_pio_read()
611 buf[i] = denali->host_read(denali, addr); in denali_pio_read()
613 irq_status = denali_wait_for_irq(denali, INTR__PAGE_XFER_INC); in denali_pio_read()
623 static int denali_pio_write(struct denali_controller *denali, const u32 *buf, in denali_pio_write() argument
626 u32 addr = DENALI_MAP01 | DENALI_BANK(denali) | page; in denali_pio_write()
630 denali_reset_irq(denali); in denali_pio_write()
633 denali->host_write(denali, addr, buf[i]); in denali_pio_write()
635 irq_status = denali_wait_for_irq(denali, in denali_pio_write()
644 static int denali_pio_xfer(struct denali_controller *denali, void *buf, in denali_pio_xfer() argument
648 return denali_pio_write(denali, buf, size, page); in denali_pio_xfer()
650 return denali_pio_read(denali, buf, size, page); in denali_pio_xfer()
653 static int denali_dma_xfer(struct denali_controller *denali, void *buf, in denali_dma_xfer() argument
661 dma_addr = dma_map_single(denali->dev, buf, size, dir); in denali_dma_xfer()
662 if (dma_mapping_error(denali->dev, dma_addr)) { in denali_dma_xfer()
663 dev_dbg(denali->dev, "Failed to DMA-map buffer. Trying PIO.\n"); in denali_dma_xfer()
664 return denali_pio_xfer(denali, buf, size, page, write); in denali_dma_xfer()
675 } else if (denali->caps & DENALI_CAP_HW_ECC_FIXUP) { in denali_dma_xfer()
683 iowrite32(DMA_ENABLE__FLAG, denali->reg + DMA_ENABLE); in denali_dma_xfer()
689 ioread32(denali->reg + DMA_ENABLE); in denali_dma_xfer()
691 denali_reset_irq(denali); in denali_dma_xfer()
692 denali->setup_dma(denali, dma_addr, page, write); in denali_dma_xfer()
694 irq_status = denali_wait_for_irq(denali, irq_mask); in denali_dma_xfer()
700 iowrite32(0, denali->reg + DMA_ENABLE); in denali_dma_xfer()
702 dma_unmap_single(denali->dev, dma_addr, size, dir); in denali_dma_xfer()
713 struct denali_controller *denali = to_denali_controller(chip); in denali_page_xfer() local
717 if (denali->dma_avail) in denali_page_xfer()
718 return denali_dma_xfer(denali, buf, size, page, write); in denali_page_xfer()
720 return denali_pio_xfer(denali, buf, size, page, write); in denali_page_xfer()
726 struct denali_controller *denali = to_denali_controller(chip); in denali_read_page() local
736 if (denali->caps & DENALI_CAP_HW_ECC_FIXUP) in denali_read_page()
768 struct denali_controller *denali = to_denali_controller(chip); in denali_setup_interface() local
782 t_x = DIV_ROUND_DOWN_ULL(1000000000000ULL, denali->clk_x_rate); in denali_setup_interface()
791 mult_x = DIV_ROUND_CLOSEST_ULL(denali->clk_x_rate, denali->clk_rate); in denali_setup_interface()
804 tmp = ioread32(denali->reg + RE_2_WE); in denali_setup_interface()
813 tmp = ioread32(denali->reg + RE_2_RE); in denali_setup_interface()
827 tmp = ioread32(denali->reg + TWHR2_AND_WE_2_RE); in denali_setup_interface()
836 if (denali->revision < 0x0501) in denali_setup_interface()
842 tmp = ioread32(denali->reg + TCWAW_AND_ADDR_2_DATA); in denali_setup_interface()
852 tmp = ioread32(denali->reg + RDWR_EN_HI_CNT); in denali_setup_interface()
891 tmp = ioread32(denali->reg + ACC_CLKS); in denali_setup_interface()
896 tmp = ioread32(denali->reg + RDWR_EN_LO_CNT); in denali_setup_interface()
907 tmp = ioread32(denali->reg + CS_SETUP_CNT); in denali_setup_interface()
926 struct denali_controller *denali = to_denali_controller(chip); in denali_ooblayout_ecc() local
931 oobregion->offset = denali->oob_skip_bytes; in denali_ooblayout_ecc()
941 struct denali_controller *denali = to_denali_controller(chip); in denali_ooblayout_free() local
946 oobregion->offset = chip->ecc.total + denali->oob_skip_bytes; in denali_ooblayout_free()
959 struct denali_controller *denali = to_denali_controller(chip); in denali_multidev_fixup() local
972 denali->devs_per_cs = ioread32(denali->reg + DEVICES_CONNECTED); in denali_multidev_fixup()
978 if (denali->devs_per_cs == 0) { in denali_multidev_fixup()
979 denali->devs_per_cs = 1; in denali_multidev_fixup()
980 iowrite32(1, denali->reg + DEVICES_CONNECTED); in denali_multidev_fixup()
983 if (denali->devs_per_cs == 1) in denali_multidev_fixup()
986 if (denali->devs_per_cs != 2) { in denali_multidev_fixup()
987 dev_err(denali->dev, "unsupported number of devices %d\n", in denali_multidev_fixup()
988 denali->devs_per_cs); in denali_multidev_fixup()
1007 denali->oob_skip_bytes <<= 1; in denali_multidev_fixup()
1014 struct denali_controller *denali = to_denali_controller(chip); in denali_attach_chip() local
1018 ret = nand_ecc_choose_conf(chip, denali->ecc_caps, in denali_attach_chip()
1019 mtd->oobsize - denali->oob_skip_bytes); in denali_attach_chip()
1021 dev_err(denali->dev, "Failed to setup ECC settings.\n"); in denali_attach_chip()
1025 dev_dbg(denali->dev, in denali_attach_chip()
1036 static void denali_exec_in8(struct denali_controller *denali, u32 type, in denali_exec_in8() argument
1042 buf[i] = denali->host_read(denali, type | DENALI_BANK(denali)); in denali_exec_in8()
1045 static void denali_exec_in16(struct denali_controller *denali, u32 type, in denali_exec_in16() argument
1052 data = denali->host_read(denali, type | DENALI_BANK(denali)); in denali_exec_in16()
1059 static void denali_exec_in(struct denali_controller *denali, u32 type, in denali_exec_in() argument
1063 denali_exec_in16(denali, type, buf, len); in denali_exec_in()
1065 denali_exec_in8(denali, type, buf, len); in denali_exec_in()
1068 static void denali_exec_out8(struct denali_controller *denali, u32 type, in denali_exec_out8() argument
1074 denali->host_write(denali, type | DENALI_BANK(denali), buf[i]); in denali_exec_out8()
1077 static void denali_exec_out16(struct denali_controller *denali, u32 type, in denali_exec_out16() argument
1083 denali->host_write(denali, type | DENALI_BANK(denali), in denali_exec_out16()
1087 static void denali_exec_out(struct denali_controller *denali, u32 type, in denali_exec_out() argument
1091 denali_exec_out16(denali, type, buf, len); in denali_exec_out()
1093 denali_exec_out8(denali, type, buf, len); in denali_exec_out()
1096 static int denali_exec_waitrdy(struct denali_controller *denali) in denali_exec_waitrdy() argument
1101 irq_stat = denali_wait_for_irq(denali, INTR__INT_ACT); in denali_exec_waitrdy()
1104 denali_reset_irq(denali); in denali_exec_waitrdy()
1112 struct denali_controller *denali = to_denali_controller(chip); in denali_exec_instr() local
1116 denali_exec_out8(denali, DENALI_MAP11_CMD, in denali_exec_instr()
1120 denali_exec_out8(denali, DENALI_MAP11_ADDR, in denali_exec_instr()
1125 denali_exec_in(denali, DENALI_MAP11_DATA, in denali_exec_instr()
1132 denali_exec_out(denali, DENALI_MAP11_DATA, in denali_exec_instr()
1139 return denali_exec_waitrdy(denali); in denali_exec_instr()
1179 int denali_chip_init(struct denali_controller *denali, in denali_chip_init() argument
1187 chip->controller = &denali->controller; in denali_chip_init()
1193 if (bank >= denali->nbanks) { in denali_chip_init()
1194 dev_err(denali->dev, "unsupported bank %d\n", bank); in denali_chip_init()
1200 dev_err(denali->dev, in denali_chip_init()
1207 list_for_each_entry(dchip2, &denali->chips, node) { in denali_chip_init()
1210 dev_err(denali->dev, in denali_chip_init()
1219 mtd->dev.parent = denali->dev; in denali_chip_init()
1225 if (!mtd->name && list_empty(&denali->chips)) in denali_chip_init()
1228 if (denali->dma_avail) { in denali_chip_init()
1234 if (!denali->clk_rate || !denali->clk_x_rate) in denali_chip_init()
1257 dev_err(denali->dev, "Failed to register MTD: %d\n", ret); in denali_chip_init()
1261 list_add_tail(&dchip->node, &denali->chips); in denali_chip_init()
1272 int denali_init(struct denali_controller *denali) in denali_init() argument
1274 u32 features = ioread32(denali->reg + FEATURES); in denali_init()
1277 nand_controller_init(&denali->controller); in denali_init()
1278 denali->controller.ops = &denali_controller_ops; in denali_init()
1279 init_completion(&denali->complete); in denali_init()
1280 spin_lock_init(&denali->irq_lock); in denali_init()
1281 INIT_LIST_HEAD(&denali->chips); in denali_init()
1282 denali->active_bank = DENALI_INVALID_BANK; in denali_init()
1288 if (!denali->revision) in denali_init()
1289 denali->revision = swab16(ioread32(denali->reg + REVISION)); in denali_init()
1291 denali->nbanks = 1 << FIELD_GET(FEATURES__N_BANKS, features); in denali_init()
1294 if (denali->revision < 0x0501) in denali_init()
1295 denali->nbanks <<= 1; in denali_init()
1298 denali->dma_avail = true; in denali_init()
1300 if (denali->dma_avail) { in denali_init()
1301 int dma_bit = denali->caps & DENALI_CAP_DMA_64BIT ? 64 : 32; in denali_init()
1303 ret = dma_set_mask(denali->dev, DMA_BIT_MASK(dma_bit)); in denali_init()
1305 dev_info(denali->dev, in denali_init()
1307 denali->dma_avail = false; in denali_init()
1311 if (denali->dma_avail) { in denali_init()
1312 if (denali->caps & DENALI_CAP_DMA_64BIT) in denali_init()
1313 denali->setup_dma = denali_setup_dma64; in denali_init()
1315 denali->setup_dma = denali_setup_dma32; in denali_init()
1319 denali->host_read = denali_indexed_read; in denali_init()
1320 denali->host_write = denali_indexed_write; in denali_init()
1322 denali->host_read = denali_direct_read; in denali_init()
1323 denali->host_write = denali_direct_write; in denali_init()
1332 if (denali->oob_skip_bytes) in denali_init()
1333 iowrite32(denali->oob_skip_bytes, in denali_init()
1334 denali->reg + SPARE_AREA_SKIP_BYTES); in denali_init()
1336 denali->oob_skip_bytes = ioread32(denali->reg + in denali_init()
1339 iowrite32(0, denali->reg + TRANSFER_SPARE_REG); in denali_init()
1340 iowrite32(GENMASK(denali->nbanks - 1, 0), denali->reg + RB_PIN_ENABLED); in denali_init()
1341 iowrite32(CHIP_EN_DONT_CARE__FLAG, denali->reg + CHIP_ENABLE_DONT_CARE); in denali_init()
1342 iowrite32(ECC_ENABLE__FLAG, denali->reg + ECC_ENABLE); in denali_init()
1343 iowrite32(0xffff, denali->reg + SPARE_AREA_MARKER); in denali_init()
1344 iowrite32(WRITE_PROTECT__FLAG, denali->reg + WRITE_PROTECT); in denali_init()
1346 denali_clear_irq_all(denali); in denali_init()
1348 ret = devm_request_irq(denali->dev, denali->irq, denali_isr, in denali_init()
1349 IRQF_SHARED, DENALI_NAND_NAME, denali); in denali_init()
1351 dev_err(denali->dev, "Unable to request IRQ\n"); in denali_init()
1355 denali_enable_irq(denali); in denali_init()
1361 void denali_remove(struct denali_controller *denali) in denali_remove() argument
1367 list_for_each_entry_safe(dchip, tmp, &denali->chips, node) { in denali_remove()
1375 denali_disable_irq(denali); in denali_remove()