Commit 7cc31d57 authored by Dave Stevenson's avatar Dave Stevenson Committed by Greg Kroah-Hartman

staging: bcm2835-camera: Match MMAL buffer count to V4L2.

For historical reasons, the number of buffers passed to the VPU over
MMAL did not match that passed from V4L2.  That is a silly situation
as the driver has to duplicate serialisation and other functions that
have already been implemented in V4L2/videobuf2.

As we had more V4L2 buffers than MMAL ones, the MMAL buffer headers
were returned to the VPU immediately on being filled, which is now
invalid.

Match the number of buffers notified in queue_setup with that used in
MMAL.  Return buffers only when we get them from V4L2.
Signed-off-by: default avatarDave Stevenson <dave.stevenson@raspberrypi.org>
Signed-off-by: default avatarEric Anholt <eric@anholt.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 71fcbc47
...@@ -260,8 +260,10 @@ static int queue_setup(struct vb2_queue *vq, ...@@ -260,8 +260,10 @@ static int queue_setup(struct vb2_queue *vq,
return -EINVAL; return -EINVAL;
} }
if (*nbuffers < (dev->capture.port->current_buffer.num + 2)) if (*nbuffers < dev->capture.port->minimum_buffer.num)
*nbuffers = (dev->capture.port->current_buffer.num + 2); *nbuffers = dev->capture.port->minimum_buffer.num;
dev->capture.port->current_buffer.num = *nbuffers;
*nplanes = 1; *nplanes = 1;
......
...@@ -545,7 +545,6 @@ static int port_buffer_from_host(struct vchiq_mmal_instance *instance, ...@@ -545,7 +545,6 @@ static int port_buffer_from_host(struct vchiq_mmal_instance *instance,
/* peek buffer from queue */ /* peek buffer from queue */
spin_lock_irqsave(&port->slock, flags); spin_lock_irqsave(&port->slock, flags);
if (list_empty(&port->buffers)) { if (list_empty(&port->buffers)) {
port->buffer_underflow++;
spin_unlock_irqrestore(&port->slock, flags); spin_unlock_irqrestore(&port->slock, flags);
return -ENOSPC; return -ENOSPC;
} }
...@@ -636,9 +635,6 @@ static void buffer_to_host_cb(struct vchiq_mmal_instance *instance, ...@@ -636,9 +635,6 @@ static void buffer_to_host_cb(struct vchiq_mmal_instance *instance,
msg->u.buffer_from_host.payload_in_message; msg->u.buffer_from_host.payload_in_message;
} }
/* replace the buffer header */
port_buffer_from_host(instance, msg_context->u.bulk.port);
/* schedule the port callback */ /* schedule the port callback */
schedule_work(&msg_context->u.bulk.work); schedule_work(&msg_context->u.bulk.work);
} }
...@@ -646,10 +642,6 @@ static void buffer_to_host_cb(struct vchiq_mmal_instance *instance, ...@@ -646,10 +642,6 @@ static void buffer_to_host_cb(struct vchiq_mmal_instance *instance,
static void bulk_receive_cb(struct vchiq_mmal_instance *instance, static void bulk_receive_cb(struct vchiq_mmal_instance *instance,
struct mmal_msg_context *msg_context) struct mmal_msg_context *msg_context)
{ {
/* replace the buffer header */
port_buffer_from_host(msg_context->u.bulk.instance,
msg_context->u.bulk.port);
msg_context->u.bulk.status = 0; msg_context->u.bulk.status = 0;
/* schedule the port callback */ /* schedule the port callback */
...@@ -661,10 +653,6 @@ static void bulk_abort_cb(struct vchiq_mmal_instance *instance, ...@@ -661,10 +653,6 @@ static void bulk_abort_cb(struct vchiq_mmal_instance *instance,
{ {
pr_err("%s: bulk ABORTED msg_context:%p\n", __func__, msg_context); pr_err("%s: bulk ABORTED msg_context:%p\n", __func__, msg_context);
/* replace the buffer header */
port_buffer_from_host(msg_context->u.bulk.instance,
msg_context->u.bulk.port);
msg_context->u.bulk.status = -EINTR; msg_context->u.bulk.status = -EINTR;
schedule_work(&msg_context->u.bulk.work); schedule_work(&msg_context->u.bulk.work);
...@@ -1713,14 +1701,7 @@ int vchiq_mmal_submit_buffer(struct vchiq_mmal_instance *instance, ...@@ -1713,14 +1701,7 @@ int vchiq_mmal_submit_buffer(struct vchiq_mmal_instance *instance,
list_add_tail(&buffer->list, &port->buffers); list_add_tail(&buffer->list, &port->buffers);
spin_unlock_irqrestore(&port->slock, flags); spin_unlock_irqrestore(&port->slock, flags);
/* the port previously underflowed because it was missing a
* mmal_buffer which has just been added, submit that buffer
* to the mmal service.
*/
if (port->buffer_underflow) {
port_buffer_from_host(instance, port); port_buffer_from_host(instance, port);
port->buffer_underflow--;
}
return 0; return 0;
} }
......
...@@ -79,10 +79,6 @@ struct vchiq_mmal_port { ...@@ -79,10 +79,6 @@ struct vchiq_mmal_port {
struct list_head buffers; struct list_head buffers;
/* lock to serialise adding and removing buffers from list */ /* lock to serialise adding and removing buffers from list */
spinlock_t slock; spinlock_t slock;
/* count of how many buffer header refils have failed because
* there was no buffer to satisfy them
*/
int buffer_underflow;
/* callback on buffer completion */ /* callback on buffer completion */
vchiq_mmal_buffer_cb buffer_cb; vchiq_mmal_buffer_cb buffer_cb;
/* callback context */ /* callback context */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment