summaryrefslogtreecommitdiffstats
path: root/bsp/meta-rcar/meta-rcar-gen3-adas/recipes-kernel/linux/linux-renesas/0140-lvds-ti9x4-fix-remote-gpio-enablement-for-4-cams.patch
blob: 9aae7cb4845340608bf391c7e946df751c84db21 (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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
From f07aa0200ffd820fdceb9a06816927d81071cc61 Mon Sep 17 00:00:00 2001
From: Vladimir Barinov <vladimir.barinov@cogentembedded.com>
Date: Sun, 6 Jan 2019 18:18:23 +0300
Subject: [PATCH 089/122] lvds: ti9x4: fix remote gpio enablement for 4 cams

This fix enablemnet of remote gpio (ti953) on all 4 cams

Signed-off-by: Vladimir Barinov <vladimir.barinov@cogentembedded.com>
---
 drivers/media/i2c/soc_camera/ti9x4.c | 39 ++++++++++++++++++++----------------
 1 file changed, 22 insertions(+), 17 deletions(-)

diff --git a/drivers/media/i2c/soc_camera/ti9x4.c b/drivers/media/i2c/soc_camera/ti9x4.c
index f0b782f..7b8209b 100644
--- a/drivers/media/i2c/soc_camera/ti9x4.c
+++ b/drivers/media/i2c/soc_camera/ti9x4.c
@@ -279,8 +279,7 @@ static int ti9x4_initialize(struct i2c_client *client)
 {
 	struct ti9x4_priv *priv = i2c_get_clientdata(client);
 	int idx, timeout;
-	u8 port_sts1 = 0, port_sts2 = 0;
-	int tmp_addr;
+	u8 port_sts1[4] = {0, 0, 0, 0}, port_sts2[4] = {0, 0, 0, 0};
 
 	dev_info(&client->dev, "LINKs=%d, LANES=%d, FORWARDING=%s, CABLE=%s, ID=%s\n",
 			       priv->links, priv->lanes, priv->forwarding_mode, priv->is_coax ? "coax" : "stp", priv->chip_id);
@@ -301,30 +300,36 @@ static int ti9x4_initialize(struct i2c_client *client)
 	/* check lock status */
 	for (timeout = 500 / priv->links; timeout > 0; timeout--) {
 		for (idx = 0; idx < priv->links; idx++) {
+			if ((port_sts1[idx] & 0x1) && (port_sts2[idx] & 0x4))
+				continue;
+
 			reg8_write(client, 0x4c, (idx << 4) | (1 << idx));	/* Select RX port number */
 			usleep_range(1000, 1500);				/* wait 1ms */
-			reg8_read(client, 0x4d, &port_sts1);			/* Lock status */
-			reg8_read(client, 0x4e, &port_sts2);			/* Freq stable */
-
-			if (port_sts1 & 0x1) {
-				tmp_addr = client->addr;
-				client->addr = priv->ti9x3_addr_map[idx];	/* TI9X3 I2C addr */
-				reg8_write(client, 0x0d, 0xf0);			/* Enable all remote GPIOs */
-				reg8_write(client, 0x0e, 0xf0);			/* Enable serializer GPIOs */
-				client->addr = tmp_addr;
-			}
-
-			if ((port_sts1 & 0x1) && (port_sts2 & 0x4))
-				goto out;
+			reg8_read(client, 0x4d, &port_sts1[idx]);		/* Lock status */
+			reg8_read(client, 0x4e, &port_sts2[idx]);		/* Freq stable */
 		}
 	}
 
 	if (!timeout)
-		dev_info(&client->dev, "Receiver is not locked\n");
-out:
+		dev_info(&client->dev, "Receiver lock status [%d,%d,%d,%d]\n",
+				       (port_sts1[0] & 0x1) && (port_sts2[0] & 0x4),
+				       (port_sts1[1] & 0x1) && (port_sts2[1] & 0x4),
+				       (port_sts1[2] & 0x1) && (port_sts2[2] & 0x4),
+				       (port_sts1[3] & 0x1) && (port_sts2[3] & 0x4));
+
 	if (priv->poc_delay)
 		mdelay(100);
 
+	for (idx = 0; idx < priv->links; idx++) {
+		reg8_write(client, 0x4c, (idx << 4) | (1 << idx));		/* Select RX port number */
+		usleep_range(1000, 1500);					/* wait 1ms */
+
+		client->addr = priv->ti9x3_addr_map[idx];			/* TI9X3 I2C addr */
+		reg8_write(client, 0x0d, 0xf0);					/* Enable all remote GPIOs */
+		reg8_write(client, 0x0e, 0xf0);					/* Enable serializer GPIOs */
+		client->addr = priv->des_addr;
+	}
+
 	return 0;
 }
 
-- 
2.7.4