*                     buffer accessed by driver
  * @dma:               DMA address, only valid when kernel DMA API used
  * @size:              size of the buffer
+ * @ctx:               memory context (bank) used for this allocation
  */
 struct s5p_mfc_priv_buf {
        unsigned long   ofs;
        void            *virt;
        dma_addr_t      dma;
        size_t          size;
+       unsigned int    ctx;
 };
 
 /**
 
                dev->mfc_regs = s5p_mfc_init_regs_v6_plus(dev);
 }
 
-int s5p_mfc_alloc_priv_buf(struct device *dev, dma_addr_t base,
-                                       struct s5p_mfc_priv_buf *b)
+int s5p_mfc_alloc_priv_buf(struct s5p_mfc_dev *dev, unsigned int mem_ctx,
+                          struct s5p_mfc_priv_buf *b)
 {
+       struct device *mem_dev = dev->mem_dev[mem_ctx];
+       dma_addr_t base = dev->dma_base[mem_ctx];
+
        mfc_debug(3, "Allocating priv: %zu\n", b->size);
 
-       b->virt = dma_alloc_coherent(dev, b->size, &b->dma, GFP_KERNEL);
+       b->ctx = mem_ctx;
+       b->virt = dma_alloc_coherent(mem_dev, b->size, &b->dma, GFP_KERNEL);
 
        if (!b->virt) {
                mfc_err("Allocating private buffer of size %zu failed\n",
        if (b->dma < base) {
                mfc_err("Invalid memory configuration - buffer (%pad) is below base memory address(%pad)\n",
                        &b->dma, &base);
-               dma_free_coherent(dev, b->size, b->virt, b->dma);
+               dma_free_coherent(mem_dev, b->size, b->virt, b->dma);
                return -ENOMEM;
        }
 
        return 0;
 }
 
-void s5p_mfc_release_priv_buf(struct device *dev,
-                                               struct s5p_mfc_priv_buf *b)
+void s5p_mfc_release_priv_buf(struct s5p_mfc_dev *dev,
+                             struct s5p_mfc_priv_buf *b)
 {
+       struct device *mem_dev = dev->mem_dev[b->ctx];
+
        if (b->virt) {
-               dma_free_coherent(dev, b->size, b->virt, b->dma);
+               dma_free_coherent(mem_dev, b->size, b->virt, b->dma);
                b->virt = NULL;
                b->dma = 0;
                b->size = 0;
 
 
 void s5p_mfc_init_hw_ops(struct s5p_mfc_dev *dev);
 void s5p_mfc_init_regs(struct s5p_mfc_dev *dev);
-int s5p_mfc_alloc_priv_buf(struct device *dev, dma_addr_t base,
-                                       struct s5p_mfc_priv_buf *b);
-void s5p_mfc_release_priv_buf(struct device *dev,
-                                       struct s5p_mfc_priv_buf *b);
+int s5p_mfc_alloc_priv_buf(struct s5p_mfc_dev *dev, unsigned int mem_ctx,
+                          struct s5p_mfc_priv_buf *b);
+void s5p_mfc_release_priv_buf(struct s5p_mfc_dev *dev,
+                             struct s5p_mfc_priv_buf *b);
 
 
 #endif /* S5P_MFC_OPR_H_ */
 
        int ret;
 
        ctx->dsc.size = buf_size->dsc;
