aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/brcm2708/patches-4.14/950-0370-staging-bcm2835-camera-Match-MMAL-buffer-count-to-V4.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/brcm2708/patches-4.14/950-0370-staging-bcm2835-camera-Match-MMAL-buffer-count-to-V4.patch')
-rw-r--r--target/linux/brcm2708/patches-4.14/950-0370-staging-bcm2835-camera-Match-MMAL-buffer-count-to-V4.patch115
1 files changed, 115 insertions, 0 deletions
diff --git a/target/linux/brcm2708/patches-4.14/950-0370-staging-bcm2835-camera-Match-MMAL-buffer-count-to-V4.patch b/target/linux/brcm2708/patches-4.14/950-0370-staging-bcm2835-camera-Match-MMAL-buffer-count-to-V4.patch
new file mode 100644
index 0000000000..2e07fa1360
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.14/950-0370-staging-bcm2835-camera-Match-MMAL-buffer-count-to-V4.patch
@@ -0,0 +1,115 @@
+From 84ab2b48fc6834e44ef2d6cec5b2d21285090f88 Mon Sep 17 00:00:00 2001
+From: Dave Stevenson <dave.stevenson@raspberrypi.org>
+Date: Thu, 10 May 2018 12:42:10 -0700
+Subject: [PATCH 370/454] staging: bcm2835-camera: Match MMAL buffer count to
+ V4L2.
+
+commit 7cc31d57f399b00f96ce295d5b86426b95d9076f upstream.
+
+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: Dave Stevenson <dave.stevenson@raspberrypi.org>
+Signed-off-by: Eric Anholt <eric@anholt.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ .../bcm2835-camera/bcm2835-camera.c | 6 ++++--
+ .../vc04_services/bcm2835-camera/mmal-vchiq.c | 21 +------------------
+ .../vc04_services/bcm2835-camera/mmal-vchiq.h | 4 ----
+ 3 files changed, 5 insertions(+), 26 deletions(-)
+
+--- a/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c
++++ b/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c
+@@ -262,8 +262,10 @@ static int queue_setup(struct vb2_queue
+ return -EINVAL;
+ }
+
+- if (*nbuffers < (dev->capture.port->current_buffer.num + 2))
+- *nbuffers = (dev->capture.port->current_buffer.num + 2);
++ if (*nbuffers < dev->capture.port->minimum_buffer.num)
++ *nbuffers = dev->capture.port->minimum_buffer.num;
++
++ dev->capture.port->current_buffer.num = *nbuffers;
+
+ *nplanes = 1;
+
+--- a/drivers/staging/vc04_services/bcm2835-camera/mmal-vchiq.c
++++ b/drivers/staging/vc04_services/bcm2835-camera/mmal-vchiq.c
+@@ -548,7 +548,6 @@ static int port_buffer_from_host(struct
+ /* peek buffer from queue */
+ spin_lock_irqsave(&port->slock, flags);
+ if (list_empty(&port->buffers)) {
+- port->buffer_underflow++;
+ spin_unlock_irqrestore(&port->slock, flags);
+ return -ENOSPC;
+ }
+@@ -639,9 +638,6 @@ static void buffer_to_host_cb(struct vch
+ 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_work(&msg_context->u.bulk.work);
+ }
+@@ -649,10 +645,6 @@ static void buffer_to_host_cb(struct vch
+ static void bulk_receive_cb(struct vchiq_mmal_instance *instance,
+ 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;
+
+ /* schedule the port callback */
+@@ -664,10 +656,6 @@ static void bulk_abort_cb(struct vchiq_m
+ {
+ 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;
+
+ schedule_work(&msg_context->u.bulk.work);
+@@ -1718,14 +1706,7 @@ int vchiq_mmal_submit_buffer(struct vchi
+ list_add_tail(&buffer->list, &port->buffers);
+ 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_underflow--;
+- }
++ port_buffer_from_host(instance, port);
+
+ return 0;
+ }
+--- a/drivers/staging/vc04_services/bcm2835-camera/mmal-vchiq.h
++++ b/drivers/staging/vc04_services/bcm2835-camera/mmal-vchiq.h
+@@ -82,10 +82,6 @@ struct vchiq_mmal_port {
+ struct list_head buffers;
+ /* lock to serialise adding and removing buffers from list */
+ 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 */
+ vchiq_mmal_buffer_cb buffer_cb;
+ /* callback context */