aboutsummaryrefslogtreecommitdiff
path: root/target/linux/bcm27xx/patches-6.1/950-1172-drivers-media-cfe-Find-the-source-pads-on-the-sensor.patch
blob: e1f16d0171c364a03648fff94517152dde28705c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
From 76b1bbf3ec3be0afdc768863ab7e9bbd2734b97b Mon Sep 17 00:00:00 2001
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
Date: Fri, 24 Nov 2023 14:29:57 +0000
Subject: [PATCH] drivers: media: cfe: Find the source pads on the sensor
 entity

The driver was assuming that pad 0 on the sensor entity was the
appropriate source pad, but this isn't necessarily the case.
With video-mux, it has the sink pads first, and then the source
pad as the last one.

Iterate through the sensor pads to find the relevant source pads.

Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
---
 drivers/media/platform/raspberrypi/rp1_cfe/cfe.c | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

--- a/drivers/media/platform/raspberrypi/rp1_cfe/cfe.c
+++ b/drivers/media/platform/raspberrypi/rp1_cfe/cfe.c
@@ -1826,7 +1826,7 @@ static void cfe_unregister_nodes(struct
 
 static int cfe_link_node_pads(struct cfe_device *cfe)
 {
-	unsigned int i;
+	unsigned int i, source_pad = 0;
 	int ret;
 
 	for (i = 0; i < CSI2_NUM_CHANNELS; i++) {
@@ -1835,14 +1835,23 @@ static int cfe_link_node_pads(struct cfe
 		if (!check_state(cfe, NODE_REGISTERED, i))
 			continue;
 
-		if (i < cfe->sensor->entity.num_pads) {
+		/* Find next source pad */
+		while (source_pad < cfe->sensor->entity.num_pads &&
+		       !(cfe->sensor->entity.pads[source_pad].flags &
+							MEDIA_PAD_FL_SOURCE))
+			source_pad++;
+
+		if (source_pad < cfe->sensor->entity.num_pads) {
 			/* Sensor -> CSI2 */
-			ret = media_create_pad_link(&cfe->sensor->entity, i,
+			ret = media_create_pad_link(&cfe->sensor->entity, source_pad,
 						    &cfe->csi2.sd.entity, i,
 						    MEDIA_LNK_FL_IMMUTABLE |
 						    MEDIA_LNK_FL_ENABLED);
 			if (ret)
 				return ret;
+
+			/* Dealt with that source_pad, look at the next one next time */
+			source_pad++;
 		}
 
 		/* CSI2 channel # -> /dev/video# */