drivers: rk_flash: set dma mask to 32bits

The nandc's DMA only supports 32bits. When the DDR capacity exceeds 4GB,
It need to configure DMA mask to 32bits and use API dma_map_single to
get the physical address.

Change-Id: I1510f7bbe2779ea20ff83a93e3a4dabb941263e3
Signed-off-by: Jon Lin <jon.lin@rock-chips.com>
This commit is contained in:
Jon Lin
2021-07-02 21:46:51 +08:00
committed by Tao Huang
parent fed72e8fa9
commit 750cdbce41
4 changed files with 22 additions and 29 deletions
+6 -12
View File
@@ -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)
+6 -12
View File
@@ -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)
+8 -3
View File
@@ -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)
+2 -2
View File
@@ -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);