diff options
author | Robby Cai <r63905@freescale.com> | 2009-10-13 13:33:16 +0800 |
---|---|---|
committer | Alejandro Gonzalez <alex.gonzalez@digi.com> | 2010-02-12 17:19:22 +0100 |
commit | eec1e88a6bcd530ad33df4f51fa186a263e0a59d (patch) | |
tree | 8c6c4b31aa11ab3db6c09563ef9933e6dbde4a68 /drivers/media/video | |
parent | 0013e8e158f7f4e3c136e4722f8743494c9fee36 (diff) |
ENGR00117203 MX23 Fix the wrong operations on chromakey in PXP/V4L2 driver
Separate chromakey setting for s1 and s0.
Set chromakey for S1 via S_FMT
set chromakey for S0 via S_CTRL (with private CID)
Current V4l2 framework can not support this case with only S_FMT.
Signed-off-by: Robby Cai <r63905@freescale.com>
Diffstat (limited to 'drivers/media/video')
-rw-r--r-- | drivers/media/video/pxp.c | 63 | ||||
-rw-r--r-- | drivers/media/video/pxp.h | 5 |
2 files changed, 52 insertions, 16 deletions
diff --git a/drivers/media/video/pxp.c b/drivers/media/video/pxp.c index 02b1fe3b364e..6540ef58b050 100644 --- a/drivers/media/video/pxp.c +++ b/drivers/media/video/pxp.c @@ -128,6 +128,15 @@ struct v4l2_queryctrl pxp_controls[] = { .type = V4L2_CTRL_TYPE_INTEGER, }, { .id = V4L2_CID_PRIVATE_BASE + 2, + .name = "Set S0 Chromakey", + .minimum = -1, + .maximum = 0xFFFFFF, + .step = 1, + .default_value = -1, + .flags = 0, + .type = V4L2_CTRL_TYPE_INTEGER, + }, { + .id = V4L2_CID_PRIVATE_BASE + 3, .name = "YUV Colorspace", .minimum = 0, .maximum = 1, @@ -172,11 +181,30 @@ static void pxp_set_rgbbuf(struct pxps *pxp) REGS_PXP_BASE + HW_PXP_RGBSIZE); } -static void pxp_set_colorkey(struct pxps *pxp) +static void pxp_set_s0colorkey(struct pxps *pxp) { /* Low and high are set equal. V4L does not allow a chromakey range */ - __raw_writel(pxp->chromakey, REGS_PXP_BASE + HW_PXP_S0COLORKEYLOW); - __raw_writel(pxp->chromakey, REGS_PXP_BASE + HW_PXP_S0COLORKEYHIGH); + if (pxp->s0_chromakey == -1) { + /* disable color key */ + __raw_writel(0xFFFFFF, REGS_PXP_BASE + HW_PXP_S0COLORKEYLOW); + __raw_writel(0, REGS_PXP_BASE + HW_PXP_S0COLORKEYHIGH); + } else { + __raw_writel(pxp->s0_chromakey, REGS_PXP_BASE + HW_PXP_S0COLORKEYLOW); + __raw_writel(pxp->s0_chromakey, REGS_PXP_BASE + HW_PXP_S0COLORKEYHIGH); + } +} + +static void pxp_set_s1colorkey(struct pxps *pxp) +{ + /* Low and high are set equal. V4L does not allow a chromakey range */ + if (pxp->s1_chromakey_state != 0 && pxp->s1_chromakey != -1) { + __raw_writel(pxp->s1_chromakey, REGS_PXP_BASE + HW_PXP_OLCOLORKEYLOW); + __raw_writel(pxp->s1_chromakey, REGS_PXP_BASE + HW_PXP_OLCOLORKEYHIGH); + } else { + /* disable color key */ + __raw_writel(0xFFFFFF, REGS_PXP_BASE + HW_PXP_OLCOLORKEYLOW); + __raw_writel(0, REGS_PXP_BASE + HW_PXP_OLCOLORKEYHIGH); + } } static void pxp_set_oln(struct pxps *pxp) @@ -202,7 +230,7 @@ static void pxp_set_olparam(struct pxps *pxp) if (pxp->global_alpha_state) olparam |= BF(BV_PXP_OLnPARAM_ALPHA_CNTL__Override, PXP_OLnPARAM_ALPHA_CNTL); - if (pxp->chromakey_state) + if (pxp->s1_chromakey_state) olparam |= BM_PXP_OLnPARAM_ENABLE_COLORKEY; if (pxp->overlay_state) olparam |= BM_PXP_OLnPARAM_ENABLE; @@ -316,6 +344,9 @@ static int pxp_set_cstate(struct pxps *pxp, struct v4l2_control *vc) pxp->s0_bgcolor = vc->value; pxp_set_s0bg(pxp); } else if (vc->id == V4L2_CID_PRIVATE_BASE + 2) { + pxp->s0_chromakey = vc->value; + pxp_set_s0colorkey(pxp); + } else if (vc->id == V4L2_CID_PRIVATE_BASE + 3) { pxp->yuv = vc->value; pxp_set_csc(pxp); } @@ -336,6 +367,8 @@ static int pxp_get_cstate(struct pxps *pxp, struct v4l2_control *vc) else if (vc->id == V4L2_CID_PRIVATE_BASE + 1) vc->value = pxp->s0_bgcolor; else if (vc->id == V4L2_CID_PRIVATE_BASE + 2) + vc->value = pxp->s0_chromakey; + else if (vc->id == V4L2_CID_PRIVATE_BASE + 3) vc->value = pxp->yuv; return 0; @@ -505,7 +538,7 @@ static int pxp_g_fmt_output_overlay(struct file *file, void *fh, struct v4l2_window *wf = &f->fmt.win; memset(wf, 0, sizeof(struct v4l2_window)); - wf->chromakey = pxp->chromakey; + wf->chromakey = pxp->s1_chromakey; wf->global_alpha = pxp->global_alpha; wf->field = V4L2_FIELD_NONE; wf->clips = NULL; @@ -525,14 +558,14 @@ static int pxp_try_fmt_output_overlay(struct file *file, void *fh, struct pxps *pxp = video_get_drvdata(video_devdata(file)); struct v4l2_window *wf = &f->fmt.win; struct v4l2_rect srect; - u32 chromakey = wf->chromakey; + u32 s1_chromakey = wf->chromakey; u8 global_alpha = wf->global_alpha; memcpy(&srect, &(wf->w), sizeof(struct v4l2_rect)); pxp_g_fmt_output_overlay(file, fh, f); - wf->chromakey = chromakey; + wf->chromakey = s1_chromakey; wf->global_alpha = global_alpha; /* Constrain parameters to the input buffer */ @@ -557,12 +590,12 @@ static int pxp_s_fmt_output_overlay(struct file *file, void *fh, pxp->srect.width = wf->w.width; pxp->srect.height = wf->w.height; pxp->global_alpha = wf->global_alpha; - pxp->chromakey = wf->chromakey; + pxp->s1_chromakey = wf->chromakey; pxp_set_s0param(pxp); pxp_set_s0crop(pxp); pxp_set_scaling(pxp); pxp_set_olparam(pxp); - pxp_set_colorkey(pxp); + pxp_set_s1colorkey(pxp); } return ret; @@ -772,7 +805,7 @@ static int pxp_g_fbuf(struct file *file, void *priv, fb->flags |= V4L2_FBUF_FLAG_GLOBAL_ALPHA; if (pxp->local_alpha_state) fb->flags |= V4L2_FBUF_FLAG_LOCAL_ALPHA; - if (pxp->chromakey_state) + if (pxp->s1_chromakey_state) fb->flags |= V4L2_FBUF_FLAG_CHROMAKEY; return 0; @@ -792,7 +825,7 @@ static int pxp_s_fbuf(struct file *file, void *priv, /* Global alpha overrides local alpha if both are requested */ if (pxp->global_alpha_state && pxp->local_alpha_state) pxp->local_alpha_state = 0; - pxp->chromakey_state = + pxp->s1_chromakey_state = (fb->flags & V4L2_FBUF_FLAG_CHROMAKEY) != 0; pxp_set_olparam(pxp); @@ -952,8 +985,9 @@ static int pxp_hw_init(struct pxps *pxp) pxp->global_alpha_state = 0; pxp->global_alpha = 0; pxp->local_alpha_state = 0; - pxp->chromakey_state = 0; - pxp->chromakey = 0; + pxp->s1_chromakey_state = 0; + pxp->s1_chromakey = -1; + pxp->s0_chromakey = -1; /* Write default h/w config */ pxp_set_ctrl(pxp); @@ -961,7 +995,8 @@ static int pxp_hw_init(struct pxps *pxp) pxp_set_s0crop(pxp); pxp_set_oln(pxp); pxp_set_olparam(pxp); - pxp_set_colorkey(pxp); + pxp_set_s0colorkey(pxp); + pxp_set_s1colorkey(pxp); pxp_set_csc(pxp); return 0; diff --git a/drivers/media/video/pxp.h b/drivers/media/video/pxp.h index 0e2cd62969ca..4ac191fa7d65 100644 --- a/drivers/media/video/pxp.h +++ b/drivers/media/video/pxp.h @@ -41,6 +41,7 @@ struct pxps { u32 s0_width; u32 s0_height; u32 s0_bgcolor; + u32 s0_chromakey; struct v4l2_framebuffer fb; struct v4l2_rect drect; @@ -58,8 +59,8 @@ struct pxps { int global_alpha_state; u8 global_alpha; int local_alpha_state; - int chromakey_state; - u32 chromakey; + int s1_chromakey_state; + u32 s1_chromakey; }; struct pxp_data_format { |