diff options
-rw-r--r-- | drivers/media/video/cx88/cx88-core.c | 4 | ||||
-rw-r--r-- | drivers/media/video/cx88/cx88-video.c | 29 |
2 files changed, 30 insertions, 3 deletions
diff --git a/drivers/media/video/cx88/cx88-core.c b/drivers/media/video/cx88/cx88-core.c index 2e145f0a5fd9..20ad809568cf 100644 --- a/drivers/media/video/cx88/cx88-core.c +++ b/drivers/media/video/cx88/cx88-core.c | |||
@@ -759,8 +759,8 @@ int cx88_set_scale(struct cx88_core *core, unsigned int width, unsigned int heig | |||
759 | if (nocomb) | 759 | if (nocomb) |
760 | value |= (3 << 5); // disable comb filter | 760 | value |= (3 << 5); // disable comb filter |
761 | 761 | ||
762 | cx_write(MO_FILTER_EVEN, value); | 762 | cx_andor(MO_FILTER_EVEN, 0x7ffc7f, value); /* preserve PEAKEN, PSEL */ |
763 | cx_write(MO_FILTER_ODD, value); | 763 | cx_andor(MO_FILTER_ODD, 0x7ffc7f, value); |
764 | dprintk(1,"set_scale: filter 0x%04x\n", value); | 764 | dprintk(1,"set_scale: filter 0x%04x\n", value); |
765 | 765 | ||
766 | return 0; | 766 | return 0; |
diff --git a/drivers/media/video/cx88/cx88-video.c b/drivers/media/video/cx88/cx88-video.c index 1db97f3a1975..516aa6ec1e82 100644 --- a/drivers/media/video/cx88/cx88-video.c +++ b/drivers/media/video/cx88/cx88-video.c | |||
@@ -221,7 +221,23 @@ static const struct cx88_ctrl cx8800_ctls[] = { | |||
221 | .reg = MO_UV_SATURATION, | 221 | .reg = MO_UV_SATURATION, |
222 | .mask = 0x00ff, | 222 | .mask = 0x00ff, |
223 | .shift = 0, | 223 | .shift = 0, |
224 | },{ | 224 | }, { |
225 | .v = { | ||
226 | .id = V4L2_CID_SHARPNESS, | ||
227 | .name = "Sharpness", | ||
228 | .minimum = 0, | ||
229 | .maximum = 4, | ||
230 | .step = 1, | ||
231 | .default_value = 0x0, | ||
232 | .type = V4L2_CTRL_TYPE_INTEGER, | ||
233 | }, | ||
234 | .off = 0, | ||
235 | /* NOTE: the value is converted and written to both even | ||
236 | and odd registers in the code */ | ||
237 | .reg = MO_FILTER_ODD, | ||
238 | .mask = 7 << 7, | ||
239 | .shift = 7, | ||
240 | }, { | ||
225 | .v = { | 241 | .v = { |
226 | .id = V4L2_CID_CHROMA_AGC, | 242 | .id = V4L2_CID_CHROMA_AGC, |
227 | .name = "Chroma AGC", | 243 | .name = "Chroma AGC", |
@@ -301,6 +317,7 @@ const u32 cx88_user_ctrls[] = { | |||
301 | V4L2_CID_AUDIO_VOLUME, | 317 | V4L2_CID_AUDIO_VOLUME, |
302 | V4L2_CID_AUDIO_BALANCE, | 318 | V4L2_CID_AUDIO_BALANCE, |
303 | V4L2_CID_AUDIO_MUTE, | 319 | V4L2_CID_AUDIO_MUTE, |
320 | V4L2_CID_SHARPNESS, | ||
304 | V4L2_CID_CHROMA_AGC, | 321 | V4L2_CID_CHROMA_AGC, |
305 | V4L2_CID_COLOR_KILLER, | 322 | V4L2_CID_COLOR_KILLER, |
306 | 0 | 323 | 0 |
@@ -963,6 +980,10 @@ int cx88_get_control (struct cx88_core *core, struct v4l2_control *ctl) | |||
963 | case V4L2_CID_AUDIO_VOLUME: | 980 | case V4L2_CID_AUDIO_VOLUME: |
964 | ctl->value = 0x3f - (value & 0x3f); | 981 | ctl->value = 0x3f - (value & 0x3f); |
965 | break; | 982 | break; |
983 | case V4L2_CID_SHARPNESS: | ||
984 | ctl->value = ((value & 0x0200) ? (((value & 0x0180) >> 7) + 1) | ||
985 | : 0); | ||
986 | break; | ||
966 | default: | 987 | default: |
967 | ctl->value = ((value + (c->off << c->shift)) & c->mask) >> c->shift; | 988 | ctl->value = ((value + (c->off << c->shift)) & c->mask) >> c->shift; |
968 | break; | 989 | break; |
@@ -1040,6 +1061,12 @@ int cx88_set_control(struct cx88_core *core, struct v4l2_control *ctl) | |||
1040 | } | 1061 | } |
1041 | mask=0xffff; | 1062 | mask=0xffff; |
1042 | break; | 1063 | break; |
1064 | case V4L2_CID_SHARPNESS: | ||
1065 | /* 0b000, 0b100, 0b101, 0b110, or 0b111 */ | ||
1066 | value = (ctl->value < 1 ? 0 : ((ctl->value + 3) << 7)); | ||
1067 | /* needs to be set for both fields */ | ||
1068 | cx_andor(MO_FILTER_EVEN, mask, value); | ||
1069 | break; | ||
1043 | case V4L2_CID_CHROMA_AGC: | 1070 | case V4L2_CID_CHROMA_AGC: |
1044 | /* Do not allow chroma AGC to be enabled for SECAM */ | 1071 | /* Do not allow chroma AGC to be enabled for SECAM */ |
1045 | value = ((ctl->value - c->off) << c->shift) & c->mask; | 1072 | value = ((ctl->value - c->off) << c->shift) & c->mask; |