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:
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user