diff --git a/drivers/rkflash/rknandc_base.c b/drivers/rkflash/rknandc_base.c index d2730da2603c..d2e97883dec4 100644 --- a/drivers/rkflash/rknandc_base.c +++ b/drivers/rkflash/rknandc_base.c @@ -38,23 +38,14 @@ static struct completion nandc_irq_complete; unsigned long rknandc_dma_map_single(unsigned long ptr, int size, int dir) { -#ifdef CONFIG_ARM64 - __dma_map_area((void *)ptr, size, dir); - return ((unsigned long)virt_to_phys((void *)ptr)); -#else - return dma_map_single(NULL, (void *)ptr, size + return dma_map_single(g_nandc_dev, (void *)ptr, size , dir ? DMA_TO_DEVICE : DMA_FROM_DEVICE); -#endif } void rknandc_dma_unmap_single(unsigned long ptr, int size, int dir) { -#ifdef CONFIG_ARM64 - __dma_unmap_area(phys_to_virt(ptr), size, dir); -#else - dma_unmap_single(NULL, (dma_addr_t)ptr, size + dma_unmap_single(g_nandc_dev, (dma_addr_t)ptr, size , dir ? DMA_TO_DEVICE : DMA_FROM_DEVICE); -#endif } static irqreturn_t rknandc_interrupt(int irq, void *dev_id) @@ -135,7 +126,10 @@ static int rknandc_probe(struct platform_device *pdev) rknandc_irq_init(); ret = rkflash_dev_init(g_nandc_info.reg_base, FLASH_TYPE_NANDC_NAND, &nandc_nand_ops); - return ret; + if (ret) + return ret; + + return dma_set_mask(g_nandc_dev, DMA_BIT_MASK(32)); } static int __maybe_unused rknandc_suspend(struct device *dev) diff --git a/drivers/rkflash/rksfc_base.c b/drivers/rkflash/rksfc_base.c index d7aa3246be97..6cf74e103972 100644 --- a/drivers/rkflash/rksfc_base.c +++ b/drivers/rkflash/rksfc_base.c @@ -40,23 +40,14 @@ static struct completion sfc_irq_complete; unsigned long rksfc_dma_map_single(unsigned long ptr, int size, int dir) { -#ifdef CONFIG_ARM64 - __dma_map_area((void *)ptr, size, dir); - return ((unsigned long)virt_to_phys((void *)ptr)); -#else - return dma_map_single(NULL, (void *)ptr, size + return dma_map_single(g_sfc_dev, (void *)ptr, size , dir ? DMA_TO_DEVICE : DMA_FROM_DEVICE); -#endif } void rksfc_dma_unmap_single(unsigned long ptr, int size, int dir) { -#ifdef CONFIG_ARM64 - __dma_unmap_area(phys_to_virt(ptr), size, dir); -#else - dma_unmap_single(NULL, (dma_addr_t)ptr, size + dma_unmap_single(g_sfc_dev, (dma_addr_t)ptr, size , dir ? DMA_TO_DEVICE : DMA_FROM_DEVICE); -#endif } static irqreturn_t rksfc_interrupt(int irq, void *dev_id) @@ -209,7 +200,10 @@ static int rksfc_probe(struct platform_device *pdev) dev_result = rkflash_dev_init(g_sfc_info.reg_base, FLASH_TYPE_SFC_NAND, &sfc_nand_ops); #endif - return dev_result; + if (dev_result) + return dev_result; + + return dma_set_mask(g_sfc_dev, DMA_BIT_MASK(32)); } static int __maybe_unused rksfc_suspend(struct device *dev) diff --git a/drivers/rkflash/sfc_nand.c b/drivers/rkflash/sfc_nand.c index 9e61d3d76ac8..cf3d3e887198 100644 --- a/drivers/rkflash/sfc_nand.c +++ b/drivers/rkflash/sfc_nand.c @@ -145,7 +145,7 @@ static struct nand_info spi_nand_tbl[] = { }; static struct nand_info *p_nand_info; -static u32 gp_page_buf[SFC_NAND_PAGE_MAX_SIZE / 4]; +static u32 *gp_page_buf; static struct SFNAND_DEV sfc_nand_dev; static struct nand_info *sfc_nand_get_info(u8 *nand_id) @@ -985,6 +985,10 @@ u32 sfc_nand_init(void) if (!p_nand_info) return (u32)FTL_UNSUPPORTED_FLASH; + gp_page_buf = (u32 *)__get_free_pages(GFP_KERNEL | GFP_DMA32, get_order(SFC_NAND_PAGE_MAX_SIZE)); + if (!gp_page_buf) + return -ENOMEM; + sfc_nand_dev.manufacturer = id_byte[0]; sfc_nand_dev.mem_type = id_byte[1]; sfc_nand_dev.capacity = p_nand_info->density; @@ -997,7 +1001,7 @@ u32 sfc_nand_init(void) sfc_nand_dev.prog_lines = DATA_LINES_X1; sfc_nand_dev.page_read_cmd = 0x03; sfc_nand_dev.page_prog_cmd = 0x02; - sfc_nand_dev.recheck_buffer = kmalloc(SFC_NAND_PAGE_MAX_SIZE, GFP_KERNEL | GFP_DMA); + sfc_nand_dev.recheck_buffer = (u8 *)__get_free_pages(GFP_KERNEL | GFP_DMA32, get_order(SFC_NAND_PAGE_MAX_SIZE)); if (!sfc_nand_dev.recheck_buffer) { pr_err("%s recheck_buffer alloc failed\n", __func__); return -ENOMEM; @@ -1032,7 +1036,8 @@ u32 sfc_nand_init(void) void sfc_nand_deinit(void) { /* to-do */ - kfree(sfc_nand_dev.recheck_buffer); + free_pages((unsigned long)sfc_nand_dev.recheck_buffer, get_order(SFC_NAND_PAGE_MAX_SIZE)); + free_pages((unsigned long)gp_page_buf, get_order(SFC_NAND_PAGE_MAX_SIZE)); } struct SFNAND_DEV *sfc_nand_get_private_dev(void) diff --git a/drivers/rkflash/sfc_nor_mtd.c b/drivers/rkflash/sfc_nor_mtd.c index bff6ec1f73ef..8c9d69a581f2 100644 --- a/drivers/rkflash/sfc_nor_mtd.c +++ b/drivers/rkflash/sfc_nor_mtd.c @@ -202,7 +202,7 @@ int sfc_nor_mtd_init(struct SFNOR_DEV *p_dev, struct mutex *lock) priv_dev->mtd.erasesize = p_dev->blk_size << 9; priv_dev->mtd.writebufsize = NOR_PAGE_SIZE; priv_dev->lock = lock; - priv_dev->dma_buf = kmalloc(SFC_NOR_MTD_DMA_MAX, GFP_KERNEL | GFP_DMA); + priv_dev->dma_buf = (u8 *)__get_free_pages(GFP_KERNEL | GFP_DMA32, get_order(SFC_NOR_MTD_DMA_MAX)); if (!priv_dev->dma_buf) { rkflash_print_error("%s %d alloc failed\n", __func__, __LINE__); ret = -ENOMEM; @@ -258,7 +258,7 @@ int sfc_nor_mtd_init(struct SFNOR_DEV *p_dev, struct mutex *lock) return 0; } - kfree(priv_dev->dma_buf); + free_pages((unsigned long)priv_dev->dma_buf, get_order(SFC_NOR_MTD_DMA_MAX)); error_out: kfree(priv_dev);