|
@@ -228,6 +228,18 @@ static struct cx88_ctrl cx8800_ctls[] = {
|
|
|
.mask = 0x00ff,
|
|
|
.shift = 0,
|
|
|
},{
|
|
|
+ .v = {
|
|
|
+ .id = V4L2_CID_CHROMA_AGC,
|
|
|
+ .name = "Chroma AGC",
|
|
|
+ .minimum = 0,
|
|
|
+ .maximum = 1,
|
|
|
+ .default_value = 0x0,
|
|
|
+ .type = V4L2_CTRL_TYPE_BOOLEAN,
|
|
|
+ },
|
|
|
+ .reg = MO_INPUT_FORMAT,
|
|
|
+ .mask = 1 << 10,
|
|
|
+ .shift = 10,
|
|
|
+ }, {
|
|
|
/* --- audio --- */
|
|
|
.v = {
|
|
|
.id = V4L2_CID_AUDIO_MUTE,
|
|
@@ -282,6 +294,7 @@ const u32 cx88_user_ctrls[] = {
|
|
|
V4L2_CID_AUDIO_VOLUME,
|
|
|
V4L2_CID_AUDIO_BALANCE,
|
|
|
V4L2_CID_AUDIO_MUTE,
|
|
|
+ V4L2_CID_CHROMA_AGC,
|
|
|
0
|
|
|
};
|
|
|
EXPORT_SYMBOL(cx88_user_ctrls);
|
|
@@ -291,7 +304,7 @@ static const u32 *ctrl_classes[] = {
|
|
|
NULL
|
|
|
};
|
|
|
|
|
|
-int cx8800_ctrl_query(struct v4l2_queryctrl *qctrl)
|
|
|
+int cx8800_ctrl_query(struct cx88_core *core, struct v4l2_queryctrl *qctrl)
|
|
|
{
|
|
|
int i;
|
|
|
|
|
@@ -306,6 +319,11 @@ int cx8800_ctrl_query(struct v4l2_queryctrl *qctrl)
|
|
|
return 0;
|
|
|
}
|
|
|
*qctrl = cx8800_ctls[i].v;
|
|
|
+ /* Report chroma AGC as inactive when SECAM is selected */
|
|
|
+ if (cx8800_ctls[i].v.id == V4L2_CID_CHROMA_AGC &&
|
|
|
+ core->tvnorm & V4L2_STD_SECAM)
|
|
|
+ qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
EXPORT_SYMBOL(cx8800_ctrl_query);
|
|
@@ -976,6 +994,12 @@ int cx88_set_control(struct cx88_core *core, struct v4l2_control *ctl)
|
|
|
}
|
|
|
mask=0xffff;
|
|
|
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;
|
|
|
+ if (core->tvnorm & V4L2_STD_SECAM && value)
|
|
|
+ return -EINVAL;
|
|
|
+ break;
|
|
|
default:
|
|
|
value = ((ctl->value - c->off) << c->shift) & c->mask;
|
|
|
break;
|
|
@@ -1268,10 +1292,12 @@ static int vidioc_s_input (struct file *file, void *priv, unsigned int i)
|
|
|
static int vidioc_queryctrl (struct file *file, void *priv,
|
|
|
struct v4l2_queryctrl *qctrl)
|
|
|
{
|
|
|
+ struct cx88_core *core = ((struct cx8800_fh *)priv)->dev->core;
|
|
|
+
|
|
|
qctrl->id = v4l2_ctrl_next(ctrl_classes, qctrl->id);
|
|
|
if (unlikely(qctrl->id == 0))
|
|
|
return -EINVAL;
|
|
|
- return cx8800_ctrl_query(qctrl);
|
|
|
+ return cx8800_ctrl_query(core, qctrl);
|
|
|
}
|
|
|
|
|
|
static int vidioc_g_ctrl (struct file *file, void *priv,
|