aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHans Verkuil <hverkuil@xs4all.nl>2014-03-05 18:21:38 -0500
committerMauro Carvalho Chehab <m.chehab@samsung.com>2014-03-14 04:39:23 -0400
commitbc9087549ea9f57c400013d08d311c7cd4892132 (patch)
tree656e785f5b12dcd43e74de878b33b689107c2297
parentc5f51b15829d5e5dc65a9628cf4fbdcfd97636bf (diff)
[media] rtl2832_sdr: fixing v4l2-compliance issues
Fix rtl2832_sdr driver v4l2-compliance issues. Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Antti Palosaari <crope@iki.fi> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
-rw-r--r--drivers/staging/media/rtl2832u_sdr/rtl2832_sdr.c29
1 files changed, 23 insertions, 6 deletions
diff --git a/drivers/staging/media/rtl2832u_sdr/rtl2832_sdr.c b/drivers/staging/media/rtl2832u_sdr/rtl2832_sdr.c
index 7e20576e4d37..141fc8b428ba 100644
--- a/drivers/staging/media/rtl2832u_sdr/rtl2832_sdr.c
+++ b/drivers/staging/media/rtl2832u_sdr/rtl2832_sdr.c
@@ -118,6 +118,7 @@ struct rtl2832_sdr_state {
118 struct vb2_queue vb_queue; 118 struct vb2_queue vb_queue;
119 struct list_head queued_bufs; 119 struct list_head queued_bufs;
120 spinlock_t queued_bufs_lock; /* Protects queued_bufs */ 120 spinlock_t queued_bufs_lock; /* Protects queued_bufs */
121 unsigned sequence; /* buffer sequence counter */
121 122
122 /* Note if taking both locks v4l2_lock must always be locked first! */ 123 /* Note if taking both locks v4l2_lock must always be locked first! */
123 struct mutex v4l2_lock; /* Protects everything else */ 124 struct mutex v4l2_lock; /* Protects everything else */
@@ -413,6 +414,8 @@ static void rtl2832_sdr_urb_complete(struct urb *urb)
413 len = rtl2832_sdr_convert_stream(s, ptr, urb->transfer_buffer, 414 len = rtl2832_sdr_convert_stream(s, ptr, urb->transfer_buffer,
414 urb->actual_length); 415 urb->actual_length);
415 vb2_set_plane_payload(&fbuf->vb, 0, len); 416 vb2_set_plane_payload(&fbuf->vb, 0, len);
417 v4l2_get_timestamp(&fbuf->vb.v4l2_buf.timestamp);
418 fbuf->vb.v4l2_buf.sequence = s->sequence++;
416 vb2_buffer_done(&fbuf->vb, VB2_BUF_STATE_DONE); 419 vb2_buffer_done(&fbuf->vb, VB2_BUF_STATE_DONE);
417 } 420 }
418skip: 421skip:
@@ -609,8 +612,9 @@ static int rtl2832_sdr_queue_setup(struct vb2_queue *vq,
609 struct rtl2832_sdr_state *s = vb2_get_drv_priv(vq); 612 struct rtl2832_sdr_state *s = vb2_get_drv_priv(vq);
610 dev_dbg(&s->udev->dev, "%s: *nbuffers=%d\n", __func__, *nbuffers); 613 dev_dbg(&s->udev->dev, "%s: *nbuffers=%d\n", __func__, *nbuffers);
611 614
612 /* Absolute min and max number of buffers available for mmap() */ 615 /* Need at least 8 buffers */
613 *nbuffers = clamp_t(unsigned int, *nbuffers, 8, 32); 616 if (vq->num_buffers + *nbuffers < 8)
617 *nbuffers = 8 - vq->num_buffers;
614 *nplanes = 1; 618 *nplanes = 1;
615 /* 2 = max 16-bit sample returned */ 619 /* 2 = max 16-bit sample returned */
616 sizes[0] = PAGE_ALIGN(BULK_BUFFER_SIZE * 2); 620 sizes[0] = PAGE_ALIGN(BULK_BUFFER_SIZE * 2);
@@ -1011,6 +1015,8 @@ static int rtl2832_sdr_start_streaming(struct vb2_queue *vq, unsigned int count)
1011 if (ret) 1015 if (ret)
1012 goto err; 1016 goto err;
1013 1017
1018 s->sequence = 0;
1019
1014 ret = rtl2832_sdr_submit_urbs(s); 1020 ret = rtl2832_sdr_submit_urbs(s);
1015 if (ret) 1021 if (ret)
1016 goto err; 1022 goto err;
@@ -1088,6 +1094,8 @@ static int rtl2832_sdr_s_tuner(struct file *file, void *priv,
1088 struct rtl2832_sdr_state *s = video_drvdata(file); 1094 struct rtl2832_sdr_state *s = video_drvdata(file);
1089 dev_dbg(&s->udev->dev, "%s:\n", __func__); 1095 dev_dbg(&s->udev->dev, "%s:\n", __func__);
1090 1096
1097 if (v->index > 1)
1098 return -EINVAL;
1091 return 0; 1099 return 0;
1092} 1100}
1093 1101
@@ -1123,12 +1131,15 @@ static int rtl2832_sdr_g_frequency(struct file *file, void *priv,
1123 dev_dbg(&s->udev->dev, "%s: tuner=%d type=%d\n", 1131 dev_dbg(&s->udev->dev, "%s: tuner=%d type=%d\n",
1124 __func__, f->tuner, f->type); 1132 __func__, f->tuner, f->type);
1125 1133
1126 if (f->tuner == 0) 1134 if (f->tuner == 0) {
1127 f->frequency = s->f_adc; 1135 f->frequency = s->f_adc;
1128 else if (f->tuner == 1) 1136 f->type = V4L2_TUNER_ADC;
1137 } else if (f->tuner == 1) {
1129 f->frequency = s->f_tuner; 1138 f->frequency = s->f_tuner;
1130 else 1139 f->type = V4L2_TUNER_RF;
1140 } else {
1131 return -EINVAL; 1141 return -EINVAL;
1142 }
1132 1143
1133 return ret; 1144 return ret;
1134} 1145}
@@ -1162,7 +1173,9 @@ static int rtl2832_sdr_s_frequency(struct file *file, void *priv,
1162 __func__, s->f_adc); 1173 __func__, s->f_adc);
1163 ret = rtl2832_sdr_set_adc(s); 1174 ret = rtl2832_sdr_set_adc(s);
1164 } else if (f->tuner == 1) { 1175 } else if (f->tuner == 1) {
1165 s->f_tuner = f->frequency; 1176 s->f_tuner = clamp_t(unsigned int, f->frequency,
1177 bands_fm[0].rangelow,
1178 bands_fm[0].rangehigh);
1166 dev_dbg(&s->udev->dev, "%s: RF frequency=%u Hz\n", 1179 dev_dbg(&s->udev->dev, "%s: RF frequency=%u Hz\n",
1167 __func__, f->frequency); 1180 __func__, f->frequency);
1168 1181
@@ -1196,6 +1209,7 @@ static int rtl2832_sdr_g_fmt_sdr_cap(struct file *file, void *priv,
1196 dev_dbg(&s->udev->dev, "%s:\n", __func__); 1209 dev_dbg(&s->udev->dev, "%s:\n", __func__);
1197 1210
1198 f->fmt.sdr.pixelformat = s->pixelformat; 1211 f->fmt.sdr.pixelformat = s->pixelformat;
1212 memset(f->fmt.sdr.reserved, 0, sizeof(f->fmt.sdr.reserved));
1199 1213
1200 return 0; 1214 return 0;
1201} 1215}
@@ -1212,6 +1226,7 @@ static int rtl2832_sdr_s_fmt_sdr_cap(struct file *file, void *priv,
1212 if (vb2_is_busy(q)) 1226 if (vb2_is_busy(q))
1213 return -EBUSY; 1227 return -EBUSY;
1214 1228
1229 memset(f->fmt.sdr.reserved, 0, sizeof(f->fmt.sdr.reserved));
1215 for (i = 0; i < NUM_FORMATS; i++) { 1230 for (i = 0; i < NUM_FORMATS; i++) {
1216 if (formats[i].pixelformat == f->fmt.sdr.pixelformat) { 1231 if (formats[i].pixelformat == f->fmt.sdr.pixelformat) {
1217 s->pixelformat = f->fmt.sdr.pixelformat; 1232 s->pixelformat = f->fmt.sdr.pixelformat;
@@ -1233,6 +1248,7 @@ static int rtl2832_sdr_try_fmt_sdr_cap(struct file *file, void *priv,
1233 dev_dbg(&s->udev->dev, "%s: pixelformat fourcc %4.4s\n", __func__, 1248 dev_dbg(&s->udev->dev, "%s: pixelformat fourcc %4.4s\n", __func__,
1234 (char *)&f->fmt.sdr.pixelformat); 1249 (char *)&f->fmt.sdr.pixelformat);
1235 1250
1251 memset(f->fmt.sdr.reserved, 0, sizeof(f->fmt.sdr.reserved));
1236 for (i = 0; i < NUM_FORMATS; i++) { 1252 for (i = 0; i < NUM_FORMATS; i++) {
1237 if (formats[i].pixelformat == f->fmt.sdr.pixelformat) 1253 if (formats[i].pixelformat == f->fmt.sdr.pixelformat)
1238 return 0; 1254 return 0;
@@ -1363,6 +1379,7 @@ struct dvb_frontend *rtl2832_sdr_attach(struct dvb_frontend *fe,
1363 s->i2c = i2c; 1379 s->i2c = i2c;
1364 s->cfg = cfg; 1380 s->cfg = cfg;
1365 s->f_adc = bands_adc[0].rangelow; 1381 s->f_adc = bands_adc[0].rangelow;
1382 s->f_tuner = bands_fm[0].rangelow;
1366 s->pixelformat = V4L2_SDR_FMT_CU8; 1383 s->pixelformat = V4L2_SDR_FMT_CU8;
1367 1384
1368 mutex_init(&s->v4l2_lock); 1385 mutex_init(&s->v4l2_lock);