summaryrefslogtreecommitdiffstats
path: root/bsp/meta-rcar/meta-rcar-gen3-adas/recipes-kernel/linux/linux-renesas/0514-media-i2c-gmsl2-add-fsync-support.patch
blob: 49b66489a9b8f8822190bb8f3a9b1866c27c6697 (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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
From 848b902979b3d10b6104bdae5a73285351b98a3a Mon Sep 17 00:00:00 2001
From: Vladimir Barinov <vladimir.barinov@cogentembedded.com>
Date: Tue, 5 May 2020 00:31:31 +0300
Subject: [PATCH 1/3] media: i2c: gmsl2: add fsync support

This add FSYNC support on GMSL2 serializers

Signed-off-by: Vladimir Barinov <vladimir.barinov@cogentembedded.com>
---
 drivers/media/i2c/soc_camera/gmsl/max9296.c  | 12 ++++++++++--
 drivers/media/i2c/soc_camera/gmsl/max9296.h  |  1 +
 drivers/media/i2c/soc_camera/gmsl/max96712.c | 12 ++++++++++--
 drivers/media/i2c/soc_camera/gmsl/max96712.h |  1 +
 4 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/drivers/media/i2c/soc_camera/gmsl/max9296.c b/drivers/media/i2c/soc_camera/gmsl/max9296.c
index 85b45ca..daa2201 100644
--- a/drivers/media/i2c/soc_camera/gmsl/max9296.c
+++ b/drivers/media/i2c/soc_camera/gmsl/max9296.c
@@ -840,7 +840,7 @@ static int max9296_gmsl2_link_serializer_setup(struct max9296_priv *priv, int li
 		if (priv->gpio[i] == 2) {
 			/* GPIO FSIN */
 			ser_write(MAX9295_GPIO_A(i), 0x84);	/* 1MOm, GMSL2 RX from deserializer */
-			ser_write(MAX9295_GPIO_C(i), 0x01);	/* pull-none, GPIO stream ID=1 */
+			ser_write(MAX9295_GPIO_C(i), 0x08);	/* pull-none, GPIO ID=8 assosiated with FSYNC transmission */
 		}
 		if (priv->gpio[i] == 3) {
 			/* GPIO Interrupt */
@@ -919,7 +919,15 @@ static void max9296_gmsl2_link_crossbar_setup(struct max9296_priv *priv, int lin
 
 static void max9296_gmsl2_fsync_setup(struct max9296_priv *priv)
 {
-	/* TODO */
+	des_write(MAX9296_FSYNC_5, priv->fsync_period & 0xff);	/* Fsync Period L */
+	des_write(MAX9296_FSYNC_6, (priv->fsync_period >> 8) & 0xff);/* Fsync Period M */
+	des_write(MAX9296_FSYNC_7, priv->fsync_period >> 16);	/* Fsync Period H */
+	des_write(MAX9296_FSYNC_10, 0x00);			/* Disable Overlap */
+	des_write(MAX9296_FSYNC_11, 0x00);
+
+	des_write(MAX9296_FSYNC_0, 0x00);			/* Manual method, Internal GMSL2 generator mode */
+	des_write(MAX9296_FSYNC_15, 0x9f);			/* GMSL2 Type Fsync, Enable all pipes */
+	des_write(MAX9296_FSYNC_17, 8 << 3);			/* GPIO ID=8 assosiated with FSYNC transmission */
 }
 
 /* -----------------------------------------------------------------------------
diff --git a/drivers/media/i2c/soc_camera/gmsl/max9296.h b/drivers/media/i2c/soc_camera/gmsl/max9296.h
index 985b77e..87fa05ee 100644
--- a/drivers/media/i2c/soc_camera/gmsl/max9296.h
+++ b/drivers/media/i2c/soc_camera/gmsl/max9296.h
@@ -153,6 +153,7 @@ struct max9296_priv {
 #define MAX9296_FSYNC_10		0x3aa
 #define MAX9296_FSYNC_11		0x3ab
 #define MAX9296_FSYNC_15		0x3af
+#define MAX9296_FSYNC_17		0x3b1
 
 #define MAX_MIPI_PHY_BASE		0x8a0
 #define MAX_MIPI_PHY0			(MAX_MIPI_PHY_BASE + 0x00)
diff --git a/drivers/media/i2c/soc_camera/gmsl/max96712.c b/drivers/media/i2c/soc_camera/gmsl/max96712.c
index c4cdf0e..17eed0b 100644
--- a/drivers/media/i2c/soc_camera/gmsl/max96712.c
+++ b/drivers/media/i2c/soc_camera/gmsl/max96712.c
@@ -836,7 +836,7 @@ static int max96712_gmsl2_link_serializer_setup(struct max96712_priv *priv, int
 		if (priv->gpio[i] == 2) {
 			/* GPIO FSIN */
 			ser_write(MAX9295_GPIO_A(i), 0x84);	/* 1MOm, GMSL2 RX from deserializer */
-			ser_write(MAX9295_GPIO_C(i), 0x01);	/* pull-none, GPIO stream ID=1 */
+			ser_write(MAX9295_GPIO_C(i), 0x08);	/* pull-none, GPIO ID=8 assosiated with FSYNC transmission */
 		}
 		if (priv->gpio[i] == 3) {
 			/* GPIO Interrupt */
@@ -918,7 +918,15 @@ static void max96712_gmsl2_link_crossbar_setup(struct max96712_priv *priv, int l
 
 static void max96712_gmsl2_fsync_setup(struct max96712_priv *priv)
 {
-	/* TODO */
+	des_write(MAX96712_FSYNC_5, priv->fsync_period & 0xff);	/* Fsync Period L */
+	des_write(MAX96712_FSYNC_6, (priv->fsync_period >> 8) & 0xff);/* Fsync Period M */
+	des_write(MAX96712_FSYNC_7, priv->fsync_period >> 16);	/* Fsync Period H */
+	des_write(MAX96712_FSYNC_10, 0x00);			/* Disable Overlap */
+	des_write(MAX96712_FSYNC_11, 0x00);
+
+	des_write(MAX96712_FSYNC_0, 0x00);			/* Manual method, Internal GMSL2 generator mode */
+	des_write(MAX96712_FSYNC_15, 0x9f);			/* GMSL2 Type Fsync, Enable all pipes */
+	des_write(MAX96712_FSYNC_17, 8 << 3);			/* GPIO ID=8 assosiated with FSYNC transmission */
 }
 
 /* -----------------------------------------------------------------------------
diff --git a/drivers/media/i2c/soc_camera/gmsl/max96712.h b/drivers/media/i2c/soc_camera/gmsl/max96712.h
index b648bdc..609da2f 100644
--- a/drivers/media/i2c/soc_camera/gmsl/max96712.h
+++ b/drivers/media/i2c/soc_camera/gmsl/max96712.h
@@ -135,6 +135,7 @@ struct max96712_priv {
 #define MAX96712_FSYNC_10		0x4aa
 #define MAX96712_FSYNC_11		0x4ab
 #define MAX96712_FSYNC_15		0x4af
+#define MAX96712_FSYNC_17		0x4b1
 
 #define MAX_MIPI_PHY_BASE		0x8a0
 #define MAX_MIPI_PHY0			(MAX_MIPI_PHY_BASE + 0x00)
-- 
2.7.4