162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2017 Ideas on Board <kieran.bingham@ideasonboard.com>
462306a36Sopenharmony_ci * Copyright (C) 2021 Jacopo Mondi <jacopo+renesas@jmondi.org>
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Device Tree Source (overlay) that describes GMSL camera connected to
762306a36Sopenharmony_ci * Fakra connectors for the Eagle V3M and Condor V3H (and compatible) boards.
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci * The following cameras are currently supported: RDACM20 and RDACM21.
1062306a36Sopenharmony_ci *
1162306a36Sopenharmony_ci * The board .dts file that include this has to select which cameras are in use
1262306a36Sopenharmony_ci * by specifying the camera model with:
1362306a36Sopenharmony_ci *
1462306a36Sopenharmony_ci * #define GMSL_CAMERA_RDACM20
1562306a36Sopenharmony_ci * or
1662306a36Sopenharmony_ci * #define GMSL_CAMERA_RDACM21
1762306a36Sopenharmony_ci *
1862306a36Sopenharmony_ci * And which cameras are connected to the board by defining:
1962306a36Sopenharmony_ci * for GMSL channel 0:
2062306a36Sopenharmony_ci *	   #define GMSL_CAMERA_0
2162306a36Sopenharmony_ci *	   #define GMSL_CAMERA_1
2262306a36Sopenharmony_ci *	   #define GMSL_CAMERA_2
2362306a36Sopenharmony_ci *	   #define GMSL_CAMERA_3
2462306a36Sopenharmony_ci *
2562306a36Sopenharmony_ci * for GMSL channel 1:
2662306a36Sopenharmony_ci *	   #define GMSL_CAMERA_4
2762306a36Sopenharmony_ci *	   #define GMSL_CAMERA_5
2862306a36Sopenharmony_ci *	   #define GMSL_CAMERA_6
2962306a36Sopenharmony_ci *	   #define GMSL_CAMERA_7
3062306a36Sopenharmony_ci */
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci#include <dt-bindings/gpio/gpio.h>
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci/* Validate the board file settings. */
3562306a36Sopenharmony_ci#if !defined(GMSL_CAMERA_RDACM20) && !defined(GMSL_CAMERA_RDACM21)
3662306a36Sopenharmony_ci#error "Camera model should be defined by the board file"
3762306a36Sopenharmony_ci#endif
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci#if defined(GMSL_CAMERA_RDACM20) && defined(GMSL_CAMERA_RDACM21)
4062306a36Sopenharmony_ci#error "A single camera model should be selected"
4162306a36Sopenharmony_ci#endif
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci#if !defined(GMSL_CAMERA_0) && !defined(GMSL_CAMERA_1) && \
4462306a36Sopenharmony_ci    !defined(GMSL_CAMERA_2) && !defined(GMSL_CAMERA_3) && \
4562306a36Sopenharmony_ci    !defined(GMSL_CAMERA_4) && !defined(GMSL_CAMERA_5) && \
4662306a36Sopenharmony_ci    !defined(GMSL_CAMERA_6) && !defined(GMSL_CAMERA_7)
4762306a36Sopenharmony_ci#error "At least one camera should be selected"
4862306a36Sopenharmony_ci#endif
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci/* Deduce from the enabled cameras which GMSL channels are active. */
5162306a36Sopenharmony_ci#if defined(GMSL_CAMERA_0) || defined(GMSL_CAMERA_1) || \
5262306a36Sopenharmony_ci    defined(GMSL_CAMERA_2) || defined(GMSL_CAMERA_3)
5362306a36Sopenharmony_ci#define GMSL_0
5462306a36Sopenharmony_ci#endif
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci#if defined(GMSL_CAMERA_4) || defined(GMSL_CAMERA_5) || \
5762306a36Sopenharmony_ci    defined(GMSL_CAMERA_6) || defined(GMSL_CAMERA_7)
5862306a36Sopenharmony_ci#define GMSL_1
5962306a36Sopenharmony_ci#endif
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci/* Deduce the camera model compatible string. */
6262306a36Sopenharmony_ci#if defined(GMSL_CAMERA_RDACM20)
6362306a36Sopenharmony_ci#define GMSL_CAMERA_MODEL "imi,rdacm20"
6462306a36Sopenharmony_ci#elif defined(GMSL_CAMERA_RDACM21)
6562306a36Sopenharmony_ci#define GMSL_CAMERA_MODEL "imi,rdacm21"
6662306a36Sopenharmony_ci#endif
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci#ifdef GMSL_0
6962306a36Sopenharmony_ci&vin0 {
7062306a36Sopenharmony_ci	status = "okay";
7162306a36Sopenharmony_ci};
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci&vin1 {
7462306a36Sopenharmony_ci	status = "okay";
7562306a36Sopenharmony_ci};
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci&vin2 {
7862306a36Sopenharmony_ci	status = "okay";
7962306a36Sopenharmony_ci};
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci&vin3 {
8262306a36Sopenharmony_ci	status = "okay";
8362306a36Sopenharmony_ci};
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci&gmsl0 {
8662306a36Sopenharmony_ci	status = "okay";
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci#if defined(GMSL_CAMERA_RDACM21)
8962306a36Sopenharmony_ci	maxim,reverse-channel-microvolt = <100000>;
9062306a36Sopenharmony_ci#endif
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci	ports {
9362306a36Sopenharmony_ci#ifdef GMSL_CAMERA_0
9462306a36Sopenharmony_ci		port@0 {
9562306a36Sopenharmony_ci			max9286_in0: endpoint {
9662306a36Sopenharmony_ci				remote-endpoint = <&fakra_con0>;
9762306a36Sopenharmony_ci			};
9862306a36Sopenharmony_ci		};
9962306a36Sopenharmony_ci#endif
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci#ifdef GMSL_CAMERA_1
10262306a36Sopenharmony_ci		port@1 {
10362306a36Sopenharmony_ci			max9286_in1: endpoint {
10462306a36Sopenharmony_ci				remote-endpoint = <&fakra_con1>;
10562306a36Sopenharmony_ci			};
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ci		};
10862306a36Sopenharmony_ci#endif
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci#ifdef GMSL_CAMERA_2
11162306a36Sopenharmony_ci		port@2 {
11262306a36Sopenharmony_ci			max9286_in2: endpoint {
11362306a36Sopenharmony_ci				remote-endpoint = <&fakra_con2>;
11462306a36Sopenharmony_ci			};
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ci		};
11762306a36Sopenharmony_ci#endif
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci#ifdef GMSL_CAMERA_3
12062306a36Sopenharmony_ci		port@3 {
12162306a36Sopenharmony_ci			max9286_in3: endpoint {
12262306a36Sopenharmony_ci				remote-endpoint = <&fakra_con3>;
12362306a36Sopenharmony_ci			};
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_ci		};
12662306a36Sopenharmony_ci#endif
12762306a36Sopenharmony_ci	};
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci	i2c-mux {
13062306a36Sopenharmony_ci#ifdef GMSL_CAMERA_0
13162306a36Sopenharmony_ci		i2c@0 {
13262306a36Sopenharmony_ci			status = "okay";
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_ci			camera@51 {
13562306a36Sopenharmony_ci				compatible = GMSL_CAMERA_MODEL;
13662306a36Sopenharmony_ci				reg = <0x51>, <0x61>;
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci				port {
13962306a36Sopenharmony_ci					fakra_con0: endpoint {
14062306a36Sopenharmony_ci						remote-endpoint = <&max9286_in0>;
14162306a36Sopenharmony_ci					};
14262306a36Sopenharmony_ci				};
14362306a36Sopenharmony_ci			};
14462306a36Sopenharmony_ci		};
14562306a36Sopenharmony_ci#endif
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ci#ifdef GMSL_CAMERA_1
14862306a36Sopenharmony_ci		i2c@1 {
14962306a36Sopenharmony_ci			status = "okay";
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_ci			camera@52 {
15262306a36Sopenharmony_ci				compatible = GMSL_CAMERA_MODEL;
15362306a36Sopenharmony_ci				reg = <0x52>, <0x62>;
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ci				port {
15662306a36Sopenharmony_ci					fakra_con1: endpoint {
15762306a36Sopenharmony_ci						remote-endpoint = <&max9286_in1>;
15862306a36Sopenharmony_ci					};
15962306a36Sopenharmony_ci				};
16062306a36Sopenharmony_ci			};
16162306a36Sopenharmony_ci		};
16262306a36Sopenharmony_ci#endif
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_ci#ifdef GMSL_CAMERA_2
16562306a36Sopenharmony_ci		i2c@2 {
16662306a36Sopenharmony_ci			status = "okay";
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_ci			camera@53 {
16962306a36Sopenharmony_ci				compatible = GMSL_CAMERA_MODEL;
17062306a36Sopenharmony_ci				reg = <0x53>, <0x63>;
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_ci				port {
17362306a36Sopenharmony_ci					fakra_con2: endpoint {
17462306a36Sopenharmony_ci						remote-endpoint = <&max9286_in2>;
17562306a36Sopenharmony_ci					};
17662306a36Sopenharmony_ci				};
17762306a36Sopenharmony_ci			};
17862306a36Sopenharmony_ci		};
17962306a36Sopenharmony_ci#endif
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_ci#ifdef GMSL_CAMERA_3
18262306a36Sopenharmony_ci		i2c@3 {
18362306a36Sopenharmony_ci			status = "okay";
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_ci			camera@54 {
18662306a36Sopenharmony_ci				compatible = GMSL_CAMERA_MODEL;
18762306a36Sopenharmony_ci				reg = <0x54>, <0x64>;
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_ci				port {
19062306a36Sopenharmony_ci					fakra_con3: endpoint {
19162306a36Sopenharmony_ci						remote-endpoint = <&max9286_in3>;
19262306a36Sopenharmony_ci					};
19362306a36Sopenharmony_ci				};
19462306a36Sopenharmony_ci			};
19562306a36Sopenharmony_ci		};
19662306a36Sopenharmony_ci#endif
19762306a36Sopenharmony_ci	};
19862306a36Sopenharmony_ci};
19962306a36Sopenharmony_ci#endif /* ifdef GMSL_0 */
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_ci#ifdef GMSL_1
20262306a36Sopenharmony_ci&vin4 {
20362306a36Sopenharmony_ci	status = "okay";
20462306a36Sopenharmony_ci};
20562306a36Sopenharmony_ci
20662306a36Sopenharmony_ci&vin5 {
20762306a36Sopenharmony_ci	status = "okay";
20862306a36Sopenharmony_ci};
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_ci&vin6 {
21162306a36Sopenharmony_ci	status = "okay";
21262306a36Sopenharmony_ci};
21362306a36Sopenharmony_ci
21462306a36Sopenharmony_ci&vin7 {
21562306a36Sopenharmony_ci	status = "okay";
21662306a36Sopenharmony_ci};
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_ci&gmsl1 {
21962306a36Sopenharmony_ci	status = "okay";
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_ci#if defined(GMSL_CAMERA_RDACM21)
22262306a36Sopenharmony_ci	maxim,reverse-channel-microvolt = <100000>;
22362306a36Sopenharmony_ci#endif
22462306a36Sopenharmony_ci
22562306a36Sopenharmony_ci	ports {
22662306a36Sopenharmony_ci#ifdef GMSL_CAMERA_4
22762306a36Sopenharmony_ci		port@0 {
22862306a36Sopenharmony_ci			max9286_in4: endpoint {
22962306a36Sopenharmony_ci				remote-endpoint = <&fakra_con4>;
23062306a36Sopenharmony_ci			};
23162306a36Sopenharmony_ci		};
23262306a36Sopenharmony_ci#endif
23362306a36Sopenharmony_ci
23462306a36Sopenharmony_ci#ifdef GMSL_CAMERA_5
23562306a36Sopenharmony_ci		port@1 {
23662306a36Sopenharmony_ci			max9286_in5: endpoint {
23762306a36Sopenharmony_ci				remote-endpoint = <&fakra_con5>;
23862306a36Sopenharmony_ci			};
23962306a36Sopenharmony_ci
24062306a36Sopenharmony_ci		};
24162306a36Sopenharmony_ci#endif
24262306a36Sopenharmony_ci
24362306a36Sopenharmony_ci#ifdef GMSL_CAMERA_6
24462306a36Sopenharmony_ci		port@2 {
24562306a36Sopenharmony_ci			max9286_in6: endpoint {
24662306a36Sopenharmony_ci				remote-endpoint = <&fakra_con6>;
24762306a36Sopenharmony_ci			};
24862306a36Sopenharmony_ci
24962306a36Sopenharmony_ci		};
25062306a36Sopenharmony_ci#endif
25162306a36Sopenharmony_ci
25262306a36Sopenharmony_ci#ifdef GMSL_CAMERA_7
25362306a36Sopenharmony_ci		port@3 {
25462306a36Sopenharmony_ci			max9286_in7: endpoint {
25562306a36Sopenharmony_ci				remote-endpoint = <&fakra_con7>;
25662306a36Sopenharmony_ci			};
25762306a36Sopenharmony_ci
25862306a36Sopenharmony_ci		};
25962306a36Sopenharmony_ci#endif
26062306a36Sopenharmony_ci	};
26162306a36Sopenharmony_ci
26262306a36Sopenharmony_ci	i2c-mux {
26362306a36Sopenharmony_ci#ifdef GMSL_CAMERA_4
26462306a36Sopenharmony_ci		i2c@0 {
26562306a36Sopenharmony_ci			status = "okay";
26662306a36Sopenharmony_ci
26762306a36Sopenharmony_ci			camera@55 {
26862306a36Sopenharmony_ci				compatible = GMSL_CAMERA_MODEL;
26962306a36Sopenharmony_ci				reg = <0x55>, <0x65>;
27062306a36Sopenharmony_ci
27162306a36Sopenharmony_ci				port {
27262306a36Sopenharmony_ci					fakra_con4: endpoint {
27362306a36Sopenharmony_ci						remote-endpoint = <&max9286_in4>;
27462306a36Sopenharmony_ci					};
27562306a36Sopenharmony_ci				};
27662306a36Sopenharmony_ci			};
27762306a36Sopenharmony_ci		};
27862306a36Sopenharmony_ci#endif
27962306a36Sopenharmony_ci
28062306a36Sopenharmony_ci#ifdef GMSL_CAMERA_5
28162306a36Sopenharmony_ci		i2c@1 {
28262306a36Sopenharmony_ci			status = "okay";
28362306a36Sopenharmony_ci
28462306a36Sopenharmony_ci			camera@56 {
28562306a36Sopenharmony_ci				compatible = GMSL_CAMERA_MODEL;
28662306a36Sopenharmony_ci				reg = <0x56>, <0x66>;
28762306a36Sopenharmony_ci
28862306a36Sopenharmony_ci				port {
28962306a36Sopenharmony_ci					fakra_con5: endpoint {
29062306a36Sopenharmony_ci						remote-endpoint = <&max9286_in5>;
29162306a36Sopenharmony_ci					};
29262306a36Sopenharmony_ci				};
29362306a36Sopenharmony_ci			};
29462306a36Sopenharmony_ci		};
29562306a36Sopenharmony_ci#endif
29662306a36Sopenharmony_ci
29762306a36Sopenharmony_ci#ifdef GMSL_CAMERA_6
29862306a36Sopenharmony_ci		i2c@2 {
29962306a36Sopenharmony_ci			status = "okay";
30062306a36Sopenharmony_ci
30162306a36Sopenharmony_ci			camera@57 {
30262306a36Sopenharmony_ci				compatible = GMSL_CAMERA_MODEL;
30362306a36Sopenharmony_ci				reg = <0x57>, <0x67>;
30462306a36Sopenharmony_ci
30562306a36Sopenharmony_ci				port {
30662306a36Sopenharmony_ci					fakra_con6: endpoint {
30762306a36Sopenharmony_ci						remote-endpoint = <&max9286_in6>;
30862306a36Sopenharmony_ci					};
30962306a36Sopenharmony_ci				};
31062306a36Sopenharmony_ci			};
31162306a36Sopenharmony_ci		};
31262306a36Sopenharmony_ci#endif
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_ci#ifdef GMSL_CAMERA_7
31562306a36Sopenharmony_ci		i2c@3 {
31662306a36Sopenharmony_ci			status = "okay";
31762306a36Sopenharmony_ci
31862306a36Sopenharmony_ci			camera@58 {
31962306a36Sopenharmony_ci				compatible = GMSL_CAMERA_MODEL;
32062306a36Sopenharmony_ci				reg = <0x58>, <0x68>;
32162306a36Sopenharmony_ci
32262306a36Sopenharmony_ci				port {
32362306a36Sopenharmony_ci					fakra_con7: endpoint {
32462306a36Sopenharmony_ci						remote-endpoint = <&max9286_in7>;
32562306a36Sopenharmony_ci					};
32662306a36Sopenharmony_ci				};
32762306a36Sopenharmony_ci			};
32862306a36Sopenharmony_ci		};
32962306a36Sopenharmony_ci#endif
33062306a36Sopenharmony_ci	};
33162306a36Sopenharmony_ci};
33262306a36Sopenharmony_ci#endif /* ifdef GMSL_1 */
333