Lines Matching refs:this

119 static int __gpmi_enable_clk(struct gpmi_nand_data *this, bool v)  in __gpmi_enable_clk()  argument
126 clk = this->resources.clock[i]; in __gpmi_enable_clk()
142 clk_disable_unprepare(this->resources.clock[i - 1]); in __gpmi_enable_clk()
146 static int gpmi_init(struct gpmi_nand_data *this) in gpmi_init() argument
148 struct resources *r = &this->resources; in gpmi_init()
151 ret = pm_runtime_resume_and_get(this->dev); in gpmi_init()
163 ret = gpmi_reset_block(r->bch_regs, GPMI_IS_MXS(this)); in gpmi_init()
189 pm_runtime_mark_last_busy(this->dev); in gpmi_init()
190 pm_runtime_put_autosuspend(this->dev); in gpmi_init()
195 static void gpmi_dump_info(struct gpmi_nand_data *this) in gpmi_dump_info() argument
197 struct resources *r = &this->resources; in gpmi_dump_info()
198 struct bch_geometry *geo = &this->bch_geometry; in gpmi_dump_info()
202 dev_err(this->dev, "Show GPMI registers :\n"); in gpmi_dump_info()
205 dev_err(this->dev, "offset 0x%.3x : 0x%.8x\n", i * 0x10, reg); in gpmi_dump_info()
209 dev_err(this->dev, "Show BCH registers :\n"); in gpmi_dump_info()
212 dev_err(this->dev, "offset 0x%.3x : 0x%.8x\n", i * 0x10, reg); in gpmi_dump_info()
214 dev_err(this->dev, "BCH Geometry :\n" in gpmi_dump_info()
241 static bool gpmi_check_ecc(struct gpmi_nand_data *this) in gpmi_check_ecc() argument
243 struct nand_chip *chip = &this->nand; in gpmi_check_ecc()
244 struct bch_geometry *geo = &this->bch_geometry; in gpmi_check_ecc()
252 if (GPMI_IS_MXS(this)) { in gpmi_check_ecc()
258 if (geo->ecc_strength > this->devdata->bch_max_ecc_strength) in gpmi_check_ecc()
268 static bool bbm_in_data_chunk(struct gpmi_nand_data *this, in bbm_in_data_chunk() argument
271 struct bch_geometry *geo = &this->bch_geometry; in bbm_in_data_chunk()
272 struct nand_chip *chip = &this->nand; in bbm_in_data_chunk()
277 dev_err(this->dev, in bbm_in_data_chunk()
292 dev_dbg(this->dev, "Set ecc to %d and bbm in chunk %d\n", in bbm_in_data_chunk()
306 static int set_geometry_by_ecc_info(struct gpmi_nand_data *this, in set_geometry_by_ecc_info() argument
310 struct bch_geometry *geo = &this->bch_geometry; in set_geometry_by_ecc_info()
311 struct nand_chip *chip = &this->nand; in set_geometry_by_ecc_info()
323 dev_err(this->dev, in set_geometry_by_ecc_info()
332 if (!gpmi_check_ecc(this)) in set_geometry_by_ecc_info()
337 dev_err(this->dev, in set_geometry_by_ecc_info()
405 if (!this->swap_block_mark) in set_geometry_by_ecc_info()
436 static inline int get_ecc_strength(struct gpmi_nand_data *this) in get_ecc_strength() argument
438 struct bch_geometry *geo = &this->bch_geometry; in get_ecc_strength()
439 struct mtd_info *mtd = nand_to_mtd(&this->nand); in get_ecc_strength()
449 static int set_geometry_for_large_oob(struct gpmi_nand_data *this) in set_geometry_for_large_oob() argument
451 struct bch_geometry *geo = &this->bch_geometry; in set_geometry_for_large_oob()
452 struct nand_chip *chip = &this->nand; in set_geometry_for_large_oob()
468 if (!gpmi_check_ecc(this)) { in set_geometry_for_large_oob()
469 dev_err(this->dev, in set_geometry_for_large_oob()
481 max_ecc = min(get_ecc_strength(this), in set_geometry_for_large_oob()
482 this->devdata->bch_max_ecc_strength); in set_geometry_for_large_oob()
490 if (bbm_in_data_chunk(this, &bbm_chunk)) in set_geometry_for_large_oob()
505 dev_err(this->dev, "unsupported NAND chip with new layout\n"); in set_geometry_for_large_oob()
531 if (!this->swap_block_mark) in set_geometry_for_large_oob()
544 dev_dbg(this->dev, "BCH Geometry :\n" in set_geometry_for_large_oob()
577 static int legacy_set_geometry(struct gpmi_nand_data *this) in legacy_set_geometry() argument
579 struct bch_geometry *geo = &this->bch_geometry; in legacy_set_geometry()
580 struct mtd_info *mtd = nand_to_mtd(&this->nand); in legacy_set_geometry()
607 geo->ecc_strength = get_ecc_strength(this); in legacy_set_geometry()
608 if (!gpmi_check_ecc(this)) { in legacy_set_geometry()
609 dev_err(this->dev, in legacy_set_geometry()
613 this->devdata->bch_max_ecc_strength); in legacy_set_geometry()
633 if (!this->swap_block_mark) in legacy_set_geometry()
691 static int common_nfc_set_geometry(struct gpmi_nand_data *this) in common_nfc_set_geometry() argument
693 struct nand_chip *chip = &this->nand; in common_nfc_set_geometry()
694 struct mtd_info *mtd = nand_to_mtd(&this->nand); in common_nfc_set_geometry()
700 use_minimun_ecc = of_property_read_bool(this->dev->of_node, in common_nfc_set_geometry()
706 dev_dbg(this->dev, "use legacy bch geometry\n"); in common_nfc_set_geometry()
707 err = legacy_set_geometry(this); in common_nfc_set_geometry()
714 dev_dbg(this->dev, "use large oob bch geometry\n"); in common_nfc_set_geometry()
715 err = set_geometry_for_large_oob(this); in common_nfc_set_geometry()
721 dev_dbg(this->dev, "use minimum ecc bch geometry\n"); in common_nfc_set_geometry()
722 err = set_geometry_by_ecc_info(this, requirements->strength, in common_nfc_set_geometry()
725 dev_err(this->dev, "none of the bch geometry setting works\n"); in common_nfc_set_geometry()
731 static int bch_set_geometry(struct gpmi_nand_data *this) in bch_set_geometry() argument
733 struct resources *r = &this->resources; in bch_set_geometry()
736 ret = common_nfc_set_geometry(this); in bch_set_geometry()
740 ret = pm_runtime_get_sync(this->dev); in bch_set_geometry()
742 pm_runtime_put_autosuspend(this->dev); in bch_set_geometry()
751 ret = gpmi_reset_block(r->bch_regs, GPMI_IS_MXS(this)); in bch_set_geometry()
760 pm_runtime_mark_last_busy(this->dev); in bch_set_geometry()
761 pm_runtime_put_autosuspend(this->dev); in bch_set_geometry()
840 static int gpmi_nfc_compute_timings(struct gpmi_nand_data *this, in gpmi_nfc_compute_timings() argument
843 struct gpmi_nfc_hardware_timing *hw = &this->hw; in gpmi_nfc_compute_timings()
844 struct resources *r = &this->resources; in gpmi_nfc_compute_timings()
845 unsigned int dll_threshold_ps = this->devdata->max_chain_delay; in gpmi_nfc_compute_timings()
875 dev_err(this->dev, "clock setting: expected %ld, got %ld\n", in gpmi_nfc_compute_timings()
925 static int gpmi_nfc_apply_timings(struct gpmi_nand_data *this) in gpmi_nfc_apply_timings() argument
927 struct gpmi_nfc_hardware_timing *hw = &this->hw; in gpmi_nfc_apply_timings()
928 struct resources *r = &this->resources; in gpmi_nfc_apply_timings()
937 if (GPMI_IS_MX6Q(this) || GPMI_IS_MX6SX(this)) in gpmi_nfc_apply_timings()
942 dev_err(this->dev, "cannot set clock rate to %lu Hz: %d\n", hw->clk_rate, ret); in gpmi_nfc_apply_timings()
946 if (GPMI_IS_MX6Q(this) || GPMI_IS_MX6SX(this)) { in gpmi_nfc_apply_timings()
976 struct gpmi_nand_data *this = nand_get_controller_data(chip); in gpmi_setup_interface() local
986 if (sdr->tRC_min <= 25000 && !GPMI_IS_MX28(this) && !GPMI_IS_MX6(this)) in gpmi_setup_interface()
994 ret = gpmi_nfc_compute_timings(this, sdr); in gpmi_setup_interface()
998 this->hw.must_apply_timings = true; in gpmi_setup_interface()
1004 static void gpmi_clear_bch(struct gpmi_nand_data *this) in gpmi_clear_bch() argument
1006 struct resources *r = &this->resources; in gpmi_clear_bch()
1010 static struct dma_chan *get_dma_chan(struct gpmi_nand_data *this) in get_dma_chan() argument
1013 return this->dma_chans[0]; in get_dma_chan()
1019 struct gpmi_nand_data *this = param; in dma_irq_callback() local
1020 struct completion *dma_c = &this->dma_done; in dma_irq_callback()
1027 struct gpmi_nand_data *this = cookie; in bch_irq() local
1029 gpmi_clear_bch(this); in bch_irq()
1030 complete(&this->bch_done); in bch_irq()
1034 static int gpmi_raw_len_to_len(struct gpmi_nand_data *this, int raw_len) in gpmi_raw_len_to_len() argument
1040 if (this->bch) in gpmi_raw_len_to_len()
1041 return ALIGN_DOWN(raw_len, this->bch_geometry.eccn_chunk_size); in gpmi_raw_len_to_len()
1047 static bool prepare_data_dma(struct gpmi_nand_data *this, const void *buf, in prepare_data_dma() argument
1052 int len = gpmi_raw_len_to_len(this, raw_len); in prepare_data_dma()
1057 ret = dma_map_sg(this->dev, sgl, 1, dr); in prepare_data_dma()
1066 sg_init_one(sgl, this->data_buffer_dma, len); in prepare_data_dma()
1068 if (dr == DMA_TO_DEVICE && buf != this->data_buffer_dma) in prepare_data_dma()
1069 memcpy(this->data_buffer_dma, buf, len); in prepare_data_dma()
1071 dma_map_sg(this->dev, sgl, 1, dr); in prepare_data_dma()
1093 struct gpmi_nand_data *this = nand_get_controller_data(chip); in gpmi_ooblayout_ecc() local
1094 struct bch_geometry *geo = &this->bch_geometry; in gpmi_ooblayout_ecc()
1109 struct gpmi_nand_data *this = nand_get_controller_data(chip); in gpmi_ooblayout_free() local
1110 struct bch_geometry *geo = &this->bch_geometry; in gpmi_ooblayout_free()
1181 static int acquire_register_block(struct gpmi_nand_data *this, in acquire_register_block() argument
1184 struct platform_device *pdev = this->pdev; in acquire_register_block()
1185 struct resources *res = &this->resources; in acquire_register_block()
1197 dev_err(this->dev, "unknown resource name : %s\n", res_name); in acquire_register_block()
1202 static int acquire_bch_irq(struct gpmi_nand_data *this, irq_handler_t irq_h) in acquire_bch_irq() argument
1204 struct platform_device *pdev = this->pdev; in acquire_bch_irq()
1212 err = devm_request_irq(this->dev, err, irq_h, 0, res_name, this); in acquire_bch_irq()
1214 dev_err(this->dev, "error requesting BCH IRQ\n"); in acquire_bch_irq()
1219 static void release_dma_channels(struct gpmi_nand_data *this) in release_dma_channels() argument
1223 if (this->dma_chans[i]) { in release_dma_channels()
1224 dma_release_channel(this->dma_chans[i]); in release_dma_channels()
1225 this->dma_chans[i] = NULL; in release_dma_channels()
1229 static int acquire_dma_channels(struct gpmi_nand_data *this) in acquire_dma_channels() argument
1231 struct platform_device *pdev = this->pdev; in acquire_dma_channels()
1238 ret = dev_err_probe(this->dev, PTR_ERR(dma_chan), in acquire_dma_channels()
1240 release_dma_channels(this); in acquire_dma_channels()
1242 this->dma_chans[0] = dma_chan; in acquire_dma_channels()
1248 static int gpmi_get_clks(struct gpmi_nand_data *this) in gpmi_get_clks() argument
1250 struct resources *r = &this->resources; in gpmi_get_clks()
1254 for (i = 0; i < this->devdata->clks_count; i++) { in gpmi_get_clks()
1255 clk = devm_clk_get(this->dev, this->devdata->clks[i]); in gpmi_get_clks()
1267 dev_dbg(this->dev, "failed in finding the clocks.\n"); in gpmi_get_clks()
1271 static int acquire_resources(struct gpmi_nand_data *this) in acquire_resources() argument
1275 ret = acquire_register_block(this, GPMI_NAND_GPMI_REGS_ADDR_RES_NAME); in acquire_resources()
1279 ret = acquire_register_block(this, GPMI_NAND_BCH_REGS_ADDR_RES_NAME); in acquire_resources()
1283 ret = acquire_bch_irq(this, bch_irq); in acquire_resources()
1287 ret = acquire_dma_channels(this); in acquire_resources()
1291 ret = gpmi_get_clks(this); in acquire_resources()
1297 release_dma_channels(this); in acquire_resources()
1302 static void release_resources(struct gpmi_nand_data *this) in release_resources() argument
1304 release_dma_channels(this); in release_resources()
1307 static void gpmi_free_dma_buffer(struct gpmi_nand_data *this) in gpmi_free_dma_buffer() argument
1309 struct device *dev = this->dev; in gpmi_free_dma_buffer()
1310 struct bch_geometry *geo = &this->bch_geometry; in gpmi_free_dma_buffer()
1312 if (this->auxiliary_virt && virt_addr_valid(this->auxiliary_virt)) in gpmi_free_dma_buffer()
1314 this->auxiliary_virt, in gpmi_free_dma_buffer()
1315 this->auxiliary_phys); in gpmi_free_dma_buffer()
1316 kfree(this->data_buffer_dma); in gpmi_free_dma_buffer()
1317 kfree(this->raw_buffer); in gpmi_free_dma_buffer()
1319 this->data_buffer_dma = NULL; in gpmi_free_dma_buffer()
1320 this->raw_buffer = NULL; in gpmi_free_dma_buffer()
1324 static int gpmi_alloc_dma_buffer(struct gpmi_nand_data *this) in gpmi_alloc_dma_buffer() argument
1326 struct bch_geometry *geo = &this->bch_geometry; in gpmi_alloc_dma_buffer()
1327 struct device *dev = this->dev; in gpmi_alloc_dma_buffer()
1328 struct mtd_info *mtd = nand_to_mtd(&this->nand); in gpmi_alloc_dma_buffer()
1338 this->data_buffer_dma = kzalloc(mtd->writesize ?: PAGE_SIZE, in gpmi_alloc_dma_buffer()
1340 if (this->data_buffer_dma == NULL) in gpmi_alloc_dma_buffer()
1343 this->auxiliary_virt = dma_alloc_coherent(dev, geo->auxiliary_size, in gpmi_alloc_dma_buffer()
1344 &this->auxiliary_phys, GFP_DMA); in gpmi_alloc_dma_buffer()
1345 if (!this->auxiliary_virt) in gpmi_alloc_dma_buffer()
1348 this->raw_buffer = kzalloc((mtd->writesize ?: PAGE_SIZE) + mtd->oobsize, GFP_KERNEL); in gpmi_alloc_dma_buffer()
1349 if (!this->raw_buffer) in gpmi_alloc_dma_buffer()
1355 gpmi_free_dma_buffer(this); in gpmi_alloc_dma_buffer()
1364 static void block_mark_swapping(struct gpmi_nand_data *this, in block_mark_swapping() argument
1367 struct bch_geometry *nfc_geo = &this->bch_geometry; in block_mark_swapping()
1375 if (!this->swap_block_mark) in block_mark_swapping()
1410 struct gpmi_nand_data *this = nand_get_controller_data(chip); in gpmi_count_bitflips() local
1411 struct bch_geometry *nfc_geo = &this->bch_geometry; in gpmi_count_bitflips()
1418 status = this->auxiliary_virt + ALIGN(meta, 4); in gpmi_count_bitflips()
1426 u8 *eccbuf = this->raw_buffer; in gpmi_count_bitflips()
1473 this->auxiliary_virt, in gpmi_count_bitflips()
1503 static void gpmi_bch_layout_std(struct gpmi_nand_data *this) in gpmi_bch_layout_std() argument
1505 struct bch_geometry *geo = &this->bch_geometry; in gpmi_bch_layout_std()
1511 this->bch_flashlayout0 = in gpmi_bch_layout_std()
1514 BF_BCH_FLASH0LAYOUT0_ECC0(ecc_strength, this) | in gpmi_bch_layout_std()
1515 BF_BCH_FLASH0LAYOUT0_GF(gf_len, this) | in gpmi_bch_layout_std()
1516 BF_BCH_FLASH0LAYOUT0_DATA0_SIZE(block0_size, this); in gpmi_bch_layout_std()
1518 this->bch_flashlayout1 = in gpmi_bch_layout_std()
1520 BF_BCH_FLASH0LAYOUT1_ECCN(ecc_strength, this) | in gpmi_bch_layout_std()
1521 BF_BCH_FLASH0LAYOUT1_GF(gf_len, this) | in gpmi_bch_layout_std()
1522 BF_BCH_FLASH0LAYOUT1_DATAN_SIZE(blockn_size, this); in gpmi_bch_layout_std()
1528 struct gpmi_nand_data *this = nand_get_controller_data(chip); in gpmi_ecc_read_page() local
1530 struct bch_geometry *geo = &this->bch_geometry; in gpmi_ecc_read_page()
1534 gpmi_bch_layout_std(this); in gpmi_ecc_read_page()
1535 this->bch = true; in gpmi_ecc_read_page()
1546 block_mark_swapping(this, buf, this->auxiliary_virt); in gpmi_ecc_read_page()
1560 chip->oob_poi[0] = ((uint8_t *)this->auxiliary_virt)[0]; in gpmi_ecc_read_page()
1570 struct gpmi_nand_data *this = nand_get_controller_data(chip); in gpmi_ecc_read_subpage() local
1571 struct bch_geometry *geo = &this->bch_geometry; in gpmi_ecc_read_subpage()
1588 if (this->swap_block_mark) { in gpmi_ecc_read_subpage()
1598 dev_dbg(this->dev, in gpmi_ecc_read_subpage()
1636 this->bch_flashlayout0 = BF_BCH_FLASH0LAYOUT0_NBLOCKS( in gpmi_ecc_read_subpage()
1639 BF_BCH_FLASH0LAYOUT0_ECC0(ecc_strength, this) | in gpmi_ecc_read_subpage()
1640 BF_BCH_FLASH0LAYOUT0_GF(geo->gf_len, this) | in gpmi_ecc_read_subpage()
1642 0 : geo->ecc0_chunk_size), this); in gpmi_ecc_read_subpage()
1644 this->bch_flashlayout1 = BF_BCH_FLASH0LAYOUT1_PAGE_SIZE(page_size) | in gpmi_ecc_read_subpage()
1645 BF_BCH_FLASH0LAYOUT1_ECCN(ecc_strength, this) | in gpmi_ecc_read_subpage()
1646 BF_BCH_FLASH0LAYOUT1_GF(geo->gf_len, this) | in gpmi_ecc_read_subpage()
1647 BF_BCH_FLASH0LAYOUT1_DATAN_SIZE(geo->eccn_chunk_size, this); in gpmi_ecc_read_subpage()
1649 this->bch = true; in gpmi_ecc_read_subpage()
1655 dev_dbg(this->dev, "page:%d(%d:%d)%d, chunk:(%d:%d), BCH PG size:%d\n", in gpmi_ecc_read_subpage()
1667 struct gpmi_nand_data *this = nand_get_controller_data(chip); in gpmi_ecc_write_page() local
1668 struct bch_geometry *nfc_geo = &this->bch_geometry; in gpmi_ecc_write_page()
1670 dev_dbg(this->dev, "ecc write page.\n"); in gpmi_ecc_write_page()
1672 gpmi_bch_layout_std(this); in gpmi_ecc_write_page()
1673 this->bch = true; in gpmi_ecc_write_page()
1675 memcpy(this->auxiliary_virt, chip->oob_poi, nfc_geo->auxiliary_size); in gpmi_ecc_write_page()
1677 if (this->swap_block_mark) { in gpmi_ecc_write_page()
1682 memcpy(this->data_buffer_dma, buf, mtd->writesize); in gpmi_ecc_write_page()
1683 buf = this->data_buffer_dma; in gpmi_ecc_write_page()
1684 block_mark_swapping(this, this->data_buffer_dma, in gpmi_ecc_write_page()
1685 this->auxiliary_virt); in gpmi_ecc_write_page()
1754 struct gpmi_nand_data *this = nand_get_controller_data(chip); in gpmi_ecc_read_oob() local
1771 if (GPMI_IS_MX23(this)) { in gpmi_ecc_read_oob()
1814 struct gpmi_nand_data *this = nand_get_controller_data(chip); in gpmi_ecc_read_page_raw() local
1815 struct bch_geometry *nfc_geo = &this->bch_geometry; in gpmi_ecc_read_page_raw()
1818 u8 *tmp_buf = this->raw_buffer; in gpmi_ecc_read_page_raw()
1838 if (this->swap_block_mark) in gpmi_ecc_read_page_raw()
1899 struct gpmi_nand_data *this = nand_get_controller_data(chip); in gpmi_ecc_write_page_raw() local
1900 struct bch_geometry *nfc_geo = &this->bch_geometry; in gpmi_ecc_write_page_raw()
1903 u8 *tmp_buf = this->raw_buffer; in gpmi_ecc_write_page_raw()
1959 if (this->swap_block_mark) in gpmi_ecc_write_page_raw()
1979 struct gpmi_nand_data *this = nand_get_controller_data(chip); in gpmi_block_markbad() local
1987 column = !GPMI_IS_MX23(this) ? mtd->writesize : 0; in gpmi_block_markbad()
1990 block_mark = this->data_buffer_dma; in gpmi_block_markbad()
2003 static int nand_boot_set_geometry(struct gpmi_nand_data *this) in nand_boot_set_geometry() argument
2005 struct boot_rom_geometry *geometry = &this->rom_geometry; in nand_boot_set_geometry()
2030 static int mx23_check_transcription_stamp(struct gpmi_nand_data *this) in mx23_check_transcription_stamp() argument
2032 struct boot_rom_geometry *rom_geo = &this->rom_geometry; in mx23_check_transcription_stamp()
2033 struct device *dev = this->dev; in mx23_check_transcription_stamp()
2034 struct nand_chip *chip = &this->nand; in mx23_check_transcription_stamp()
2085 static int mx23_write_transcription_stamp(struct gpmi_nand_data *this) in mx23_write_transcription_stamp() argument
2087 struct device *dev = this->dev; in mx23_write_transcription_stamp()
2088 struct boot_rom_geometry *rom_geo = &this->rom_geometry; in mx23_write_transcription_stamp()
2089 struct nand_chip *chip = &this->nand; in mx23_write_transcription_stamp()
2151 static int mx23_boot_init(struct gpmi_nand_data *this) in mx23_boot_init() argument
2153 struct device *dev = this->dev; in mx23_boot_init()
2154 struct nand_chip *chip = &this->nand; in mx23_boot_init()
2170 if (mx23_check_transcription_stamp(this)) in mx23_boot_init()
2220 mx23_write_transcription_stamp(this); in mx23_boot_init()
2224 static int nand_boot_init(struct gpmi_nand_data *this) in nand_boot_init() argument
2226 nand_boot_set_geometry(this); in nand_boot_init()
2229 if (GPMI_IS_MX23(this)) in nand_boot_init()
2230 return mx23_boot_init(this); in nand_boot_init()
2234 static int gpmi_set_geometry(struct gpmi_nand_data *this) in gpmi_set_geometry() argument
2239 gpmi_free_dma_buffer(this); in gpmi_set_geometry()
2242 ret = bch_set_geometry(this); in gpmi_set_geometry()
2244 dev_err(this->dev, "Error setting BCH geometry : %d\n", ret); in gpmi_set_geometry()
2249 return gpmi_alloc_dma_buffer(this); in gpmi_set_geometry()
2252 static int gpmi_init_last(struct gpmi_nand_data *this) in gpmi_init_last() argument
2254 struct nand_chip *chip = &this->nand; in gpmi_init_last()
2257 struct bch_geometry *bch_geo = &this->bch_geometry; in gpmi_init_last()
2261 ret = gpmi_set_geometry(this); in gpmi_init_last()
2284 if (GPMI_IS_MX6(this) && in gpmi_init_last()
2295 struct gpmi_nand_data *this = nand_get_controller_data(chip); in gpmi_nand_attach_chip() local
2301 if (of_property_read_bool(this->dev->of_node, in gpmi_nand_attach_chip()
2303 this->swap_block_mark = false; in gpmi_nand_attach_chip()
2305 dev_dbg(this->dev, "Blockmark swapping %sabled\n", in gpmi_nand_attach_chip()
2306 this->swap_block_mark ? "en" : "dis"); in gpmi_nand_attach_chip()
2308 ret = gpmi_init_last(this); in gpmi_nand_attach_chip()
2317 static struct gpmi_transfer *get_next_transfer(struct gpmi_nand_data *this) in get_next_transfer() argument
2319 struct gpmi_transfer *transfer = &this->transfers[this->ntransfers]; in get_next_transfer()
2321 this->ntransfers++; in get_next_transfer()
2323 if (this->ntransfers == GPMI_MAX_TRANSFERS) in get_next_transfer()
2330 struct gpmi_nand_data *this, u8 cmd, const u8 *addr, int naddr) in gpmi_chain_command() argument
2332 struct dma_chan *channel = get_dma_chan(this); in gpmi_chain_command()
2335 int chip = this->nand.cur_cs; in gpmi_chain_command()
2341 | BF_GPMI_CTRL0_CS(chip, this) in gpmi_chain_command()
2342 | BF_GPMI_CTRL0_LOCK_CS(LOCK_CS_ENABLE, this) in gpmi_chain_command()
2353 transfer = get_next_transfer(this); in gpmi_chain_command()
2362 dma_map_sg(this->dev, &transfer->sgl, 1, DMA_TO_DEVICE); in gpmi_chain_command()
2372 struct gpmi_nand_data *this) in gpmi_chain_wait_ready() argument
2374 struct dma_chan *channel = get_dma_chan(this); in gpmi_chain_wait_ready()
2379 | BF_GPMI_CTRL0_CS(this->nand.cur_cs, this) in gpmi_chain_wait_ready()
2380 | BF_GPMI_CTRL0_LOCK_CS(LOCK_CS_ENABLE, this) in gpmi_chain_wait_ready()
2390 struct gpmi_nand_data *this, void *buf, int raw_len, bool *direct) in gpmi_chain_data_read() argument
2393 struct dma_chan *channel = get_dma_chan(this); in gpmi_chain_data_read()
2397 transfer = get_next_transfer(this); in gpmi_chain_data_read()
2403 *direct = prepare_data_dma(this, buf, raw_len, &transfer->sgl, in gpmi_chain_data_read()
2408 | BF_GPMI_CTRL0_CS(this->nand.cur_cs, this) in gpmi_chain_data_read()
2409 | BF_GPMI_CTRL0_LOCK_CS(LOCK_CS_ENABLE, this) in gpmi_chain_data_read()
2413 if (this->bch) { in gpmi_chain_data_read()
2420 pio[5] = this->auxiliary_phys; in gpmi_chain_data_read()
2428 if (!this->bch) in gpmi_chain_data_read()
2437 struct gpmi_nand_data *this, const void *buf, int raw_len) in gpmi_chain_data_write() argument
2439 struct dma_chan *channel = get_dma_chan(this); in gpmi_chain_data_write()
2444 transfer = get_next_transfer(this); in gpmi_chain_data_write()
2450 prepare_data_dma(this, buf, raw_len, &transfer->sgl, DMA_TO_DEVICE); in gpmi_chain_data_write()
2454 | BF_GPMI_CTRL0_CS(this->nand.cur_cs, this) in gpmi_chain_data_write()
2455 | BF_GPMI_CTRL0_LOCK_CS(LOCK_CS_ENABLE, this) in gpmi_chain_data_write()
2459 if (this->bch) { in gpmi_chain_data_write()
2466 pio[5] = this->auxiliary_phys; in gpmi_chain_data_write()
2471 (this->bch ? MXS_DMA_CTRL_WAIT4END : 0)); in gpmi_chain_data_write()
2475 if (!this->bch) in gpmi_chain_data_write()
2488 struct gpmi_nand_data *this = nand_get_controller_data(chip); in gpmi_nfc_exec_op() local
2501 this->ntransfers = 0; in gpmi_nfc_exec_op()
2503 this->transfers[i].direction = DMA_NONE; in gpmi_nfc_exec_op()
2505 ret = pm_runtime_resume_and_get(this->dev); in gpmi_nfc_exec_op()
2515 if (this->hw.must_apply_timings) { in gpmi_nfc_exec_op()
2516 this->hw.must_apply_timings = false; in gpmi_nfc_exec_op()
2517 ret = gpmi_nfc_apply_timings(this); in gpmi_nfc_exec_op()
2522 dev_dbg(this->dev, "%s: %d instructions\n", __func__, op->ninstrs); in gpmi_nfc_exec_op()
2531 desc = gpmi_chain_wait_ready(this); in gpmi_nfc_exec_op()
2544 desc = gpmi_chain_command(this, cmd, NULL, 0); in gpmi_nfc_exec_op()
2548 desc = gpmi_chain_command(this, cmd, instr->ctx.addr.addrs, in gpmi_nfc_exec_op()
2556 desc = gpmi_chain_data_write(this, buf_write, buf_len); in gpmi_nfc_exec_op()
2566 desc = gpmi_chain_data_read(this, buf_read, buf_len, in gpmi_nfc_exec_op()
2577 dev_dbg(this->dev, "%s setup done\n", __func__); in gpmi_nfc_exec_op()
2580 dev_err(this->dev, "Multiple data instructions not supported\n"); in gpmi_nfc_exec_op()
2585 if (this->bch) { in gpmi_nfc_exec_op()
2586 writel(this->bch_flashlayout0, in gpmi_nfc_exec_op()
2587 this->resources.bch_regs + HW_BCH_FLASH0LAYOUT0); in gpmi_nfc_exec_op()
2588 writel(this->bch_flashlayout1, in gpmi_nfc_exec_op()
2589 this->resources.bch_regs + HW_BCH_FLASH0LAYOUT1); in gpmi_nfc_exec_op()
2593 desc->callback_param = this; in gpmi_nfc_exec_op()
2594 dma_completion = &this->dma_done; in gpmi_nfc_exec_op()
2599 if (this->bch && buf_read) { in gpmi_nfc_exec_op()
2601 this->resources.bch_regs + HW_BCH_CTRL_SET); in gpmi_nfc_exec_op()
2602 bch_completion = &this->bch_done; in gpmi_nfc_exec_op()
2607 dma_async_issue_pending(get_dma_chan(this)); in gpmi_nfc_exec_op()
2611 dev_err(this->dev, "DMA timeout, last DMA\n"); in gpmi_nfc_exec_op()
2612 gpmi_dump_info(this); in gpmi_nfc_exec_op()
2617 if (this->bch && buf_read) { in gpmi_nfc_exec_op()
2620 dev_err(this->dev, "BCH timeout, last DMA\n"); in gpmi_nfc_exec_op()
2621 gpmi_dump_info(this); in gpmi_nfc_exec_op()
2628 this->resources.bch_regs + HW_BCH_CTRL_CLR); in gpmi_nfc_exec_op()
2629 gpmi_clear_bch(this); in gpmi_nfc_exec_op()
2634 for (i = 0; i < this->ntransfers; i++) { in gpmi_nfc_exec_op()
2635 struct gpmi_transfer *transfer = &this->transfers[i]; in gpmi_nfc_exec_op()
2638 dma_unmap_sg(this->dev, &transfer->sgl, 1, in gpmi_nfc_exec_op()
2643 memcpy(buf_read, this->data_buffer_dma, in gpmi_nfc_exec_op()
2644 gpmi_raw_len_to_len(this, buf_len)); in gpmi_nfc_exec_op()
2646 this->bch = false; in gpmi_nfc_exec_op()
2649 pm_runtime_mark_last_busy(this->dev); in gpmi_nfc_exec_op()
2650 pm_runtime_put_autosuspend(this->dev); in gpmi_nfc_exec_op()
2661 static int gpmi_nand_init(struct gpmi_nand_data *this) in gpmi_nand_init() argument
2663 struct nand_chip *chip = &this->nand; in gpmi_nand_init()
2669 mtd->dev.parent = this->dev; in gpmi_nand_init()
2672 nand_set_controller_data(chip, this); in gpmi_nand_init()
2673 nand_set_flash_node(chip, this->pdev->dev.of_node); in gpmi_nand_init()
2679 this->swap_block_mark = !GPMI_IS_MX23(this); in gpmi_nand_init()
2685 this->bch_geometry.payload_size = 1024; in gpmi_nand_init()
2686 this->bch_geometry.auxiliary_size = 128; in gpmi_nand_init()
2687 ret = gpmi_alloc_dma_buffer(this); in gpmi_nand_init()
2691 nand_controller_init(&this->base); in gpmi_nand_init()
2692 this->base.ops = &gpmi_nand_controller_ops; in gpmi_nand_init()
2693 chip->controller = &this->base; in gpmi_nand_init()
2695 ret = nand_scan(chip, GPMI_IS_MX6(this) ? 2 : 1); in gpmi_nand_init()
2699 ret = nand_boot_init(this); in gpmi_nand_init()
2714 gpmi_free_dma_buffer(this); in gpmi_nand_init()
2730 struct gpmi_nand_data *this; in gpmi_nand_probe() local
2733 this = devm_kzalloc(&pdev->dev, sizeof(*this), GFP_KERNEL); in gpmi_nand_probe()
2734 if (!this) in gpmi_nand_probe()
2737 this->devdata = of_device_get_match_data(&pdev->dev); in gpmi_nand_probe()
2738 platform_set_drvdata(pdev, this); in gpmi_nand_probe()
2739 this->pdev = pdev; in gpmi_nand_probe()
2740 this->dev = &pdev->dev; in gpmi_nand_probe()
2742 ret = acquire_resources(this); in gpmi_nand_probe()
2746 ret = __gpmi_enable_clk(this, true); in gpmi_nand_probe()
2756 ret = gpmi_init(this); in gpmi_nand_probe()
2760 ret = gpmi_nand_init(this); in gpmi_nand_probe()
2767 dev_info(this->dev, "driver registered.\n"); in gpmi_nand_probe()
2774 release_resources(this); in gpmi_nand_probe()
2782 struct gpmi_nand_data *this = platform_get_drvdata(pdev); in gpmi_nand_remove() local
2783 struct nand_chip *chip = &this->nand; in gpmi_nand_remove()
2792 gpmi_free_dma_buffer(this); in gpmi_nand_remove()
2793 release_resources(this); in gpmi_nand_remove()
2799 struct gpmi_nand_data *this = dev_get_drvdata(dev); in gpmi_pm_suspend() local
2801 release_dma_channels(this); in gpmi_pm_suspend()
2807 struct gpmi_nand_data *this = dev_get_drvdata(dev); in gpmi_pm_resume() local
2810 ret = acquire_dma_channels(this); in gpmi_pm_resume()
2815 ret = gpmi_init(this); in gpmi_pm_resume()
2817 dev_err(this->dev, "Error setting GPMI : %d\n", ret); in gpmi_pm_resume()
2822 if (this->hw.clk_rate) in gpmi_pm_resume()
2823 this->hw.must_apply_timings = true; in gpmi_pm_resume()
2826 ret = bch_set_geometry(this); in gpmi_pm_resume()
2828 dev_err(this->dev, "Error setting BCH : %d\n", ret); in gpmi_pm_resume()
2838 struct gpmi_nand_data *this = dev_get_drvdata(dev); in gpmi_runtime_suspend() local
2840 return __gpmi_enable_clk(this, false); in gpmi_runtime_suspend()
2845 struct gpmi_nand_data *this = dev_get_drvdata(dev); in gpmi_runtime_resume() local
2847 return __gpmi_enable_clk(this, true); in gpmi_runtime_resume()