brcm2708: update to latest patches from RPi foundation
[openwrt/openwrt.git] / target / linux / brcm2708 / patches-4.19 / 950-0205-staging-bcm2835-camera-Provide-more-specific-probe-e.patch
diff --git a/target/linux/brcm2708/patches-4.19/950-0205-staging-bcm2835-camera-Provide-more-specific-probe-e.patch b/target/linux/brcm2708/patches-4.19/950-0205-staging-bcm2835-camera-Provide-more-specific-probe-e.patch
new file mode 100644 (file)
index 0000000..e7566d1
--- /dev/null
@@ -0,0 +1,166 @@
+From 94a174095f29c77574548eea17aacaed5c540757 Mon Sep 17 00:00:00 2001
+From: Stefan Wahren <stefan.wahren@i2se.com>
+Date: Sun, 21 Oct 2018 18:40:07 +0200
+Subject: [PATCH] staging: bcm2835-camera: Provide more specific probe
+ error messages
+
+Currently there is only a catch-all info message which print the
+relevant error code without any context. So add more specific error
+messages in order to narrow down possible issues.
+
+Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
+---
+ .../bcm2835-camera/bcm2835-camera.c           | 58 +++++++++++++------
+ 1 file changed, 39 insertions(+), 19 deletions(-)
+
+--- a/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c
++++ b/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c
+@@ -1552,8 +1552,11 @@ static int mmal_init(struct bm2835_mmal_
+       struct vchiq_mmal_component  *camera;
+       ret = vchiq_mmal_init(&dev->instance);
+-      if (ret < 0)
++      if (ret < 0) {
++              v4l2_err(&dev->v4l2_dev, "%s: vchiq mmal init failed %d\n",
++                       __func__, ret);
+               return ret;
++      }
+       /* get the camera component ready */
+       ret = vchiq_mmal_component_init(dev->instance, "ril.camera",
+@@ -1562,7 +1565,9 @@ static int mmal_init(struct bm2835_mmal_
+               goto unreg_mmal;
+       camera = dev->component[MMAL_COMPONENT_CAMERA];
+-      if (camera->outputs <  MMAL_CAMERA_PORT_COUNT) {
++      if (camera->outputs < MMAL_CAMERA_PORT_COUNT) {
++              v4l2_err(&dev->v4l2_dev, "%s: too few camera outputs %d needed %d\n",
++                       __func__, camera->outputs, MMAL_CAMERA_PORT_COUNT);
+               ret = -EINVAL;
+               goto unreg_camera;
+       }
+@@ -1570,8 +1575,11 @@ static int mmal_init(struct bm2835_mmal_
+       ret = set_camera_parameters(dev->instance,
+                                   camera,
+                                   dev);
+-      if (ret < 0)
++      if (ret < 0) {
++              v4l2_err(&dev->v4l2_dev, "%s: unable to set camera parameters: %d\n",
++                       __func__, ret);
+               goto unreg_camera;
++      }
+       /* There was an error in the firmware that meant the camera component
+        * produced BGR instead of RGB.
+@@ -1660,8 +1668,8 @@ static int mmal_init(struct bm2835_mmal_
+       if (dev->component[MMAL_COMPONENT_PREVIEW]->inputs < 1) {
+               ret = -EINVAL;
+-              pr_debug("too few input ports %d needed %d\n",
+-                       dev->component[MMAL_COMPONENT_PREVIEW]->inputs, 1);
++              v4l2_err(&dev->v4l2_dev, "%s: too few input ports %d needed %d\n",
++                       __func__, dev->component[MMAL_COMPONENT_PREVIEW]->inputs, 1);
+               goto unreg_preview;
+       }
+@@ -1674,8 +1682,8 @@ static int mmal_init(struct bm2835_mmal_
+       if (dev->component[MMAL_COMPONENT_IMAGE_ENCODE]->inputs < 1) {
+               ret = -EINVAL;
+-              v4l2_err(&dev->v4l2_dev, "too few input ports %d needed %d\n",
+-                       dev->component[MMAL_COMPONENT_IMAGE_ENCODE]->inputs,
++              v4l2_err(&dev->v4l2_dev, "%s: too few input ports %d needed %d\n",
++                       __func__, dev->component[MMAL_COMPONENT_IMAGE_ENCODE]->inputs,
+                        1);
+               goto unreg_image_encoder;
+       }
+@@ -1689,8 +1697,8 @@ static int mmal_init(struct bm2835_mmal_
+       if (dev->component[MMAL_COMPONENT_VIDEO_ENCODE]->inputs < 1) {
+               ret = -EINVAL;
+-              v4l2_err(&dev->v4l2_dev, "too few input ports %d needed %d\n",
+-                       dev->component[MMAL_COMPONENT_VIDEO_ENCODE]->inputs,
++              v4l2_err(&dev->v4l2_dev, "%s: too few input ports %d needed %d\n",
++                       __func__, dev->component[MMAL_COMPONENT_VIDEO_ENCODE]->inputs,
+                        1);
+               goto unreg_vid_encoder;
+       }
+@@ -1719,8 +1727,11 @@ static int mmal_init(struct bm2835_mmal_
+                                             sizeof(enable));
+       }
+       ret = bm2835_mmal_set_all_camera_controls(dev);
+-      if (ret < 0)
++      if (ret < 0) {
++              v4l2_err(&dev->v4l2_dev, "%s: failed to set all camera controls: %d\n",
++                       __func__, ret);
+               goto unreg_vid_encoder;
++      }
+       return 0;
+@@ -1886,21 +1897,29 @@ static int bcm2835_mmal_probe(struct pla
+               snprintf(dev->v4l2_dev.name, sizeof(dev->v4l2_dev.name),
+                        "%s", BM2835_MMAL_MODULE_NAME);
+               ret = v4l2_device_register(NULL, &dev->v4l2_dev);
+-              if (ret)
++              if (ret) {
++                      dev_err(&pdev->dev, "%s: could not register V4L2 device: %d\n",
++                              __func__, ret);
+                       goto free_dev;
++              }
+               /* setup v4l controls */
+               ret = bm2835_mmal_init_controls(dev, &dev->ctrl_handler);
+-              if (ret < 0)
++              if (ret < 0) {
++                      v4l2_err(&dev->v4l2_dev, "%s: could not init controls: %d\n",
++                              __func__, ret);
+                       goto unreg_dev;
++              }
+               dev->v4l2_dev.ctrl_handler = &dev->ctrl_handler;
+               /* mmal init */
+               dev->instance = instance;
+               ret = mmal_init(dev);
+-              if (ret < 0)
++              if (ret < 0) {
++                      v4l2_err(&dev->v4l2_dev, "%s: mmal init failed: %d\n",
++                              __func__, ret);
+                       goto unreg_dev;
+-
++              }
+               /* initialize queue */
+               q = &dev->capture.vb_vidq;
+               memset(q, 0, sizeof(*q));
+@@ -1918,16 +1937,19 @@ static int bcm2835_mmal_probe(struct pla
+               /* initialise video devices */
+               ret = bm2835_mmal_init_device(dev, &dev->vdev);
+-              if (ret < 0)
++              if (ret < 0) {
++                      v4l2_err(&dev->v4l2_dev, "%s: could not init device: %d\n",
++                              __func__, ret);
+                       goto unreg_dev;
++              }
+               /* Really want to call vidioc_s_fmt_vid_cap with the default
+                * format, but currently the APIs don't join up.
+                */
+               ret = mmal_setup_components(dev, &default_v4l2_format);
+               if (ret < 0) {
+-                      v4l2_err(&dev->v4l2_dev,
+-                               "%s: could not setup components\n", __func__);
++                      v4l2_err(&dev->v4l2_dev, "%s: could not setup components: %d\n",
++                              __func__, ret);
+                       goto unreg_dev;
+               }
+@@ -1951,8 +1973,6 @@ cleanup_gdev:
+               bcm2835_cleanup_instance(gdev[i]);
+               gdev[i] = NULL;
+       }
+-      pr_info("%s: error %d while loading driver\n",
+-              BM2835_MMAL_MODULE_NAME, ret);
+ cleanup_mmal:
+       vchiq_mmal_finalise(instance);