aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/mx3_camera.c
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2012-03-21 07:03:21 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-05-15 15:08:22 -0400
commit2b61d46e2c44568886bc099f8085aefc7107e372 (patch)
treee948595df69c6e9ad5c22a3bc00e93fb0a8ef93d /drivers/media/video/mx3_camera.c
parent584943aa0692fea9ec3356c7d4677dd7a225cdef (diff)
[media] soc_camera: Use soc_camera_device::sizeimage to compute buffer sizes
Instead of computing the buffer size manually in the videobuf queue setup and buffer prepare callbacks, use the previously negotiated soc_camera_device::sizeimage value. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/mx3_camera.c')
-rw-r--r--drivers/media/video/mx3_camera.c20
1 files changed, 9 insertions, 11 deletions
diff --git a/drivers/media/video/mx3_camera.c b/drivers/media/video/mx3_camera.c
index 93c35ef5f0ad..b3016adb0f4f 100644
--- a/drivers/media/video/mx3_camera.c
+++ b/drivers/media/video/mx3_camera.c
@@ -199,8 +199,6 @@ static int mx3_videobuf_setup(struct vb2_queue *vq,
199 struct soc_camera_device *icd = soc_camera_from_vb2q(vq); 199 struct soc_camera_device *icd = soc_camera_from_vb2q(vq);
200 struct soc_camera_host *ici = to_soc_camera_host(icd->parent); 200 struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
201 struct mx3_camera_dev *mx3_cam = ici->priv; 201 struct mx3_camera_dev *mx3_cam = ici->priv;
202 int bytes_per_line;
203 unsigned int height;
204 202
205 if (!mx3_cam->idmac_channel[0]) 203 if (!mx3_cam->idmac_channel[0])
206 return -EINVAL; 204 return -EINVAL;
@@ -208,21 +206,21 @@ static int mx3_videobuf_setup(struct vb2_queue *vq,
208 if (fmt) { 206 if (fmt) {
209 const struct soc_camera_format_xlate *xlate = soc_camera_xlate_by_fourcc(icd, 207 const struct soc_camera_format_xlate *xlate = soc_camera_xlate_by_fourcc(icd,
210 fmt->fmt.pix.pixelformat); 208 fmt->fmt.pix.pixelformat);
209 int bytes_per_line;
210
211 if (!xlate) 211 if (!xlate)
212 return -EINVAL; 212 return -EINVAL;
213
213 bytes_per_line = soc_mbus_bytes_per_line(fmt->fmt.pix.width, 214 bytes_per_line = soc_mbus_bytes_per_line(fmt->fmt.pix.width,
214 xlate->host_fmt); 215 xlate->host_fmt);
215 height = fmt->fmt.pix.height; 216 if (bytes_per_line < 0)
217 return bytes_per_line;
218
219 sizes[0] = bytes_per_line * fmt->fmt.pix.height;
216 } else { 220 } else {
217 /* Called from VIDIOC_REQBUFS or in compatibility mode */ 221 /* Called from VIDIOC_REQBUFS or in compatibility mode */
218 bytes_per_line = soc_mbus_bytes_per_line(icd->user_width, 222 sizes[0] = icd->sizeimage;
219 icd->current_fmt->host_fmt);
220 height = icd->user_height;
221 } 223 }
222 if (bytes_per_line < 0)
223 return bytes_per_line;
224
225 sizes[0] = bytes_per_line * height;
226 224
227 alloc_ctxs[0] = mx3_cam->alloc_ctx; 225 alloc_ctxs[0] = mx3_cam->alloc_ctx;
228 226
@@ -274,7 +272,7 @@ static void mx3_videobuf_queue(struct vb2_buffer *vb)
274 272
275 BUG_ON(bytes_per_line <= 0); 273 BUG_ON(bytes_per_line <= 0);
276 274
277 new_size = bytes_per_line * icd->user_height; 275 new_size = icd->sizeimage;
278 276
279 if (vb2_plane_size(vb, 0) < new_size) { 277 if (vb2_plane_size(vb, 0) < new_size) {
280 dev_err(icd->parent, "Buffer #%d too small (%lu < %zu)\n", 278 dev_err(icd->parent, "Buffer #%d too small (%lu < %zu)\n",