diff options
Diffstat (limited to 'drivers/media/video')
-rw-r--r-- | drivers/media/video/s5p-fimc/fimc-core.c | 36 | ||||
-rw-r--r-- | drivers/media/video/s5p-fimc/fimc-core.h | 30 |
2 files changed, 44 insertions, 22 deletions
diff --git a/drivers/media/video/s5p-fimc/fimc-core.c b/drivers/media/video/s5p-fimc/fimc-core.c index 6558a2ea9ffd..b151c7be8a50 100644 --- a/drivers/media/video/s5p-fimc/fimc-core.c +++ b/drivers/media/video/s5p-fimc/fimc-core.c @@ -303,7 +303,9 @@ static int fimc_prepare_addr(struct fimc_ctx *ctx, u32 pix_size; int ret = 0; - ctx_m2m_get_frame(frame, ctx, type); + frame = ctx_m2m_get_frame(ctx, type); + if (IS_ERR(frame)) + return PTR_ERR(frame); paddr = &frame->paddr; if (!buf) @@ -555,8 +557,10 @@ dma_unlock: spin_unlock_irqrestore(&ctx->slock, flags); } -/* Nothing done in job_abort. */ -static void fimc_job_abort(void *priv) {} +static void fimc_job_abort(void *priv) +{ + /* Nothing done in job_abort. */ +} static void fimc_buf_release(struct videobuf_queue *vq, struct videobuf_buffer *vb) @@ -571,7 +575,9 @@ static int fimc_buf_setup(struct videobuf_queue *vq, unsigned int *count, struct fimc_ctx *ctx = vq->priv_data; struct fimc_frame *frame; - ctx_m2m_get_frame(frame, ctx, vq->type); + frame = ctx_m2m_get_frame(ctx, vq->type); + if (IS_ERR(frame)) + return PTR_ERR(frame); *size = (frame->width * frame->height * frame->fmt->depth) >> 3; if (0 == *count) @@ -587,7 +593,9 @@ static int fimc_buf_prepare(struct videobuf_queue *vq, struct fimc_frame *frame; int ret; - ctx_m2m_get_frame(frame, ctx, vq->type); + frame = ctx_m2m_get_frame(ctx, vq->type); + if (IS_ERR(frame)) + return PTR_ERR(frame); if (vb->baddr) { if (vb->bsize < frame->size) { @@ -628,7 +636,7 @@ static void fimc_buf_queue(struct videobuf_queue *vq, v4l2_m2m_buf_queue(ctx->m2m_ctx, vq, vb); } -struct videobuf_queue_ops fimc_qops = { +static struct videobuf_queue_ops fimc_qops = { .buf_setup = fimc_buf_setup, .buf_prepare = fimc_buf_prepare, .buf_queue = fimc_buf_queue, @@ -670,7 +678,9 @@ static int fimc_m2m_g_fmt(struct file *file, void *priv, struct v4l2_format *f) struct fimc_ctx *ctx = priv; struct fimc_frame *frame; - ctx_m2m_get_frame(frame, ctx, f->type); + frame = ctx_m2m_get_frame(ctx, f->type); + if (IS_ERR(frame)) + return PTR_ERR(frame); f->fmt.pix.width = frame->width; f->fmt.pix.height = frame->height; @@ -1003,7 +1013,9 @@ static int fimc_m2m_cropcap(struct file *file, void *fh, struct fimc_frame *frame; struct fimc_ctx *ctx = fh; - ctx_m2m_get_frame(frame, ctx, cr->type); + frame = ctx_m2m_get_frame(ctx, cr->type); + if (IS_ERR(frame)) + return PTR_ERR(frame); cr->bounds.left = 0; cr->bounds.top = 0; @@ -1021,7 +1033,9 @@ static int fimc_m2m_g_crop(struct file *file, void *fh, struct v4l2_crop *cr) struct fimc_frame *frame; struct fimc_ctx *ctx = file->private_data; - ctx_m2m_get_frame(frame, ctx, cr->type); + frame = ctx_m2m_get_frame(ctx, cr->type); + if (IS_ERR(frame)) + return PTR_ERR(frame); cr->c.left = frame->offs_h; cr->c.top = frame->offs_v; @@ -1052,7 +1066,9 @@ static int fimc_m2m_s_crop(struct file *file, void *fh, struct v4l2_crop *cr) return -EINVAL; } - ctx_m2m_get_frame(f, ctx, cr->type); + f = ctx_m2m_get_frame(ctx, cr->type); + if (IS_ERR(f)) + return PTR_ERR(f); /* Adjust to required pixel boundary. */ min_size = (cr->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) ? diff --git a/drivers/media/video/s5p-fimc/fimc-core.h b/drivers/media/video/s5p-fimc/fimc-core.h index f121b939626a..6b3e0cd73cdd 100644 --- a/drivers/media/video/s5p-fimc/fimc-core.h +++ b/drivers/media/video/s5p-fimc/fimc-core.h @@ -28,18 +28,6 @@ #define dbg(fmt, args...) #endif -#define ctx_m2m_get_frame(frame, ctx, type) do { \ - if (V4L2_BUF_TYPE_VIDEO_OUTPUT == (type)) { \ - frame = &(ctx)->s_frame; \ - } else if (V4L2_BUF_TYPE_VIDEO_CAPTURE == (type)) { \ - frame = &(ctx)->d_frame; \ - } else { \ - v4l2_err(&(ctx)->fimc_dev->m2m.v4l2_dev,\ - "Wrong buffer/video queue type (%d)\n", type); \ - return -EINVAL; \ - } \ -} while (0) - #define NUM_FIMC_CLOCKS 2 #define MODULE_NAME "s5p-fimc" #define FIMC_MAX_DEVS 3 @@ -444,6 +432,24 @@ static inline void fimc_hw_stop_in_dma(struct fimc_dev *dev) writel(cfg, dev->regs + S5P_MSCTRL); } +static inline struct fimc_frame *ctx_m2m_get_frame(struct fimc_ctx *ctx, + enum v4l2_buf_type type) +{ + struct fimc_frame *frame; + + if (V4L2_BUF_TYPE_VIDEO_OUTPUT == type) { + frame = &ctx->s_frame; + } else if (V4L2_BUF_TYPE_VIDEO_CAPTURE == type) { + frame = &ctx->d_frame; + } else { + v4l2_err(&ctx->fimc_dev->m2m.v4l2_dev, + "Wrong buffer/video queue type (%d)\n", type); + return ERR_PTR(-EINVAL); + } + + return frame; +} + /* -----------------------------------------------------*/ /* fimc-reg.c */ void fimc_hw_reset(struct fimc_dev *dev); |