|
@@ -957,6 +957,41 @@ static int si4713_choose_econtrol_action(struct si4713_device *sdev, u32 id,
|
|
|
*bit = 5;
|
|
|
*mask = 0x1F << 5;
|
|
|
break;
|
|
|
+ case V4L2_CID_RDS_TX_DYNAMIC_PTY:
|
|
|
+ *property = SI4713_TX_RDS_PS_MISC;
|
|
|
+ *bit = 15;
|
|
|
+ *mask = 1 << 15;
|
|
|
+ break;
|
|
|
+ case V4L2_CID_RDS_TX_COMPRESSED:
|
|
|
+ *property = SI4713_TX_RDS_PS_MISC;
|
|
|
+ *bit = 14;
|
|
|
+ *mask = 1 << 14;
|
|
|
+ break;
|
|
|
+ case V4L2_CID_RDS_TX_ARTIFICIAL_HEAD:
|
|
|
+ *property = SI4713_TX_RDS_PS_MISC;
|
|
|
+ *bit = 13;
|
|
|
+ *mask = 1 << 13;
|
|
|
+ break;
|
|
|
+ case V4L2_CID_RDS_TX_MONO_STEREO:
|
|
|
+ *property = SI4713_TX_RDS_PS_MISC;
|
|
|
+ *bit = 12;
|
|
|
+ *mask = 1 << 12;
|
|
|
+ break;
|
|
|
+ case V4L2_CID_RDS_TX_TRAFFIC_PROGRAM:
|
|
|
+ *property = SI4713_TX_RDS_PS_MISC;
|
|
|
+ *bit = 10;
|
|
|
+ *mask = 1 << 10;
|
|
|
+ break;
|
|
|
+ case V4L2_CID_RDS_TX_TRAFFIC_ANNOUNCEMENT:
|
|
|
+ *property = SI4713_TX_RDS_PS_MISC;
|
|
|
+ *bit = 4;
|
|
|
+ *mask = 1 << 4;
|
|
|
+ break;
|
|
|
+ case V4L2_CID_RDS_TX_MUSIC_SPEECH:
|
|
|
+ *property = SI4713_TX_RDS_PS_MISC;
|
|
|
+ *bit = 3;
|
|
|
+ *mask = 1 << 3;
|
|
|
+ break;
|
|
|
case V4L2_CID_AUDIO_LIMITER_ENABLED:
|
|
|
*property = SI4713_TX_ACOMP_ENABLE;
|
|
|
*bit = 1;
|
|
@@ -1122,6 +1157,17 @@ static int si4713_s_ctrl(struct v4l2_ctrl *ctrl)
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
+ case V4L2_CID_RDS_TX_ALT_FREQS_ENABLE:
|
|
|
+ case V4L2_CID_RDS_TX_ALT_FREQS:
|
|
|
+ if (sdev->rds_alt_freqs_enable->val) {
|
|
|
+ val = sdev->rds_alt_freqs->p_new.p_u32[0];
|
|
|
+ val = val / 100 - 876 + 0xe101;
|
|
|
+ } else {
|
|
|
+ val = 0xe0e0;
|
|
|
+ }
|
|
|
+ ret = si4713_write_property(sdev, SI4713_TX_RDS_PS_AF, val);
|
|
|
+ break;
|
|
|
+
|
|
|
default:
|
|
|
ret = si4713_choose_econtrol_action(sdev, ctrl->id, &bit,
|
|
|
&mask, &property, &mul, &table, &size);
|
|
@@ -1355,6 +1401,17 @@ static const struct v4l2_subdev_ops si4713_subdev_ops = {
|
|
|
.tuner = &si4713_subdev_tuner_ops,
|
|
|
};
|
|
|
|
|
|
+static const struct v4l2_ctrl_config si4713_alt_freqs_ctrl = {
|
|
|
+ .id = V4L2_CID_RDS_TX_ALT_FREQS,
|
|
|
+ .type = V4L2_CTRL_TYPE_U32,
|
|
|
+ .min = 87600,
|
|
|
+ .max = 107900,
|
|
|
+ .step = 100,
|
|
|
+ .def = 87600,
|
|
|
+ .dims = { 1 },
|
|
|
+ .elem_size = sizeof(u32),
|
|
|
+};
|
|
|
+
|
|
|
/*
|
|
|
* I2C driver interface
|
|
|
*/
|
|
@@ -1410,6 +1467,23 @@ static int si4713_probe(struct i2c_client *client,
|
|
|
V4L2_CID_RDS_TX_PI, 0, 0xffff, 1, DEFAULT_RDS_PI);
|
|
|
sdev->rds_pty = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
|
|
|
V4L2_CID_RDS_TX_PTY, 0, 31, 1, DEFAULT_RDS_PTY);
|
|
|
+ sdev->rds_compressed = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
|
|
|
+ V4L2_CID_RDS_TX_COMPRESSED, 0, 1, 1, 0);
|
|
|
+ sdev->rds_art_head = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
|
|
|
+ V4L2_CID_RDS_TX_ARTIFICIAL_HEAD, 0, 1, 1, 0);
|
|
|
+ sdev->rds_stereo = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
|
|
|
+ V4L2_CID_RDS_TX_MONO_STEREO, 0, 1, 1, 1);
|
|
|
+ sdev->rds_tp = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
|
|
|
+ V4L2_CID_RDS_TX_TRAFFIC_PROGRAM, 0, 1, 1, 0);
|
|
|
+ sdev->rds_ta = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
|
|
|
+ V4L2_CID_RDS_TX_TRAFFIC_ANNOUNCEMENT, 0, 1, 1, 0);
|
|
|
+ sdev->rds_ms = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
|
|
|
+ V4L2_CID_RDS_TX_MUSIC_SPEECH, 0, 1, 1, 1);
|
|
|
+ sdev->rds_dyn_pty = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
|
|
|
+ V4L2_CID_RDS_TX_DYNAMIC_PTY, 0, 1, 1, 0);
|
|
|
+ sdev->rds_alt_freqs_enable = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
|
|
|
+ V4L2_CID_RDS_TX_ALT_FREQS_ENABLE, 0, 1, 1, 0);
|
|
|
+ sdev->rds_alt_freqs = v4l2_ctrl_new_custom(hdl, &si4713_alt_freqs_ctrl, NULL);
|
|
|
sdev->rds_deviation = v4l2_ctrl_new_std(hdl, &si4713_ctrl_ops,
|
|
|
V4L2_CID_RDS_TX_DEVIATION, 0, MAX_RDS_DEVIATION,
|
|
|
10, DEFAULT_RDS_DEVIATION);
|
|
@@ -1476,7 +1550,7 @@ static int si4713_probe(struct i2c_client *client,
|
|
|
rval = hdl->error;
|
|
|
goto free_ctrls;
|
|
|
}
|
|
|
- v4l2_ctrl_cluster(20, &sdev->mute);
|
|
|
+ v4l2_ctrl_cluster(29, &sdev->mute);
|
|
|
sdev->sd.ctrl_handler = hdl;
|
|
|
|
|
|
if (client->irq) {
|