-       ret =  s5p_mfc_alloc_priv_buf(dev->mem_dev[BANK1_CTX],
-                                     dev->dma_base[BANK1_CTX], &ctx->dsc);
+       ret =  s5p_mfc_alloc_priv_buf(dev, BANK1_CTX, &ctx->dsc);
        if (ret) {
                mfc_err("Failed to allocate temporary buffer\n");
                return ret;
 /* Release temporary buffers for decoding */
 static void s5p_mfc_release_dec_desc_buffer_v5(struct s5p_mfc_ctx *ctx)
 {
-       s5p_mfc_release_priv_buf(ctx->dev->mem_dev[BANK1_CTX], &ctx->dsc);
+       s5p_mfc_release_priv_buf(ctx->dev, &ctx->dsc);
 }
 
 /* Allocate codec buffers */
        /* Allocate only if memory from bank 1 is necessary */
        if (ctx->bank1.size > 0) {
 
-               ret = s5p_mfc_alloc_priv_buf(dev->mem_dev[BANK1_CTX],
-                                    dev->dma_base[BANK1_CTX], &ctx->bank1);
+               ret = s5p_mfc_alloc_priv_buf(dev, BANK1_CTX, &ctx->bank1);
                if (ret) {
                        mfc_err("Failed to allocate Bank1 temporary buffer\n");
                        return ret;
        }
        /* Allocate only if memory from bank 2 is necessary */
        if (ctx->bank2.size > 0) {
-               ret = s5p_mfc_alloc_priv_buf(dev->mem_dev[BANK2_CTX],
-                                    dev->dma_base[BANK2_CTX], &ctx->bank2);
+               ret = s5p_mfc_alloc_priv_buf(dev, BANK2_CTX, &ctx->bank2);
                if (ret) {
                        mfc_err("Failed to allocate Bank2 temporary buffer\n");
-                       s5p_mfc_release_priv_buf(ctx->dev->mem_dev[BANK1_CTX],
-                                                &ctx->bank1);
+                       s5p_mfc_release_priv_buf(ctx->dev, &ctx->bank1);
                        return ret;
                }
                BUG_ON(ctx->bank2.dma & ((1 << MFC_BANK2_ALIGN_ORDER) - 1));
 /* Release buffers allocated for codec */
 static void s5p_mfc_release_codec_buffers_v5(struct s5p_mfc_ctx *ctx)
 {
-       s5p_mfc_release_priv_buf(ctx->dev->mem_dev[BANK1_CTX], &ctx->bank1);
-       s5p_mfc_release_priv_buf(ctx->dev->mem_dev[BANK2_CTX], &ctx->bank2);
+       s5p_mfc_release_priv_buf(ctx->dev, &ctx->bank1);
+       s5p_mfc_release_priv_buf(ctx->dev, &ctx->bank2);
 }
 
 /* Allocate memory for instance data buffer */
        else
                ctx->ctx.size = buf_size->non_h264_ctx;
 
-       ret = s5p_mfc_alloc_priv_buf(dev->mem_dev[BANK1_CTX],
-                                    dev->dma_base[BANK1_CTX], &ctx->ctx);
+       ret = s5p_mfc_alloc_priv_buf(dev, BANK1_CTX, &ctx->ctx);
        if (ret) {
                mfc_err("Failed to allocate instance buffer\n");
                return ret;
 
        /* Initialize shared memory */
        ctx->shm.size = buf_size->shm;
-       ret = s5p_mfc_alloc_priv_buf(dev->mem_dev[BANK1_CTX],
-                                    dev->dma_base[BANK1_CTX], &ctx->shm);
+       ret = s5p_mfc_alloc_priv_buf(dev, BANK1_CTX, &ctx->shm);
        if (ret) {
                mfc_err("Failed to allocate shared memory buffer\n");
-               s5p_mfc_release_priv_buf(dev->mem_dev[BANK1_CTX], &ctx->ctx);
+               s5p_mfc_release_priv_buf(dev, &ctx->ctx);
                return ret;
        }
 
 /* Release instance buffer */
 static void s5p_mfc_release_instance_buffer_v5(struct s5p_mfc_ctx *ctx)
 {
-       s5p_mfc_release_priv_buf(ctx->dev->mem_dev[BANK1_CTX], &ctx->ctx);
-       s5p_mfc_release_priv_buf(ctx->dev->mem_dev[BANK1_CTX], &ctx->shm);
+       s5p_mfc_release_priv_buf(ctx->dev, &ctx->ctx);
+       s5p_mfc_release_priv_buf(ctx->dev, &ctx->shm);
 }
 
 static int s5p_mfc_alloc_dev_context_buffer_v5(struct s5p_mfc_dev *dev)
 
 
        /* Allocate only if memory from bank 1 is necessary */
        if (ctx->bank1.size > 0) {
-               ret = s5p_mfc_alloc_priv_buf(dev->mem_dev[BANK1_CTX],
-                                       dev->dma_base[BANK1_CTX], &ctx->bank1);
+               ret = s5p_mfc_alloc_priv_buf(dev, BANK1_CTX, &ctx->bank1);
                if (ret) {
                        mfc_err("Failed to allocate Bank1 memory\n");
                        return ret;
 /* Release buffers allocated for codec */
 static void s5p_mfc_release_codec_buffers_v6(struct s5p_mfc_ctx *ctx)
 {
-       s5p_mfc_release_priv_buf(ctx->dev->mem_dev[BANK1_CTX], &ctx->bank1);
+       s5p_mfc_release_priv_buf(ctx->dev, &ctx->bank1);
 }
 
 /* Allocate memory for instance data buffer */
                break;
        }
 
-       ret = s5p_mfc_alloc_priv_buf(dev->mem_dev[BANK1_CTX],
-                                    dev->dma_base[BANK1_CTX], &ctx->ctx);
+       ret = s5p_mfc_alloc_priv_buf(dev, BANK1_CTX, &ctx->ctx);
        if (ret) {
                mfc_err("Failed to allocate instance buffer\n");
                return ret;
 /* Release instance buffer */
 static void s5p_mfc_release_instance_buffer_v6(struct s5p_mfc_ctx *ctx)
 {
-       s5p_mfc_release_priv_buf(ctx->dev->mem_dev[BANK1_CTX], &ctx->ctx);
+       s5p_mfc_release_priv_buf(ctx->dev, &ctx->ctx);
 }
 
 /* Allocate context buffers for SYS_INIT */
        mfc_debug_enter();
 
        dev->ctx_buf.size = buf_size->dev_ctx;
-       ret = s5p_mfc_alloc_priv_buf(dev->mem_dev[BANK1_CTX],
-                                    dev->dma_base[BANK1_CTX], &dev->ctx_buf);
+       ret = s5p_mfc_alloc_priv_buf(dev, BANK1_CTX, &dev->ctx_buf);
        if (ret) {
                mfc_err("Failed to allocate device context buffer\n");
                return ret;
 /* Release context buffers for SYS_INIT */
 static void s5p_mfc_release_dev_context_buffer_v6(struct s5p_mfc_dev *dev)
 {
-       s5p_mfc_release_priv_buf(dev->mem_dev[BANK1_CTX], &dev->ctx_buf);
+       s5p_mfc_release_priv_buf(dev, &dev->ctx_buf);
 }
 
 static int calc_plane(int width, int height)