Lines Matching refs:cdns_ctrl
549 cadence_nand_dma_buf_ok(struct cdns_nand_ctrl *cdns_ctrl, const void *buf, in cadence_nand_dma_buf_ok() argument
552 u8 data_dma_width = cdns_ctrl->caps2.data_dma_width; in cadence_nand_dma_buf_ok()
559 static int cadence_nand_wait_for_value(struct cdns_nand_ctrl *cdns_ctrl, in cadence_nand_wait_for_value() argument
566 ret = readl_relaxed_poll_timeout(cdns_ctrl->reg + reg_offset, in cadence_nand_wait_for_value()
571 dev_err(cdns_ctrl->dev, in cadence_nand_wait_for_value()
579 static int cadence_nand_set_ecc_enable(struct cdns_nand_ctrl *cdns_ctrl, in cadence_nand_set_ecc_enable() argument
584 if (cadence_nand_wait_for_value(cdns_ctrl, CTRL_STATUS, in cadence_nand_set_ecc_enable()
589 reg = readl_relaxed(cdns_ctrl->reg + ECC_CONFIG_0); in cadence_nand_set_ecc_enable()
596 writel_relaxed(reg, cdns_ctrl->reg + ECC_CONFIG_0); in cadence_nand_set_ecc_enable()
601 static void cadence_nand_set_ecc_strength(struct cdns_nand_ctrl *cdns_ctrl, in cadence_nand_set_ecc_strength() argument
606 if (cdns_ctrl->curr_corr_str_idx == corr_str_idx) in cadence_nand_set_ecc_strength()
609 reg = readl_relaxed(cdns_ctrl->reg + ECC_CONFIG_0); in cadence_nand_set_ecc_strength()
612 writel_relaxed(reg, cdns_ctrl->reg + ECC_CONFIG_0); in cadence_nand_set_ecc_strength()
614 cdns_ctrl->curr_corr_str_idx = corr_str_idx; in cadence_nand_set_ecc_strength()
617 static int cadence_nand_get_ecc_strength_idx(struct cdns_nand_ctrl *cdns_ctrl, in cadence_nand_get_ecc_strength_idx() argument
623 if (cdns_ctrl->ecc_strengths[i] == strength) { in cadence_nand_get_ecc_strength_idx()
632 static int cadence_nand_set_skip_marker_val(struct cdns_nand_ctrl *cdns_ctrl, in cadence_nand_set_skip_marker_val() argument
637 if (cadence_nand_wait_for_value(cdns_ctrl, CTRL_STATUS, in cadence_nand_set_skip_marker_val()
642 reg = readl_relaxed(cdns_ctrl->reg + SKIP_BYTES_CONF); in cadence_nand_set_skip_marker_val()
647 writel_relaxed(reg, cdns_ctrl->reg + SKIP_BYTES_CONF); in cadence_nand_set_skip_marker_val()
652 static int cadence_nand_set_skip_bytes_conf(struct cdns_nand_ctrl *cdns_ctrl, in cadence_nand_set_skip_bytes_conf() argument
659 if (cadence_nand_wait_for_value(cdns_ctrl, CTRL_STATUS, in cadence_nand_set_skip_bytes_conf()
669 reg = readl_relaxed(cdns_ctrl->reg + SKIP_BYTES_CONF); in cadence_nand_set_skip_bytes_conf()
676 writel_relaxed(reg, cdns_ctrl->reg + SKIP_BYTES_CONF); in cadence_nand_set_skip_bytes_conf()
677 writel_relaxed(skip_bytes_offset, cdns_ctrl->reg + SKIP_BYTES_OFFSET); in cadence_nand_set_skip_bytes_conf()
683 static void cadence_nand_set_erase_detection(struct cdns_nand_ctrl *cdns_ctrl, in cadence_nand_set_erase_detection() argument
689 reg = readl_relaxed(cdns_ctrl->reg + ECC_CONFIG_0); in cadence_nand_set_erase_detection()
696 writel_relaxed(reg, cdns_ctrl->reg + ECC_CONFIG_0); in cadence_nand_set_erase_detection()
697 writel_relaxed(bitflips_threshold, cdns_ctrl->reg + ECC_CONFIG_1); in cadence_nand_set_erase_detection()
700 static int cadence_nand_set_access_width16(struct cdns_nand_ctrl *cdns_ctrl, in cadence_nand_set_access_width16() argument
705 if (cadence_nand_wait_for_value(cdns_ctrl, CTRL_STATUS, in cadence_nand_set_access_width16()
710 reg = readl_relaxed(cdns_ctrl->reg + COMMON_SET); in cadence_nand_set_access_width16()
716 writel_relaxed(reg, cdns_ctrl->reg + COMMON_SET); in cadence_nand_set_access_width16()
722 cadence_nand_clear_interrupt(struct cdns_nand_ctrl *cdns_ctrl, in cadence_nand_clear_interrupt() argument
725 writel_relaxed(irq_status->status, cdns_ctrl->reg + INTR_STATUS); in cadence_nand_clear_interrupt()
727 cdns_ctrl->reg + TRD_COMP_INT_STATUS); in cadence_nand_clear_interrupt()
729 cdns_ctrl->reg + TRD_ERR_INT_STATUS); in cadence_nand_clear_interrupt()
733 cadence_nand_read_int_status(struct cdns_nand_ctrl *cdns_ctrl, in cadence_nand_read_int_status() argument
736 irq_status->status = readl_relaxed(cdns_ctrl->reg + INTR_STATUS); in cadence_nand_read_int_status()
737 irq_status->trd_status = readl_relaxed(cdns_ctrl->reg in cadence_nand_read_int_status()
739 irq_status->trd_error = readl_relaxed(cdns_ctrl->reg in cadence_nand_read_int_status()
743 static u32 irq_detected(struct cdns_nand_ctrl *cdns_ctrl, in irq_detected() argument
746 cadence_nand_read_int_status(cdns_ctrl, irq_status); in irq_detected()
752 static void cadence_nand_reset_irq(struct cdns_nand_ctrl *cdns_ctrl) in cadence_nand_reset_irq() argument
756 spin_lock_irqsave(&cdns_ctrl->irq_lock, flags); in cadence_nand_reset_irq()
757 memset(&cdns_ctrl->irq_status, 0, sizeof(cdns_ctrl->irq_status)); in cadence_nand_reset_irq()
758 memset(&cdns_ctrl->irq_mask, 0, sizeof(cdns_ctrl->irq_mask)); in cadence_nand_reset_irq()
759 spin_unlock_irqrestore(&cdns_ctrl->irq_lock, flags); in cadence_nand_reset_irq()
768 struct cdns_nand_ctrl *cdns_ctrl = dev_id; in cadence_nand_isr() local
772 spin_lock(&cdns_ctrl->irq_lock); in cadence_nand_isr()
774 if (irq_detected(cdns_ctrl, &irq_status)) { in cadence_nand_isr()
777 cadence_nand_clear_interrupt(cdns_ctrl, &irq_status); in cadence_nand_isr()
779 cdns_ctrl->irq_status.status |= irq_status.status; in cadence_nand_isr()
780 cdns_ctrl->irq_status.trd_status |= irq_status.trd_status; in cadence_nand_isr()
781 cdns_ctrl->irq_status.trd_error |= irq_status.trd_error; in cadence_nand_isr()
783 complete(&cdns_ctrl->complete); in cadence_nand_isr()
787 spin_unlock(&cdns_ctrl->irq_lock); in cadence_nand_isr()
792 static void cadence_nand_set_irq_mask(struct cdns_nand_ctrl *cdns_ctrl, in cadence_nand_set_irq_mask() argument
796 cdns_ctrl->reg + INTR_ENABLE); in cadence_nand_set_irq_mask()
799 cdns_ctrl->reg + TRD_ERR_INT_STATUS_EN); in cadence_nand_set_irq_mask()
803 cadence_nand_wait_for_irq(struct cdns_nand_ctrl *cdns_ctrl, in cadence_nand_wait_for_irq() argument
810 time_left = wait_for_completion_timeout(&cdns_ctrl->complete, in cadence_nand_wait_for_irq()
813 *irq_status = cdns_ctrl->irq_status; in cadence_nand_wait_for_irq()
816 dev_err(cdns_ctrl->dev, "timeout occurred:\n"); in cadence_nand_wait_for_irq()
817 dev_err(cdns_ctrl->dev, "\tstatus = 0x%x, mask = 0x%x\n", in cadence_nand_wait_for_irq()
819 dev_err(cdns_ctrl->dev, in cadence_nand_wait_for_irq()
822 dev_err(cdns_ctrl->dev, in cadence_nand_wait_for_irq()
829 static int cadence_nand_generic_cmd_send(struct cdns_nand_ctrl *cdns_ctrl, in cadence_nand_generic_cmd_send() argument
839 if (cadence_nand_wait_for_value(cdns_ctrl, CTRL_STATUS, in cadence_nand_generic_cmd_send()
844 cadence_nand_reset_irq(cdns_ctrl); in cadence_nand_generic_cmd_send()
846 writel_relaxed(mini_ctrl_cmd_l, cdns_ctrl->reg + CMD_REG2); in cadence_nand_generic_cmd_send()
847 writel_relaxed(mini_ctrl_cmd_h, cdns_ctrl->reg + CMD_REG3); in cadence_nand_generic_cmd_send()
855 writel_relaxed(reg, cdns_ctrl->reg + CMD_REG0); in cadence_nand_generic_cmd_send()
861 static int cadence_nand_wait_on_sdma(struct cdns_nand_ctrl *cdns_ctrl, in cadence_nand_wait_on_sdma() argument
873 cadence_nand_set_irq_mask(cdns_ctrl, &irq_mask); in cadence_nand_wait_on_sdma()
874 cadence_nand_wait_for_irq(cdns_ctrl, &irq_mask, &irq_status); in cadence_nand_wait_on_sdma()
876 dev_err(cdns_ctrl->dev, "Timeout while waiting for SDMA\n"); in cadence_nand_wait_on_sdma()
881 *out_sdma_size = readl_relaxed(cdns_ctrl->reg + SDMA_SIZE); in cadence_nand_wait_on_sdma()
882 *out_sdma_trd = readl_relaxed(cdns_ctrl->reg + SDMA_TRD_NUM); in cadence_nand_wait_on_sdma()
886 dev_err(cdns_ctrl->dev, "SDMA error - irq_status %x\n", in cadence_nand_wait_on_sdma()
894 static void cadence_nand_get_caps(struct cdns_nand_ctrl *cdns_ctrl) in cadence_nand_get_caps() argument
898 reg = readl_relaxed(cdns_ctrl->reg + CTRL_FEATURES); in cadence_nand_get_caps()
900 cdns_ctrl->caps2.max_banks = 1 << FIELD_GET(CTRL_FEATURES_N_BANKS, reg); in cadence_nand_get_caps()
903 cdns_ctrl->caps2.data_dma_width = 8; in cadence_nand_get_caps()
905 cdns_ctrl->caps2.data_dma_width = 4; in cadence_nand_get_caps()
908 cdns_ctrl->caps2.data_control_supp = true; in cadence_nand_get_caps()
912 cdns_ctrl->caps2.is_phy_type_dll = true; in cadence_nand_get_caps()
917 cadence_nand_cdma_desc_prepare(struct cdns_nand_ctrl *cdns_ctrl, in cadence_nand_cdma_desc_prepare() argument
921 struct cadence_nand_cdma_desc *cdma_desc = cdns_ctrl->cdma_desc; in cadence_nand_cdma_desc_prepare()
927 if (cdns_ctrl->ctrl_rev >= 13) in cadence_nand_cdma_desc_prepare()
944 static u8 cadence_nand_check_desc_error(struct cdns_nand_ctrl *cdns_ctrl, in cadence_nand_check_desc_error() argument
954 dev_err(cdns_ctrl->dev, ":CDMA desc error flag detected.\n"); in cadence_nand_check_desc_error()
964 static int cadence_nand_cdma_finish(struct cdns_nand_ctrl *cdns_ctrl) in cadence_nand_cdma_finish() argument
966 struct cadence_nand_cdma_desc *desc_ptr = cdns_ctrl->cdma_desc; in cadence_nand_cdma_finish()
970 status = cadence_nand_check_desc_error(cdns_ctrl, in cadence_nand_cdma_finish()
972 dev_err(cdns_ctrl->dev, ":CDMA error %x\n", desc_ptr->status); in cadence_nand_cdma_finish()
976 dev_info(cdns_ctrl->dev, "DMA unsupported flag is set"); in cadence_nand_cdma_finish()
987 static int cadence_nand_cdma_send(struct cdns_nand_ctrl *cdns_ctrl, in cadence_nand_cdma_send() argument
994 status = cadence_nand_wait_for_value(cdns_ctrl, TRD_STATUS, in cadence_nand_cdma_send()
1000 cadence_nand_reset_irq(cdns_ctrl); in cadence_nand_cdma_send()
1001 reinit_completion(&cdns_ctrl->complete); in cadence_nand_cdma_send()
1003 writel_relaxed((u32)cdns_ctrl->dma_cdma_desc, in cadence_nand_cdma_send()
1004 cdns_ctrl->reg + CMD_REG2); in cadence_nand_cdma_send()
1005 writel_relaxed(0, cdns_ctrl->reg + CMD_REG3); in cadence_nand_cdma_send()
1012 writel_relaxed(reg, cdns_ctrl->reg + CMD_REG0); in cadence_nand_cdma_send()
1019 cadence_nand_cdma_send_and_wait(struct cdns_nand_ctrl *cdns_ctrl, in cadence_nand_cdma_send_and_wait() argument
1029 cadence_nand_set_irq_mask(cdns_ctrl, &irq_mask); in cadence_nand_cdma_send_and_wait()
1031 status = cadence_nand_cdma_send(cdns_ctrl, thread); in cadence_nand_cdma_send_and_wait()
1035 cadence_nand_wait_for_irq(cdns_ctrl, &irq_mask, &irq_status); in cadence_nand_cdma_send_and_wait()
1039 dev_err(cdns_ctrl->dev, "CDMA command timeout\n"); in cadence_nand_cdma_send_and_wait()
1043 dev_err(cdns_ctrl->dev, "CDMA command failed\n"); in cadence_nand_cdma_send_and_wait()
1076 static int cadence_nand_read_bch_caps(struct cdns_nand_ctrl *cdns_ctrl) in cadence_nand_read_bch_caps() argument
1078 struct nand_ecc_caps *ecc_caps = &cdns_ctrl->ecc_caps; in cadence_nand_read_bch_caps()
1082 reg = readl_relaxed(cdns_ctrl->reg + BCH_CFG_3); in cadence_nand_read_bch_caps()
1083 cdns_ctrl->bch_metadata_size = FIELD_GET(BCH_CFG_3_METADATA_SIZE, reg); in cadence_nand_read_bch_caps()
1084 if (cdns_ctrl->bch_metadata_size < 4) { in cadence_nand_read_bch_caps()
1085 dev_err(cdns_ctrl->dev, in cadence_nand_read_bch_caps()
1090 reg = readl_relaxed(cdns_ctrl->reg + BCH_CFG_0); in cadence_nand_read_bch_caps()
1091 cdns_ctrl->ecc_strengths[0] = FIELD_GET(BCH_CFG_0_CORR_CAP_0, reg); in cadence_nand_read_bch_caps()
1092 cdns_ctrl->ecc_strengths[1] = FIELD_GET(BCH_CFG_0_CORR_CAP_1, reg); in cadence_nand_read_bch_caps()
1093 cdns_ctrl->ecc_strengths[2] = FIELD_GET(BCH_CFG_0_CORR_CAP_2, reg); in cadence_nand_read_bch_caps()
1094 cdns_ctrl->ecc_strengths[3] = FIELD_GET(BCH_CFG_0_CORR_CAP_3, reg); in cadence_nand_read_bch_caps()
1096 reg = readl_relaxed(cdns_ctrl->reg + BCH_CFG_1); in cadence_nand_read_bch_caps()
1097 cdns_ctrl->ecc_strengths[4] = FIELD_GET(BCH_CFG_1_CORR_CAP_4, reg); in cadence_nand_read_bch_caps()
1098 cdns_ctrl->ecc_strengths[5] = FIELD_GET(BCH_CFG_1_CORR_CAP_5, reg); in cadence_nand_read_bch_caps()
1099 cdns_ctrl->ecc_strengths[6] = FIELD_GET(BCH_CFG_1_CORR_CAP_6, reg); in cadence_nand_read_bch_caps()
1100 cdns_ctrl->ecc_strengths[7] = FIELD_GET(BCH_CFG_1_CORR_CAP_7, reg); in cadence_nand_read_bch_caps()
1102 reg = readl_relaxed(cdns_ctrl->reg + BCH_CFG_2); in cadence_nand_read_bch_caps()
1103 cdns_ctrl->ecc_stepinfos[0].stepsize = in cadence_nand_read_bch_caps()
1106 cdns_ctrl->ecc_stepinfos[1].stepsize = in cadence_nand_read_bch_caps()
1111 if (cdns_ctrl->ecc_strengths[i] != 0) in cadence_nand_read_bch_caps()
1118 cdns_ctrl->ecc_stepinfos[i].nstrengths = nstrengths; in cadence_nand_read_bch_caps()
1119 cdns_ctrl->ecc_stepinfos[i].strengths = in cadence_nand_read_bch_caps()
1120 cdns_ctrl->ecc_strengths; in cadence_nand_read_bch_caps()
1122 if (cdns_ctrl->ecc_stepinfos[i].stepsize != 0) in cadence_nand_read_bch_caps()
1125 if (cdns_ctrl->ecc_stepinfos[i].stepsize > max_step_size) in cadence_nand_read_bch_caps()
1126 max_step_size = cdns_ctrl->ecc_stepinfos[i].stepsize; in cadence_nand_read_bch_caps()
1128 ecc_caps->stepinfos = &cdns_ctrl->ecc_stepinfos[0]; in cadence_nand_read_bch_caps()
1147 dev_err(cdns_ctrl->dev, in cadence_nand_read_bch_caps()
1157 static int cadence_nand_hw_init(struct cdns_nand_ctrl *cdns_ctrl) in cadence_nand_hw_init() argument
1162 status = cadence_nand_wait_for_value(cdns_ctrl, CTRL_STATUS, in cadence_nand_hw_init()
1168 reg = readl_relaxed(cdns_ctrl->reg + CTRL_VERSION); in cadence_nand_hw_init()
1169 cdns_ctrl->ctrl_rev = FIELD_GET(CTRL_VERSION_REV, reg); in cadence_nand_hw_init()
1171 dev_info(cdns_ctrl->dev, in cadence_nand_hw_init()
1176 writel_relaxed(0, cdns_ctrl->reg + MULTIPLANE_CFG); in cadence_nand_hw_init()
1177 writel_relaxed(0, cdns_ctrl->reg + CACHE_CFG); in cadence_nand_hw_init()
1180 writel_relaxed(0xFFFFFFFF, cdns_ctrl->reg + INTR_STATUS); in cadence_nand_hw_init()
1182 cadence_nand_get_caps(cdns_ctrl); in cadence_nand_hw_init()
1183 if (cadence_nand_read_bch_caps(cdns_ctrl)) in cadence_nand_hw_init()
1187 if (cdns_ctrl->caps2.data_dma_width == 8) { in cadence_nand_hw_init()
1188 dev_err(cdns_ctrl->dev, in cadence_nand_hw_init()
1199 status = cadence_nand_set_access_width16(cdns_ctrl, false); in cadence_nand_hw_init()
1214 struct cdns_nand_ctrl *cdns_ctrl = to_cdns_nand_ctrl(chip->controller); in cadence_nand_prepare_data_size() local
1222 if (cdns_ctrl->curr_trans_type == transfer_type) in cadence_nand_prepare_data_size()
1249 writel_relaxed(reg, cdns_ctrl->reg + TRAN_CFG_0); in cadence_nand_prepare_data_size()
1254 writel_relaxed(reg, cdns_ctrl->reg + TRAN_CFG_1); in cadence_nand_prepare_data_size()
1256 if (cdns_ctrl->caps2.data_control_supp) { in cadence_nand_prepare_data_size()
1257 reg = readl_relaxed(cdns_ctrl->reg + CONTROL_DATA_CTRL); in cadence_nand_prepare_data_size()
1260 writel_relaxed(reg, cdns_ctrl->reg + CONTROL_DATA_CTRL); in cadence_nand_prepare_data_size()
1263 cdns_ctrl->curr_trans_type = transfer_type; in cadence_nand_prepare_data_size()
1267 cadence_nand_cdma_transfer(struct cdns_nand_ctrl *cdns_ctrl, u8 chip_nr, in cadence_nand_cdma_transfer() argument
1282 cadence_nand_set_ecc_enable(cdns_ctrl, with_ecc); in cadence_nand_cdma_transfer()
1284 dma_buf = dma_map_single(cdns_ctrl->dev, buf, buf_size, dir); in cadence_nand_cdma_transfer()
1285 if (dma_mapping_error(cdns_ctrl->dev, dma_buf)) { in cadence_nand_cdma_transfer()
1286 dev_err(cdns_ctrl->dev, "Failed to map DMA buffer\n"); in cadence_nand_cdma_transfer()
1291 dma_ctrl_dat = dma_map_single(cdns_ctrl->dev, ctrl_dat, in cadence_nand_cdma_transfer()
1293 if (dma_mapping_error(cdns_ctrl->dev, dma_ctrl_dat)) { in cadence_nand_cdma_transfer()
1294 dma_unmap_single(cdns_ctrl->dev, dma_buf, in cadence_nand_cdma_transfer()
1296 dev_err(cdns_ctrl->dev, "Failed to map DMA buffer\n"); in cadence_nand_cdma_transfer()
1301 cadence_nand_cdma_desc_prepare(cdns_ctrl, chip_nr, page, in cadence_nand_cdma_transfer()
1304 status = cadence_nand_cdma_send_and_wait(cdns_ctrl, thread_nr); in cadence_nand_cdma_transfer()
1306 dma_unmap_single(cdns_ctrl->dev, dma_buf, in cadence_nand_cdma_transfer()
1310 dma_unmap_single(cdns_ctrl->dev, dma_ctrl_dat, in cadence_nand_cdma_transfer()
1315 return cadence_nand_cdma_finish(cdns_ctrl); in cadence_nand_cdma_transfer()
1318 static void cadence_nand_set_timings(struct cdns_nand_ctrl *cdns_ctrl, in cadence_nand_set_timings() argument
1322 cdns_ctrl->reg + ASYNC_TOGGLE_TIMINGS); in cadence_nand_set_timings()
1323 writel_relaxed(t->timings0, cdns_ctrl->reg + TIMINGS0); in cadence_nand_set_timings()
1324 writel_relaxed(t->timings1, cdns_ctrl->reg + TIMINGS1); in cadence_nand_set_timings()
1325 writel_relaxed(t->timings2, cdns_ctrl->reg + TIMINGS2); in cadence_nand_set_timings()
1327 if (cdns_ctrl->caps2.is_phy_type_dll) in cadence_nand_set_timings()
1328 writel_relaxed(t->dll_phy_ctrl, cdns_ctrl->reg + DLL_PHY_CTRL); in cadence_nand_set_timings()
1330 writel_relaxed(t->phy_ctrl, cdns_ctrl->reg + PHY_CTRL); in cadence_nand_set_timings()
1332 if (cdns_ctrl->caps2.is_phy_type_dll) { in cadence_nand_set_timings()
1333 writel_relaxed(0, cdns_ctrl->reg + PHY_TSEL); in cadence_nand_set_timings()
1334 writel_relaxed(2, cdns_ctrl->reg + PHY_DQ_TIMING); in cadence_nand_set_timings()
1336 cdns_ctrl->reg + PHY_DQS_TIMING); in cadence_nand_set_timings()
1338 cdns_ctrl->reg + PHY_GATE_LPBK_CTRL); in cadence_nand_set_timings()
1340 cdns_ctrl->reg + PHY_DLL_MASTER_CTRL); in cadence_nand_set_timings()
1341 writel_relaxed(0, cdns_ctrl->reg + PHY_DLL_SLAVE_CTRL); in cadence_nand_set_timings()
1347 struct cdns_nand_ctrl *cdns_ctrl = to_cdns_nand_ctrl(chip->controller); in cadence_nand_select_target() local
1350 if (chip == cdns_ctrl->selected_chip) in cadence_nand_select_target()
1353 if (cadence_nand_wait_for_value(cdns_ctrl, CTRL_STATUS, in cadence_nand_select_target()
1358 cadence_nand_set_timings(cdns_ctrl, &cdns_chip->timings); in cadence_nand_select_target()
1360 cadence_nand_set_ecc_strength(cdns_ctrl, in cadence_nand_select_target()
1363 cadence_nand_set_erase_detection(cdns_ctrl, true, in cadence_nand_select_target()
1366 cdns_ctrl->curr_trans_type = -1; in cadence_nand_select_target()
1367 cdns_ctrl->selected_chip = chip; in cadence_nand_select_target()
1374 struct cdns_nand_ctrl *cdns_ctrl = to_cdns_nand_ctrl(chip->controller); in cadence_nand_erase() local
1379 cadence_nand_cdma_desc_prepare(cdns_ctrl, in cadence_nand_erase()
1383 status = cadence_nand_cdma_send_and_wait(cdns_ctrl, thread_nr); in cadence_nand_erase()
1385 dev_err(cdns_ctrl->dev, "erase operation failed\n"); in cadence_nand_erase()
1389 status = cadence_nand_cdma_finish(cdns_ctrl); in cadence_nand_erase()
1399 struct cdns_nand_ctrl *cdns_ctrl = to_cdns_nand_ctrl(chip->controller); in cadence_nand_read_bbm() local
1405 cadence_nand_set_skip_bytes_conf(cdns_ctrl, 0, 0, 0); in cadence_nand_read_bbm()
1411 status = cadence_nand_cdma_transfer(cdns_ctrl, in cadence_nand_read_bbm()
1413 page, cdns_ctrl->buf, NULL, in cadence_nand_read_bbm()
1417 dev_err(cdns_ctrl->dev, "read BBM failed\n"); in cadence_nand_read_bbm()
1421 memcpy(buf + cdns_chip->bbm_offs, cdns_ctrl->buf, cdns_chip->bbm_len); in cadence_nand_read_bbm()
1430 struct cdns_nand_ctrl *cdns_ctrl = to_cdns_nand_ctrl(chip->controller); in cadence_nand_write_page() local
1440 cadence_nand_set_skip_bytes_conf(cdns_ctrl, cdns_chip->bbm_len, in cadence_nand_write_page()
1450 memset(cdns_ctrl->buf + mtd->writesize, 0xFF, in cadence_nand_write_page()
1454 cadence_nand_set_skip_marker_val(cdns_ctrl, marker_val); in cadence_nand_write_page()
1458 if (cadence_nand_dma_buf_ok(cdns_ctrl, buf, mtd->writesize) && in cadence_nand_write_page()
1459 cdns_ctrl->caps2.data_control_supp) { in cadence_nand_write_page()
1465 oob = cdns_ctrl->buf + mtd->writesize; in cadence_nand_write_page()
1467 status = cadence_nand_cdma_transfer(cdns_ctrl, in cadence_nand_write_page()
1474 dev_err(cdns_ctrl->dev, "write page failed\n"); in cadence_nand_write_page()
1483 memcpy(cdns_ctrl->buf + mtd->writesize, chip->oob_poi, in cadence_nand_write_page()
1487 memcpy(cdns_ctrl->buf, buf, mtd->writesize); in cadence_nand_write_page()
1491 return cadence_nand_cdma_transfer(cdns_ctrl, in cadence_nand_write_page()
1493 page, cdns_ctrl->buf, NULL, in cadence_nand_write_page()
1501 struct cdns_nand_ctrl *cdns_ctrl = to_cdns_nand_ctrl(chip->controller); in cadence_nand_write_oob() local
1504 memset(cdns_ctrl->buf, 0xFF, mtd->writesize); in cadence_nand_write_oob()
1506 return cadence_nand_write_page(chip, cdns_ctrl->buf, 1, page); in cadence_nand_write_oob()
1513 struct cdns_nand_ctrl *cdns_ctrl = to_cdns_nand_ctrl(chip->controller); in cadence_nand_write_page_raw() local
1521 void *tmp_buf = cdns_ctrl->buf; in cadence_nand_write_page_raw()
1538 cadence_nand_set_skip_bytes_conf(cdns_ctrl, 0, 0, 0); in cadence_nand_write_page_raw()
1602 return cadence_nand_cdma_transfer(cdns_ctrl, in cadence_nand_write_page_raw()
1604 page, cdns_ctrl->buf, NULL, in cadence_nand_write_page_raw()
1619 struct cdns_nand_ctrl *cdns_ctrl = to_cdns_nand_ctrl(chip->controller); in cadence_nand_read_page() local
1629 cadence_nand_set_skip_bytes_conf(cdns_ctrl, cdns_chip->bbm_len, in cadence_nand_read_page()
1637 if (cadence_nand_dma_buf_ok(cdns_ctrl, buf, mtd->writesize) && in cadence_nand_read_page()
1638 cdns_ctrl->caps2.data_control_supp) { in cadence_nand_read_page()
1644 oob = cdns_ctrl->buf + mtd->writesize; in cadence_nand_read_page()
1647 status = cadence_nand_cdma_transfer(cdns_ctrl, in cadence_nand_read_page()
1656 status = cadence_nand_cdma_transfer(cdns_ctrl, in cadence_nand_read_page()
1658 page, cdns_ctrl->buf, in cadence_nand_read_page()
1663 memcpy(buf, cdns_ctrl->buf, mtd->writesize); in cadence_nand_read_page()
1666 cdns_ctrl->buf + mtd->writesize, in cadence_nand_read_page()
1677 cdns_ctrl->cdma_desc->status); in cadence_nand_read_page()
1684 dev_err(cdns_ctrl->dev, "read page failed\n"); in cadence_nand_read_page()
1698 struct cdns_nand_ctrl *cdns_ctrl = to_cdns_nand_ctrl(chip->controller); in cadence_nand_read_oob() local
1700 return cadence_nand_read_page(chip, cdns_ctrl->buf, 1, page); in cadence_nand_read_oob()
1706 struct cdns_nand_ctrl *cdns_ctrl = to_cdns_nand_ctrl(chip->controller); in cadence_nand_read_page_raw() local
1714 void *tmp_buf = cdns_ctrl->buf; in cadence_nand_read_page_raw()
1722 cadence_nand_set_skip_bytes_conf(cdns_ctrl, 0, 0, 0); in cadence_nand_read_page_raw()
1725 status = cadence_nand_cdma_transfer(cdns_ctrl, in cadence_nand_read_page_raw()
1727 page, cdns_ctrl->buf, NULL, in cadence_nand_read_page_raw()
1737 dev_err(cdns_ctrl->dev, "read raw page failed\n"); in cadence_nand_read_page_raw()
1818 static int cadence_nand_slave_dma_transfer(struct cdns_nand_ctrl *cdns_ctrl, in cadence_nand_slave_dma_transfer() argument
1830 chan = cdns_ctrl->dmac; in cadence_nand_slave_dma_transfer()
1835 dev_err(cdns_ctrl->dev, "Failed to map DMA buffer\n"); in cadence_nand_slave_dma_transfer()
1840 src_dma = cdns_ctrl->io.iova_dma; in cadence_nand_slave_dma_transfer()
1844 dst_dma = cdns_ctrl->io.iova_dma; in cadence_nand_slave_dma_transfer()
1847 tx = dmaengine_prep_dma_memcpy(cdns_ctrl->dmac, dst_dma, src_dma, len, in cadence_nand_slave_dma_transfer()
1850 dev_err(cdns_ctrl->dev, "Failed to prepare DMA memcpy\n"); in cadence_nand_slave_dma_transfer()
1859 dev_err(cdns_ctrl->dev, "Failed to do DMA tx_submit\n"); in cadence_nand_slave_dma_transfer()
1863 dma_async_issue_pending(cdns_ctrl->dmac); in cadence_nand_slave_dma_transfer()
1874 dev_dbg(cdns_ctrl->dev, "Fall back to CPU I/O\n"); in cadence_nand_slave_dma_transfer()
1879 static int cadence_nand_read_buf(struct cdns_nand_ctrl *cdns_ctrl, in cadence_nand_read_buf() argument
1887 status = cadence_nand_wait_on_sdma(cdns_ctrl, &thread_nr, &sdma_size); in cadence_nand_read_buf()
1891 if (!cdns_ctrl->caps1->has_dma) { in cadence_nand_read_buf()
1892 u8 data_dma_width = cdns_ctrl->caps2.data_dma_width; in cadence_nand_read_buf()
1898 ioread32_rep(cdns_ctrl->io.virt, buf, len_in_words); in cadence_nand_read_buf()
1901 readsq(cdns_ctrl->io.virt, buf, len_in_words); in cadence_nand_read_buf()
1910 ioread32_rep(cdns_ctrl->io.virt, in cadence_nand_read_buf()
1911 cdns_ctrl->buf, in cadence_nand_read_buf()
1915 readsq(cdns_ctrl->io.virt, cdns_ctrl->buf, in cadence_nand_read_buf()
1920 memcpy(buf + read_bytes, cdns_ctrl->buf, in cadence_nand_read_buf()
1926 if (cadence_nand_dma_buf_ok(cdns_ctrl, buf, len)) { in cadence_nand_read_buf()
1927 status = cadence_nand_slave_dma_transfer(cdns_ctrl, buf, in cadence_nand_read_buf()
1928 cdns_ctrl->io.dma, in cadence_nand_read_buf()
1933 dev_warn(cdns_ctrl->dev, in cadence_nand_read_buf()
1938 status = cadence_nand_slave_dma_transfer(cdns_ctrl, cdns_ctrl->buf, in cadence_nand_read_buf()
1939 cdns_ctrl->io.dma, in cadence_nand_read_buf()
1943 dev_err(cdns_ctrl->dev, "Slave DMA transfer failed"); in cadence_nand_read_buf()
1947 memcpy(buf, cdns_ctrl->buf, len); in cadence_nand_read_buf()
1952 static int cadence_nand_write_buf(struct cdns_nand_ctrl *cdns_ctrl, in cadence_nand_write_buf() argument
1960 status = cadence_nand_wait_on_sdma(cdns_ctrl, &thread_nr, &sdma_size); in cadence_nand_write_buf()
1964 if (!cdns_ctrl->caps1->has_dma) { in cadence_nand_write_buf()
1965 u8 data_dma_width = cdns_ctrl->caps2.data_dma_width; in cadence_nand_write_buf()
1970 iowrite32_rep(cdns_ctrl->io.virt, buf, len_in_words); in cadence_nand_write_buf()
1973 writesq(cdns_ctrl->io.virt, buf, len_in_words); in cadence_nand_write_buf()
1981 memcpy(cdns_ctrl->buf, buf + written_bytes, in cadence_nand_write_buf()
1986 iowrite32_rep(cdns_ctrl->io.virt, in cadence_nand_write_buf()
1987 cdns_ctrl->buf, in cadence_nand_write_buf()
1991 writesq(cdns_ctrl->io.virt, cdns_ctrl->buf, in cadence_nand_write_buf()
1999 if (cadence_nand_dma_buf_ok(cdns_ctrl, buf, len)) { in cadence_nand_write_buf()
2000 status = cadence_nand_slave_dma_transfer(cdns_ctrl, (void *)buf, in cadence_nand_write_buf()
2001 cdns_ctrl->io.dma, in cadence_nand_write_buf()
2006 dev_warn(cdns_ctrl->dev, in cadence_nand_write_buf()
2011 memcpy(cdns_ctrl->buf, buf, len); in cadence_nand_write_buf()
2013 status = cadence_nand_slave_dma_transfer(cdns_ctrl, cdns_ctrl->buf, in cadence_nand_write_buf()
2014 cdns_ctrl->io.dma, in cadence_nand_write_buf()
2018 dev_err(cdns_ctrl->dev, "Slave DMA transfer failed"); in cadence_nand_write_buf()
2026 struct cdns_nand_ctrl *cdns_ctrl = to_cdns_nand_ctrl(chip->controller); in cadence_nand_force_byte_access() local
2037 return cadence_nand_set_access_width16(cdns_ctrl, !force_8bit); in cadence_nand_force_byte_access()
2043 struct cdns_nand_ctrl *cdns_ctrl = to_cdns_nand_ctrl(chip->controller); in cadence_nand_cmd_opcode() local
2060 ret = cadence_nand_generic_cmd_send(cdns_ctrl, in cadence_nand_cmd_opcode()
2064 dev_err(cdns_ctrl->dev, "send cmd %x failed\n", in cadence_nand_cmd_opcode()
2073 struct cdns_nand_ctrl *cdns_ctrl = to_cdns_nand_ctrl(chip->controller); in cadence_nand_cmd_address() local
2104 ret = cadence_nand_generic_cmd_send(cdns_ctrl, in cadence_nand_cmd_address()
2108 dev_err(cdns_ctrl->dev, "send address %llx failed\n", address); in cadence_nand_cmd_address()
2157 struct cdns_nand_ctrl *cdns_ctrl = to_cdns_nand_ctrl(chip->controller); in cadence_nand_cmd_data() local
2184 dev_err(cdns_ctrl->dev, in cadence_nand_cmd_data()
2190 ret = cadence_nand_generic_cmd_send(cdns_ctrl, in cadence_nand_cmd_data()
2194 dev_err(cdns_ctrl->dev, "send generic data cmd failed\n"); in cadence_nand_cmd_data()
2201 ret = cadence_nand_read_buf(cdns_ctrl, buf, len); in cadence_nand_cmd_data()
2205 ret = cadence_nand_write_buf(cdns_ctrl, buf, len); in cadence_nand_cmd_data()
2209 dev_err(cdns_ctrl->dev, "data transfer failed for generic command\n"); in cadence_nand_cmd_data()
2216 dev_err(cdns_ctrl->dev, in cadence_nand_cmd_data()
2229 struct cdns_nand_ctrl *cdns_ctrl = to_cdns_nand_ctrl(chip->controller); in cadence_nand_cmd_waitrdy() local
2234 status = cadence_nand_wait_for_value(cdns_ctrl, RBN_SETINGS, in cadence_nand_cmd_waitrdy()
2353 struct cdns_nand_ctrl *cdns_ctrl = to_cdns_nand_ctrl(chip->controller); in cadence_nand_setup_interface() local
2357 u32 board_delay = cdns_ctrl->board_delay; in cadence_nand_setup_interface()
2359 cdns_ctrl->nf_clk_rate); in cadence_nand_setup_interface()
2364 u32 if_skew = cdns_ctrl->caps1->if_skew; in cadence_nand_setup_interface()
2380 if (cdns_ctrl->caps2.is_phy_type_dll) in cadence_nand_setup_interface()
2511 dev_dbg(cdns_ctrl->dev, "ASYNC_TOGGLE_TIMINGS_SDR\t%x\n", reg); in cadence_nand_setup_interface()
2531 dev_dbg(cdns_ctrl->dev, "TIMINGS0_SDR\t%x\n", reg); in cadence_nand_setup_interface()
2552 dev_dbg(cdns_ctrl->dev, "TIMINGS1_SDR\t%x\n", reg); in cadence_nand_setup_interface()
2565 dev_dbg(cdns_ctrl->dev, "TIMINGS2_SDR\t%x\n", reg); in cadence_nand_setup_interface()
2567 if (cdns_ctrl->caps2.is_phy_type_dll) { in cadence_nand_setup_interface()
2577 dev_dbg(cdns_ctrl->dev, "DLL_PHY_CTRL_SDR\t%x\n", reg); in cadence_nand_setup_interface()
2602 if (!cdns_ctrl->caps2.is_phy_type_dll) in cadence_nand_setup_interface()
2610 dev_warn(cdns_ctrl->dev, in cadence_nand_setup_interface()
2615 if (cdns_ctrl->caps2.is_phy_type_dll) in cadence_nand_setup_interface()
2618 dev_dbg(cdns_ctrl->dev, "PHY_CTRL_REG_SDR\t%x\n", reg); in cadence_nand_setup_interface()
2620 if (cdns_ctrl->caps2.is_phy_type_dll) { in cadence_nand_setup_interface()
2621 dev_dbg(cdns_ctrl->dev, "PHY_TSEL_REG_SDR\t%x\n", 0); in cadence_nand_setup_interface()
2622 dev_dbg(cdns_ctrl->dev, "PHY_DQ_TIMING_REG_SDR\t%x\n", 2); in cadence_nand_setup_interface()
2623 dev_dbg(cdns_ctrl->dev, "PHY_DQS_TIMING_REG_SDR\t%x\n", in cadence_nand_setup_interface()
2628 dev_dbg(cdns_ctrl->dev, "PHY_GATE_LPBK_CTRL_REG_SDR\t%x\n", in cadence_nand_setup_interface()
2632 dev_dbg(cdns_ctrl->dev, "PHY_DLL_MASTER_CTRL_REG_SDR\t%lx\n", in cadence_nand_setup_interface()
2634 dev_dbg(cdns_ctrl->dev, "PHY_DLL_SLAVE_CTRL_REG_SDR\t%x\n", 0); in cadence_nand_setup_interface()
2642 struct cdns_nand_ctrl *cdns_ctrl = to_cdns_nand_ctrl(chip->controller); in cadence_nand_attach_chip() local
2649 ret = cadence_nand_set_access_width16(cdns_ctrl, true); in cadence_nand_attach_chip()
2666 &cdns_ctrl->ecc_caps, in cadence_nand_attach_chip()
2669 dev_err(cdns_ctrl->dev, "ECC configuration failed\n"); in cadence_nand_attach_chip()
2673 dev_dbg(cdns_ctrl->dev, in cadence_nand_attach_chip()
2684 if (cdns_chip->avail_oob_size > cdns_ctrl->bch_metadata_size) in cadence_nand_attach_chip()
2685 cdns_chip->avail_oob_size = cdns_ctrl->bch_metadata_size; in cadence_nand_attach_chip()
2691 ret = cadence_nand_get_ecc_strength_idx(cdns_ctrl, chip->ecc.strength); in cadence_nand_attach_chip()
2697 if (cadence_nand_wait_for_value(cdns_ctrl, CTRL_STATUS, in cadence_nand_attach_chip()
2702 cadence_nand_set_ecc_strength(cdns_ctrl, in cadence_nand_attach_chip()
2705 cadence_nand_set_erase_detection(cdns_ctrl, true, in cadence_nand_attach_chip()
2718 if ((mtd->writesize + mtd->oobsize) > cdns_ctrl->buf_size) in cadence_nand_attach_chip()
2719 cdns_ctrl->buf_size = mtd->writesize + mtd->oobsize; in cadence_nand_attach_chip()
2722 ret = dma_set_mask(cdns_ctrl->dev, DMA_BIT_MASK(32)); in cadence_nand_attach_chip()
2724 dev_err(cdns_ctrl->dev, "no usable DMA configuration\n"); in cadence_nand_attach_chip()
2739 static int cadence_nand_chip_init(struct cdns_nand_ctrl *cdns_ctrl, in cadence_nand_chip_init() argument
2750 dev_err(cdns_ctrl->dev, "missing/invalid reg property\n"); in cadence_nand_chip_init()
2755 cdns_chip = devm_kzalloc(cdns_ctrl->dev, sizeof(*cdns_chip) + in cadence_nand_chip_init()
2759 dev_err(cdns_ctrl->dev, "could not allocate chip structure\n"); in cadence_nand_chip_init()
2769 dev_err(cdns_ctrl->dev, in cadence_nand_chip_init()
2775 if (cs >= cdns_ctrl->caps2.max_banks) { in cadence_nand_chip_init()
2776 dev_err(cdns_ctrl->dev, in cadence_nand_chip_init()
2778 cs, cdns_ctrl->caps2.max_banks); in cadence_nand_chip_init()
2782 if (test_and_set_bit(cs, &cdns_ctrl->assigned_cs)) { in cadence_nand_chip_init()
2783 dev_err(cdns_ctrl->dev, in cadence_nand_chip_init()
2792 chip->controller = &cdns_ctrl->controller; in cadence_nand_chip_init()
2796 mtd->dev.parent = cdns_ctrl->dev; in cadence_nand_chip_init()
2806 dev_err(cdns_ctrl->dev, "could not scan the nand chip\n"); in cadence_nand_chip_init()
2812 dev_err(cdns_ctrl->dev, in cadence_nand_chip_init()
2818 list_add_tail(&cdns_chip->node, &cdns_ctrl->chips); in cadence_nand_chip_init()
2823 static void cadence_nand_chips_cleanup(struct cdns_nand_ctrl *cdns_ctrl) in cadence_nand_chips_cleanup() argument
2829 list_for_each_entry_safe(entry, temp, &cdns_ctrl->chips, node) { in cadence_nand_chips_cleanup()
2838 static int cadence_nand_chips_init(struct cdns_nand_ctrl *cdns_ctrl) in cadence_nand_chips_init() argument
2840 struct device_node *np = cdns_ctrl->dev->of_node; in cadence_nand_chips_init()
2841 int max_cs = cdns_ctrl->caps2.max_banks; in cadence_nand_chips_init()
2847 dev_err(cdns_ctrl->dev, in cadence_nand_chips_init()
2854 ret = cadence_nand_chip_init(cdns_ctrl, nand_np); in cadence_nand_chips_init()
2856 cadence_nand_chips_cleanup(cdns_ctrl); in cadence_nand_chips_init()
2865 cadence_nand_irq_cleanup(int irqnum, struct cdns_nand_ctrl *cdns_ctrl) in cadence_nand_irq_cleanup() argument
2868 writel_relaxed(INTR_ENABLE_INTR_EN, cdns_ctrl->reg + INTR_ENABLE); in cadence_nand_irq_cleanup()
2871 static int cadence_nand_init(struct cdns_nand_ctrl *cdns_ctrl) in cadence_nand_init() argument
2874 struct dma_device *dma_dev = cdns_ctrl->dmac->device; in cadence_nand_init()
2877 cdns_ctrl->cdma_desc = dma_alloc_coherent(cdns_ctrl->dev, in cadence_nand_init()
2878 sizeof(*cdns_ctrl->cdma_desc), in cadence_nand_init()
2879 &cdns_ctrl->dma_cdma_desc, in cadence_nand_init()
2881 if (!cdns_ctrl->dma_cdma_desc) in cadence_nand_init()
2884 cdns_ctrl->buf_size = SZ_16K; in cadence_nand_init()
2885 cdns_ctrl->buf = kmalloc(cdns_ctrl->buf_size, GFP_KERNEL); in cadence_nand_init()
2886 if (!cdns_ctrl->buf) { in cadence_nand_init()
2891 if (devm_request_irq(cdns_ctrl->dev, cdns_ctrl->irq, cadence_nand_isr, in cadence_nand_init()
2893 cdns_ctrl)) { in cadence_nand_init()
2894 dev_err(cdns_ctrl->dev, "Unable to allocate IRQ\n"); in cadence_nand_init()
2899 spin_lock_init(&cdns_ctrl->irq_lock); in cadence_nand_init()
2900 init_completion(&cdns_ctrl->complete); in cadence_nand_init()
2902 ret = cadence_nand_hw_init(cdns_ctrl); in cadence_nand_init()
2909 if (cdns_ctrl->caps1->has_dma) { in cadence_nand_init()
2910 cdns_ctrl->dmac = dma_request_chan_by_mask(&mask); in cadence_nand_init()
2911 if (IS_ERR(cdns_ctrl->dmac)) { in cadence_nand_init()
2912 ret = dev_err_probe(cdns_ctrl->dev, PTR_ERR(cdns_ctrl->dmac), in cadence_nand_init()
2918 cdns_ctrl->io.iova_dma = dma_map_resource(dma_dev->dev, cdns_ctrl->io.dma, in cadence_nand_init()
2919 cdns_ctrl->io.size, in cadence_nand_init()
2922 ret = dma_mapping_error(dma_dev->dev, cdns_ctrl->io.iova_dma); in cadence_nand_init()
2924 dev_err(cdns_ctrl->dev, "Failed to map I/O resource to DMA\n"); in cadence_nand_init()
2928 nand_controller_init(&cdns_ctrl->controller); in cadence_nand_init()
2929 INIT_LIST_HEAD(&cdns_ctrl->chips); in cadence_nand_init()
2931 cdns_ctrl->controller.ops = &cadence_nand_controller_ops; in cadence_nand_init()
2932 cdns_ctrl->curr_corr_str_idx = 0xFF; in cadence_nand_init()
2934 ret = cadence_nand_chips_init(cdns_ctrl); in cadence_nand_init()
2936 dev_err(cdns_ctrl->dev, "Failed to register MTD: %d\n", in cadence_nand_init()
2941 kfree(cdns_ctrl->buf); in cadence_nand_init()
2942 cdns_ctrl->buf = kzalloc(cdns_ctrl->buf_size, GFP_KERNEL); in cadence_nand_init()
2943 if (!cdns_ctrl->buf) { in cadence_nand_init()
2951 dma_unmap_resource(dma_dev->dev, cdns_ctrl->io.iova_dma, in cadence_nand_init()
2952 cdns_ctrl->io.size, DMA_BIDIRECTIONAL, 0); in cadence_nand_init()
2955 if (cdns_ctrl->dmac) in cadence_nand_init()
2956 dma_release_channel(cdns_ctrl->dmac); in cadence_nand_init()
2959 cadence_nand_irq_cleanup(cdns_ctrl->irq, cdns_ctrl); in cadence_nand_init()
2962 kfree(cdns_ctrl->buf); in cadence_nand_init()
2965 dma_free_coherent(cdns_ctrl->dev, sizeof(struct cadence_nand_cdma_desc), in cadence_nand_init()
2966 cdns_ctrl->cdma_desc, cdns_ctrl->dma_cdma_desc); in cadence_nand_init()
2972 static void cadence_nand_remove(struct cdns_nand_ctrl *cdns_ctrl) in cadence_nand_remove() argument
2974 cadence_nand_chips_cleanup(cdns_ctrl); in cadence_nand_remove()
2975 if (cdns_ctrl->dmac) in cadence_nand_remove()
2976 dma_unmap_resource(cdns_ctrl->dmac->device->dev, in cadence_nand_remove()
2977 cdns_ctrl->io.iova_dma, cdns_ctrl->io.size, in cadence_nand_remove()
2979 cadence_nand_irq_cleanup(cdns_ctrl->irq, cdns_ctrl); in cadence_nand_remove()
2980 kfree(cdns_ctrl->buf); in cadence_nand_remove()
2981 dma_free_coherent(cdns_ctrl->dev, sizeof(struct cadence_nand_cdma_desc), in cadence_nand_remove()
2982 cdns_ctrl->cdma_desc, cdns_ctrl->dma_cdma_desc); in cadence_nand_remove()
2984 if (cdns_ctrl->dmac) in cadence_nand_remove()
2985 dma_release_channel(cdns_ctrl->dmac); in cadence_nand_remove()
2989 struct cdns_nand_ctrl cdns_ctrl; member
3011 struct cdns_nand_ctrl *cdns_ctrl; in cadence_nand_dt_probe() local
3026 cdns_ctrl = &dt->cdns_ctrl; in cadence_nand_dt_probe()
3027 cdns_ctrl->caps1 = devdata; in cadence_nand_dt_probe()
3029 cdns_ctrl->dev = &ofdev->dev; in cadence_nand_dt_probe()
3030 cdns_ctrl->irq = platform_get_irq(ofdev, 0); in cadence_nand_dt_probe()
3031 if (cdns_ctrl->irq < 0) in cadence_nand_dt_probe()
3032 return cdns_ctrl->irq; in cadence_nand_dt_probe()
3034 dev_info(cdns_ctrl->dev, "IRQ: nr %d\n", cdns_ctrl->irq); in cadence_nand_dt_probe()
3036 cdns_ctrl->reg = devm_platform_ioremap_resource(ofdev, 0); in cadence_nand_dt_probe()
3037 if (IS_ERR(cdns_ctrl->reg)) in cadence_nand_dt_probe()
3038 return PTR_ERR(cdns_ctrl->reg); in cadence_nand_dt_probe()
3040 cdns_ctrl->io.virt = devm_platform_get_and_ioremap_resource(ofdev, 1, &res); in cadence_nand_dt_probe()
3041 if (IS_ERR(cdns_ctrl->io.virt)) in cadence_nand_dt_probe()
3042 return PTR_ERR(cdns_ctrl->io.virt); in cadence_nand_dt_probe()
3044 cdns_ctrl->io.dma = res->start; in cadence_nand_dt_probe()
3045 cdns_ctrl->io.size = resource_size(res); in cadence_nand_dt_probe()
3047 dt->clk = devm_clk_get(cdns_ctrl->dev, "nf_clk"); in cadence_nand_dt_probe()
3051 cdns_ctrl->nf_clk_rate = clk_get_rate(dt->clk); in cadence_nand_dt_probe()
3057 dev_info(cdns_ctrl->dev, in cadence_nand_dt_probe()
3061 cdns_ctrl->board_delay = val; in cadence_nand_dt_probe()
3063 ret = cadence_nand_init(cdns_ctrl); in cadence_nand_dt_probe()
3075 cadence_nand_remove(&dt->cdns_ctrl); in cadence_nand_dt_remove()