diff --git a/drivers/video/rockchip/rga3/include/rga_drv.h b/drivers/video/rockchip/rga3/include/rga_drv.h index 87ce1a69fc3e..a47ffbc25f97 100644 --- a/drivers/video/rockchip/rga3/include/rga_drv.h +++ b/drivers/video/rockchip/rga3/include/rga_drv.h @@ -87,7 +87,7 @@ #define DRIVER_MAJOR_VERISON 1 #define DRIVER_MINOR_VERSION 2 -#define DRIVER_REVISION_VERSION 22 +#define DRIVER_REVISION_VERSION 23 #define DRIVER_PATCH_VERSION #define DRIVER_VERSION (STR(DRIVER_MAJOR_VERISON) "." STR(DRIVER_MINOR_VERSION) \ diff --git a/drivers/video/rockchip/rga3/rga_mm.c b/drivers/video/rockchip/rga3/rga_mm.c index e95ebfafd810..62c864be8f29 100644 --- a/drivers/video/rockchip/rga3/rga_mm.c +++ b/drivers/video/rockchip/rga3/rga_mm.c @@ -1417,7 +1417,7 @@ static int rga_mm_get_buffer(struct rga_mm *mm, ret = rga_mm_sync_dma_sg_for_device(internal_buffer, job, dir); if (ret < 0) { pr_err("sync sgt for device error!\n"); - return ret; + goto put_internal_buffer; } } @@ -1446,6 +1446,22 @@ static void rga_mm_put_buffer(struct rga_mm *mm, mutex_unlock(&mm->lock); } +static void rga_mm_put_channel_handle_info(struct rga_mm *mm, + struct rga_job *job, + struct rga_job_buffer *job_buf, + enum dma_data_direction dir) +{ + if (job_buf->y_addr) + rga_mm_put_buffer(mm, job, job_buf->y_addr, dir); + if (job_buf->uv_addr) + rga_mm_put_buffer(mm, job, job_buf->uv_addr, dir); + if (job_buf->v_addr) + rga_mm_put_buffer(mm, job, job_buf->v_addr, dir); + + if (job_buf->page_table) + free_pages((unsigned long)job_buf->page_table, job_buf->order); +} + static int rga_mm_get_channel_handle_info(struct rga_mm *mm, struct rga_job *job, struct rga_img_info_t *img, @@ -1514,6 +1530,8 @@ static int rga_mm_get_channel_handle_info(struct rga_mm *mm, ret = rga_mm_set_mmu_base(job, img, job_buf); if (ret < 0) { pr_err("Can't set RGA2 MMU_BASE from handle!\n"); + + rga_mm_put_channel_handle_info(mm, job, job_buf, dir); return ret; } } @@ -1521,22 +1539,6 @@ static int rga_mm_get_channel_handle_info(struct rga_mm *mm, return 0; } -static void rga_mm_put_channel_handle_info(struct rga_mm *mm, - struct rga_job *job, - struct rga_job_buffer *job_buf, - enum dma_data_direction dir) -{ - if (job_buf->y_addr) - rga_mm_put_buffer(mm, job, job_buf->y_addr, dir); - if (job_buf->uv_addr) - rga_mm_put_buffer(mm, job, job_buf->uv_addr, dir); - if (job_buf->v_addr) - rga_mm_put_buffer(mm, job, job_buf->v_addr, dir); - - if (job_buf->page_table) - free_pages((unsigned long)job_buf->page_table, job_buf->order); -} - static int rga_mm_get_handle_info(struct rga_job *job) { int ret = 0;