mirror of https://gitee.com/openkylin/linux.git
[media] s5p-g2d: Add HFLIP and VFLIP support
Add support for flipping the image horizontally and vertically. Signed-off-by: Sachin Kamat <sachin.kamat@linaro.org> Acked-by: Sylwester Nawrocki <s.nawrocki@samsung.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
eb732518e0
commit
d0d2832658
|
@ -77,6 +77,11 @@ void g2d_set_rop4(struct g2d_dev *d, u32 r)
|
||||||
w(r, ROP4_REG);
|
w(r, ROP4_REG);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void g2d_set_flip(struct g2d_dev *d, u32 r)
|
||||||
|
{
|
||||||
|
w(r, SRC_MSK_DIRECT_REG);
|
||||||
|
}
|
||||||
|
|
||||||
u32 g2d_cmd_stretch(u32 e)
|
u32 g2d_cmd_stretch(u32 e)
|
||||||
{
|
{
|
||||||
e &= 1;
|
e &= 1;
|
||||||
|
|
|
@ -185,6 +185,11 @@ static int g2d_s_ctrl(struct v4l2_ctrl *ctrl)
|
||||||
else
|
else
|
||||||
ctx->rop = ROP4_COPY;
|
ctx->rop = ROP4_COPY;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case V4L2_CID_HFLIP:
|
||||||
|
ctx->flip = ctx->ctrl_hflip->val | (ctx->ctrl_vflip->val << 1);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
v4l2_err(&ctx->dev->v4l2_dev, "unknown control\n");
|
v4l2_err(&ctx->dev->v4l2_dev, "unknown control\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -200,11 +205,13 @@ int g2d_setup_ctrls(struct g2d_ctx *ctx)
|
||||||
{
|
{
|
||||||
struct g2d_dev *dev = ctx->dev;
|
struct g2d_dev *dev = ctx->dev;
|
||||||
|
|
||||||
v4l2_ctrl_handler_init(&ctx->ctrl_handler, 1);
|
v4l2_ctrl_handler_init(&ctx->ctrl_handler, 3);
|
||||||
if (ctx->ctrl_handler.error) {
|
|
||||||
v4l2_err(&dev->v4l2_dev, "v4l2_ctrl_handler_init failed\n");
|
ctx->ctrl_hflip = v4l2_ctrl_new_std(&ctx->ctrl_handler, &g2d_ctrl_ops,
|
||||||
return ctx->ctrl_handler.error;
|
V4L2_CID_HFLIP, 0, 1, 1, 0);
|
||||||
}
|
|
||||||
|
ctx->ctrl_vflip = v4l2_ctrl_new_std(&ctx->ctrl_handler, &g2d_ctrl_ops,
|
||||||
|
V4L2_CID_VFLIP, 0, 1, 1, 0);
|
||||||
|
|
||||||
v4l2_ctrl_new_std_menu(
|
v4l2_ctrl_new_std_menu(
|
||||||
&ctx->ctrl_handler,
|
&ctx->ctrl_handler,
|
||||||
|
@ -215,10 +222,14 @@ int g2d_setup_ctrls(struct g2d_ctx *ctx)
|
||||||
V4L2_COLORFX_NONE);
|
V4L2_COLORFX_NONE);
|
||||||
|
|
||||||
if (ctx->ctrl_handler.error) {
|
if (ctx->ctrl_handler.error) {
|
||||||
v4l2_err(&dev->v4l2_dev, "v4l2_ctrl_handler_init failed\n");
|
int err = ctx->ctrl_handler.error;
|
||||||
return ctx->ctrl_handler.error;
|
v4l2_err(&dev->v4l2_dev, "g2d_setup_ctrls failed\n");
|
||||||
|
v4l2_ctrl_handler_free(&ctx->ctrl_handler);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
v4l2_ctrl_cluster(2, &ctx->ctrl_hflip);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -564,6 +575,8 @@ static void device_run(void *prv)
|
||||||
g2d_set_dst_addr(dev, vb2_dma_contig_plane_dma_addr(dst, 0));
|
g2d_set_dst_addr(dev, vb2_dma_contig_plane_dma_addr(dst, 0));
|
||||||
|
|
||||||
g2d_set_rop4(dev, ctx->rop);
|
g2d_set_rop4(dev, ctx->rop);
|
||||||
|
g2d_set_flip(dev, ctx->flip);
|
||||||
|
|
||||||
if (ctx->in.c_width != ctx->out.c_width ||
|
if (ctx->in.c_width != ctx->out.c_width ||
|
||||||
ctx->in.c_height != ctx->out.c_height)
|
ctx->in.c_height != ctx->out.c_height)
|
||||||
cmd |= g2d_cmd_stretch(1);
|
cmd |= g2d_cmd_stretch(1);
|
||||||
|
|
|
@ -57,8 +57,11 @@ struct g2d_ctx {
|
||||||
struct v4l2_m2m_ctx *m2m_ctx;
|
struct v4l2_m2m_ctx *m2m_ctx;
|
||||||
struct g2d_frame in;
|
struct g2d_frame in;
|
||||||
struct g2d_frame out;
|
struct g2d_frame out;
|
||||||
|
struct v4l2_ctrl *ctrl_hflip;
|
||||||
|
struct v4l2_ctrl *ctrl_vflip;
|
||||||
struct v4l2_ctrl_handler ctrl_handler;
|
struct v4l2_ctrl_handler ctrl_handler;
|
||||||
u32 rop;
|
u32 rop;
|
||||||
|
u32 flip;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct g2d_fmt {
|
struct g2d_fmt {
|
||||||
|
@ -77,6 +80,7 @@ void g2d_set_dst_addr(struct g2d_dev *d, dma_addr_t a);
|
||||||
void g2d_start(struct g2d_dev *d);
|
void g2d_start(struct g2d_dev *d);
|
||||||
void g2d_clear_int(struct g2d_dev *d);
|
void g2d_clear_int(struct g2d_dev *d);
|
||||||
void g2d_set_rop4(struct g2d_dev *d, u32 r);
|
void g2d_set_rop4(struct g2d_dev *d, u32 r);
|
||||||
|
void g2d_set_flip(struct g2d_dev *d, u32 r);
|
||||||
u32 g2d_cmd_stretch(u32 e);
|
u32 g2d_cmd_stretch(u32 e);
|
||||||
void g2d_set_cmd(struct g2d_dev *d, u32 c);
|
void g2d_set_cmd(struct g2d_dev *d, u32 c);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue