Initialise working buffers, accomodating DMA alignment constraints.

Signed-off-by: Lee Jones <lee.jo...@linaro.org>
---
 drivers/mtd/nand/stm_nand_bch.c | 45 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 45 insertions(+)

diff --git a/drivers/mtd/nand/stm_nand_bch.c b/drivers/mtd/nand/stm_nand_bch.c
index cf57b90..5be7889 100644
--- a/drivers/mtd/nand/stm_nand_bch.c
+++ b/drivers/mtd/nand/stm_nand_bch.c
@@ -31,6 +31,9 @@
 
 /* NANDi BCH Controller properties */
 #define NANDI_BCH_SECTOR_SIZE                  1024
+#define NANDI_BCH_DMA_ALIGNMENT                        64
+#define NANDI_BCH_MAX_BUF_LIST                 8
+#define NANDI_BCH_BUF_LIST_SIZE                        (4 * 
NANDI_BCH_MAX_BUF_LIST)
 
 /* BCH ECC sizes */
 static int bch_ecc_sizes[] = {
@@ -920,6 +923,44 @@ static void nandi_init_controller(struct nandi_controller 
*nandi,
        nandi_init_hamming(nandi, emi_bank);
 }
 
+/* Initialise working buffers, accomodating DMA alignment constraints */
+static int nandi_init_working_buffers(struct nandi_controller *nandi,
+                                     struct nandi_bbt_info *bbt_info,
+                                     struct mtd_info *mtd)
+{
+       uint32_t bbt_buf_size;
+       uint32_t buf_size;
+
+       /*      - Page and OOB */
+       buf_size = mtd->writesize + mtd->oobsize + NANDI_BCH_DMA_ALIGNMENT;
+
+       /*      - BBT data (page-size aligned) */
+       bbt_info->bbt_size = nandi->blocks_per_device >> 2; /* 2 bits/block */
+       bbt_buf_size = ALIGN(bbt_info->bbt_size, mtd->writesize);
+       buf_size += bbt_buf_size + NANDI_BCH_DMA_ALIGNMENT;
+
+       /*      - BCH BUF list */
+       buf_size += NANDI_BCH_BUF_LIST_SIZE + NANDI_BCH_DMA_ALIGNMENT;
+
+       /* Allocate bufffer */
+       nandi->buf = devm_kzalloc(nandi->dev, buf_size, GFP_KERNEL);
+       if (!nandi->buf) {
+               dev_err(nandi->dev, "failed to allocate working buffers\n");
+               return -ENOMEM;
+       }
+
+       /* Set/Align buffer pointers */
+       nandi->page_buf = PTR_ALIGN(nandi->buf, NANDI_BCH_DMA_ALIGNMENT);
+       nandi->oob_buf  = nandi->page_buf + mtd->writesize;
+       bbt_info->bbt   = PTR_ALIGN(nandi->oob_buf + mtd->oobsize,
+                                   NANDI_BCH_DMA_ALIGNMENT);
+       nandi->buf_list = (uint32_t *)PTR_ALIGN(bbt_info->bbt + bbt_buf_size,
+                                               NANDI_BCH_DMA_ALIGNMENT);
+       nandi->cached_page = -1;
+
+       return 0;
+}
+
 static int remap_named_resource(struct platform_device *pdev,
                                char *name,
                                void __iomem **io_ptr)
@@ -1140,6 +1181,10 @@ static int stm_nand_bch_probe(struct platform_device 
*pdev)
        /* Tune BCH programs according to device found and ECC mode */
        bch_configure_progs(nandi);
 
+       err = nandi_init_working_buffers(nandi, bbt_info, mtd);
+       if (err)
+               return err;
+
        return 0;
 }
 
-- 
1.8.3.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to