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
|