Merge tag 'nfsd-4.6' of git://linux-nfs.org/~bfields/linux
[cascardo/linux.git] / drivers / staging / goldfish / goldfish_nand.c
index 623353d..76d60ee 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/mutex.h>
 #include <linux/goldfish.h>
 #include <asm/div64.h>
+#include <linux/dma-mapping.h>
 
 #include "goldfish_nand_reg.h"
 
@@ -99,11 +100,11 @@ static int goldfish_nand_erase(struct mtd_info *mtd, struct erase_info *instr)
 {
        loff_t ofs = instr->addr;
        u32 len = instr->len;
-       u32 rem;
+       s32 rem;
 
        if (ofs + len > mtd->size)
                goto invalid_arg;
-       rem = do_div(ofs, mtd->writesize);
+       ofs = div_s64_rem(ofs, mtd->writesize, &rem);
        if (rem)
                goto invalid_arg;
        ofs *= (mtd->writesize + mtd->oobsize);
@@ -132,7 +133,7 @@ invalid_arg:
 static int goldfish_nand_read_oob(struct mtd_info *mtd, loff_t ofs,
                                  struct mtd_oob_ops *ops)
 {
-       u32 rem;
+       s32 rem;
 
        if (ofs + ops->len > mtd->size)
                goto invalid_arg;
@@ -141,7 +142,7 @@ static int goldfish_nand_read_oob(struct mtd_info *mtd, loff_t ofs,
        if (ops->ooblen + ops->ooboffs > mtd->oobsize)
                goto invalid_arg;
 
-       rem = do_div(ofs, mtd->writesize);
+       ofs = div_s64_rem(ofs, mtd->writesize, &rem);
        if (rem)
                goto invalid_arg;
        ofs *= (mtd->writesize + mtd->oobsize);
@@ -164,7 +165,7 @@ invalid_arg:
 static int goldfish_nand_write_oob(struct mtd_info *mtd, loff_t ofs,
                                   struct mtd_oob_ops *ops)
 {
-       u32 rem;
+       s32 rem;
 
        if (ofs + ops->len > mtd->size)
                goto invalid_arg;
@@ -173,7 +174,7 @@ static int goldfish_nand_write_oob(struct mtd_info *mtd, loff_t ofs,
        if (ops->ooblen + ops->ooboffs > mtd->oobsize)
                goto invalid_arg;
 
-       rem = do_div(ofs, mtd->writesize);
+       ofs = div_s64_rem(ofs, mtd->writesize, &rem);
        if (rem)
                goto invalid_arg;
        ofs *= (mtd->writesize + mtd->oobsize);
@@ -196,12 +197,12 @@ invalid_arg:
 static int goldfish_nand_read(struct mtd_info *mtd, loff_t from, size_t len,
                              size_t *retlen, u_char *buf)
 {
-       u32 rem;
+       s32 rem;
 
        if (from + len > mtd->size)
                goto invalid_arg;
 
-       rem = do_div(from, mtd->writesize);
+       from = div_s64_rem(from, mtd->writesize, &rem);
        if (rem)
                goto invalid_arg;
        from *= (mtd->writesize + mtd->oobsize);
@@ -218,12 +219,12 @@ invalid_arg:
 static int goldfish_nand_write(struct mtd_info *mtd, loff_t to, size_t len,
                               size_t *retlen, const u_char *buf)
 {
-       u32 rem;
+       s32 rem;
 
        if (to + len > mtd->size)
                goto invalid_arg;
 
-       rem = do_div(to, mtd->writesize);
+       to = div_s64_rem(to, mtd->writesize, &rem);
        if (rem)
                goto invalid_arg;
        to *= (mtd->writesize + mtd->oobsize);
@@ -239,12 +240,12 @@ invalid_arg:
 
 static int goldfish_nand_block_isbad(struct mtd_info *mtd, loff_t ofs)
 {
-       u32 rem;
+       s32 rem;
 
        if (ofs >= mtd->size)
                goto invalid_arg;
 
-       rem = do_div(ofs, mtd->erasesize);
+       ofs = div_s64_rem(ofs, mtd->writesize, &rem);
        if (rem)
                goto invalid_arg;
        ofs *= mtd->erasesize / mtd->writesize;
@@ -260,12 +261,12 @@ invalid_arg:
 
 static int goldfish_nand_block_markbad(struct mtd_info *mtd, loff_t ofs)
 {
-       u32 rem;
+       s32 rem;
 
        if (ofs >= mtd->size)
                goto invalid_arg;
 
-       rem = do_div(ofs, mtd->erasesize);
+       ofs = div_s64_rem(ofs, mtd->writesize, &rem);
        if (rem)
                goto invalid_arg;
        ofs *= mtd->erasesize / mtd->writesize;
@@ -284,17 +285,18 @@ invalid_arg:
 static int nand_setup_cmd_params(struct platform_device *pdev,
                                 struct goldfish_nand *nand)
 {
-       u64 paddr;
+       dma_addr_t dma_handle;
        unsigned char __iomem  *base = nand->base;
 
-       nand->cmd_params = devm_kzalloc(&pdev->dev,
-                                       sizeof(struct cmd_params), GFP_KERNEL);
-       if (!nand->cmd_params)
-               return -1;
-
-       paddr = __pa(nand->cmd_params);
-       writel((u32)(paddr >> 32), base + NAND_CMD_PARAMS_ADDR_HIGH);
-       writel((u32)paddr, base + NAND_CMD_PARAMS_ADDR_LOW);
+       nand->cmd_params = dmam_alloc_coherent(&pdev->dev,
+                                              sizeof(struct cmd_params),
+                                              &dma_handle, GFP_KERNEL);
+       if (!nand->cmd_params) {
+               dev_err(&pdev->dev, "allocate buffer failed\n");
+               return -ENOMEM;
+       }
+       writel((u32)((u64)dma_handle >> 32), base + NAND_CMD_PARAMS_ADDR_HIGH);
+       writel((u32)dma_handle, base + NAND_CMD_PARAMS_ADDR_LOW);
        return 0;
 }
 
@@ -319,7 +321,7 @@ static int goldfish_nand_init_device(struct platform_device *pdev,
        mtd->oobavail = mtd->oobsize;
        mtd->erasesize = readl(base + NAND_DEV_ERASE_SIZE) /
                        (mtd->writesize + mtd->oobsize) * mtd->writesize;
-       do_div(mtd->size, mtd->writesize + mtd->oobsize);
+       mtd->size = div_s64(mtd->size, mtd->writesize + mtd->oobsize);
        mtd->size *= mtd->writesize;
        dev_dbg(&pdev->dev,
                "goldfish nand dev%d: size %llx, page %d, extra %d, erase %d\n",