|
| 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