diff options
-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 { |