bcm27xx: update patches from RPi foundation
[oweals/openwrt.git] / target / linux / bcm27xx / patches-5.4 / 950-0661-media-bcm2835-unicam-Add-support-for-the-FRAME_SYNC-.patch
1 From 20caa3607c972f5c28b3e9aceb0b8a1d2094c0a7 Mon Sep 17 00:00:00 2001
2 From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
3 Date: Tue, 24 Mar 2020 23:13:02 +0200
4 Subject: [PATCH] media: bcm2835-unicam: Add support for the FRAME_SYNC
5  event
6
7 The FRAME_SYNC event is useful for userspace image processing algorithms
8 to program the camera sensor as early as possible after frame start.
9 Support it.
10
11 Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
12 Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
13 Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
14 Reviewed-by: Naushir Patuck <naush@raspberrypi.com>
15 ---
16  drivers/media/platform/bcm2835/bcm2835-unicam.c | 14 ++++++++++++++
17  1 file changed, 14 insertions(+)
18
19 --- a/drivers/media/platform/bcm2835/bcm2835-unicam.c
20 +++ b/drivers/media/platform/bcm2835/bcm2835-unicam.c
21 @@ -772,6 +772,16 @@ static int unicam_all_nodes_disabled(str
22                !dev->node[METADATA_PAD].streaming;
23  }
24  
25 +static void unicam_queue_event_sof(struct unicam_device *unicam)
26 +{
27 +       struct v4l2_event event = {
28 +               .type = V4L2_EVENT_FRAME_SYNC,
29 +               .u.frame_sync.frame_sequence = unicam->sequence,
30 +       };
31 +
32 +       v4l2_event_queue(&unicam->node[IMAGE_PAD].video_dev, &event);
33 +}
34 +
35  /*
36   * unicam_isr : ISR handler for unicam capture
37   * @irq: irq number
38 @@ -853,6 +863,8 @@ static irqreturn_t unicam_isr(int irq, v
39                          */
40                         unicam_schedule_dummy_buffer(&unicam->node[i]);
41                 }
42 +
43 +               unicam_queue_event_sof(unicam);
44         }
45         /*
46          * Cannot swap buffer at frame end, there may be a race condition
47 @@ -2022,6 +2034,8 @@ static int unicam_subscribe_event(struct
48                                   const struct v4l2_event_subscription *sub)
49  {
50         switch (sub->type) {
51 +       case V4L2_EVENT_FRAME_SYNC:
52 +               return v4l2_event_subscribe(fh, sub, 2, NULL);
53         case V4L2_EVENT_SOURCE_CHANGE:
54                 return v4l2_event_subscribe(fh, sub, 4, NULL);
55         }