summaryrefslogtreecommitdiff
path: root/drivers/media/video
diff options
context:
space:
mode:
authorRobby Cai <r63905@freescale.com>2009-10-13 13:33:16 +0800
committerAlejandro Gonzalez <alex.gonzalez@digi.com>2010-02-12 17:19:22 +0100
commiteec1e88a6bcd530ad33df4f51fa186a263e0a59d (patch)
tree8c6c4b31aa11ab3db6c09563ef9933e6dbde4a68 /drivers/media/video
parent0013e8e158f7f4e3c136e4722f8743494c9fee36 (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.c63
-rw-r--r--drivers/media/video/pxp.h5
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 {