Lines Matching refs:host

165 static void atmel_nand_enable(struct atmel_nand_host *host)  in atmel_nand_enable()  argument
167 if (gpio_is_valid(host->board.enable_pin)) in atmel_nand_enable()
168 gpio_set_value(host->board.enable_pin, 0); in atmel_nand_enable()
174 static void atmel_nand_disable(struct atmel_nand_host *host) in atmel_nand_disable() argument
176 if (gpio_is_valid(host->board.enable_pin)) in atmel_nand_disable()
177 gpio_set_value(host->board.enable_pin, 1); in atmel_nand_disable()
186 struct atmel_nand_host *host = nand_chip->priv; in atmel_nand_cmd_ctrl() local
190 atmel_nand_enable(host); in atmel_nand_cmd_ctrl()
192 atmel_nand_disable(host); in atmel_nand_cmd_ctrl()
198 writeb(cmd, host->io_base + (1 << host->board.cle)); in atmel_nand_cmd_ctrl()
200 writeb(cmd, host->io_base + (1 << host->board.ale)); in atmel_nand_cmd_ctrl()
209 struct atmel_nand_host *host = nand_chip->priv; in atmel_nand_device_ready() local
211 return gpio_get_value(host->board.rdy_pin) ^ in atmel_nand_device_ready()
212 !!host->board.rdy_pin_active_low; in atmel_nand_device_ready()
219 struct atmel_nand_host *host = chip->priv; in atmel_nand_set_enable_ready_pins() local
222 if (gpio_is_valid(host->board.rdy_pin)) { in atmel_nand_set_enable_ready_pins()
223 res = devm_gpio_request(host->dev, in atmel_nand_set_enable_ready_pins()
224 host->board.rdy_pin, "nand_rdy"); in atmel_nand_set_enable_ready_pins()
226 dev_err(host->dev, in atmel_nand_set_enable_ready_pins()
228 host->board.rdy_pin); in atmel_nand_set_enable_ready_pins()
232 res = gpio_direction_input(host->board.rdy_pin); in atmel_nand_set_enable_ready_pins()
234 dev_err(host->dev, in atmel_nand_set_enable_ready_pins()
236 host->board.rdy_pin); in atmel_nand_set_enable_ready_pins()
243 if (gpio_is_valid(host->board.enable_pin)) { in atmel_nand_set_enable_ready_pins()
244 res = devm_gpio_request(host->dev, in atmel_nand_set_enable_ready_pins()
245 host->board.enable_pin, "nand_enable"); in atmel_nand_set_enable_ready_pins()
247 dev_err(host->dev, in atmel_nand_set_enable_ready_pins()
249 host->board.enable_pin); in atmel_nand_set_enable_ready_pins()
253 res = gpio_direction_output(host->board.enable_pin, 1); in atmel_nand_set_enable_ready_pins()
255 dev_err(host->dev, in atmel_nand_set_enable_ready_pins()
257 host->board.enable_pin); in atmel_nand_set_enable_ready_pins()
271 struct atmel_nand_host *host = nand_chip->priv; in atmel_read_buf8() local
273 if (host->nfc && host->nfc->use_nfc_sram && host->nfc->data_in_sram) { in atmel_read_buf8()
274 memcpy(buf, host->nfc->data_in_sram, len); in atmel_read_buf8()
275 host->nfc->data_in_sram += len; in atmel_read_buf8()
284 struct atmel_nand_host *host = nand_chip->priv; in atmel_read_buf16() local
286 if (host->nfc && host->nfc->use_nfc_sram && host->nfc->data_in_sram) { in atmel_read_buf16()
287 memcpy(buf, host->nfc->data_in_sram, len); in atmel_read_buf16()
288 host->nfc->data_in_sram += len; in atmel_read_buf16()
313 static int nfc_set_sram_bank(struct atmel_nand_host *host, unsigned int bank) in nfc_set_sram_bank() argument
321 if (host->mtd.writesize > 2048) in nfc_set_sram_bank()
323 nfc_writel(host->nfc->hsmc_regs, BANK, ATMEL_HSMC_NFC_BANK1); in nfc_set_sram_bank()
325 nfc_writel(host->nfc->hsmc_regs, BANK, ATMEL_HSMC_NFC_BANK0); in nfc_set_sram_bank()
331 static uint nfc_get_sram_off(struct atmel_nand_host *host) in nfc_get_sram_off() argument
333 if (nfc_readl(host->nfc->hsmc_regs, BANK) & ATMEL_HSMC_NFC_BANK1) in nfc_get_sram_off()
339 static dma_addr_t nfc_sram_phys(struct atmel_nand_host *host) in nfc_sram_phys() argument
341 if (nfc_readl(host->nfc->hsmc_regs, BANK) & ATMEL_HSMC_NFC_BANK1) in nfc_sram_phys()
342 return host->nfc->sram_bank0_phys + NFC_SRAM_BANK1_OFFSET; in nfc_sram_phys()
344 return host->nfc->sram_bank0_phys; in nfc_sram_phys()
356 struct atmel_nand_host *host = chip->priv; in atmel_nand_dma_op() local
360 struct atmel_nfc *nfc = host->nfc; in atmel_nand_dma_op()
365 dma_dev = host->dma_chan->device; in atmel_nand_dma_op()
371 dev_err(host->dev, "Failed to dma_map_single\n"); in atmel_nand_dma_op()
377 dma_src_addr = nfc_sram_phys(host) + (nfc->data_in_sram in atmel_nand_dma_op()
378 - (nfc->sram_bank0 + nfc_get_sram_off(host))); in atmel_nand_dma_op()
380 dma_src_addr = host->io_phys; in atmel_nand_dma_op()
387 dma_dst_addr = nfc_sram_phys(host); in atmel_nand_dma_op()
389 dma_dst_addr = host->io_phys; in atmel_nand_dma_op()
392 tx = dma_dev->device_prep_dma_memcpy(host->dma_chan, dma_dst_addr, in atmel_nand_dma_op()
395 dev_err(host->dev, "Failed to prepare DMA memcpy\n"); in atmel_nand_dma_op()
399 init_completion(&host->comp); in atmel_nand_dma_op()
401 tx->callback_param = &host->comp; in atmel_nand_dma_op()
405 dev_err(host->dev, "Failed to do DMA tx_submit\n"); in atmel_nand_dma_op()
409 dma_async_issue_pending(host->dma_chan); in atmel_nand_dma_op()
410 wait_for_completion(&host->comp); in atmel_nand_dma_op()
422 dev_dbg(host->dev, "Fall back to CPU I/O\n"); in atmel_nand_dma_op()
429 struct atmel_nand_host *host = chip->priv; in atmel_read_buf() local
436 if (host->board.bus_width_16) in atmel_read_buf()
445 struct atmel_nand_host *host = chip->priv; in atmel_write_buf() local
452 if (host->board.bus_width_16) in atmel_write_buf()
493 static void __iomem *pmecc_get_alpha_to(struct atmel_nand_host *host) in pmecc_get_alpha_to() argument
497 table_size = host->pmecc_sector_size == 512 ? in pmecc_get_alpha_to()
500 return host->pmecc_rom_base + host->pmecc_lookup_table_offset + in pmecc_get_alpha_to()
504 static int pmecc_data_alloc(struct atmel_nand_host *host) in pmecc_data_alloc() argument
506 const int cap = host->pmecc_corr_cap; in pmecc_data_alloc()
510 host->pmecc_partial_syn = devm_kzalloc(host->dev, size, GFP_KERNEL); in pmecc_data_alloc()
511 host->pmecc_si = devm_kzalloc(host->dev, size, GFP_KERNEL); in pmecc_data_alloc()
512 host->pmecc_lmu = devm_kzalloc(host->dev, in pmecc_data_alloc()
514 host->pmecc_smu = devm_kzalloc(host->dev, in pmecc_data_alloc()
518 host->pmecc_mu = devm_kzalloc(host->dev, size, GFP_KERNEL); in pmecc_data_alloc()
519 host->pmecc_dmu = devm_kzalloc(host->dev, size, GFP_KERNEL); in pmecc_data_alloc()
520 host->pmecc_delta = devm_kzalloc(host->dev, size, GFP_KERNEL); in pmecc_data_alloc()
522 if (!host->pmecc_partial_syn || in pmecc_data_alloc()
523 !host->pmecc_si || in pmecc_data_alloc()
524 !host->pmecc_lmu || in pmecc_data_alloc()
525 !host->pmecc_smu || in pmecc_data_alloc()
526 !host->pmecc_mu || in pmecc_data_alloc()
527 !host->pmecc_dmu || in pmecc_data_alloc()
528 !host->pmecc_delta) in pmecc_data_alloc()
537 struct atmel_nand_host *host = nand_chip->priv; in pmecc_gen_syndrome() local
542 for (i = 0; i < host->pmecc_corr_cap; i++) { in pmecc_gen_syndrome()
543 value = pmecc_readl_rem_relaxed(host->ecc, sector, i / 2); in pmecc_gen_syndrome()
547 host->pmecc_partial_syn[(2 * i) + 1] = (int16_t)value; in pmecc_gen_syndrome()
554 struct atmel_nand_host *host = nand_chip->priv; in pmecc_substitute() local
555 int16_t __iomem *alpha_to = host->pmecc_alpha_to; in pmecc_substitute()
556 int16_t __iomem *index_of = host->pmecc_index_of; in pmecc_substitute()
557 int16_t *partial_syn = host->pmecc_partial_syn; in pmecc_substitute()
558 const int cap = host->pmecc_corr_cap; in pmecc_substitute()
565 si = host->pmecc_si; in pmecc_substitute()
572 for (j = 0; j < host->pmecc_degree; j++) { in pmecc_substitute()
585 tmp = (tmp * 2) % host->pmecc_cw_len; in pmecc_substitute()
596 struct atmel_nand_host *host = nand_chip->priv; in pmecc_get_sigma() local
598 int16_t *lmu = host->pmecc_lmu; in pmecc_get_sigma()
599 int16_t *si = host->pmecc_si; in pmecc_get_sigma()
600 int *mu = host->pmecc_mu; in pmecc_get_sigma()
601 int *dmu = host->pmecc_dmu; /* Discrepancy */ in pmecc_get_sigma()
602 int *delta = host->pmecc_delta; /* Delta order */ in pmecc_get_sigma()
603 int cw_len = host->pmecc_cw_len; in pmecc_get_sigma()
604 const int16_t cap = host->pmecc_corr_cap; in pmecc_get_sigma()
606 int16_t __iomem *index_of = host->pmecc_index_of; in pmecc_get_sigma()
607 int16_t __iomem *alpha_to = host->pmecc_alpha_to; in pmecc_get_sigma()
610 int16_t *smu = host->pmecc_smu; in pmecc_get_sigma()
754 struct atmel_nand_host *host = nand_chip->priv; in pmecc_err_location() local
756 const int cap = host->pmecc_corr_cap; in pmecc_err_location()
758 int sector_size = host->pmecc_sector_size; in pmecc_err_location()
763 int16_t *smu = host->pmecc_smu; in pmecc_err_location()
765 pmerrloc_writel(host->pmerrloc_base, ELDIS, PMERRLOC_DISABLE); in pmecc_err_location()
767 for (i = 0; i <= host->pmecc_lmu[cap + 1] >> 1; i++) { in pmecc_err_location()
768 pmerrloc_writel_sigma_relaxed(host->pmerrloc_base, i, in pmecc_err_location()
777 pmerrloc_writel(host->pmerrloc_base, ELCFG, val); in pmecc_err_location()
778 pmerrloc_writel(host->pmerrloc_base, ELEN, in pmecc_err_location()
779 sector_size * 8 + host->pmecc_degree * cap); in pmecc_err_location()
782 while (!(pmerrloc_readl_relaxed(host->pmerrloc_base, ELISR) in pmecc_err_location()
785 dev_err(host->dev, "PMECC: Timeout to calculate error location.\n"); in pmecc_err_location()
791 roots_nbr = (pmerrloc_readl_relaxed(host->pmerrloc_base, ELISR) in pmecc_err_location()
794 if (roots_nbr == host->pmecc_lmu[cap + 1] >> 1) in pmecc_err_location()
806 struct atmel_nand_host *host = nand_chip->priv; in pmecc_correct_data() local
812 sector_size = host->pmecc_sector_size; in pmecc_correct_data()
815 tmp = pmerrloc_readl_el_relaxed(host->pmerrloc_base, i) - 1; in pmecc_correct_data()
826 pos = sector_num * host->pmecc_sector_size + byte_pos; in pmecc_correct_data()
827 dev_info(host->dev, "Bit flip in data area, byte_pos: %d, bit_pos: %d, 0x%02x -> 0x%02x\n", in pmecc_correct_data()
837 dev_info(host->dev, "Bit flip in OOB, oob_byte_pos: %d, bit_pos: %d, 0x%02x -> 0x%02x\n", in pmecc_correct_data()
852 struct atmel_nand_host *host = nand_chip->priv; in pmecc_correction() local
858 if (host->caps->pmecc_correct_erase_page) in pmecc_correction()
871 buf_pos = buf + i * host->pmecc_sector_size; in pmecc_correction()
879 dev_err(host->dev, "PMECC: Too many errors\n"); in pmecc_correction()
895 static void pmecc_enable(struct atmel_nand_host *host, int ecc_op) in pmecc_enable() argument
900 dev_err(host->dev, "atmel_nand: wrong pmecc operation type!"); in pmecc_enable()
904 pmecc_writel(host->ecc, CTRL, PMECC_CTRL_RST); in pmecc_enable()
905 pmecc_writel(host->ecc, CTRL, PMECC_CTRL_DISABLE); in pmecc_enable()
906 val = pmecc_readl_relaxed(host->ecc, CFG); in pmecc_enable()
909 pmecc_writel(host->ecc, CFG, (val & ~PMECC_CFG_WRITE_OP) in pmecc_enable()
912 pmecc_writel(host->ecc, CFG, (val | PMECC_CFG_WRITE_OP) in pmecc_enable()
915 pmecc_writel(host->ecc, CTRL, PMECC_CTRL_ENABLE); in pmecc_enable()
916 pmecc_writel(host->ecc, CTRL, PMECC_CTRL_DATA); in pmecc_enable()
922 struct atmel_nand_host *host = chip->priv; in atmel_nand_pmecc_read_page() local
930 if (!host->nfc || !host->nfc->use_nfc_sram) in atmel_nand_pmecc_read_page()
931 pmecc_enable(host, NAND_ECC_READ); in atmel_nand_pmecc_read_page()
937 while ((pmecc_readl_relaxed(host->ecc, SR) & PMECC_SR_BUSY)) { in atmel_nand_pmecc_read_page()
939 dev_err(host->dev, "PMECC: Timeout to get error status.\n"); in atmel_nand_pmecc_read_page()
945 stat = pmecc_readl_relaxed(host->ecc, ISR); in atmel_nand_pmecc_read_page()
960 struct atmel_nand_host *host = chip->priv; in atmel_nand_pmecc_write_page() local
965 if (!host->nfc || !host->nfc->write_by_sram) { in atmel_nand_pmecc_write_page()
966 pmecc_enable(host, NAND_ECC_WRITE); in atmel_nand_pmecc_write_page()
971 while ((pmecc_readl_relaxed(host->ecc, SR) & PMECC_SR_BUSY)) { in atmel_nand_pmecc_write_page()
973 dev_err(host->dev, "PMECC: Timeout to get ECC value.\n"); in atmel_nand_pmecc_write_page()
985 pmecc_readb_ecc_relaxed(host->ecc, i, j); in atmel_nand_pmecc_write_page()
996 struct atmel_nand_host *host = nand_chip->priv; in atmel_pmecc_core_init() local
1000 pmecc_writel(host->ecc, CTRL, PMECC_CTRL_RST); in atmel_pmecc_core_init()
1001 pmecc_writel(host->ecc, CTRL, PMECC_CTRL_DISABLE); in atmel_pmecc_core_init()
1003 switch (host->pmecc_corr_cap) { in atmel_pmecc_core_init()
1021 if (host->pmecc_sector_size == 512) in atmel_pmecc_core_init()
1023 else if (host->pmecc_sector_size == 1024) in atmel_pmecc_core_init()
1043 pmecc_writel(host->ecc, CFG, val); in atmel_pmecc_core_init()
1046 pmecc_writel(host->ecc, SAREA, mtd->oobsize - 1); in atmel_pmecc_core_init()
1047 pmecc_writel(host->ecc, SADDR, ecc_layout->eccpos[0]); in atmel_pmecc_core_init()
1048 pmecc_writel(host->ecc, EADDR, in atmel_pmecc_core_init()
1051 pmecc_writel(host->ecc, CLK, 2); in atmel_pmecc_core_init()
1052 pmecc_writel(host->ecc, IDR, 0xff); in atmel_pmecc_core_init()
1053 pmecc_writel(host->ecc, CTRL, PMECC_CTRL_ENABLE); in atmel_pmecc_core_init()
1063 static int pmecc_choose_ecc(struct atmel_nand_host *host, in pmecc_choose_ecc() argument
1067 if (host->nand_chip.ecc_strength_ds) { in pmecc_choose_ecc()
1068 *cap = host->nand_chip.ecc_strength_ds; in pmecc_choose_ecc()
1069 *sector_size = host->nand_chip.ecc_step_ds; in pmecc_choose_ecc()
1070 dev_info(host->dev, "minimum ECC: %d bits in %d bytes\n", in pmecc_choose_ecc()
1075 dev_info(host->dev, "can't detect min. ECC, assume 2 bits in 512 bytes\n"); in pmecc_choose_ecc()
1079 if (host->pmecc_corr_cap == 0) { in pmecc_choose_ecc()
1082 host->pmecc_corr_cap = 2; in pmecc_choose_ecc()
1084 host->pmecc_corr_cap = 4; in pmecc_choose_ecc()
1086 host->pmecc_corr_cap = 8; in pmecc_choose_ecc()
1088 host->pmecc_corr_cap = 12; in pmecc_choose_ecc()
1090 host->pmecc_corr_cap = 24; in pmecc_choose_ecc()
1094 if (host->pmecc_sector_size == 0) { in pmecc_choose_ecc()
1097 host->pmecc_sector_size = 1024; in pmecc_choose_ecc()
1099 host->pmecc_sector_size = 512; in pmecc_choose_ecc()
1160 struct atmel_nand_host *host) in atmel_pmecc_nand_init_params() argument
1162 struct mtd_info *mtd = &host->mtd; in atmel_pmecc_nand_init_params()
1163 struct nand_chip *nand_chip = &host->nand_chip; in atmel_pmecc_nand_init_params()
1168 err_no = pmecc_choose_ecc(host, &cap, &sector_size); in atmel_pmecc_nand_init_params()
1170 dev_err(host->dev, "The NAND flash's ECC requirement are not support!"); in atmel_pmecc_nand_init_params()
1174 if (cap > host->pmecc_corr_cap || in atmel_pmecc_nand_init_params()
1175 sector_size != host->pmecc_sector_size) in atmel_pmecc_nand_init_params()
1176 …dev_info(host->dev, "WARNING: Be Caution! Using different PMECC parameters from Nand ONFI ECC reqi… in atmel_pmecc_nand_init_params()
1178 cap = host->pmecc_corr_cap; in atmel_pmecc_nand_init_params()
1179 sector_size = host->pmecc_sector_size; in atmel_pmecc_nand_init_params()
1180 host->pmecc_lookup_table_offset = (sector_size == 512) ? in atmel_pmecc_nand_init_params()
1181 host->pmecc_lookup_table_offset_512 : in atmel_pmecc_nand_init_params()
1182 host->pmecc_lookup_table_offset_1024; in atmel_pmecc_nand_init_params()
1184 dev_info(host->dev, "Initialize PMECC params, cap: %d, sector: %d\n", in atmel_pmecc_nand_init_params()
1189 dev_warn(host->dev, in atmel_pmecc_nand_init_params()
1195 host->ecc = devm_ioremap_resource(&pdev->dev, regs); in atmel_pmecc_nand_init_params()
1196 if (IS_ERR(host->ecc)) { in atmel_pmecc_nand_init_params()
1197 err_no = PTR_ERR(host->ecc); in atmel_pmecc_nand_init_params()
1202 host->pmerrloc_base = devm_ioremap_resource(&pdev->dev, regs_pmerr); in atmel_pmecc_nand_init_params()
1203 if (IS_ERR(host->pmerrloc_base)) { in atmel_pmecc_nand_init_params()
1204 err_no = PTR_ERR(host->pmerrloc_base); in atmel_pmecc_nand_init_params()
1208 if (!host->has_no_lookup_table) { in atmel_pmecc_nand_init_params()
1210 host->pmecc_rom_base = devm_ioremap_resource(&pdev->dev, in atmel_pmecc_nand_init_params()
1212 if (IS_ERR(host->pmecc_rom_base)) { in atmel_pmecc_nand_init_params()
1213 dev_err(host->dev, "Can not get I/O resource for ROM, will build a lookup table in runtime!\n"); in atmel_pmecc_nand_init_params()
1214 host->has_no_lookup_table = true; in atmel_pmecc_nand_init_params()
1218 if (host->has_no_lookup_table) { in atmel_pmecc_nand_init_params()
1220 galois_table = create_lookup_table(host->dev, sector_size); in atmel_pmecc_nand_init_params()
1222 dev_err(host->dev, "Failed to build a lookup table in runtime!\n"); in atmel_pmecc_nand_init_params()
1227 host->pmecc_rom_base = (void __iomem *)galois_table; in atmel_pmecc_nand_init_params()
1228 host->pmecc_lookup_table_offset = 0; in atmel_pmecc_nand_init_params()
1241 dev_err(host->dev, "pmecc sector size is bigger than the page size!\n"); in atmel_pmecc_nand_init_params()
1246 host->pmecc_degree = (sector_size == 512) ? in atmel_pmecc_nand_init_params()
1248 host->pmecc_cw_len = (1 << host->pmecc_degree) - 1; in atmel_pmecc_nand_init_params()
1249 host->pmecc_alpha_to = pmecc_get_alpha_to(host); in atmel_pmecc_nand_init_params()
1250 host->pmecc_index_of = host->pmecc_rom_base + in atmel_pmecc_nand_init_params()
1251 host->pmecc_lookup_table_offset; in atmel_pmecc_nand_init_params()
1260 dev_err(host->dev, "No room for ECC bytes\n"); in atmel_pmecc_nand_init_params()
1271 dev_warn(host->dev, in atmel_pmecc_nand_init_params()
1280 err_no = pmecc_data_alloc(host); in atmel_pmecc_nand_init_params()
1282 dev_err(host->dev, in atmel_pmecc_nand_init_params()
1312 struct atmel_nand_host *host = nand_chip->priv; in atmel_nand_calculate() local
1316 ecc_value = ecc_readl(host->ecc, PR); in atmel_nand_calculate()
1322 ecc_value = ecc_readl(host->ecc, NPR) & ATMEL_ECC_NPARITY; in atmel_nand_calculate()
1358 struct atmel_nand_host *host = chip->priv; in atmel_nand_read_page() local
1359 if (host->board.need_reset_workaround) in atmel_nand_read_page()
1360 ecc_writel(host->ecc, CR, ATMEL_ECC_RST); in atmel_nand_read_page()
1416 struct atmel_nand_host *host = nand_chip->priv; in atmel_nand_correct() local
1421 ecc_status = ecc_readl(host->ecc, SR); in atmel_nand_correct()
1428 ecc_bit = ecc_readl(host->ecc, PR) & ATMEL_ECC_BITADDR; in atmel_nand_correct()
1430 ecc_word = ecc_readl(host->ecc, PR) & ATMEL_ECC_WORDADDR; in atmel_nand_correct()
1445 dev_dbg(host->dev, "atmel_nand : multiple errors detected." in atmel_nand_correct()
1455 dev_dbg(host->dev, "atmel_nand : one bit error on ECC code." in atmel_nand_correct()
1460 dev_dbg(host->dev, "atmel_nand : one bit error on data." in atmel_nand_correct()
1472 dev_dbg(host->dev, "atmel_nand : error corrected\n"); in atmel_nand_correct()
1482 struct atmel_nand_host *host = nand_chip->priv; in atmel_nand_hwctl() local
1484 if (host->board.need_reset_workaround) in atmel_nand_hwctl()
1485 ecc_writel(host->ecc, CR, ATMEL_ECC_RST); in atmel_nand_hwctl()
1490 static int atmel_of_init_port(struct atmel_nand_host *host, in atmel_of_init_port() argument
1496 struct atmel_nand_data *board = &host->board; in atmel_of_init_port()
1499 host->caps = (struct atmel_nand_caps *) in atmel_of_init_port()
1500 of_match_device(atmel_nand_dt_ids, host->dev)->data; in atmel_of_init_port()
1504 dev_err(host->dev, "invalid addr-offset %u\n", val); in atmel_of_init_port()
1512 dev_err(host->dev, "invalid cmd-offset %u\n", val); in atmel_of_init_port()
1535 host->has_pmecc = of_property_read_bool(np, "atmel,has-pmecc"); in atmel_of_init_port()
1538 of_platform_populate(np, NULL, NULL, host->dev); in atmel_of_init_port()
1540 if (!(board->ecc_mode == NAND_ECC_HW) || !host->has_pmecc) in atmel_of_init_port()
1551 dev_err(host->dev, in atmel_of_init_port()
1556 host->pmecc_corr_cap = (u8)val; in atmel_of_init_port()
1561 dev_err(host->dev, in atmel_of_init_port()
1566 host->pmecc_sector_size = (u16)val; in atmel_of_init_port()
1571 …dev_err(host->dev, "Cannot get PMECC lookup table offset, will build a lookup table in runtime.\n"… in atmel_of_init_port()
1572 host->has_no_lookup_table = true; in atmel_of_init_port()
1577 dev_err(host->dev, "Invalid PMECC lookup table offset\n"); in atmel_of_init_port()
1580 host->pmecc_lookup_table_offset_512 = offset[0]; in atmel_of_init_port()
1581 host->pmecc_lookup_table_offset_1024 = offset[1]; in atmel_of_init_port()
1587 struct atmel_nand_host *host) in atmel_hw_nand_init_params() argument
1589 struct mtd_info *mtd = &host->mtd; in atmel_hw_nand_init_params()
1590 struct nand_chip *nand_chip = &host->nand_chip; in atmel_hw_nand_init_params()
1595 dev_err(host->dev, in atmel_hw_nand_init_params()
1601 host->ecc = devm_ioremap_resource(&pdev->dev, regs); in atmel_hw_nand_init_params()
1602 if (IS_ERR(host->ecc)) in atmel_hw_nand_init_params()
1603 return PTR_ERR(host->ecc); in atmel_hw_nand_init_params()
1612 ecc_writel(host->ecc, MR, ATMEL_ECC_PAGESIZE_528); in atmel_hw_nand_init_params()
1616 ecc_writel(host->ecc, MR, ATMEL_ECC_PAGESIZE_1056); in atmel_hw_nand_init_params()
1620 ecc_writel(host->ecc, MR, ATMEL_ECC_PAGESIZE_2112); in atmel_hw_nand_init_params()
1624 ecc_writel(host->ecc, MR, ATMEL_ECC_PAGESIZE_4224); in atmel_hw_nand_init_params()
1644 static inline u32 nfc_read_status(struct atmel_nand_host *host) in nfc_read_status() argument
1647 u32 nfc_status = nfc_readl(host->nfc->hsmc_regs, SR); in nfc_read_status()
1651 dev_err(host->dev, "NFC: Waiting Nand R/B Timeout Error\n"); in nfc_read_status()
1653 dev_err(host->dev, "NFC: Access Undefined Area Error\n"); in nfc_read_status()
1655 dev_err(host->dev, "NFC: Access memory While NFC is busy\n"); in nfc_read_status()
1657 dev_err(host->dev, "NFC: Access memory Size Error\n"); in nfc_read_status()
1666 struct atmel_nand_host *host = dev_id; in hsmc_interrupt() local
1670 status = nfc_read_status(host); in hsmc_interrupt()
1671 mask = nfc_readl(host->nfc->hsmc_regs, IMR); in hsmc_interrupt()
1675 complete(&host->nfc->comp_xfer_done); in hsmc_interrupt()
1676 nfc_writel(host->nfc->hsmc_regs, IDR, NFC_SR_XFR_DONE); in hsmc_interrupt()
1680 complete(&host->nfc->comp_ready); in hsmc_interrupt()
1681 nfc_writel(host->nfc->hsmc_regs, IDR, NFC_SR_RB_EDGE); in hsmc_interrupt()
1685 complete(&host->nfc->comp_cmd_done); in hsmc_interrupt()
1686 nfc_writel(host->nfc->hsmc_regs, IDR, NFC_SR_CMD_DONE); in hsmc_interrupt()
1694 static void nfc_prepare_interrupt(struct atmel_nand_host *host, u32 flag) in nfc_prepare_interrupt() argument
1697 init_completion(&host->nfc->comp_xfer_done); in nfc_prepare_interrupt()
1700 init_completion(&host->nfc->comp_ready); in nfc_prepare_interrupt()
1703 init_completion(&host->nfc->comp_cmd_done); in nfc_prepare_interrupt()
1706 nfc_writel(host->nfc->hsmc_regs, IER, flag); in nfc_prepare_interrupt()
1709 static int nfc_wait_interrupt(struct atmel_nand_host *host, u32 flag) in nfc_wait_interrupt() argument
1715 comp[index++] = &host->nfc->comp_xfer_done; in nfc_wait_interrupt()
1718 comp[index++] = &host->nfc->comp_ready; in nfc_wait_interrupt()
1721 comp[index++] = &host->nfc->comp_cmd_done; in nfc_wait_interrupt()
1724 dev_err(host->dev, "Unknown interrupt flag: 0x%08x\n", flag); in nfc_wait_interrupt()
1739 dev_err(host->dev, "Time out to wait for interrupt: 0x%08x\n", flag); in nfc_wait_interrupt()
1741 nfc_writel(host->nfc->hsmc_regs, IDR, flag); in nfc_wait_interrupt()
1745 static int nfc_send_command(struct atmel_nand_host *host, in nfc_send_command() argument
1752 dev_dbg(host->dev, in nfc_send_command()
1757 while (nfc_readl(host->nfc->hsmc_regs, SR) & NFC_SR_BUSY) { in nfc_send_command()
1759 dev_err(host->dev, in nfc_send_command()
1765 nfc_prepare_interrupt(host, flag); in nfc_send_command()
1766 nfc_writel(host->nfc->hsmc_regs, CYCLE0, cycle0); in nfc_send_command()
1767 nfc_cmd_addr1234_writel(cmd, addr, host->nfc->base_cmd_regs); in nfc_send_command()
1768 return nfc_wait_interrupt(host, flag); in nfc_send_command()
1775 struct atmel_nand_host *host = nand_chip->priv; in nfc_device_ready() local
1777 status = nfc_read_status(host); in nfc_device_ready()
1778 mask = nfc_readl(host->nfc->hsmc_regs, IMR); in nfc_device_ready()
1782 dev_err(host->dev, "Lost the interrupt flags: 0x%08x\n", in nfc_device_ready()
1791 struct atmel_nand_host *host = nand_chip->priv; in nfc_select_chip() local
1794 nfc_writel(host->nfc->hsmc_regs, CTRL, NFC_CTRL_DISABLE); in nfc_select_chip()
1796 nfc_writel(host->nfc->hsmc_regs, CTRL, NFC_CTRL_ENABLE); in nfc_select_chip()
1843 struct atmel_nand_host *host = chip->priv; in nfc_nand_command() local
1859 host->nfc->data_in_sram = NULL; in nfc_nand_command()
1861 dev_dbg(host->dev, "%s: cmd = 0x%02x, col = 0x%08x, page = 0x%08x\n", in nfc_nand_command()
1867 nfc_send_command(host, nfc_addr_cmd, addr1234, cycle0); in nfc_nand_command()
1874 dev_err(host->dev, in nfc_nand_command()
1901 if (host->nfc->use_nfc_sram) { in nfc_nand_command()
1908 if (chip->ecc.mode == NAND_ECC_HW && host->has_pmecc) in nfc_nand_command()
1909 pmecc_enable(host, NAND_ECC_READ); in nfc_nand_command()
1920 if (host->nfc->will_write_sram && command == NAND_CMD_SEQIN) in nfc_nand_command()
1932 nfc_send_command(host, nfc_addr_cmd, addr1234, cycle0); in nfc_nand_command()
1952 host->nfc->data_in_sram = host->nfc->sram_bank0 + in nfc_nand_command()
1953 nfc_get_sram_off(host); in nfc_nand_command()
1958 nfc_prepare_interrupt(host, NFC_SR_RB_EDGE); in nfc_nand_command()
1959 nfc_wait_interrupt(host, NFC_SR_RB_EDGE); in nfc_nand_command()
1969 struct atmel_nand_host *host = chip->priv; in nfc_sram_write_page() local
1970 void *sram = host->nfc->sram_bank0 + nfc_get_sram_off(host); in nfc_sram_write_page()
1986 cfg = nfc_readl(host->nfc->hsmc_regs, CFG); in nfc_sram_write_page()
1990 nfc_writel(host->nfc->hsmc_regs, CFG, cfg | NFC_CFG_WSPARE); in nfc_sram_write_page()
1992 nfc_writel(host->nfc->hsmc_regs, CFG, cfg & ~NFC_CFG_WSPARE); in nfc_sram_write_page()
1995 if (chip->ecc.mode == NAND_ECC_HW && host->has_pmecc) in nfc_sram_write_page()
2001 pmecc_enable(host, NAND_ECC_WRITE); in nfc_sram_write_page()
2003 host->nfc->will_write_sram = true; in nfc_sram_write_page()
2005 host->nfc->will_write_sram = false; in nfc_sram_write_page()
2030 struct atmel_nand_host *host = chip->priv; in nfc_sram_init() local
2054 dev_err(host->dev, "Unsupported page size for NFC.\n"); in nfc_sram_init()
2067 nfc_writel(host->nfc->hsmc_regs, CFG, cfg_nfc); in nfc_sram_init()
2069 host->nfc->will_write_sram = false; in nfc_sram_init()
2070 nfc_set_sram_bank(host, 0); in nfc_sram_init()
2073 if (host->nfc->write_by_sram) { in nfc_sram_init()
2074 if ((chip->ecc.mode == NAND_ECC_HW && host->has_pmecc) || in nfc_sram_init()
2078 host->nfc->write_by_sram = false; in nfc_sram_init()
2081 dev_info(host->dev, "Using NFC Sram read %s\n", in nfc_sram_init()
2082 host->nfc->write_by_sram ? "and write" : ""); in nfc_sram_init()
2092 struct atmel_nand_host *host; in atmel_nand_probe() local
2100 host = devm_kzalloc(&pdev->dev, sizeof(*host), GFP_KERNEL); in atmel_nand_probe()
2101 if (!host) in atmel_nand_probe()
2109 host->io_base = devm_ioremap_resource(&pdev->dev, mem); in atmel_nand_probe()
2110 if (IS_ERR(host->io_base)) { in atmel_nand_probe()
2111 res = PTR_ERR(host->io_base); in atmel_nand_probe()
2114 host->io_phys = (dma_addr_t)mem->start; in atmel_nand_probe()
2116 mtd = &host->mtd; in atmel_nand_probe()
2117 nand_chip = &host->nand_chip; in atmel_nand_probe()
2118 host->dev = &pdev->dev; in atmel_nand_probe()
2121 res = atmel_of_init_port(host, pdev->dev.of_node); in atmel_nand_probe()
2125 memcpy(&host->board, dev_get_platdata(&pdev->dev), in atmel_nand_probe()
2129 nand_chip->priv = host; /* link the private data structures */ in atmel_nand_probe()
2134 nand_chip->IO_ADDR_R = host->io_base; in atmel_nand_probe()
2135 nand_chip->IO_ADDR_W = host->io_base; in atmel_nand_probe()
2139 host->nfc = &nand_nfc; in atmel_nand_probe()
2148 dev_err(host->dev, "Cannot get HSMC irq!\n"); in atmel_nand_probe()
2154 0, "hsmc", host); in atmel_nand_probe()
2168 nand_chip->ecc.mode = host->board.ecc_mode; in atmel_nand_probe()
2171 if (host->board.bus_width_16) /* 16-bit bus width */ in atmel_nand_probe()
2177 platform_set_drvdata(pdev, host); in atmel_nand_probe()
2178 atmel_nand_enable(host); in atmel_nand_probe()
2180 if (gpio_is_valid(host->board.det_pin)) { in atmel_nand_probe()
2182 host->board.det_pin, "nand_det"); in atmel_nand_probe()
2186 host->board.det_pin); in atmel_nand_probe()
2190 res = gpio_direction_input(host->board.det_pin); in atmel_nand_probe()
2194 host->board.det_pin); in atmel_nand_probe()
2198 if (gpio_get_value(host->board.det_pin)) { in atmel_nand_probe()
2205 if (host->board.on_flash_bbt || on_flash_bbt) { in atmel_nand_probe()
2210 if (!host->board.has_dma) in atmel_nand_probe()
2218 host->dma_chan = dma_request_channel(mask, NULL, NULL); in atmel_nand_probe()
2219 if (!host->dma_chan) { in atmel_nand_probe()
2220 dev_err(host->dev, "Failed to request DMA channel\n"); in atmel_nand_probe()
2225 dev_info(host->dev, "Using %s for DMA transfers.\n", in atmel_nand_probe()
2226 dma_chan_name(host->dma_chan)); in atmel_nand_probe()
2228 dev_info(host->dev, "No DMA support for NAND access.\n"); in atmel_nand_probe()
2237 if (host->has_pmecc) in atmel_nand_probe()
2238 res = atmel_pmecc_nand_init_params(pdev, host); in atmel_nand_probe()
2240 res = atmel_hw_nand_init_params(pdev, host); in atmel_nand_probe()
2247 if (host->nfc && host->nfc->use_nfc_sram) { in atmel_nand_probe()
2250 host->nfc->use_nfc_sram = false; in atmel_nand_probe()
2251 dev_err(host->dev, "Disable use nfc sram for data transfer.\n"); in atmel_nand_probe()
2264 host->board.parts, host->board.num_parts); in atmel_nand_probe()
2269 if (host->has_pmecc && host->nand_chip.ecc.mode == NAND_ECC_HW) in atmel_nand_probe()
2270 pmecc_writel(host->ecc, CTRL, PMECC_CTRL_DISABLE); in atmel_nand_probe()
2274 atmel_nand_disable(host); in atmel_nand_probe()
2275 if (host->dma_chan) in atmel_nand_probe()
2276 dma_release_channel(host->dma_chan); in atmel_nand_probe()
2286 struct atmel_nand_host *host = platform_get_drvdata(pdev); in atmel_nand_remove() local
2287 struct mtd_info *mtd = &host->mtd; in atmel_nand_remove()
2291 atmel_nand_disable(host); in atmel_nand_remove()
2293 if (host->has_pmecc && host->nand_chip.ecc.mode == NAND_ECC_HW) { in atmel_nand_remove()
2294 pmecc_writel(host->ecc, CTRL, PMECC_CTRL_DISABLE); in atmel_nand_remove()
2295 pmerrloc_writel(host->pmerrloc_base, ELDIS, in atmel_nand_remove()
2299 if (host->dma_chan) in atmel_nand_remove()
2300 dma_release_channel(host->dma_chan); in atmel_nand_remove()