// SPDX-License-Identifier: GPL-2.0+
/*
 * Copyright (C) 2017 Ideas on Board <kieran.bingham@ideasonboard.com>
 * Copyright (C) 2021 Jacopo Mondi <jacopo+renesas@jmondi.org>
 *
 * Device Tree Source (overlay) that describes GMSL camera connected to
 * Fakra connectors for the Eagle V3M and Condor V3H (and compatible) boards.
 *
 * The following cameras are currently supported: RDACM20 and RDACM21.
 *
 * The board .dts file that include this has to select which cameras are in use
 * by specifying the camera model with:
 *
 * #define GMSL_CAMERA_RDACM20
 * or
 * #define GMSL_CAMERA_RDACM21
 *
 * And which cameras are connected to the board by defining:
 * for GMSL channel 0:
 *	   #define GMSL_CAMERA_0
 *	   #define GMSL_CAMERA_1
 *	   #define GMSL_CAMERA_2
 *	   #define GMSL_CAMERA_3
 *
 * for GMSL channel 1:
 *	   #define GMSL_CAMERA_4
 *	   #define GMSL_CAMERA_5
 *	   #define GMSL_CAMERA_6
 *	   #define GMSL_CAMERA_7
 */

#include <dt-bindings/gpio/gpio.h>

/* Validate the board file settings. */
#if !defined(GMSL_CAMERA_RDACM20) && !defined(GMSL_CAMERA_RDACM21)
#error "Camera model should be defined by the board file"
#endif

#if defined(GMSL_CAMERA_RDACM20) && defined(GMSL_CAMERA_RDACM21)
#error "A single camera model should be selected"
#endif

#if !defined(GMSL_CAMERA_0) && !defined(GMSL_CAMERA_1) && \
    !defined(GMSL_CAMERA_2) && !defined(GMSL_CAMERA_3) && \
    !defined(GMSL_CAMERA_4) && !defined(GMSL_CAMERA_5) && \
    !defined(GMSL_CAMERA_6) && !defined(GMSL_CAMERA_7)
#error "At least one camera should be selected"
#endif

/* Deduce from the enabled cameras which GMSL channels are active. */
#if defined(GMSL_CAMERA_0) || defined(GMSL_CAMERA_1) || \
    defined(GMSL_CAMERA_2) || defined(GMSL_CAMERA_3)
#define GMSL_0
#endif

#if defined(GMSL_CAMERA_4) || defined(GMSL_CAMERA_5) || \
    defined(GMSL_CAMERA_6) || defined(GMSL_CAMERA_7)
#define GMSL_1
#endif

/* Deduce the camera model compatible string. */
#if defined(GMSL_CAMERA_RDACM20)
#define GMSL_CAMERA_MODEL "imi,rdacm20"
#elif defined(GMSL_CAMERA_RDACM21)
#define GMSL_CAMERA_MODEL "imi,rdacm21"
#endif

#ifdef GMSL_0
&vin0 {
	status = "okay";
};

&vin1 {
	status = "okay";
};

&vin2 {
	status = "okay";
};

&vin3 {
	status = "okay";
};

