[media] si4713: add the missing RDS functionality
Not all the RDS features of the si4713 were supported. Add the missing bits to fully support the hardware capabilities. Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Cc: Eduardo Valentin <edubezval@gmail.com> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
This commit is contained in:
Родитель
36cd37f2a5
Коммит
1abba28cf1
|
@ -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) {
|
||||
|
|
|
@ -211,6 +211,15 @@ struct si4713_device {
|
|||
struct v4l2_ctrl *rds_pi;
|
||||
struct v4l2_ctrl *rds_deviation;
|
||||
struct v4l2_ctrl *rds_pty;
|
||||
struct v4l2_ctrl *rds_compressed;
|
||||
struct v4l2_ctrl *rds_art_head;
|
||||
struct v4l2_ctrl *rds_stereo;
|
||||
struct v4l2_ctrl *rds_ta;
|
||||
struct v4l2_ctrl *rds_tp;
|
||||
struct v4l2_ctrl *rds_ms;
|
||||
struct v4l2_ctrl *rds_dyn_pty;
|
||||
struct v4l2_ctrl *rds_alt_freqs_enable;
|
||||
struct v4l2_ctrl *rds_alt_freqs;
|
||||
struct v4l2_ctrl *compression_enabled;
|
||||
struct v4l2_ctrl *compression_threshold;
|
||||
struct v4l2_ctrl *compression_gain;
|
||||
|
|
Загрузка…
Ссылка в новой задаче