mtd: nand: cafe: remove use of NAND_OWN_BUFFERS
authorMasahiro Yamada <yamada.masahiro@socionext.com>
Tue, 5 Dec 2017 08:47:14 +0000 (17:47 +0900)
committerBoris Brezillon <boris.brezillon@free-electrons.com>
Thu, 14 Dec 2017 12:34:18 +0000 (13:34 +0100)
This driver is the last/only user of NAND_OWN_BUFFERS.  Boris suggested
to remove this flag.

Taking a closer look at this driver, it calls dma_alloc_coherent() for
the concatenated area for the DMA bounce buffer + struct nand_buffers,
but the latter does not need to be DMA-coherent; cafe_{write,read}_buf
simply do memcpy() between buffers when usedma==1.

Let's do dma_alloc_coherent() for the DMA bounce buffer in the front,
and leave the nand_buffers allocation to nand_scan_tail(), then rip off
NAND_OWN_BUFFERS.

The magic number, 2112, is still mysterious (hard-coded writesize +
oobsize ?), but this is not our main interest.  I am keeping it.

Suggested-by: Boris Brezillon <boris.brezillon@free-electrons.com>
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
drivers/mtd/nand/cafe_nand.c

index de36762e3058af18f511798e76e298a50cbbdc5a..a438b711405375ad90feba113256b4f236ea9947 100644 (file)
@@ -605,7 +605,6 @@ static int cafe_nand_probe(struct pci_dev *pdev,
        uint32_t ctrl;
        int err = 0;
        int old_dma;
-       struct nand_buffers *nbuf;
 
        /* Very old versions shared the same PCI ident for all three
           functions on the chip. Verify the class too... */
@@ -653,7 +652,6 @@ static int cafe_nand_probe(struct pci_dev *pdev,
 
        /* Enable the following for a flash based bad block table */
        cafe->nand.bbt_options = NAND_BBT_USE_FLASH;
-       cafe->nand.options = NAND_OWN_BUFFERS;
 
        if (skipbbt) {
                cafe->nand.options |= NAND_SKIP_BBTSCAN;
@@ -723,15 +721,12 @@ static int cafe_nand_probe(struct pci_dev *pdev,
        if (err)
                goto out_irq;
 
-       cafe->dmabuf = dma_alloc_coherent(&cafe->pdev->dev,
-                               2112 + sizeof(struct nand_buffers) +
-                               mtd->writesize + mtd->oobsize,
-                               &cafe->dmaaddr, GFP_KERNEL);
+       cafe->dmabuf = dma_alloc_coherent(&cafe->pdev->dev, 2112,
+                                         &cafe->dmaaddr, GFP_KERNEL);
        if (!cafe->dmabuf) {
                err = -ENOMEM;
                goto out_irq;
        }
-       cafe->nand.buffers = nbuf = (void *)cafe->dmabuf + 2112;
 
        /* Set up DMA address */
        cafe_writel(cafe, cafe->dmaaddr & 0xffffffff, NAND_DMA_ADDR0);
@@ -744,11 +739,6 @@ static int cafe_nand_probe(struct pci_dev *pdev,
        cafe_dev_dbg(&cafe->pdev->dev, "Set DMA address to %x (virt %p)\n",
                cafe_readl(cafe, NAND_DMA_ADDR0), cafe->dmabuf);
 
-       /* this driver does not need the @ecccalc and @ecccode */
-       nbuf->ecccalc = NULL;
-       nbuf->ecccode = NULL;
-       nbuf->databuf = (uint8_t *)(nbuf + 1);
-
        /* Restore the DMA flag */
        usedma = old_dma;
 
@@ -793,10 +783,7 @@ static int cafe_nand_probe(struct pci_dev *pdev,
        goto out;
 
  out_free_dma:
-       dma_free_coherent(&cafe->pdev->dev,
-                       2112 + sizeof(struct nand_buffers) +
-                       mtd->writesize + mtd->oobsize,
-                       cafe->dmabuf, cafe->dmaaddr);
+       dma_free_coherent(&cafe->pdev->dev, 2112, cafe->dmabuf, cafe->dmaaddr);
  out_irq:
        /* Disable NAND IRQ in global IRQ mask register */
        cafe_writel(cafe, ~1 & cafe_readl(cafe, GLOBAL_IRQ_MASK), GLOBAL_IRQ_MASK);
@@ -821,10 +808,7 @@ static void cafe_nand_remove(struct pci_dev *pdev)
        nand_release(mtd);
        free_rs(cafe->rs);
        pci_iounmap(pdev, cafe->mmio);
-       dma_free_coherent(&cafe->pdev->dev,
-                       2112 + sizeof(struct nand_buffers) +
-                       mtd->writesize + mtd->oobsize,
-                       cafe->dmabuf, cafe->dmaaddr);
+       dma_free_coherent(&cafe->pdev->dev, 2112, cafe->dmabuf, cafe->dmaaddr);
        kfree(cafe);
 }