&gmsl0 {
	status = "okay";

#if defined(GMSL_CAMERA_RDACM21)
	maxim,reverse-channel-microvolt = <100000>;
#endif

	ports {
#ifdef GMSL_CAMERA_0
		port@0 {
			max9286_in0: endpoint {
				remote-endpoint = <&fakra_con0>;
			};
		};
#endif

#ifdef GMSL_CAMERA_1
		port@1 {
			max9286_in1: endpoint {
				remote-endpoint = <&fakra_con1>;
			};

		};
#endif

#ifdef GMSL_CAMERA_2
		port@2 {
			max9286_in2: endpoint {
				remote-endpoint = <&fakra_con2>;
			};

		};
#endif

#ifdef GMSL_CAMERA_3
		port@3 {
			max9286_in3: endpoint {
				remote-endpoint = <&fakra_con3>;
			};

		};
#endif
	};

	i2c-mux {
#ifdef GMSL_CAMERA_0
		i2c@0 {
			status = "okay";

			camera@51 {
				compatible = GMSL_CAMERA_MODEL;
				reg = <0x51>, <0x61>;

				port {
					fakra_con0: endpoint {
						remote-endpoint = <&max9286_in0>;
					};
				};
			};
		};
#endif

#ifdef GMSL_CAMERA_1
		i2c@1 {
			status = "okay";

			camera@52 {
				compatible = GMSL_CAMERA_MODEL;
				reg = <0x52>, <0x62>;

				port {
					fakra_con1: endpoint {
						remote-endpoint = <&max9286_in1>;
					};
				};
			};
		};
#endif

#ifdef GMSL_CAMERA_2
		i2c@2 {
			status = "okay";

			camera@53 {
				compatible = GMSL_CAMERA_MODEL;
				reg = <0x53>, <0x63>;

				port {
					fakra_con2: endpoint {
						remote-endpoint = <&max9286_in2>;
					};
				};
			};
		};
#endif

#ifdef GMSL_CAMERA_3
		i2c@3 {
			status = "okay";

			camera@54 {
				compatible = GMSL_CAMERA_MODEL;
				reg = <0x54>, <0x64>;

				port {
					fakra_con3: endpoint {
						remote-endpoint = <&max9286_in3>;
					};
				};
			};
		};
#endif
	};
};
#endif /* ifdef GMSL_0 */

#ifdef GMSL_1
&vin4 {
	status = "okay";
};

&vin5 {
	status = "okay";
};

&vin6 {
	status = "okay";
};

&vin7 {
	status = "okay";
};

&gmsl1 {
	status = "okay";

#if defined(GMSL_CAMERA_RDACM21)
	maxim,reverse-channel-microvolt = <100000>;
#endif

	ports {
#ifdef GMSL_CAMERA_4
		port@0 {
			max9286_in4: endpoint {
				remote-endpoint = <&fakra_con4>;
			};
		};
#endif

#ifdef GMSL_CAMERA_5
		port@1 {
			max9286_in5: endpoint {
				remote-endpoint = <&fakra_con5>;
			};

		};
#endif

#ifdef GMSL_CAMERA_6
		port@2 {
			max9286_in6: endpoint {
				remote-endpoint = <&fakra_con6>;
			};

		};
#endif

#ifdef GMSL_CAMERA_7
		port@3 {
			max9286_in7: endpoint {
				remote-endpoint = <&fakra_con7>;
			};

		};
#endif
	};

	i2c-mux {
#ifdef GMSL_CAMERA_4
		i2c@0 {
			status = "okay";

			camera@55 {
				compatible = GMSL_CAMERA_MODEL;
				reg = <0x55>, <0x65>;

				port {
					fakra_con4: endpoint {
						remote-endpoint = <&max9286_in4>;
					};
				};
			};
		};
#endif

#ifdef GMSL_CAMERA_5
		i2c@1 {
			status = "okay";

			camera@56 {
				compatible = GMSL_CAMERA_MODEL;
				reg = <0x56>, <0x66>;

				port {
					fakra_con5: endpoint {
						remote-endpoint = <&max9286_in5>;
					};
				};
			};
		};
#endif

#ifdef GMSL_CAMERA_6
		i2c@2 {
			status = "okay";

			camera@57 {
				compatible = GMSL_CAMERA_MODEL;
				reg = <0x57>, <0x67>;

				port {
					fakra_con6: endpoint {
						remote-endpoint = <&max9286_in6>;
					};
				};
			};
		};
#endif

#ifdef GMSL_CAMERA_7
		i2c@3 {
			status = "okay";

			camera@58 {
				compatible = GMSL_CAMERA_MODEL;
				reg = <0x58>, <0x68>;

				port {
					fakra_con7: endpoint {
						remote-endpoint = <&max9286_in7>;
					};
				};
			};
		};
#endif
	};
};
#endif /* ifdef GMSL_1 */