1 // SPDX-License-Identifier: GPL-2.0-only
2 // Overlay to configure a 2 port camera multiplexer
4 // Configuration is based on the Arducam Doubleplexer
5 // which uses a PCA9543 I2C multiplexer to handle the
6 // I2C, and GPIO 4 to control the MIPI mux, and GPIO 17
7 // to enable the CSI-2 mux output (gpio-hog).
12 #include <dt-bindings/gpio/gpio.h>
15 compatible = "brcm,bcm2835";
17 /* Fragments that complete the individual sensor fragments */
20 target = <&imx290_0_ep>;
24 /bits/ 64 <445500000 297000000>;
29 target = <&imx290_1_ep>;
33 /bits/ 64 <445500000 297000000>;
41 compatible = "sony,imx477";
48 compatible = "sony,imx477";
52 /* Additional fragments affecting the mux nodes */
81 target = <&i2c_csi_dsi>;
89 compatible = "nxp,pca9543";
99 #define cam_node imx219_0
100 #define cam_endpoint imx219_0_ep
101 #define cam1_clk clk_24mhz
102 #include "imx219.dtsi"
107 #define cam_node imx477_0
108 #define cam_endpoint imx477_0_ep
109 #define cam1_clk clk_24mhz
110 #include "imx477_378.dtsi"
115 #define cam_node imx708_0
116 #define cam_endpoint imx708_0_ep
117 #define vcm_node imx708_0_vcm
118 #define cam1_clk clk_24mhz
119 #include "imx708.dtsi"
125 #define cam_node ov5647_0
126 #define cam_endpoint ov5647_0_ep
127 #define cam1_clk clk_25mhz
128 #include "ov5647.dtsi"
133 #define cam_node ov7251_0
134 #define cam_endpoint ov7251_0_ep
135 #define cam1_clk clk_24mhz
136 #include "ov7251.dtsi"
141 #define cam_node ov9281_0
142 #define cam_endpoint ov9281_0_ep
143 #define cam1_clk clk_24mhz
144 #include "ov9281.dtsi"
149 #define cam_node imx258_0
150 #define cam_endpoint imx258_0_ep
151 #define cam1_clk clk_24mhz
152 #include "imx258.dtsi"
157 #define cam_node imx290_0
158 #define cam_endpoint imx290_0_ep
159 #define cam1_clk clk_imx290
160 #include "imx290_327.dtsi"
165 #define cam_node ov2311_0
166 #define cam_endpoint ov2311_0_ep
167 #define cam1_clk clk_24mhz
168 #include "ov2311.dtsi"
176 #address-cells = <1>;
179 #define cam_node imx219_1
180 #define cam_endpoint imx219_1_ep
181 #define cam1_clk clk_24mhz
182 #include "imx219.dtsi"
187 #define cam_node imx477_1
188 #define cam_endpoint imx477_1_ep
189 #define cam1_clk clk_24mhz
190 #include "imx477_378.dtsi"
195 #define cam_node imx708_1
196 #define cam_endpoint imx708_1_ep
197 #define vcm_node imx708_1_vcm
198 #define cam1_clk clk_24mhz
199 #include "imx708.dtsi"
205 #define cam_node ov5647_1
206 #define cam_endpoint ov5647_1_ep
207 #define cam1_clk clk_25mhz
208 #include "ov5647.dtsi"
213 #define cam_node ov7251_1
214 #define cam_endpoint ov7251_1_ep
215 #define cam1_clk clk_24mhz
216 #include "ov7251.dtsi"
221 #define cam_node ov9281_1
222 #define cam_endpoint ov9281_1_ep
223 #define cam1_clk clk_24mhz
224 #include "ov9281.dtsi"
229 #define cam_node imx258_1
230 #define cam_endpoint imx258_1_ep
231 #define cam1_clk clk_24mhz
232 #include "imx258.dtsi"
237 #define cam_node imx290_1
238 #define cam_endpoint imx290_1_ep
239 #define cam1_clk clk_imx290
240 #include "imx290_327.dtsi"
245 #define cam_node ov2311_1
246 #define cam_endpoint ov2311_1_ep
247 #define cam1_clk clk_24mhz
248 #include "ov2311.dtsi"
262 brcm,media-controller;
266 remote-endpoint = <&mux_out>;
284 mux: mux-controller {
285 compatible = "gpio-mux";
286 #mux-control-cells = <0>;
288 mux-gpios = <&gpio 4 GPIO_ACTIVE_HIGH>;
292 compatible = "video-mux";
293 mux-controls = <&mux>;
294 #address-cells = <1>;
317 remote-endpoint = <&csi1_ep>;
323 clk_24mhz: clk_24mhz {
324 compatible = "fixed-clock";
327 clock-frequency = <24000000>;
331 clk_25mhz: clk_25mhz {
332 compatible = "fixed-clock";
335 clock-frequency = <25000000>;
339 clk_imx290: clk_imx290 {
340 compatible = "fixed-clock";
343 clock-frequency = <37125000>;
361 gpios = <17 GPIO_ACTIVE_LOW>;
368 cam0-imx219 = <&mux_in0>, "remote-endpoint:0=",<&imx219_0_ep>,
369 <&imx219_0_ep>, "remote-endpoint:0=",<&mux_in0>,
370 <&mux_in0>, "clock-noncontinuous?",
371 <&imx219_0>, "status=okay";
372 cam0-imx477 = <&mux_in0>, "remote-endpoint:0=",<&imx477_0_ep>,
373 <&imx477_0_ep>, "remote-endpoint:0=",<&mux_in0>,
374 <&mux_in0>, "clock-noncontinuous?",
375 <&imx477_0>, "status=okay";
376 cam0-imx708 = <&mux_in0>, "remote-endpoint:0=",<&imx708_0_ep>,
377 <&imx708_0_ep>, "remote-endpoint:0=",<&mux_in0>,
378 <&mux_in0>, "clock-noncontinuous?",
379 <&imx708_0>, "status=okay",
380 <&imx708_0_vcm>, "status=okay",
381 <&imx708_0>,"lens-focus:0=", <&imx708_0_vcm>;
382 cam0-ov5647 = <&mux_in0>, "remote-endpoint:0=",<&ov5647_0_ep>,
383 <&ov5647_0_ep>, "remote-endpoint:0=",<&mux_in0>,
384 <&ov5647_0>, "status=okay";
385 cam0-ov7251 = <&mux_in0>, "remote-endpoint:0=",<&ov7251_0_ep>,
386 <&ov7251_0_ep>, "remote-endpoint:0=",<&mux_in0>,
387 <&ov7251_0>, "status=okay",
389 cam0-ov9281 = <&mux_in0>, "remote-endpoint:0=",<&ov9281_0_ep>,
390 <&ov9281_0_ep>, "remote-endpoint:0=",<&mux_in0>,
391 <&ov9281_0>, "status=okay";
392 cam0-imx258 = <&mux_in0>, "remote-endpoint:0=",<&imx258_0_ep>,
393 <&imx258_0_ep>, "remote-endpoint:0=",<&mux_in0>,
394 <&imx258_0>, "status=okay";
395 cam0-imx290 = <&mux_in0>, "remote-endpoint:0=",<&imx290_0_ep>,
396 <&imx290_0_ep>, "remote-endpoint:0=",<&mux_in0>,
397 <&imx290_0>, "status=okay";
398 cam0-ov2311 = <&mux_in0>, "remote-endpoint:0=",<&ov2311_0_ep>,
399 <&ov2311_0_ep>, "remote-endpoint:0=",<&mux_in0>,
400 <&ov2311_0>, "status=okay";
402 cam1-imx219 = <&mux_in1>, "remote-endpoint:0=",<&imx219_1_ep>,
403 <&imx219_1_ep>, "remote-endpoint:0=",<&mux_in1>,
404 <&mux_in1>, "clock-noncontinuous?",
405 <&imx219_1>, "status=okay";
406 cam1-imx477 = <&mux_in1>, "remote-endpoint:0=",<&imx477_1_ep>,
407 <&imx477_1_ep>, "remote-endpoint:0=",<&mux_in1>,
408 <&mux_in1>, "clock-noncontinuous?",
409 <&imx477_1>, "status=okay";
410 cam1-imx708 = <&mux_in1>, "remote-endpoint:0=",<&imx708_1_ep>,
411 <&imx708_1_ep>, "remote-endpoint:0=",<&mux_in1>,
412 <&mux_in1>, "clock-noncontinuous?",
413 <&imx708_1>, "status=okay",
414 <&imx708_1_vcm>, "status=okay",
415 <&imx708_1>,"lens-focus:0=", <&imx708_1_vcm>;
416 cam1-ov5647 = <&mux_in1>, "remote-endpoint:0=",<&ov5647_1_ep>,
417 <&ov5647_1_ep>, "remote-endpoint:0=",<&mux_in1>,
418 <&ov5647_1>, "status=okay";
419 cam1-ov7251 = <&mux_in1>, "remote-endpoint:0=",<&ov7251_1_ep>,
420 <&ov7251_1_ep>, "remote-endpoint:0=",<&mux_in1>,
421 <&ov7251_1>, "status=okay",
423 cam1-ov9281 = <&mux_in1>, "remote-endpoint:0=",<&ov9281_1_ep>,
424 <&ov9281_1_ep>, "remote-endpoint:0=",<&mux_in1>,
425 <&ov9281_1>, "status=okay";
426 cam1-imx258 = <&mux_in1>, "remote-endpoint:0=",<&imx258_1_ep>,
427 <&imx258_1_ep>, "remote-endpoint:0=",<&mux_in1>,
428 <&imx258_1>, "status=okay";
429 cam1-imx290 = <&mux_in1>, "remote-endpoint:0=",<&imx290_1_ep>,
430 <&imx290_1_ep>, "remote-endpoint:0=",<&mux_in1>,
431 <&imx290_1>, "status=okay";
432 cam1-ov2311 = <&mux_in1>, "remote-endpoint:0=",<&ov2311_1_ep>,
433 <&ov2311_1_ep>, "remote-endpoint:0=",<&mux_in1>,
434 <&ov2311_1>, "status=okay";
436 cam0-imx290-clk-freq = <&clk_imx290>,"clock-frequency:0",
437 <&imx290_0>,"clock-frequency:0";
438 cam1-imx290-clk-freq = <&clk_imx290>,"clock-frequency:0",
439 <&imx290_1>,"clock-frequency:0";