1// SPDX-License-Identifier: GPL-2.0+ 2/* 3 * Copyright (C) 2017 Ideas on Board <kieran.bingham@ideasonboard.com> 4 * Copyright (C) 2021 Jacopo Mondi <jacopo+renesas@jmondi.org> 5 * 6 * Device Tree Source (overlay) that describes GMSL camera connected to 7 * Fakra connectors for the Eagle V3M and Condor V3H (and compatible) boards. 8 * 9 * The following cameras are currently supported: RDACM20 and RDACM21. 10 * 11 * The board .dts file that include this has to select which cameras are in use 12 * by specifying the camera model with: 13 * 14 * #define GMSL_CAMERA_RDACM20 15 * or 16 * #define GMSL_CAMERA_RDACM21 17 * 18 * And which cameras are connected to the board by defining: 19 * for GMSL channel 0: 20 * #define GMSL_CAMERA_0 21 * #define GMSL_CAMERA_1 22 * #define GMSL_CAMERA_2 23 * #define GMSL_CAMERA_3 24 * 25 * for GMSL channel 1: 26 * #define GMSL_CAMERA_4 27 * #define GMSL_CAMERA_5 28 * #define GMSL_CAMERA_6 29 * #define GMSL_CAMERA_7 30 */ 31 32#include <dt-bindings/gpio/gpio.h> 33 34/* Validate the board file settings. */ 35#if !defined(GMSL_CAMERA_RDACM20) && !defined(GMSL_CAMERA_RDACM21) 36#error "Camera model should be defined by the board file" 37#endif 38 39#if defined(GMSL_CAMERA_RDACM20) && defined(GMSL_CAMERA_RDACM21) 40#error "A single camera model should be selected" 41#endif 42 43#if !defined(GMSL_CAMERA_0) && !defined(GMSL_CAMERA_1) && \ 44 !defined(GMSL_CAMERA_2) && !defined(GMSL_CAMERA_3) && \ 45 !defined(GMSL_CAMERA_4) && !defined(GMSL_CAMERA_5) && \ 46 !defined(GMSL_CAMERA_6) && !defined(GMSL_CAMERA_7) 47#error "At least one camera should be selected" 48#endif 49 50/* Deduce from the enabled cameras which GMSL channels are active. */ 51#if defined(GMSL_CAMERA_0) || defined(GMSL_CAMERA_1) || \ 52 defined(GMSL_CAMERA_2) || defined(GMSL_CAMERA_3) 53#define GMSL_0 54#endif 55 56#if defined(GMSL_CAMERA_4) || defined(GMSL_CAMERA_5) || \ 57 defined(GMSL_CAMERA_6) || defined(GMSL_CAMERA_7) 58#define GMSL_1 59#endif 60 61/* Deduce the camera model compatible string. */ 62#if defined(GMSL_CAMERA_RDACM20) 63#define GMSL_CAMERA_MODEL "imi,rdacm20" 64#elif defined(GMSL_CAMERA_RDACM21) 65#define GMSL_CAMERA_MODEL "imi,rdacm21" 66#endif 67 68#ifdef GMSL_0 69&vin0 { 70 status = "okay"; 71}; 72 73&vin1 { 74 status = "okay"; 75}; 76 77&vin2 { 78 status = "okay"; 79}; 80 81&vin3 { 82 status = "okay"; 83}; 84 85&gmsl0 { 86 status = "okay"; 87 88#if defined(GMSL_CAMERA_RDACM21) 89 maxim,reverse-channel-microvolt = <100000>; 90#endif 91 92 ports { 93#ifdef GMSL_CAMERA_0 94 port@0 { 95 max9286_in0: endpoint { 96 remote-endpoint = <&fakra_con0>; 97 }; 98 }; 99#endif 100 101#ifdef GMSL_CAMERA_1 102 port@1 { 103 max9286_in1: endpoint { 104 remote-endpoint = <&fakra_con1>; 105 }; 106 107 }; 108#endif 109 110#ifdef GMSL_CAMERA_2 111 port@2 { 112 max9286_in2: endpoint { 113 remote-endpoint = <&fakra_con2>; 114 }; 115 116 }; 117#endif 118 119#ifdef GMSL_CAMERA_3 120 port@3 { 121 max9286_in3: endpoint { 122 remote-endpoint = <&fakra_con3>; 123 }; 124 125 }; 126#endif 127 }; 128 129 i2c-mux { 130#ifdef GMSL_CAMERA_0 131 i2c@0 { 132 status = "okay"; 133 134 camera@51 { 135 compatible = GMSL_CAMERA_MODEL; 136 reg = <0x51>, <0x61>; 137 138 port { 139 fakra_con0: endpoint { 140 remote-endpoint = <&max9286_in0>; 141 }; 142 }; 143 }; 144 }; 145#endif 146 147#ifdef GMSL_CAMERA_1 148 i2c@1 { 149 status = "okay"; 150 151 camera@52 { 152 compatible = GMSL_CAMERA_MODEL; 153 reg = <0x52>, <0x62>; 154 155 port { 156 fakra_con1: endpoint { 157 remote-endpoint = <&max9286_in1>; 158 }; 159 }; 160 }; 161 }; 162#endif 163 164#ifdef GMSL_CAMERA_2 165 i2c@2 { 166 status = "okay"; 167 168 camera@53 { 169 compatible = GMSL_CAMERA_MODEL; 170 reg = <0x53>, <0x63>; 171 172 port { 173 fakra_con2: endpoint { 174 remote-endpoint = <&max9286_in2>; 175 }; 176 }; 177 }; 178 }; 179#endif 180 181#ifdef GMSL_CAMERA_3 182 i2c@3 { 183 status = "okay"; 184 185 camera@54 { 186 compatible = GMSL_CAMERA_MODEL; 187 reg = <0x54>, <0x64>; 188 189 port { 190 fakra_con3: endpoint { 191 remote-endpoint = <&max9286_in3>; 192 }; 193 }; 194 }; 195 }; 196#endif 197 }; 198}; 199#endif /* ifdef GMSL_0 */ 200 201#ifdef GMSL_1 202&vin4 { 203 status = "okay"; 204}; 205 206&vin5 { 207 status = "okay"; 208}; 209 210&vin6 { 211 status = "okay"; 212}; 213 214&vin7 { 215 status = "okay"; 216}; 217 218&gmsl1 { 219 status = "okay"; 220 221#if defined(GMSL_CAMERA_RDACM21) 222 maxim,reverse-channel-microvolt = <100000>; 223#endif 224 225 ports { 226#ifdef GMSL_CAMERA_4 227 port@0 { 228 max9286_in4: endpoint { 229 remote-endpoint = <&fakra_con4>; 230 }; 231 }; 232#endif 233 234#ifdef GMSL_CAMERA_5 235 port@1 { 236 max9286_in5: endpoint { 237 remote-endpoint = <&fakra_con5>; 238 }; 239 240 }; 241#endif 242 243#ifdef GMSL_CAMERA_6 244 port@2 { 245 max9286_in6: endpoint { 246 remote-endpoint = <&fakra_con6>; 247 }; 248 249 }; 250#endif 251 252#ifdef GMSL_CAMERA_7 253 port@3 { 254 max9286_in7: endpoint { 255 remote-endpoint = <&fakra_con7>; 256 }; 257 258 }; 259#endif 260 }; 261 262 i2c-mux { 263#ifdef GMSL_CAMERA_4 264 i2c@0 { 265 status = "okay"; 266 267 camera@55 { 268 compatible = GMSL_CAMERA_MODEL; 269 reg = <0x55>, <0x65>; 270 271 port { 272 fakra_con4: endpoint { 273 remote-endpoint = <&max9286_in4>; 274 }; 275 }; 276 }; 277 }; 278#endif 279 280#ifdef GMSL_CAMERA_5 281 i2c@1 { 282 status = "okay"; 283 284 camera@56 { 285 compatible = GMSL_CAMERA_MODEL; 286 reg = <0x56>, <0x66>; 287 288 port { 289 fakra_con5: endpoint { 290 remote-endpoint = <&max9286_in5>; 291 }; 292 }; 293 }; 294 }; 295#endif 296 297#ifdef GMSL_CAMERA_6 298 i2c@2 { 299 status = "okay"; 300 301 camera@57 { 302 compatible = GMSL_CAMERA_MODEL; 303 reg = <0x57>, <0x67>; 304 305 port { 306 fakra_con6: endpoint { 307 remote-endpoint = <&max9286_in6>; 308 }; 309 }; 310 }; 311 }; 312#endif 313 314#ifdef GMSL_CAMERA_7 315 i2c@3 { 316 status = "okay"; 317 318 camera@58 { 319 compatible = GMSL_CAMERA_MODEL; 320 reg = <0x58>, <0x68>; 321 322 port { 323 fakra_con7: endpoint { 324 remote-endpoint = <&max9286_in7>; 325 }; 326 }; 327 }; 328 }; 329#endif 330 }; 331}; 332#endif /* ifdef GMSL_1 */ 333