diff options
author | Hans Verkuil <hverkuil@xs4all.nl> | 2014-03-05 18:21:38 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <m.chehab@samsung.com> | 2014-03-14 04:39:23 -0400 |
commit | bc9087549ea9f57c400013d08d311c7cd4892132 (patch) | |
tree | 656e785f5b12dcd43e74de878b33b689107c2297 | |
parent | c5f51b15829d5e5dc65a9628cf4fbdcfd97636bf (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.c | 29 |
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 | } |
418 | skip: | 421 | skip: |
@@ -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); |