diff options
author | Sachin Kamat <sachin.kamat@linaro.org> | 2012-02-16 08:52:16 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-03-08 05:43:10 -0500 |
commit | d0d2832658a1677c2ba339db068475851277af7d (patch) | |
tree | e7559f3f73c2308e0095ccf67385f1cbb5e4f252 /drivers/media/video/s5p-g2d | |
parent | eb732518e0db585376f95256b18b2149240e3ad3 (diff) |
[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>
Diffstat (limited to 'drivers/media/video/s5p-g2d')
-rw-r--r-- | drivers/media/video/s5p-g2d/g2d-hw.c | 5 | ||||
-rw-r--r-- | drivers/media/video/s5p-g2d/g2d.c | 27 | ||||
-rw-r--r-- | drivers/media/video/s5p-g2d/g2d.h | 4 |
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 | ||
80 | void g2d_set_flip(struct g2d_dev *d, u32 r) | ||
81 | { | ||
82 | w(r, SRC_MSK_DIRECT_REG); | ||
83 | } | ||
84 | |||
80 | u32 g2d_cmd_stretch(u32 e) | 85 | u32 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 | ||
64 | struct g2d_fmt { | 67 | struct g2d_fmt { |
@@ -77,6 +80,7 @@ void g2d_set_dst_addr(struct g2d_dev *d, dma_addr_t a); | |||
77 | void g2d_start(struct g2d_dev *d); | 80 | void g2d_start(struct g2d_dev *d); |
78 | void g2d_clear_int(struct g2d_dev *d); | 81 | void g2d_clear_int(struct g2d_dev *d); |
79 | void g2d_set_rop4(struct g2d_dev *d, u32 r); | 82 | void g2d_set_rop4(struct g2d_dev *d, u32 r); |
83 | void g2d_set_flip(struct g2d_dev *d, u32 r); | ||
80 | u32 g2d_cmd_stretch(u32 e); | 84 | u32 g2d_cmd_stretch(u32 e); |
81 | void g2d_set_cmd(struct g2d_dev *d, u32 c); | 85 | void g2d_set_cmd(struct g2d_dev *d, u32 c); |
82 | 86 | ||