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