aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/s5p-g2d
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/video/s5p-g2d')
-rw-r--r--drivers/media/video/s5p-g2d/g2d-hw.c5
-rw-r--r--drivers/media/video/s5p-g2d/g2d.c27
-rw-r--r--drivers/media/video/s5p-g2d/g2d.h4
3 files changed, 29 insertions, 7 deletions
diff --git a/drivers/media/video/s5p-g2d/g2d-hw.c b/drivers/media/video/s5p-g2d/g2d-hw.c
index 39937cf03c88..5b86cbe408e2 100644
--- a/drivers/media/video/s5p-g2d/g2d-hw.c
+++ b/drivers/media/video/s5p-g2d/g2d-hw.c
@@ -77,6 +77,11 @@ void g2d_set_rop4(struct g2d_dev *d, u32 r)
77 w(r, ROP4_REG); 77 w(r, ROP4_REG);
78} 78}
79 79
80void g2d_set_flip(struct g2d_dev *d, u32 r)
81{
82 w(r, SRC_MSK_DIRECT_REG);
83}
84
80u32 g2d_cmd_stretch(u32 e) 85u32 g2d_cmd_stretch(u32 e)
81{ 86{
82 e &= 1; 87 e &= 1;
diff --git a/drivers/media/video/s5p-g2d/g2d.c b/drivers/media/video/s5p-g2d/g2d.c
index 351080a217fe..e41357f6865d 100644
--- a/drivers/media/video/s5p-g2d/g2d.c
+++ b/drivers/media/video/s5p-g2d/g2d.c
@@ -185,6 +185,11 @@ static int g2d_s_ctrl(struct v4l2_ctrl *ctrl)
185 else 185 else
186 ctx->rop = ROP4_COPY; 186 ctx->rop = ROP4_COPY;
187 break; 187 break;
188
189 case V4L2_CID_HFLIP:
190 ctx->flip = ctx->ctrl_hflip->val | (ctx->ctrl_vflip->val << 1);
191 break;
192
188 default: 193 default:
189 v4l2_err(&ctx->dev->v4l2_dev, "unknown control\n"); 194 v4l2_err(&ctx->dev->v4l2_dev, "unknown control\n");
190 return -EINVAL; 195 return -EINVAL;
@@ -200,11 +205,13 @@ int g2d_setup_ctrls(struct g2d_ctx *ctx)
200{ 205{
201 struct g2d_dev *dev = ctx->dev; 206 struct g2d_dev *dev = ctx->dev;
202 207
203 v4l2_ctrl_handler_init(&ctx->ctrl_handler, 1); 208 v4l2_ctrl_handler_init(&ctx->ctrl_handler, 3);
204 if (ctx->ctrl_handler.error) { 209
205 v4l2_err(&dev->v4l2_dev, "v4l2_ctrl_handler_init failed\n"); 210 ctx->ctrl_hflip = v4l2_ctrl_new_std(&ctx->ctrl_handler, &g2d_ctrl_ops,
206 return ctx->ctrl_handler.error; 211 V4L2_CID_HFLIP, 0, 1, 1, 0);
207 } 212
213 ctx->ctrl_vflip = v4l2_ctrl_new_std(&ctx->ctrl_handler, &g2d_ctrl_ops,
214 V4L2_CID_VFLIP, 0, 1, 1, 0);
208 215
209 v4l2_ctrl_new_std_menu( 216 v4l2_ctrl_new_std_menu(
210 &ctx->ctrl_handler, 217 &ctx->ctrl_handler,
@@ -215,10 +222,14 @@ int g2d_setup_ctrls(struct g2d_ctx *ctx)
215 V4L2_COLORFX_NONE); 222 V4L2_COLORFX_NONE);
216 223
217 if (ctx->ctrl_handler.error) { 224 if (ctx->ctrl_handler.error) {
218 v4l2_err(&dev->v4l2_dev, "v4l2_ctrl_handler_init failed\n"); 225 int err = ctx->ctrl_handler.error;
219 return ctx->ctrl_handler.error; 226 v4l2_err(&dev->v4l2_dev, "g2d_setup_ctrls failed\n");
227 v4l2_ctrl_handler_free(&ctx->ctrl_handler);
228 return err;
220 } 229 }
221 230
231 v4l2_ctrl_cluster(2, &ctx->ctrl_hflip);
232
222 return 0; 233 return 0;
223} 234}
224 235
@@ -564,6 +575,8 @@ static void device_run(void *prv)
564 g2d_set_dst_addr(dev, vb2_dma_contig_plane_dma_addr(dst, 0)); 575 g2d_set_dst_addr(dev, vb2_dma_contig_plane_dma_addr(dst, 0));
565 576
566 g2d_set_rop4(dev, ctx->rop); 577 g2d_set_rop4(dev, ctx->rop);
578 g2d_set_flip(dev, ctx->flip);
579
567 if (ctx->in.c_width != ctx->out.c_width || 580 if (ctx->in.c_width != ctx->out.c_width ||
568 ctx->in.c_height != ctx->out.c_height) 581 ctx->in.c_height != ctx->out.c_height)
569 cmd |= g2d_cmd_stretch(1); 582 cmd |= g2d_cmd_stretch(1);
diff --git a/drivers/media/video/s5p-g2d/g2d.h b/drivers/media/video/s5p-g2d/g2d.h
index 5eae90107bf8..78848d2f2073 100644
--- a/drivers/media/video/s5p-g2d/g2d.h
+++ b/drivers/media/video/s5p-g2d/g2d.h
@@ -57,8 +57,11 @@ struct g2d_ctx {
57 struct v4l2_m2m_ctx *m2m_ctx; 57 struct v4l2_m2m_ctx *m2m_ctx;
58 struct g2d_frame in; 58 struct g2d_frame in;
59 struct g2d_frame out; 59 struct g2d_frame out;
60 struct v4l2_ctrl *ctrl_hflip;
61 struct v4l2_ctrl *ctrl_vflip;
60 struct v4l2_ctrl_handler ctrl_handler; 62 struct v4l2_ctrl_handler ctrl_handler;
61 u32 rop; 63 u32 rop;
64 u32 flip;
62}; 65};
63 66
64struct g2d_fmt { 67struct g2d_fmt {
@@ -77,6 +80,7 @@ void g2d_set_dst_addr(struct g2d_dev *d, dma_addr_t a);
77void g2d_start(struct g2d_dev *d); 80void g2d_start(struct g2d_dev *d);
78void g2d_clear_int(struct g2d_dev *d); 81void g2d_clear_int(struct g2d_dev *d);
79void g2d_set_rop4(struct g2d_dev *d, u32 r); 82void g2d_set_rop4(struct g2d_dev *d, u32 r);
83void g2d_set_flip(struct g2d_dev *d, u32 r);
80u32 g2d_cmd_stretch(u32 e); 84u32 g2d_cmd_stretch(u32 e);
81void g2d_set_cmd(struct g2d_dev *d, u32 c); 85void g2d_set_cmd(struct g2d_dev *d, u32 c);
82 86