summaryrefslogtreecommitdiffstats
path: root/bsp/meta-rcar/meta-rcar-gen3-adas/recipes-kernel/linux/linux-renesas/0163-lvds-AP0101-AR014X-add-TI-serializers.patch
blob: 568e884317e6c43bfa7d9131c9af3ee6205a3313 (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
From f0063d3e6918319b9817e2074bcf0ffefde1e2ea Mon Sep 17 00:00:00 2001
From: Vladimir Barinov <vladimir.barinov@cogentembedded.com>
Date: Tue, 7 May 2019 13:00:24 +0300
Subject: [PATCH 112/122] lvds: AP0101-AR014X: add TI serializers

Add TI UB913 support

Signed-off-by: Vladimir Barinov <vladimir.barinov@cogentembedded.com>
---
 drivers/media/i2c/soc_camera/ap0101_ar014x.c | 23 ++++++++++++++++++++---
 1 file changed, 20 insertions(+), 3 deletions(-)

diff --git a/drivers/media/i2c/soc_camera/ap0101_ar014x.c b/drivers/media/i2c/soc_camera/ap0101_ar014x.c
index 142942d..e4f2bda 100644
--- a/drivers/media/i2c/soc_camera/ap0101_ar014x.c
+++ b/drivers/media/i2c/soc_camera/ap0101_ar014x.c
@@ -46,6 +46,8 @@ struct ap0101_priv {
 	/* serializers */
 	int				max9286_addr;
 	int				max9271_addr;
+	int				ti9x4_addr;
+	int				ti9x3_addr;
 	int				port;
 	int				gpio_resetb;
 	int				gpio_fsin;
@@ -390,10 +392,13 @@ static int ap0101_initialize(struct i2c_client *client)
 	int tmp_addr;
 	int i;
 
-	ap0101_s_port(client, 1);
-
 	for (i = 0; i < ARRAY_SIZE(ap0101_i2c_addr); i++) {
 		tmp_addr = client->addr;
+		if (priv->ti9x4_addr) {
+			client->addr = priv->ti9x4_addr;			/* Deserializer I2C address */
+			reg8_write(client, 0x5d, ap0101_i2c_addr[i] << 1);	/* Sensor native I2C address */
+			usleep_range(2000, 2500);				/* wait 2ms */
+		}
 		if (priv->max9286_addr) {
 			client->addr = priv->max9271_addr;			/* Serializer I2C address */
 			reg8_write(client, 0x0A, ap0101_i2c_addr[i] << 1);	/* Sensor native I2C address */
@@ -478,11 +483,17 @@ static int ap0101_parse_dt(struct device_node *np, struct ap0101_priv *priv)
 		    !of_property_read_u32(rendpoint->parent->parent, "reg", &priv->max9286_addr) &&
 		    !kstrtouint(strrchr(rendpoint->full_name, '@') + 1, 0, &priv->port))
 			break;
+
+		if (!of_property_read_u32(rendpoint, "ti9x3-addr", &priv->ti9x3_addr) &&
+		    !of_property_match_string(rendpoint->parent->parent, "compatible", "ti,ti9x4") &&
+		    !of_property_read_u32(rendpoint->parent->parent, "reg", &priv->ti9x4_addr) &&
+		    !kstrtouint(strrchr(rendpoint->full_name, '@') + 1, 0, &priv->port))
+			break;
 	}
 
 	of_node_put(endpoint);
 
-	if (!priv->max9286_addr) {
+	if (!priv->max9286_addr && !priv->ti9x4_addr) {
 		dev_err(&client->dev, "deserializer does not present for AP0101\n");
 		return -EINVAL;
 	}
@@ -496,6 +507,12 @@ static int ap0101_parse_dt(struct device_node *np, struct ap0101_priv *priv)
 		reg8_write(client, 0x09, tmp_addr << 1);		/* Sensor translated I2C address */
 		usleep_range(2000, 2500);				/* wait 2ms */
 	};
+	if (priv->ti9x4_addr) {
+		client->addr = priv->ti9x4_addr;			/* Deserializer I2C address */
+		reg8_write(client, 0x4c, (priv->port << 4) | (1 << priv->port)); /* Select RX port number */
+		usleep_range(2000, 2500);				/* wait 2ms */
+		reg8_write(client, 0x65, tmp_addr << 1);		/* Sensor translated I2C address */
+	}
 	client->addr = tmp_addr;
 
 	mdelay(10);
-- 
2.7.4