Skip to content

Commit eaf8444

Browse files
authored
Merge pull request #398 from realsenseai/esync_gpio_tunneling_max96712
RSDSO-20613: Add GPIO tunneling for MAX96712A external sync support
2 parents 44c7419 + c2b8ee6 commit eaf8444

22 files changed

Lines changed: 762 additions & 432 deletions

kernel/nvidia/5.0.2/0015-Add-GPIO-tunneling-for-the-external-sync-support.patch

Lines changed: 0 additions & 87 deletions
This file was deleted.
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
From f44c0d640f10125458ec3f65403b50cda607c49d Mon Sep 17 00:00:00 2001
2+
From: Nikolai-L <nikolai.lyskov@realsenseai.com>
3+
Date: Sun, 1 Feb 2026 10:30:13 +0200
4+
Subject: [PATCH] Add max9295 GPIO tunneling for the external sync support
5+
6+
Add MAX9295A serializer GPIO tunneling / ESYNC register configuration
7+
for MAX96712A external sync support.
8+
9+
Includes max9295_setup_gpio_tunneling() export for MAX96712A usage.
10+
11+
Signed-off-by: ejgoldik <ehud.joseph.goldik@realsenseai.com>
12+
---
13+
drivers/media/i2c/max9295.c | 67 +++++++++++++++++++++++++++++++++++++++++++++
14+
include/media/max9295.h | 3 +++
15+
2 files changed, 70 insertions(+)
16+
17+
diff --git a/drivers/media/i2c/max9295.c b/drivers/media/i2c/max9295.c
18+
index 4b03b1ef8..d7226af6e 100644
19+
--- a/drivers/media/i2c/max9295.c
20+
+++ b/drivers/media/i2c/max9295.c
21+
@@ -34,6 +34,10 @@
22+
#define MAX9295_CTRL0_ADDR 0x10
23+
#define MAX9295_SRC_CTRL_ADDR 0x2BF
24+
#define MAX9295_SRC_PWDN_ADDR 0x02BE
25+
+#define MAX9295_2C0_ADDR 0x02C0
26+
+#define MAX9295_2C1_ADDR 0x02C1
27+
+#define MAX9295_2C2_ADDR 0x02C2
28+
+#define MAX9295_2C3_ADDR 0x02C3
29+
#define MAX9295_SRC_OUT_RCLK_ADDR 0x3F1
30+
#define MAX9295_START_PIPE_ADDR 0x311
31+
#define MAX9295_PIPE_EN_ADDR 0x2
32+
@@ -94,7 +98,15 @@
33+
34+
#define MAX9295_RESET_ALL 0x80
35+
#define MAX9295_RESET_SRC 0x60
36+
+#define MAX9295_RESET_ESYNC 0x77
37+
+
38+
#define MAX9295_PWDN_GPIO 0x90
39+
+#define MAX9295_PWDN_ESYNC_EXT 0x24
40+
+
41+
+#define MAX9295_2C0_ESYNC 0x57
42+
+#define MAX9295_2C1_ESYNC 0x05
43+
+#define MAX9295_2C2_ESYNC 0x1F
44+
+#define MAX9295_2C3_ESYNC 0x5F
45+
46+
#define MAX9295_MAX_PIPES 0x4
47+
48+
@@ -383,6 +395,61 @@ error:
49+
}
50+
EXPORT_SYMBOL(max9295_setup_control);
51+
52+
+int max9295_setup_gpio_tunneling(struct device *dev)
53+
+{
54+
+ struct max9295 *priv = dev_get_drvdata(dev);
55+
+ int err = 0;
56+
+ unsigned int readback = 0;
57+
+
58+
+ mutex_lock(&priv->lock);
59+
+
60+
+ dev_info(dev, "%s: writing GPIO tunneling registers\n", __func__);
61+
+
62+
+ /* Configure ESYNC registers for MAX96712A deserializer */
63+
+ max9295_write_reg(dev, MAX9295_SRC_PWDN_ADDR, MAX9295_PWDN_ESYNC_EXT);
64+
+ regmap_read(priv->regmap, MAX9295_SRC_PWDN_ADDR, &readback);
65+
+ dev_info(dev, "%s: reg 0x%04x written 0x%02x readback 0x%02x %s\n",
66+
+ __func__, MAX9295_SRC_PWDN_ADDR, MAX9295_PWDN_ESYNC_EXT,
67+
+ readback, (readback == MAX9295_PWDN_ESYNC_EXT) ? "OK" : "MISMATCH");
68+
+
69+
+ max9295_write_reg(dev, MAX9295_SRC_CTRL_ADDR, MAX9295_RESET_ESYNC);
70+
+ regmap_read(priv->regmap, MAX9295_SRC_CTRL_ADDR, &readback);
71+
+ dev_info(dev, "%s: reg 0x%04x written 0x%02x readback 0x%02x %s\n",
72+
+ __func__, MAX9295_SRC_CTRL_ADDR, MAX9295_RESET_ESYNC,
73+
+ readback, (readback == MAX9295_RESET_ESYNC) ? "OK" : "MISMATCH");
74+
+
75+
+ max9295_write_reg(dev, MAX9295_2C0_ADDR, MAX9295_2C0_ESYNC);
76+
+ regmap_read(priv->regmap, MAX9295_2C0_ADDR, &readback);
77+
+ dev_info(dev, "%s: reg 0x%04x written 0x%02x readback 0x%02x %s\n",
78+
+ __func__, MAX9295_2C0_ADDR, MAX9295_2C0_ESYNC,
79+
+ readback, (readback == MAX9295_2C0_ESYNC) ? "OK" : "MISMATCH");
80+
+
81+
+ max9295_write_reg(dev, MAX9295_2C1_ADDR, MAX9295_2C1_ESYNC);
82+
+ regmap_read(priv->regmap, MAX9295_2C1_ADDR, &readback);
83+
+ dev_info(dev, "%s: reg 0x%04x written 0x%02x readback 0x%02x %s\n",
84+
+ __func__, MAX9295_2C1_ADDR, MAX9295_2C1_ESYNC,
85+
+ readback, (readback == MAX9295_2C1_ESYNC) ? "OK" : "MISMATCH");
86+
+
87+
+ max9295_write_reg(dev, MAX9295_2C2_ADDR, MAX9295_2C2_ESYNC);
88+
+ regmap_read(priv->regmap, MAX9295_2C2_ADDR, &readback);
89+
+ dev_info(dev, "%s: reg 0x%04x written 0x%02x readback 0x%02x %s\n",
90+
+ __func__, MAX9295_2C2_ADDR, MAX9295_2C2_ESYNC,
91+
+ readback, (readback == MAX9295_2C2_ESYNC) ? "OK" : "MISMATCH");
92+
+
93+
+ max9295_write_reg(dev, MAX9295_2C3_ADDR, MAX9295_2C3_ESYNC);
94+
+ regmap_read(priv->regmap, MAX9295_2C3_ADDR, &readback);
95+
+ dev_info(dev, "%s: reg 0x%04x written 0x%02x readback 0x%02x %s\n",
96+
+ __func__, MAX9295_2C3_ADDR, MAX9295_2C3_ESYNC,
97+
+ readback, (readback == MAX9295_2C3_ESYNC) ? "OK" : "MISMATCH");
98+
+
99+
+ dev_info(dev, "%s: GPIO tunneling register config done\n", __func__);
100+
+
101+
+ mutex_unlock(&priv->lock);
102+
+
103+
+ return err;
104+
+}
105+
+EXPORT_SYMBOL(max9295_setup_gpio_tunneling);
106+
+
107+
int max9295_reset_control(struct device *dev)
108+
{
109+
struct max9295 *priv = dev_get_drvdata(dev);
110+
diff --git a/include/media/max9295.h b/include/media/max9295.h
111+
index bea15c414..6099859d2 100644
112+
--- a/include/media/max9295.h
113+
+++ b/include/media/max9295.h
114+
@@ -99,6 +99,9 @@ int max9295_sdev_unpair(struct device *dev, struct device *s_dev);
115+
int max9295_setup_streaming(struct device *dev);
116+
117+
int max9295_init_settings(struct device *dev);
118+
+
119+
+int max9295_setup_gpio_tunneling(struct device *dev);
120+
+
121+
/** @} */
122+
123+
#endif /* __MAX9295_H__ */
124+
--
125+
2.43.0

0 commit comments

Comments
 (0)