Lines Matching refs:denali
68 #define DENALI_BANK(denali) ((denali)->active_bank << 24) argument
83 static u32 denali_direct_read(struct denali_nand_info *denali, u32 addr) in denali_direct_read() argument
85 return ioread32(denali->host + addr); in denali_direct_read()
88 static void denali_direct_write(struct denali_nand_info *denali, u32 addr, in denali_direct_write() argument
91 iowrite32(data, denali->host + addr); in denali_direct_write()
100 static u32 denali_indexed_read(struct denali_nand_info *denali, u32 addr) in denali_indexed_read() argument
102 iowrite32(addr, denali->host + DENALI_INDEXED_CTRL); in denali_indexed_read()
103 return ioread32(denali->host + DENALI_INDEXED_DATA); in denali_indexed_read()
106 static void denali_indexed_write(struct denali_nand_info *denali, u32 addr, in denali_indexed_write() argument
109 iowrite32(addr, denali->host + DENALI_INDEXED_CTRL); in denali_indexed_write()
110 iowrite32(data, denali->host + DENALI_INDEXED_DATA); in denali_indexed_write()
117 static void denali_detect_max_banks(struct denali_nand_info *denali) in denali_detect_max_banks() argument
119 uint32_t features = ioread32(denali->reg + FEATURES); in denali_detect_max_banks()
121 denali->max_banks = 1 << FIELD_GET(FEATURES__N_BANKS, features); in denali_detect_max_banks()
124 if (denali->revision < 0x0501) in denali_detect_max_banks()
125 denali->max_banks <<= 1; in denali_detect_max_banks()
128 static void __maybe_unused denali_enable_irq(struct denali_nand_info *denali) in denali_enable_irq() argument
133 iowrite32(U32_MAX, denali->reg + INTR_EN(i)); in denali_enable_irq()
134 iowrite32(GLOBAL_INT_EN_FLAG, denali->reg + GLOBAL_INT_ENABLE); in denali_enable_irq()
137 static void __maybe_unused denali_disable_irq(struct denali_nand_info *denali) in denali_disable_irq() argument
142 iowrite32(0, denali->reg + INTR_EN(i)); in denali_disable_irq()
143 iowrite32(0, denali->reg + GLOBAL_INT_ENABLE); in denali_disable_irq()
146 static void denali_clear_irq(struct denali_nand_info *denali, in denali_clear_irq() argument
150 iowrite32(irq_status, denali->reg + INTR_STATUS(bank)); in denali_clear_irq()
153 static void denali_clear_irq_all(struct denali_nand_info *denali) in denali_clear_irq_all() argument
158 denali_clear_irq(denali, i, U32_MAX); in denali_clear_irq_all()
161 static void __denali_check_irq(struct denali_nand_info *denali) in __denali_check_irq() argument
167 irq_status = ioread32(denali->reg + INTR_STATUS(i)); in __denali_check_irq()
168 denali_clear_irq(denali, i, irq_status); in __denali_check_irq()
170 if (i != denali->active_bank) in __denali_check_irq()
173 denali->irq_status |= irq_status; in __denali_check_irq()
177 static void denali_reset_irq(struct denali_nand_info *denali) in denali_reset_irq() argument
179 denali->irq_status = 0; in denali_reset_irq()
180 denali->irq_mask = 0; in denali_reset_irq()
183 static uint32_t denali_wait_for_irq(struct denali_nand_info *denali, in denali_wait_for_irq() argument
189 __denali_check_irq(denali); in denali_wait_for_irq()
191 if (irq_mask & denali->irq_status) in denali_wait_for_irq()
192 return denali->irq_status; in denali_wait_for_irq()
198 dev_err(denali->dev, "timeout while waiting for irq 0x%x\n", in denali_wait_for_irq()
203 return denali->irq_status; in denali_wait_for_irq()
206 static uint32_t denali_check_irq(struct denali_nand_info *denali) in denali_check_irq() argument
208 __denali_check_irq(denali); in denali_check_irq()
210 return denali->irq_status; in denali_check_irq()
215 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_read_buf() local
216 u32 addr = DENALI_MAP11_DATA | DENALI_BANK(denali); in denali_read_buf()
220 buf[i] = denali->host_read(denali, addr); in denali_read_buf()
225 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_write_buf() local
226 u32 addr = DENALI_MAP11_DATA | DENALI_BANK(denali); in denali_write_buf()
230 denali->host_write(denali, addr, buf[i]); in denali_write_buf()
235 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_read_buf16() local
236 u32 addr = DENALI_MAP11_DATA | DENALI_BANK(denali); in denali_read_buf16()
241 buf16[i] = denali->host_read(denali, addr); in denali_read_buf16()
247 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_write_buf16() local
248 u32 addr = DENALI_MAP11_DATA | DENALI_BANK(denali); in denali_write_buf16()
253 denali->host_write(denali, addr, buf16[i]); in denali_write_buf16()
281 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_cmd_ctrl() local
296 denali_reset_irq(denali); in denali_cmd_ctrl()
298 denali->host_write(denali, DENALI_BANK(denali) | type, dat); in denali_cmd_ctrl()
303 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_dev_ready() local
305 return !!(denali_check_irq(denali) & INTR__INT_ACT); in denali_dev_ready()
347 struct denali_nand_info *denali, in denali_hw_ecc_fixup() argument
351 int bank = denali->active_bank; in denali_hw_ecc_fixup()
355 ecc_cor = ioread32(denali->reg + ECC_COR_INFO(bank)); in denali_hw_ecc_fixup()
382 struct denali_nand_info *denali, in denali_sw_ecc_fixup() argument
385 unsigned int ecc_size = denali->nand.ecc.size; in denali_sw_ecc_fixup()
394 denali_reset_irq(denali); in denali_sw_ecc_fixup()
397 err_addr = ioread32(denali->reg + ECC_ERROR_ADDRESS); in denali_sw_ecc_fixup()
401 err_cor_info = ioread32(denali->reg + ERR_CORRECTION_INFO); in denali_sw_ecc_fixup()
429 denali->devs_per_cs + err_device; in denali_sw_ecc_fixup()
447 irq_status = denali_wait_for_irq(denali, INTR__ECC_TRANSACTION_DONE); in denali_sw_ecc_fixup()
454 static void denali_setup_dma64(struct denali_nand_info *denali, in denali_setup_dma64() argument
460 mode = DENALI_MAP10 | DENALI_BANK(denali) | page; in denali_setup_dma64()
468 denali->host_write(denali, mode, in denali_setup_dma64()
472 denali->host_write(denali, mode, lower_32_bits(dma_addr)); in denali_setup_dma64()
475 denali->host_write(denali, mode, upper_32_bits(dma_addr)); in denali_setup_dma64()
478 static void denali_setup_dma32(struct denali_nand_info *denali, in denali_setup_dma32() argument
484 mode = DENALI_MAP10 | DENALI_BANK(denali); in denali_setup_dma32()
489 denali->host_write(denali, mode | page, in denali_setup_dma32()
493 denali->host_write(denali, mode | ((dma_addr >> 16) << 8), 0x2200); in denali_setup_dma32()
496 denali->host_write(denali, mode | ((dma_addr & 0xffff) << 8), 0x2300); in denali_setup_dma32()
499 denali->host_write(denali, mode | 0x14000, 0x2400); in denali_setup_dma32()
502 static int denali_pio_read(struct denali_nand_info *denali, void *buf, in denali_pio_read() argument
505 u32 addr = DENALI_MAP01 | DENALI_BANK(denali) | page; in denali_pio_read()
510 if (denali->caps & DENALI_CAP_HW_ECC_FIXUP) in denali_pio_read()
515 denali_reset_irq(denali); in denali_pio_read()
518 *buf32++ = denali->host_read(denali, addr); in denali_pio_read()
520 irq_status = denali_wait_for_irq(denali, INTR__PAGE_XFER_INC); in denali_pio_read()
530 static int denali_pio_write(struct denali_nand_info *denali, in denali_pio_write() argument
533 u32 addr = DENALI_MAP01 | DENALI_BANK(denali) | page; in denali_pio_write()
538 denali_reset_irq(denali); in denali_pio_write()
541 denali->host_write(denali, addr, *buf32++); in denali_pio_write()
543 irq_status = denali_wait_for_irq(denali, in denali_pio_write()
551 static int denali_pio_xfer(struct denali_nand_info *denali, void *buf, in denali_pio_xfer() argument
555 return denali_pio_write(denali, buf, size, page, raw); in denali_pio_xfer()
557 return denali_pio_read(denali, buf, size, page, raw); in denali_pio_xfer()
560 static int denali_dma_xfer(struct denali_nand_info *denali, void *buf, in denali_dma_xfer() argument
568 dma_addr = dma_map_single(denali->dev, buf, size, dir); in denali_dma_xfer()
569 if (dma_mapping_error(denali->dev, dma_addr)) { in denali_dma_xfer()
570 dev_dbg(denali->dev, "Failed to DMA-map buffer. Trying PIO.\n"); in denali_dma_xfer()
571 return denali_pio_xfer(denali, buf, size, page, raw, write); in denali_dma_xfer()
582 } else if (denali->caps & DENALI_CAP_HW_ECC_FIXUP) { in denali_dma_xfer()
590 iowrite32(DMA_ENABLE__FLAG, denali->reg + DMA_ENABLE); in denali_dma_xfer()
596 ioread32(denali->reg + DMA_ENABLE); in denali_dma_xfer()
598 denali_reset_irq(denali); in denali_dma_xfer()
599 denali->setup_dma(denali, dma_addr, page, write); in denali_dma_xfer()
601 irq_status = denali_wait_for_irq(denali, irq_mask); in denali_dma_xfer()
607 iowrite32(0, denali->reg + DMA_ENABLE); in denali_dma_xfer()
609 dma_unmap_single(denali->dev, dma_addr, size, dir); in denali_dma_xfer()
617 static int denali_data_xfer(struct denali_nand_info *denali, void *buf, in denali_data_xfer() argument
620 iowrite32(raw ? 0 : ECC_ENABLE__FLAG, denali->reg + ECC_ENABLE); in denali_data_xfer()
622 denali->reg + TRANSFER_SPARE_REG); in denali_data_xfer()
624 if (denali->dma_avail) in denali_data_xfer()
625 return denali_dma_xfer(denali, buf, size, page, raw, write); in denali_data_xfer()
627 return denali_pio_xfer(denali, buf, size, page, raw, write); in denali_data_xfer()
633 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_oob_xfer() local
642 int oob_skip = denali->oob_skip_bytes; in denali_oob_xfer()
693 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_read_page_raw() local
699 void *tmp_buf = denali->buf; in denali_read_page_raw()
700 int oob_skip = denali->oob_skip_bytes; in denali_read_page_raw()
704 ret = denali_data_xfer(denali, tmp_buf, size, page, 1, 0); in denali_read_page_raw()
776 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_write_oob() local
779 denali_reset_irq(denali); in denali_write_oob()
792 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_read_page() local
797 ret = denali_data_xfer(denali, buf, mtd->writesize, page, 0, 0); in denali_read_page()
801 if (denali->caps & DENALI_CAP_HW_ECC_FIXUP) in denali_read_page()
802 stat = denali_hw_ecc_fixup(mtd, denali, &uncor_ecc_flags); in denali_read_page()
804 stat = denali_sw_ecc_fixup(mtd, denali, &uncor_ecc_flags, buf); in denali_read_page()
824 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_write_page_raw() local
830 void *tmp_buf = denali->buf; in denali_write_page_raw()
831 int oob_skip = denali->oob_skip_bytes; in denali_write_page_raw()
896 return denali_data_xfer(denali, tmp_buf, size, page, 1, 1); in denali_write_page_raw()
902 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_write_page() local
904 return denali_data_xfer(denali, (void *)buf, mtd->writesize, in denali_write_page()
910 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_select_chip() local
912 denali->active_bank = chip; in denali_select_chip()
917 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_waitfunc() local
921 irq_status = denali_wait_for_irq(denali, INTR__INT_ACT); in denali_waitfunc()
928 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_erase() local
931 denali_reset_irq(denali); in denali_erase()
933 denali->host_write(denali, DENALI_MAP10 | DENALI_BANK(denali) | page, in denali_erase()
937 irq_status = denali_wait_for_irq(denali, in denali_erase()
946 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_setup_data_interface() local
959 t_x = DIV_ROUND_DOWN_ULL(1000000000000ULL, denali->clk_x_rate); in denali_setup_data_interface()
968 mult_x = DIV_ROUND_CLOSEST_ULL(denali->clk_x_rate, denali->clk_rate); in denali_setup_data_interface()
979 tmp = ioread32(denali->reg + ACC_CLKS); in denali_setup_data_interface()
982 iowrite32(tmp, denali->reg + ACC_CLKS); in denali_setup_data_interface()
988 tmp = ioread32(denali->reg + RE_2_WE); in denali_setup_data_interface()
991 iowrite32(tmp, denali->reg + RE_2_WE); in denali_setup_data_interface()
997 tmp = ioread32(denali->reg + RE_2_RE); in denali_setup_data_interface()
1000 iowrite32(tmp, denali->reg + RE_2_RE); in denali_setup_data_interface()
1011 tmp = ioread32(denali->reg + TWHR2_AND_WE_2_RE); in denali_setup_data_interface()
1014 iowrite32(tmp, denali->reg + TWHR2_AND_WE_2_RE); in denali_setup_data_interface()
1020 if (denali->revision < 0x0501) in denali_setup_data_interface()
1026 tmp = ioread32(denali->reg + TCWAW_AND_ADDR_2_DATA); in denali_setup_data_interface()
1029 iowrite32(tmp, denali->reg + TCWAW_AND_ADDR_2_DATA); in denali_setup_data_interface()
1036 tmp = ioread32(denali->reg + RDWR_EN_HI_CNT); in denali_setup_data_interface()
1039 iowrite32(tmp, denali->reg + RDWR_EN_HI_CNT); in denali_setup_data_interface()
1049 tmp = ioread32(denali->reg + RDWR_EN_LO_CNT); in denali_setup_data_interface()
1052 iowrite32(tmp, denali->reg + RDWR_EN_LO_CNT); in denali_setup_data_interface()
1060 tmp = ioread32(denali->reg + CS_SETUP_CNT); in denali_setup_data_interface()
1063 iowrite32(tmp, denali->reg + CS_SETUP_CNT); in denali_setup_data_interface()
1068 static void denali_reset_banks(struct denali_nand_info *denali) in denali_reset_banks() argument
1073 for (i = 0; i < denali->max_banks; i++) { in denali_reset_banks()
1074 denali->active_bank = i; in denali_reset_banks()
1076 denali_reset_irq(denali); in denali_reset_banks()
1079 denali->reg + DEVICE_RESET); in denali_reset_banks()
1081 irq_status = denali_wait_for_irq(denali, in denali_reset_banks()
1087 dev_dbg(denali->dev, "%d chips connected\n", i); in denali_reset_banks()
1088 denali->max_banks = i; in denali_reset_banks()
1091 static void denali_hw_init(struct denali_nand_info *denali) in denali_hw_init() argument
1097 if (!denali->revision) in denali_hw_init()
1098 denali->revision = swab16(ioread32(denali->reg + REVISION)); in denali_hw_init()
1104 denali->oob_skip_bytes = CONFIG_NAND_DENALI_SPARE_AREA_SKIP_BYTES; in denali_hw_init()
1105 iowrite32(denali->oob_skip_bytes, denali->reg + SPARE_AREA_SKIP_BYTES); in denali_hw_init()
1106 denali_detect_max_banks(denali); in denali_hw_init()
1107 iowrite32(0x0F, denali->reg + RB_PIN_ENABLED); in denali_hw_init()
1108 iowrite32(CHIP_EN_DONT_CARE__FLAG, denali->reg + CHIP_ENABLE_DONT_CARE); in denali_hw_init()
1110 iowrite32(0xffff, denali->reg + SPARE_AREA_MARKER); in denali_hw_init()
1121 struct denali_nand_info *denali) in denali_ecc_setup() argument
1123 int oobavail = mtd->oobsize - denali->oob_skip_bytes; in denali_ecc_setup()
1131 return nand_check_ecc_caps(chip, denali->ecc_caps, oobavail); in denali_ecc_setup()
1138 ret = nand_match_ecc_req(chip, denali->ecc_caps, oobavail); in denali_ecc_setup()
1144 return nand_maximize_ecc(chip, denali->ecc_caps, oobavail); in denali_ecc_setup()
1152 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_ooblayout_ecc() local
1158 oobregion->offset = denali->oob_skip_bytes; in denali_ooblayout_ecc()
1167 struct denali_nand_info *denali = mtd_to_denali(mtd); in denali_ooblayout_free() local
1173 oobregion->offset = chip->ecc.total + denali->oob_skip_bytes; in denali_ooblayout_free()
1184 static int denali_multidev_fixup(struct denali_nand_info *denali) in denali_multidev_fixup() argument
1186 struct nand_chip *chip = &denali->nand; in denali_multidev_fixup()
1196 denali->devs_per_cs = ioread32(denali->reg + DEVICES_CONNECTED); in denali_multidev_fixup()
1202 if (denali->devs_per_cs == 0) { in denali_multidev_fixup()
1203 denali->devs_per_cs = 1; in denali_multidev_fixup()
1204 iowrite32(1, denali->reg + DEVICES_CONNECTED); in denali_multidev_fixup()
1207 if (denali->devs_per_cs == 1) in denali_multidev_fixup()
1210 if (denali->devs_per_cs != 2) { in denali_multidev_fixup()
1211 dev_err(denali->dev, "unsupported number of devices %d\n", in denali_multidev_fixup()
1212 denali->devs_per_cs); in denali_multidev_fixup()
1230 denali->oob_skip_bytes <<= 1; in denali_multidev_fixup()
1235 int denali_init(struct denali_nand_info *denali) in denali_init() argument
1237 struct nand_chip *chip = &denali->nand; in denali_init()
1239 u32 features = ioread32(denali->reg + FEATURES); in denali_init()
1242 denali_hw_init(denali); in denali_init()
1244 denali_clear_irq_all(denali); in denali_init()
1246 denali_reset_banks(denali); in denali_init()
1248 denali->active_bank = DENALI_INVALID_BANK; in denali_init()
1250 chip->flash_node = dev_of_offset(denali->dev); in denali_init()
1264 denali->host_read = denali_indexed_read; in denali_init()
1265 denali->host_write = denali_indexed_write; in denali_init()
1267 denali->host_read = denali_direct_read; in denali_init()
1268 denali->host_write = denali_direct_write; in denali_init()
1272 if (denali->clk_x_rate) in denali_init()
1275 ret = nand_scan_ident(mtd, denali->max_banks, NULL); in denali_init()
1279 if (ioread32(denali->reg + FEATURES) & FEATURES__DMA) in denali_init()
1280 denali->dma_avail = 1; in denali_init()
1282 if (denali->dma_avail) { in denali_init()
1284 if (denali->caps & DENALI_CAP_DMA_64BIT) in denali_init()
1285 denali->setup_dma = denali_setup_dma64; in denali_init()
1287 denali->setup_dma = denali_setup_dma32; in denali_init()
1295 denali->nand.ecc.mode = NAND_ECC_HW_SYNDROME; in denali_init()
1300 ret = denali_ecc_setup(mtd, chip, denali); in denali_init()
1302 dev_err(denali->dev, "Failed to setup ECC settings.\n"); in denali_init()
1306 dev_dbg(denali->dev, in denali_init()
1312 denali->reg + ECC_CORRECTION); in denali_init()
1314 denali->reg + PAGES_PER_BLOCK); in denali_init()
1316 denali->reg + DEVICE_WIDTH); in denali_init()
1318 denali->reg + TWO_ROW_ADDR_CYCLES); in denali_init()
1319 iowrite32(mtd->writesize, denali->reg + DEVICE_MAIN_AREA_SIZE); in denali_init()
1320 iowrite32(mtd->oobsize, denali->reg + DEVICE_SPARE_AREA_SIZE); in denali_init()
1322 iowrite32(chip->ecc.size, denali->reg + CFG_DATA_BLOCK_SIZE); in denali_init()
1323 iowrite32(chip->ecc.size, denali->reg + CFG_LAST_DATA_BLOCK_SIZE); in denali_init()
1326 denali->reg + CFG_NUM_DATA_BLOCKS); in denali_init()
1330 nand_oob.eccbytes = denali->nand.ecc.bytes; in denali_init()
1331 denali->nand.ecc.layout = &nand_oob; in denali_init()
1349 ret = denali_multidev_fixup(denali); in denali_init()
1358 denali->buf = kmalloc(mtd->writesize + mtd->oobsize, GFP_KERNEL); in denali_init()
1359 if (!denali->buf) in denali_init()
1368 dev_err(denali->dev, "Failed to register MTD: %d\n", ret); in denali_init()
1374 kfree(denali->buf); in denali_init()