1 // SPDX-License-Identifier: GPL-2.0-only
3 // Overlay to configure a 4 port camera multiplexer
5 // Configuration is based on the Arducam 4 channel multiplexer
6 // which uses a PCA9543 I2C multiplexer to handle the
7 // I2C, and GPIOs 4, 17, and 18 to control the MIPI muxes.
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>;
38 target = <&imx290_2_ep>;
42 /bits/ 64 <445500000 297000000>;
47 target = <&imx290_3_ep>;
51 /bits/ 64 <445500000 297000000>;
59 compatible = "sony,imx477";
66 compatible = "sony,imx477";
73 compatible = "sony,imx477";
80 compatible = "sony,imx477";
84 /* Additional fragments affecting the mux nodes */
139 target = <&i2c_csi_dsi>;
141 #address-cells = <1>;
147 compatible = "nxp,pca9544";
149 #address-cells = <1>;
154 #address-cells = <1>;
157 #define cam_node imx219_0
158 #define cam_endpoint imx219_0_ep
159 #define cam1_clk clk_24mhz
160 #include "imx219.dtsi"
165 #define cam_node imx477_0
166 #define cam_endpoint imx477_0_ep
167 #define cam1_clk clk_24mhz
168 #include "imx477_378.dtsi"
173 #define cam_node imx708_0
174 #define cam_endpoint imx708_0_ep
175 #define vcm_node imx708_0_vcm
176 #define cam1_clk clk_24mhz
177 #include "imx708.dtsi"
183 #define cam_node ov5647_0
184 #define cam_endpoint ov5647_0_ep
185 #define cam1_clk clk_25mhz
186 #include "ov5647.dtsi"
191 #define cam_node ov7251_0
192 #define cam_endpoint ov7251_0_ep
193 #define cam1_clk clk_24mhz
194 #include "ov7251.dtsi"
199 #define cam_node ov9281_0
200 #define cam_endpoint ov9281_0_ep
201 #define cam1_clk clk_24mhz
202 #include "ov9281.dtsi"
207 #define cam_node imx258_0
208 #define cam_endpoint imx258_0_ep
209 #define cam1_clk clk_24mhz
210 #include "imx258.dtsi"
215 #define cam_node imx290_0
216 #define cam_endpoint imx290_0_ep
217 #define cam1_clk clk_imx290
218 #include "imx290_327.dtsi"
223 #define cam_node ov2311_0
224 #define cam_endpoint ov2311_0_ep
225 #define cam1_clk clk_24mhz
226 #include "ov2311.dtsi"
234 #address-cells = <1>;
237 #define cam_node imx219_1
238 #define cam_endpoint imx219_1_ep
239 #define cam1_clk clk_24mhz
240 #include "imx219.dtsi"
245 #define cam_node imx477_1
246 #define cam_endpoint imx477_1_ep
247 #define cam1_clk clk_24mhz
248 #include "imx477_378.dtsi"
253 #define cam_node imx708_1
254 #define cam_endpoint imx708_1_ep
255 #define vcm_node imx708_1_vcm
256 #define cam1_clk clk_24mhz
257 #include "imx708.dtsi"
263 #define cam_node ov5647_1
264 #define cam_endpoint ov5647_1_ep
265 #define cam1_clk clk_25mhz
266 #include "ov5647.dtsi"
271 #define cam_node ov7251_1
272 #define cam_endpoint ov7251_1_ep
273 #define cam1_clk clk_24mhz
274 #include "ov7251.dtsi"
279 #define cam_node ov9281_1
280 #define cam_endpoint ov9281_1_ep
281 #define cam1_clk clk_24mhz
282 #include "ov9281.dtsi"
287 #define cam_node imx258_1
288 #define cam_endpoint imx258_1_ep
289 #define cam1_clk clk_24mhz
290 #include "imx258.dtsi"
295 #define cam_node imx290_1
296 #define cam_endpoint imx290_1_ep
297 #define cam1_clk clk_imx290
298 #include "imx290_327.dtsi"
303 #define cam_node ov2311_1
304 #define cam_endpoint ov2311_1_ep
305 #define cam1_clk clk_24mhz
306 #include "ov2311.dtsi"
314 #address-cells = <1>;
317 #define cam_node imx219_2
318 #define cam_endpoint imx219_2_ep
319 #define cam1_clk clk_24mhz
320 #include "imx219.dtsi"
325 #define cam_node imx477_2
326 #define cam_endpoint imx477_2_ep
327 #define cam1_clk clk_24mhz
328 #include "imx477_378.dtsi"
333 #define cam_node imx708_2
334 #define cam_endpoint imx708_2_ep
335 #define vcm_node imx708_2_vcm
336 #define cam1_clk clk_24mhz
337 #include "imx708.dtsi"
343 #define cam_node ov5647_2
344 #define cam_endpoint ov5647_2_ep
345 #define cam1_clk clk_25mhz
346 #include "ov5647.dtsi"
351 #define cam_node ov7251_2
352 #define cam_endpoint ov7251_2_ep
353 #define cam1_clk clk_24mhz
354 #include "ov7251.dtsi"
359 #define cam_node ov9281_2
360 #define cam_endpoint ov9281_2_ep
361 #define cam1_clk clk_24mhz
362 #include "ov9281.dtsi"
367 #define cam_node imx258_2
368 #define cam_endpoint imx258_2_ep
369 #define cam1_clk clk_24mhz
370 #include "imx258.dtsi"
375 #define cam_node imx290_2
376 #define cam_endpoint imx290_2_ep
377 #define cam1_clk clk_imx290
378 #include "imx290_327.dtsi"
383 #define cam_node ov2311_2
384 #define cam_endpoint ov2311_2_ep
385 #define cam1_clk clk_24mhz
386 #include "ov2311.dtsi"
394 #address-cells = <1>;
397 #define cam_node imx219_3
398 #define cam_endpoint imx219_3_ep
399 #define cam1_clk clk_24mhz
400 #include "imx219.dtsi"
405 #define cam_node imx477_3
406 #define cam_endpoint imx477_3_ep
407 #define cam1_clk clk_24mhz
408 #include "imx477_378.dtsi"
413 #define cam_node imx708_3
414 #define cam_endpoint imx708_3_ep
415 #define vcm_node imx708_3_vcm
416 #define cam1_clk clk_24mhz
417 #include "imx708.dtsi"
423 #define cam_node ov5647_3
424 #define cam_endpoint ov5647_3_ep
425 #define cam1_clk clk_25mhz
426 #include "ov5647.dtsi"
431 #define cam_node ov7251_3
432 #define cam_endpoint ov7251_3_ep
433 #define cam1_clk clk_24mhz
434 #include "ov7251.dtsi"
439 #define cam_node ov9281_3
440 #define cam_endpoint ov9281_3_ep
441 #define cam1_clk clk_24mhz
442 #include "ov9281.dtsi"
447 #define cam_node imx258_3
448 #define cam_endpoint imx258_3_ep
449 #define cam1_clk clk_24mhz
450 #include "imx258.dtsi"
455 #define cam_node imx290_3
456 #define cam_endpoint imx290_3_ep
457 #define cam1_clk clk_imx290
458 #include "imx290_327.dtsi"
463 #define cam_node ov2311_3
464 #define cam_endpoint ov2311_3_ep
465 #define cam1_clk clk_24mhz
466 #include "ov2311.dtsi"
480 brcm,media-controller;
484 remote-endpoint = <&mux_out>;
502 mux: mux-controller {
503 compatible = "gpio-mux";
504 #mux-control-cells = <0>;
507 mux-gpios = <&gpio 4 GPIO_ACTIVE_HIGH>,
508 <&gpio 18 GPIO_ACTIVE_HIGH>,
509 <&gpio 17 GPIO_ACTIVE_HIGH>;
513 compatible = "video-mux";
514 mux-controls = <&mux>;
515 #address-cells = <1>;
518 /* GPIO mappings settings for selecting the different
519 * camera connectors are not direct, hence port@ values
520 * are not straight forward.
523 /* Port A - GPIO 17 = 0, GPIO 18 = 1,GPIO 4 = 0 */
532 /* Port B - GPIO 17 = 0, GPIO 18 = 1,GPIO 4 = 1 */
541 /* Port C - GPIO 17 = 1, GPIO 18 = 0, GPIO 4 = 0 */
550 /* Port D - GPIO 17 = 1, GPIO 18 = 0, GPIO 4 = 1 */
559 /* Output port needs to be the highest port number */
563 remote-endpoint = <&csi1_ep>;
569 clk_24mhz: clk_24mhz {
570 compatible = "fixed-clock";
573 clock-frequency = <24000000>;
577 clk_25mhz: clk_25mhz {
578 compatible = "fixed-clock";
581 clock-frequency = <25000000>;
585 clk_imx290: clk_imx290 {
586 compatible = "fixed-clock";
589 clock-frequency = <37125000>;
603 cam0-imx219 = <&mux_in0>, "remote-endpoint:0=",<&imx219_0_ep>,
604 <&imx219_0_ep>, "remote-endpoint:0=",<&mux_in0>,
605 <&mux_in0>, "clock-noncontinuous?",
606 <&imx219_0>, "status=okay";
607 cam0-imx477 = <&mux_in0>, "remote-endpoint:0=",<&imx477_0_ep>,
608 <&imx477_0_ep>, "remote-endpoint:0=",<&mux_in0>,
609 <&mux_in0>, "clock-noncontinuous?",
610 <&imx477_0>, "status=okay";
611 cam0-imx708 = <&mux_in0>, "remote-endpoint:0=",<&imx708_0_ep>,
612 <&imx708_0_ep>, "remote-endpoint:0=",<&mux_in0>,
613 <&mux_in0>, "clock-noncontinuous?",
614 <&imx708_0>, "status=okay",
615 <&imx708_0_vcm>, "status=okay",
616 <&imx708_0>,"lens-focus:0=", <&imx708_0_vcm>;
617 cam0-ov5647 = <&mux_in0>, "remote-endpoint:0=",<&ov5647_0_ep>,
618 <&ov5647_0_ep>, "remote-endpoint:0=",<&mux_in0>,
619 <&ov5647_0>, "status=okay";
620 cam0-ov7251 = <&mux_in0>, "remote-endpoint:0=",<&ov7251_0_ep>,
621 <&ov7251_0_ep>, "remote-endpoint:0=",<&mux_in0>,
622 <&ov7251_0>, "status=okay",
624 cam0-ov9281 = <&mux_in0>, "remote-endpoint:0=",<&ov9281_0_ep>,
625 <&ov9281_0_ep>, "remote-endpoint:0=",<&mux_in0>,
626 <&ov9281_0>, "status=okay";
627 cam0-imx258 = <&mux_in0>, "remote-endpoint:0=",<&imx258_0_ep>,
628 <&imx258_0_ep>, "remote-endpoint:0=",<&mux_in0>,
629 <&imx258_0>, "status=okay";
630 cam0-imx290 = <&mux_in0>, "remote-endpoint:0=",<&imx290_0_ep>,
631 <&imx290_0_ep>, "remote-endpoint:0=",<&mux_in0>,
632 <&imx290_0>, "status=okay";
633 cam0-ov2311 = <&mux_in0>, "remote-endpoint:0=",<&ov2311_0_ep>,
634 <&ov2311_0_ep>, "remote-endpoint:0=",<&mux_in0>,
635 <&ov2311_0>, "status=okay";
637 cam1-imx219 = <&mux_in1>, "remote-endpoint:0=",<&imx219_1_ep>,
638 <&imx219_1_ep>, "remote-endpoint:0=",<&mux_in1>,
639 <&mux_in1>, "clock-noncontinuous?",
640 <&imx219_1>, "status=okay";
641 cam1-imx477 = <&mux_in1>, "remote-endpoint:0=",<&imx477_1_ep>,
642 <&imx477_1_ep>, "remote-endpoint:0=",<&mux_in1>,
643 <&mux_in1>, "clock-noncontinuous?",
644 <&imx477_1>, "status=okay";
645 cam1-imx708 = <&mux_in1>, "remote-endpoint:0=",<&imx708_1_ep>,
646 <&imx708_1_ep>, "remote-endpoint:0=",<&mux_in1>,
647 <&mux_in1>, "clock-noncontinuous?",
648 <&imx708_1>, "status=okay",
649 <&imx708_1_vcm>, "status=okay",
650 <&imx708_1>,"lens-focus:0=", <&imx708_1_vcm>;
651 cam1-ov5647 = <&mux_in1>, "remote-endpoint:0=",<&ov5647_1_ep>,
652 <&ov5647_1_ep>, "remote-endpoint:0=",<&mux_in1>,
653 <&ov5647_1>, "status=okay";
654 cam1-ov7251 = <&mux_in1>, "remote-endpoint:0=",<&ov7251_1_ep>,
655 <&ov7251_1_ep>, "remote-endpoint:0=",<&mux_in1>,
656 <&ov7251_1>, "status=okay",
658 cam1-ov9281 = <&mux_in1>, "remote-endpoint:0=",<&ov9281_1_ep>,
659 <&ov9281_1_ep>, "remote-endpoint:0=",<&mux_in1>,
660 <&ov9281_1>, "status=okay";
661 cam1-imx258 = <&mux_in1>, "remote-endpoint:0=",<&imx258_1_ep>,
662 <&imx258_1_ep>, "remote-endpoint:0=",<&mux_in1>,
663 <&imx258_1>, "status=okay";
664 cam1-imx290 = <&mux_in1>, "remote-endpoint:0=",<&imx290_1_ep>,
665 <&imx290_1_ep>, "remote-endpoint:0=",<&mux_in1>,
666 <&imx290_1>, "status=okay";
667 cam1-ov2311 = <&mux_in1>, "remote-endpoint:0=",<&ov2311_1_ep>,
668 <&ov2311_1_ep>, "remote-endpoint:0=",<&mux_in1>,
669 <&ov2311_1>, "status=okay";
671 cam2-imx219 = <&mux_in2>, "remote-endpoint:0=",<&imx219_2_ep>,
672 <&imx219_2_ep>, "remote-endpoint:0=",<&mux_in2>,
673 <&mux_in2>, "clock-noncontinuous?",
674 <&imx219_2>, "status=okay";
675 cam2-imx477 = <&mux_in2>, "remote-endpoint:0=",<&imx477_2_ep>,
676 <&imx477_2_ep>, "remote-endpoint:0=",<&mux_in2>,
677 <&mux_in2>, "clock-noncontinuous?",
678 <&imx477_2>, "status=okay";
679 cam2-imx708 = <&mux_in2>, "remote-endpoint:0=",<&imx708_2_ep>,
680 <&imx708_2_ep>, "remote-endpoint:0=",<&mux_in2>,
681 <&mux_in2>, "clock-noncontinuous?",
682 <&imx708_2>, "status=okay",
683 <&imx708_2_vcm>, "status=okay",
684 <&imx708_2>,"lens-focus:0=", <&imx708_2_vcm>;
685 cam2-ov5647 = <&mux_in2>, "remote-endpoint:0=",<&ov5647_2_ep>,
686 <&ov5647_2_ep>, "remote-endpoint:0=",<&mux_in2>,
687 <&ov5647_2>, "status=okay";
688 cam2-ov7251 = <&mux_in2>, "remote-endpoint:0=",<&ov7251_2_ep>,
689 <&ov7251_2_ep>, "remote-endpoint:0=",<&mux_in2>,
690 <&ov7251_2>, "status=okay",
692 cam2-ov9281 = <&mux_in2>, "remote-endpoint:0=",<&ov9281_2_ep>,
693 <&ov9281_2_ep>, "remote-endpoint:0=",<&mux_in2>,
694 <&ov9281_2>, "status=okay";
695 cam2-imx258 = <&mux_in2>, "remote-endpoint:0=",<&imx258_2_ep>,
696 <&imx258_2>, "status=okay",
697 <&imx258_2>, "remote-endpoint:0=",<&mux_in2>;
698 cam2-imx290 = <&mux_in2>, "remote-endpoint:0=",<&imx290_2_ep>,
699 <&imx290_2_ep>, "remote-endpoint:0=",<&mux_in2>,
700 <&imx290_2>, "status=okay";
701 cam2-ov2311 = <&mux_in2>, "remote-endpoint:0=",<&ov2311_2_ep>,
702 <&ov2311_2_ep>, "remote-endpoint:0=",<&mux_in2>,
703 <&ov2311_2>, "status=okay";
705 cam3-imx219 = <&mux_in3>, "remote-endpoint:0=",<&imx219_3_ep>,
706 <&imx219_3_ep>, "remote-endpoint:0=",<&mux_in3>,
707 <&mux_in3>, "clock-noncontinuous?",
708 <&imx219_3>, "status=okay";
709 cam3-imx477 = <&mux_in3>, "remote-endpoint:0=",<&imx477_3_ep>,
710 <&imx477_3_ep>, "remote-endpoint:0=",<&mux_in3>,
711 <&mux_in3>, "clock-noncontinuous?",
712 <&imx477_3>, "status=okay";
713 cam3-imx708 = <&mux_in3>, "remote-endpoint:0=",<&imx708_3_ep>,
714 <&imx708_3_ep>, "remote-endpoint:0=",<&mux_in3>,
715 <&mux_in3>, "clock-noncontinuous?",
716 <&imx708_3>, "status=okay",
717 <&imx708_3_vcm>, "status=okay",
718 <&imx708_3>,"lens-focus:0=", <&imx708_3_vcm>;
719 cam3-ov5647 = <&mux_in3>, "remote-endpoint:0=",<&ov5647_3_ep>,
720 <&ov5647_3_ep>, "remote-endpoint:0=",<&mux_in3>,
721 <&ov5647_3>, "status=okay";
722 cam3-ov7251 = <&mux_in3>, "remote-endpoint:0=",<&ov7251_3_ep>,
723 <&ov7251_3_ep>, "remote-endpoint:0=",<&mux_in3>,
724 <&ov7251_3>, "status=okay",
726 cam3-ov9281 = <&mux_in3>, "remote-endpoint:0=",<&ov9281_3_ep>,
727 <&ov9281_3_ep>, "remote-endpoint:0=",<&mux_in3>,
728 <&ov9281_3>, "status=okay";
729 cam3-imx258 = <&mux_in3>, "remote-endpoint:0=",<&imx258_3_ep>,
730 <&imx258_3_ep>, "remote-endpoint:0=",<&mux_in3>,
731 <&imx258_3>, "status=okay";
732 cam3-imx290 = <&mux_in3>, "remote-endpoint:0=",<&imx290_3_ep>,
733 <&imx290_3_ep>, "remote-endpoint:0=",<&mux_in3>,
734 <&imx290_3>, "status=okay";
735 cam3-ov2311 = <&mux_in3>, "remote-endpoint:0=",<&ov2311_3_ep>,
736 <&ov2311_3_ep>, "remote-endpoint:0=",<&mux_in3>,
737 <&ov2311_3>, "status=okay";
739 cam0-imx290-clk-freq = <&clk_imx290>,"clock-frequency:0",
740 <&imx290_0>,"clock-frequency:0";
741 cam1-imx290-clk-freq = <&clk_imx290>,"clock-frequency:0",
742 <&imx290_1>,"clock-frequency:0";
743 cam2-imx290-clk-freq = <&clk_imx290>,"clock-frequency:0",
744 <&imx290_2>,"clock-frequency:0";
745 cam3-imx290-clk-freq = <&clk_imx290>,"clock-frequency:0",
746 <&imx290_3>,"clock-frequency:0";