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()
959 struct atmel_nand_host *host = chip->priv; in atmel_nand_pmecc_write_page() local
964 if (!host->nfc || !host->nfc->write_by_sram) { in atmel_nand_pmecc_write_page()
965 pmecc_enable(host, NAND_ECC_WRITE); in atmel_nand_pmecc_write_page()
970 while ((pmecc_readl_relaxed(host->ecc, SR) & PMECC_SR_BUSY)) { in atmel_nand_pmecc_write_page()
972 dev_err(host->dev, "PMECC: Timeout to get ECC value.\n"); in atmel_nand_pmecc_write_page()
984 pmecc_readb_ecc_relaxed(host->ecc, i, j); in atmel_nand_pmecc_write_page()
995 struct atmel_nand_host *host = nand_chip->priv; in atmel_pmecc_core_init() local
999 pmecc_writel(host->ecc, CTRL, PMECC_CTRL_RST); in atmel_pmecc_core_init()
1000 pmecc_writel(host->ecc, CTRL, PMECC_CTRL_DISABLE); in atmel_pmecc_core_init()
1002 switch (host->pmecc_corr_cap) { in atmel_pmecc_core_init()
1020 if (host->pmecc_sector_size == 512) in atmel_pmecc_core_init()
1022 else if (host->pmecc_sector_size == 1024) in atmel_pmecc_core_init()
1042 pmecc_writel(host->ecc, CFG, val); in atmel_pmecc_core_init()
1045 pmecc_writel(host->ecc, SAREA, mtd->oobsize - 1); in atmel_pmecc_core_init()
1046 pmecc_writel(host->ecc, SADDR, ecc_layout->eccpos[0]); in atmel_pmecc_core_init()
1047 pmecc_writel(host->ecc, EADDR, in atmel_pmecc_core_init()
1050 pmecc_writel(host->ecc, CLK, 2); in atmel_pmecc_core_init()
1051 pmecc_writel(host->ecc, IDR, 0xff); in atmel_pmecc_core_init()
1052 pmecc_writel(host->ecc, CTRL, PMECC_CTRL_ENABLE); in atmel_pmecc_core_init()
1062 static int pmecc_choose_ecc(struct atmel_nand_host *host, in pmecc_choose_ecc() argument
1066 if (host->nand_chip.ecc_strength_ds) { in pmecc_choose_ecc()
1067 *cap = host->nand_chip.ecc_strength_ds; in pmecc_choose_ecc()
1068 *sector_size = host->nand_chip.ecc_step_ds; in pmecc_choose_ecc()
1069 dev_info(host->dev, "minimum ECC: %d bits in %d bytes\n", in pmecc_choose_ecc()
1074 dev_info(host->dev, "can't detect min. ECC, assume 2 bits in 512 bytes\n"); in pmecc_choose_ecc()
1078 if (host->pmecc_corr_cap == 0) { in pmecc_choose_ecc()
1081 host->pmecc_corr_cap = 2; in pmecc_choose_ecc()
1083 host->pmecc_corr_cap = 4; in pmecc_choose_ecc()
1085 host->pmecc_corr_cap = 8; in pmecc_choose_ecc()
1087 host->pmecc_corr_cap = 12; in pmecc_choose_ecc()
1089 host->pmecc_corr_cap = 24; in pmecc_choose_ecc()
1093 if (host->pmecc_sector_size == 0) { in pmecc_choose_ecc()
1096 host->pmecc_sector_size = 1024; in pmecc_choose_ecc()
1098 host->pmecc_sector_size = 512; in pmecc_choose_ecc()
1159 struct atmel_nand_host *host) in atmel_pmecc_nand_init_params() argument
1161 struct mtd_info *mtd = &host->mtd; in atmel_pmecc_nand_init_params()
1162 struct nand_chip *nand_chip = &host->nand_chip; in atmel_pmecc_nand_init_params()
1167 err_no = pmecc_choose_ecc(host, &cap, &sector_size); in atmel_pmecc_nand_init_params()
1169 dev_err(host->dev, "The NAND flash's ECC requirement are not support!"); in atmel_pmecc_nand_init_params()
1173 if (cap > host->pmecc_corr_cap || in atmel_pmecc_nand_init_params()
1174 sector_size != host->pmecc_sector_size) in atmel_pmecc_nand_init_params()
1175 …dev_info(host->dev, "WARNING: Be Caution! Using different PMECC parameters from Nand ONFI ECC reqi… in atmel_pmecc_nand_init_params()
1177 cap = host->pmecc_corr_cap; in atmel_pmecc_nand_init_params()
1178 sector_size = host->pmecc_sector_size; in atmel_pmecc_nand_init_params()
1179 host->pmecc_lookup_table_offset = (sector_size == 512) ? in atmel_pmecc_nand_init_params()
1180 host->pmecc_lookup_table_offset_512 : in atmel_pmecc_nand_init_params()
1181 host->pmecc_lookup_table_offset_1024; in atmel_pmecc_nand_init_params()
1183 dev_info(host->dev, "Initialize PMECC params, cap: %d, sector: %d\n", in atmel_pmecc_nand_init_params()
1188 dev_warn(host->dev, in atmel_pmecc_nand_init_params()
1194 host->ecc = devm_ioremap_resource(&pdev->dev, regs); in atmel_pmecc_nand_init_params()
1195 if (IS_ERR(host->ecc)) { in atmel_pmecc_nand_init_params()
1196 err_no = PTR_ERR(host->ecc); in atmel_pmecc_nand_init_params()
1201 host->pmerrloc_base = devm_ioremap_resource(&pdev->dev, regs_pmerr); in atmel_pmecc_nand_init_params()
1202 if (IS_ERR(host->pmerrloc_base)) { in atmel_pmecc_nand_init_params()
1203 err_no = PTR_ERR(host->pmerrloc_base); in atmel_pmecc_nand_init_params()
1207 if (!host->has_no_lookup_table) { in atmel_pmecc_nand_init_params()
1209 host->pmecc_rom_base = devm_ioremap_resource(&pdev->dev, in atmel_pmecc_nand_init_params()
1211 if (IS_ERR(host->pmecc_rom_base)) { in atmel_pmecc_nand_init_params()
1212 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()
1213 host->has_no_lookup_table = true; in atmel_pmecc_nand_init_params()
1217 if (host->has_no_lookup_table) { in atmel_pmecc_nand_init_params()
1219 galois_table = create_lookup_table(host->dev, sector_size); in atmel_pmecc_nand_init_params()
1221 dev_err(host->dev, "Failed to build a lookup table in runtime!\n"); in atmel_pmecc_nand_init_params()
1226 host->pmecc_rom_base = (void __iomem *)galois_table; in atmel_pmecc_nand_init_params()
1227 host->pmecc_lookup_table_offset = 0; in atmel_pmecc_nand_init_params()
1240 dev_err(host->dev, "pmecc sector size is bigger than the page size!\n"); in atmel_pmecc_nand_init_params()
1245 host->pmecc_degree = (sector_size == 512) ? in atmel_pmecc_nand_init_params()
1247 host->pmecc_cw_len = (1 << host->pmecc_degree) - 1; in atmel_pmecc_nand_init_params()
1248 host->pmecc_alpha_to = pmecc_get_alpha_to(host); in atmel_pmecc_nand_init_params()
1249 host->pmecc_index_of = host->pmecc_rom_base + in atmel_pmecc_nand_init_params()
1250 host->pmecc_lookup_table_offset; in atmel_pmecc_nand_init_params()
1259 dev_err(host->dev, "No room for ECC bytes\n"); in atmel_pmecc_nand_init_params()
1270 dev_warn(host->dev, in atmel_pmecc_nand_init_params()
1279 err_no = pmecc_data_alloc(host); in atmel_pmecc_nand_init_params()
1281 dev_err(host->dev, in atmel_pmecc_nand_init_params()
1311 struct atmel_nand_host *host = nand_chip->priv; in atmel_nand_calculate() local
1315 ecc_value = ecc_readl(host->ecc, PR); in atmel_nand_calculate()
1321 ecc_value = ecc_readl(host->ecc, NPR) & ATMEL_ECC_NPARITY; in atmel_nand_calculate()
1357 struct atmel_nand_host *host = chip->priv; in atmel_nand_read_page() local
1358 if (host->board.need_reset_workaround) in atmel_nand_read_page()
1359 ecc_writel(host->ecc, CR, ATMEL_ECC_RST); in atmel_nand_read_page()
1415 struct atmel_nand_host *host = nand_chip->priv; in atmel_nand_correct() local
1420 ecc_status = ecc_readl(host->ecc, SR); in atmel_nand_correct()
1427 ecc_bit = ecc_readl(host->ecc, PR) & ATMEL_ECC_BITADDR; in atmel_nand_correct()
1429 ecc_word = ecc_readl(host->ecc, PR) & ATMEL_ECC_WORDADDR; in atmel_nand_correct()
1444 dev_dbg(host->dev, "atmel_nand : multiple errors detected." in atmel_nand_correct()
1454 dev_dbg(host->dev, "atmel_nand : one bit error on ECC code." in atmel_nand_correct()
1459 dev_dbg(host->dev, "atmel_nand : one bit error on data." in atmel_nand_correct()
1471 dev_dbg(host->dev, "atmel_nand : error corrected\n"); in atmel_nand_correct()
1481 struct atmel_nand_host *host = nand_chip->priv; in atmel_nand_hwctl() local
1483 if (host->board.need_reset_workaround) in atmel_nand_hwctl()
1484 ecc_writel(host->ecc, CR, ATMEL_ECC_RST); in atmel_nand_hwctl()
1489 static int atmel_of_init_port(struct atmel_nand_host *host, in atmel_of_init_port() argument
1495 struct atmel_nand_data *board = &host->board; in atmel_of_init_port()
1498 host->caps = (struct atmel_nand_caps *) in atmel_of_init_port()
1499 of_match_device(atmel_nand_dt_ids, host->dev)->data; in atmel_of_init_port()
1503 dev_err(host->dev, "invalid addr-offset %u\n", val); in atmel_of_init_port()
1511 dev_err(host->dev, "invalid cmd-offset %u\n", val); in atmel_of_init_port()
1534 host->has_pmecc = of_property_read_bool(np, "atmel,has-pmecc"); in atmel_of_init_port()
1537 of_platform_populate(np, NULL, NULL, host->dev); in atmel_of_init_port()
1539 if (!(board->ecc_mode == NAND_ECC_HW) || !host->has_pmecc) in atmel_of_init_port()
1550 dev_err(host->dev, in atmel_of_init_port()
1555 host->pmecc_corr_cap = (u8)val; in atmel_of_init_port()
1560 dev_err(host->dev, in atmel_of_init_port()
1565 host->pmecc_sector_size = (u16)val; in atmel_of_init_port()
1570 …dev_err(host->dev, "Cannot get PMECC lookup table offset, will build a lookup table in runtime.\n"… in atmel_of_init_port()
1571 host->has_no_lookup_table = true; in atmel_of_init_port()
1576 dev_err(host->dev, "Invalid PMECC lookup table offset\n"); in atmel_of_init_port()
1579 host->pmecc_lookup_table_offset_512 = offset[0]; in atmel_of_init_port()
1580 host->pmecc_lookup_table_offset_1024 = offset[1]; in atmel_of_init_port()
1586 struct atmel_nand_host *host) in atmel_hw_nand_init_params() argument
1588 struct mtd_info *mtd = &host->mtd; in atmel_hw_nand_init_params()
1589 struct nand_chip *nand_chip = &host->nand_chip; in atmel_hw_nand_init_params()
1594 dev_err(host->dev, in atmel_hw_nand_init_params()
1600 host->ecc = devm_ioremap_resource(&pdev->dev, regs); in atmel_hw_nand_init_params()
1601 if (IS_ERR(host->ecc)) in atmel_hw_nand_init_params()
1602 return PTR_ERR(host->ecc); in atmel_hw_nand_init_params()
1611 ecc_writel(host->ecc, MR, ATMEL_ECC_PAGESIZE_528); in atmel_hw_nand_init_params()
1615 ecc_writel(host->ecc, MR, ATMEL_ECC_PAGESIZE_1056); in atmel_hw_nand_init_params()
1619 ecc_writel(host->ecc, MR, ATMEL_ECC_PAGESIZE_2112); in atmel_hw_nand_init_params()
1623 ecc_writel(host->ecc, MR, ATMEL_ECC_PAGESIZE_4224); in atmel_hw_nand_init_params()
1643 static inline u32 nfc_read_status(struct atmel_nand_host *host) in nfc_read_status() argument
1646 u32 nfc_status = nfc_readl(host->nfc->hsmc_regs, SR); in nfc_read_status()
1650 dev_err(host->dev, "NFC: Waiting Nand R/B Timeout Error\n"); in nfc_read_status()
1652 dev_err(host->dev, "NFC: Access Undefined Area Error\n"); in nfc_read_status()
1654 dev_err(host->dev, "NFC: Access memory While NFC is busy\n"); in nfc_read_status()
1656 dev_err(host->dev, "NFC: Access memory Size Error\n"); in nfc_read_status()
1665 struct atmel_nand_host *host = dev_id; in hsmc_interrupt() local
1669 status = nfc_read_status(host); in hsmc_interrupt()
1670 mask = nfc_readl(host->nfc->hsmc_regs, IMR); in hsmc_interrupt()
1674 complete(&host->nfc->comp_xfer_done); in hsmc_interrupt()
1675 nfc_writel(host->nfc->hsmc_regs, IDR, NFC_SR_XFR_DONE); in hsmc_interrupt()
1679 complete(&host->nfc->comp_ready); in hsmc_interrupt()
1680 nfc_writel(host->nfc->hsmc_regs, IDR, NFC_SR_RB_EDGE); in hsmc_interrupt()
1684 complete(&host->nfc->comp_cmd_done); in hsmc_interrupt()
1685 nfc_writel(host->nfc->hsmc_regs, IDR, NFC_SR_CMD_DONE); in hsmc_interrupt()
1693 static void nfc_prepare_interrupt(struct atmel_nand_host *host, u32 flag) in nfc_prepare_interrupt() argument
1696 init_completion(&host->nfc->comp_xfer_done); in nfc_prepare_interrupt()
1699 init_completion(&host->nfc->comp_ready); in nfc_prepare_interrupt()
1702 init_completion(&host->nfc->comp_cmd_done); in nfc_prepare_interrupt()
1705 nfc_writel(host->nfc->hsmc_regs, IER, flag); in nfc_prepare_interrupt()
1708 static int nfc_wait_interrupt(struct atmel_nand_host *host, u32 flag) in nfc_wait_interrupt() argument
1714 comp[index++] = &host->nfc->comp_xfer_done; in nfc_wait_interrupt()
1717 comp[index++] = &host->nfc->comp_ready; in nfc_wait_interrupt()
1720 comp[index++] = &host->nfc->comp_cmd_done; in nfc_wait_interrupt()
1723 dev_err(host->dev, "Unknown interrupt flag: 0x%08x\n", flag); in nfc_wait_interrupt()
1738 dev_err(host->dev, "Time out to wait for interrupt: 0x%08x\n", flag); in nfc_wait_interrupt()
1740 nfc_writel(host->nfc->hsmc_regs, IDR, flag); in nfc_wait_interrupt()
1744 static int nfc_send_command(struct atmel_nand_host *host, in nfc_send_command() argument
1751 dev_dbg(host->dev, in nfc_send_command()
1756 while (nfc_readl(host->nfc->hsmc_regs, SR) & NFC_SR_BUSY) { in nfc_send_command()
1758 dev_err(host->dev, in nfc_send_command()
1764 nfc_prepare_interrupt(host, flag); in nfc_send_command()
1765 nfc_writel(host->nfc->hsmc_regs, CYCLE0, cycle0); in nfc_send_command()
1766 nfc_cmd_addr1234_writel(cmd, addr, host->nfc->base_cmd_regs); in nfc_send_command()
1767 return nfc_wait_interrupt(host, flag); in nfc_send_command()
1774 struct atmel_nand_host *host = nand_chip->priv; in nfc_device_ready() local
1776 status = nfc_read_status(host); in nfc_device_ready()
1777 mask = nfc_readl(host->nfc->hsmc_regs, IMR); in nfc_device_ready()
1781 dev_err(host->dev, "Lost the interrupt flags: 0x%08x\n", in nfc_device_ready()
1790 struct atmel_nand_host *host = nand_chip->priv; in nfc_select_chip() local
1793 nfc_writel(host->nfc->hsmc_regs, CTRL, NFC_CTRL_DISABLE); in nfc_select_chip()
1795 nfc_writel(host->nfc->hsmc_regs, CTRL, NFC_CTRL_ENABLE); in nfc_select_chip()
1842 struct atmel_nand_host *host = chip->priv; in nfc_nand_command() local
1858 host->nfc->data_in_sram = NULL; in nfc_nand_command()
1860 dev_dbg(host->dev, "%s: cmd = 0x%02x, col = 0x%08x, page = 0x%08x\n", in nfc_nand_command()
1866 nfc_send_command(host, nfc_addr_cmd, addr1234, cycle0); in nfc_nand_command()
1873 dev_err(host->dev, in nfc_nand_command()
1900 if (host->nfc->use_nfc_sram) { in nfc_nand_command()
1907 if (chip->ecc.mode == NAND_ECC_HW && host->has_pmecc) in nfc_nand_command()
1908 pmecc_enable(host, NAND_ECC_READ); in nfc_nand_command()
1919 if (host->nfc->will_write_sram && command == NAND_CMD_SEQIN) in nfc_nand_command()
1931 nfc_send_command(host, nfc_addr_cmd, addr1234, cycle0); in nfc_nand_command()
1951 host->nfc->data_in_sram = host->nfc->sram_bank0 + in nfc_nand_command()
1952 nfc_get_sram_off(host); in nfc_nand_command()
1957 nfc_prepare_interrupt(host, NFC_SR_RB_EDGE); in nfc_nand_command()
1958 nfc_wait_interrupt(host, NFC_SR_RB_EDGE); in nfc_nand_command()
1968 struct atmel_nand_host *host = chip->priv; in nfc_sram_write_page() local
1969 void *sram = host->nfc->sram_bank0 + nfc_get_sram_off(host); in nfc_sram_write_page()
1985 cfg = nfc_readl(host->nfc->hsmc_regs, CFG); in nfc_sram_write_page()
1989 nfc_writel(host->nfc->hsmc_regs, CFG, cfg | NFC_CFG_WSPARE); in nfc_sram_write_page()
1991 nfc_writel(host->nfc->hsmc_regs, CFG, cfg & ~NFC_CFG_WSPARE); in nfc_sram_write_page()
1994 if (chip->ecc.mode == NAND_ECC_HW && host->has_pmecc) in nfc_sram_write_page()
2000 pmecc_enable(host, NAND_ECC_WRITE); in nfc_sram_write_page()
2002 host->nfc->will_write_sram = true; in nfc_sram_write_page()
2004 host->nfc->will_write_sram = false; in nfc_sram_write_page()
2028 struct atmel_nand_host *host = chip->priv; in nfc_sram_init() local
2052 dev_err(host->dev, "Unsupported page size for NFC.\n"); in nfc_sram_init()
2065 nfc_writel(host->nfc->hsmc_regs, CFG, cfg_nfc); in nfc_sram_init()
2067 host->nfc->will_write_sram = false; in nfc_sram_init()
2068 nfc_set_sram_bank(host, 0); in nfc_sram_init()
2071 if (host->nfc->write_by_sram) { in nfc_sram_init()
2072 if ((chip->ecc.mode == NAND_ECC_HW && host->has_pmecc) || in nfc_sram_init()
2076 host->nfc->write_by_sram = false; in nfc_sram_init()
2079 dev_info(host->dev, "Using NFC Sram read %s\n", in nfc_sram_init()
2080 host->nfc->write_by_sram ? "and write" : ""); in nfc_sram_init()
2090 struct atmel_nand_host *host; in atmel_nand_probe() local
2098 host = devm_kzalloc(&pdev->dev, sizeof(*host), GFP_KERNEL); in atmel_nand_probe()
2099 if (!host) in atmel_nand_probe()
2107 host->io_base = devm_ioremap_resource(&pdev->dev, mem); in atmel_nand_probe()
2108 if (IS_ERR(host->io_base)) { in atmel_nand_probe()
2109 res = PTR_ERR(host->io_base); in atmel_nand_probe()
2112 host->io_phys = (dma_addr_t)mem->start; in atmel_nand_probe()
2114 mtd = &host->mtd; in atmel_nand_probe()
2115 nand_chip = &host->nand_chip; in atmel_nand_probe()
2116 host->dev = &pdev->dev; in atmel_nand_probe()
2119 res = atmel_of_init_port(host, pdev->dev.of_node); in atmel_nand_probe()
2123 memcpy(&host->board, dev_get_platdata(&pdev->dev), in atmel_nand_probe()
2127 nand_chip->priv = host; /* link the private data structures */ in atmel_nand_probe()
2132 nand_chip->IO_ADDR_R = host->io_base; in atmel_nand_probe()
2133 nand_chip->IO_ADDR_W = host->io_base; in atmel_nand_probe()
2137 host->nfc = &nand_nfc; in atmel_nand_probe()
2146 dev_err(host->dev, "Cannot get HSMC irq!\n"); in atmel_nand_probe()
2152 0, "hsmc", host); in atmel_nand_probe()
2166 nand_chip->ecc.mode = host->board.ecc_mode; in atmel_nand_probe()
2169 if (host->board.bus_width_16) /* 16-bit bus width */ in atmel_nand_probe()
2175 platform_set_drvdata(pdev, host); in atmel_nand_probe()
2176 atmel_nand_enable(host); in atmel_nand_probe()
2178 if (gpio_is_valid(host->board.det_pin)) { in atmel_nand_probe()
2180 host->board.det_pin, "nand_det"); in atmel_nand_probe()
2184 host->board.det_pin); in atmel_nand_probe()
2188 res = gpio_direction_input(host->board.det_pin); in atmel_nand_probe()
2192 host->board.det_pin); in atmel_nand_probe()
2196 if (gpio_get_value(host->board.det_pin)) { in atmel_nand_probe()
2203 if (host->board.on_flash_bbt || on_flash_bbt) { in atmel_nand_probe()
2208 if (!host->board.has_dma) in atmel_nand_probe()
2216 host->dma_chan = dma_request_channel(mask, NULL, NULL); in atmel_nand_probe()
2217 if (!host->dma_chan) { in atmel_nand_probe()
2218 dev_err(host->dev, "Failed to request DMA channel\n"); in atmel_nand_probe()
2223 dev_info(host->dev, "Using %s for DMA transfers.\n", in atmel_nand_probe()
2224 dma_chan_name(host->dma_chan)); in atmel_nand_probe()
2226 dev_info(host->dev, "No DMA support for NAND access.\n"); in atmel_nand_probe()
2235 if (host->has_pmecc) in atmel_nand_probe()
2236 res = atmel_pmecc_nand_init_params(pdev, host); in atmel_nand_probe()
2238 res = atmel_hw_nand_init_params(pdev, host); in atmel_nand_probe()
2245 if (host->nfc && host->nfc->use_nfc_sram) { in atmel_nand_probe()
2248 host->nfc->use_nfc_sram = false; in atmel_nand_probe()
2249 dev_err(host->dev, "Disable use nfc sram for data transfer.\n"); in atmel_nand_probe()
2262 host->board.parts, host->board.num_parts); in atmel_nand_probe()
2267 if (host->has_pmecc && host->nand_chip.ecc.mode == NAND_ECC_HW) in atmel_nand_probe()
2268 pmecc_writel(host->ecc, CTRL, PMECC_CTRL_DISABLE); in atmel_nand_probe()
2272 atmel_nand_disable(host); in atmel_nand_probe()
2273 if (host->dma_chan) in atmel_nand_probe()
2274 dma_release_channel(host->dma_chan); in atmel_nand_probe()
2284 struct atmel_nand_host *host = platform_get_drvdata(pdev); in atmel_nand_remove() local
2285 struct mtd_info *mtd = &host->mtd; in atmel_nand_remove()
2289 atmel_nand_disable(host); in atmel_nand_remove()
2291 if (host->has_pmecc && host->nand_chip.ecc.mode == NAND_ECC_HW) { in atmel_nand_remove()
2292 pmecc_writel(host->ecc, CTRL, PMECC_CTRL_DISABLE); in atmel_nand_remove()
2293 pmerrloc_writel(host->pmerrloc_base, ELDIS, in atmel_nand_remove()
2297 if (host->dma_chan) in atmel_nand_remove()
2298 dma_release_channel(host->dma_chan); in atmel_nand_remove()