[media] cx88: implemented sharpness control
authoristvan_v@mailbox.hu <istvan_v@mailbox.hu>
Mon, 11 Jul 2011 14:02:19 +0000 (11:02 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Wed, 27 Jul 2011 20:56:01 +0000 (17:56 -0300)
This patch implements support for a sharpness control, using the luma
peaking filter feature of cx2388x.

[mchehab@redhat.com: use cx_andor instead of cx_write]
Signed-off-by: Istvan Varga <istvan_v@mailbox.hu>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/cx88/cx88-core.c
drivers/media/video/cx88/cx88-video.c

index 2e145f0..20ad809 100644 (file)
@@ -759,8 +759,8 @@ int cx88_set_scale(struct cx88_core *core, unsigned int width, unsigned int heig
        if (nocomb)
                value |= (3 << 5); // disable comb filter
 
-       cx_write(MO_FILTER_EVEN,  value);
-       cx_write(MO_FILTER_ODD,   value);
+       cx_andor(MO_FILTER_EVEN,  0x7ffc7f, value); /* preserve PEAKEN, PSEL */
+       cx_andor(MO_FILTER_ODD,   0x7ffc7f, value);
        dprintk(1,"set_scale: filter  0x%04x\n", value);
 
        return 0;
index 1db97f3..516aa6e 100644 (file)
@@ -221,7 +221,23 @@ static const struct cx88_ctrl cx8800_ctls[] = {
                .reg                   = MO_UV_SATURATION,
                .mask                  = 0x00ff,
                .shift                 = 0,
-       },{
+       }, {
+               .v = {
+                       .id            = V4L2_CID_SHARPNESS,
+                       .name          = "Sharpness",
+                       .minimum       = 0,
+                       .maximum       = 4,
+                       .step          = 1,
+                       .default_value = 0x0,
+                       .type          = V4L2_CTRL_TYPE_INTEGER,
+               },
+               .off                   = 0,
+               /* NOTE: the value is converted and written to both even
+                  and odd registers in the code */
+               .reg                   = MO_FILTER_ODD,
+               .mask                  = 7 << 7,
+               .shift                 = 7,
+       }, {
                .v = {
                        .id            = V4L2_CID_CHROMA_AGC,
                        .name          = "Chroma AGC",
@@ -301,6 +317,7 @@ const u32 cx88_user_ctrls[] = {
        V4L2_CID_AUDIO_VOLUME,
        V4L2_CID_AUDIO_BALANCE,
        V4L2_CID_AUDIO_MUTE,
+       V4L2_CID_SHARPNESS,
        V4L2_CID_CHROMA_AGC,
        V4L2_CID_COLOR_KILLER,
        0
@@ -963,6 +980,10 @@ int cx88_get_control (struct cx88_core  *core, struct v4l2_control *ctl)
        case V4L2_CID_AUDIO_VOLUME:
                ctl->value = 0x3f - (value & 0x3f);
                break;
+       case V4L2_CID_SHARPNESS:
+               ctl->value = ((value & 0x0200) ? (((value & 0x0180) >> 7) + 1)
+                                                : 0);
+               break;
        default:
                ctl->value = ((value + (c->off << c->shift)) & c->mask) >> c->shift;
                break;
@@ -1040,6 +1061,12 @@ int cx88_set_control(struct cx88_core *core, struct v4l2_control *ctl)
                }
                mask=0xffff;
                break;
+       case V4L2_CID_SHARPNESS:
+               /* 0b000, 0b100, 0b101, 0b110, or 0b111 */
+               value = (ctl->value < 1 ? 0 : ((ctl->value + 3) << 7));
+               /* needs to be set for both fields */
+               cx_andor(MO_FILTER_EVEN, mask, value);
+               break;
        case V4L2_CID_CHROMA_AGC:
                /* Do not allow chroma AGC to be enabled for SECAM */
                value = ((ctl->value - c->off) << c->shift) & c->mask;