[PATCH v5 6/8] arm64: dts: renesas: salvator-x: Add MAX9286 expansion board

From: Jacopo Mondi
Date: Mon Nov 16 2020 - 08:54:00 EST


From: Laurent Pinchart <laurent.pinchart+renesas@xxxxxxxxxxxxxxxx>

Add a .dtsi fragment to describe the MAX9286-based expansion board for
the Renesas Salvator-X board.

The MAX9286 expansion board has eight RDACM20 cameras connected to it.
They can be individually controlled by enabling or disabling the macro
defines.

Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@xxxxxxxxxxxxxxxx>
Signed-off-by: Kieran Bingham <kieran.bingham+renesas@xxxxxxxxxxxxxxxx>

---
v2:
- Use SPDX headers
- Remove link from ADV748x TXA (HDMI)
- Use 0x31-0x38, and 0x41-0x48 for the 8 cameras. 0x30 and 0x40 are the
base addresses for the OV10635 and MAX9271 (0x50 for the MCU)
- Provide RDACM20 MCU I2C address reservations. (0x51-0x58)

v3:
- Fix gmsl-serializer@ i2c node addressing

v6:
- Make i2c-mux child node and update to be conformant to new bindings.

v7:
- Separate register arguments
---
.../boot/dts/renesas/salvator-x-max9286.dtsi | 394 ++++++++++++++++++
1 file changed, 394 insertions(+)
create mode 100644 arch/arm64/boot/dts/renesas/salvator-x-max9286.dtsi

diff --git a/arch/arm64/boot/dts/renesas/salvator-x-max9286.dtsi b/arch/arm64/boot/dts/renesas/salvator-x-max9286.dtsi
new file mode 100644
index 000000000000..6f4798859542
--- /dev/null
+++ b/arch/arm64/boot/dts/renesas/salvator-x-max9286.dtsi
@@ -0,0 +1,394 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Device Tree Source for the Salvator-X MAX9286 expansion board
+ *
+ * Copyright (C) 2017 Ideas on Board <laurent.pinchart@xxxxxxxxxxxxxxxx>
+ */
+
+#include <dt-bindings/gpio/gpio.h>
+
+/*
+ * MAX9286 A
+ */
+#define MAXIM_CAMERA0 "imi,rdacm20"
+#define MAXIM_CAMERA1 "imi,rdacm20"
+#define MAXIM_CAMERA2 "imi,rdacm20"
+#define MAXIM_CAMERA3 "imi,rdacm20"
+
+/*
+ * MAX9286 B
+ */
+#define MAXIM_CAMERA4 "imi,rdacm20"
+#define MAXIM_CAMERA5 "imi,rdacm20"
+#define MAXIM_CAMERA6 "imi,rdacm20"
+#define MAXIM_CAMERA7 "imi,rdacm20"
+
+/ {
+/*
+ * Powered MCU IMI cameras need delay between power-on and R-Car access
+ * to avoid I2C bus conflicts since the R-Car I2C does not support I2C
+ * multi-master. The I2C bus conflict would result in R-Car I2C IP stall.
+ */
+#define IMI_MCU_V0_DELAY 8000000 /* delay for powered MCU firmware v0 */
+#define IMI_MCU_V1_DELAY 3000000 /* delay for powered MCU firmware v1 */
+#define IMI_MCU_NO_DELAY 0 /* delay for unpowered MCU */
+#define IMI_MCU_DELAY IMI_MCU_V0_DELAY
+
+ poc_12v: regulator-vcc-poc-12v {
+ compatible = "regulator-fixed";
+
+ regulator-name = "Camera PoC 12V";
+ regulator-min-microvolt = <12000000>;
+ regulator-max-microvolt = <12000000>;
+ startup-delay-us = <(250000 + IMI_MCU_DELAY)>;
+
+ gpio = <&gpio6 30 GPIO_ACTIVE_HIGH>;
+ enable-active-high;
+ };
+};
+
+&vin0 {
+ status = "okay";
+};
+
+&vin1 {
+ status = "okay";
+};
+
+&vin2 {
+ status = "okay";
+};
+
+&vin3 {
+ status = "okay";
+};
+
+&vin4 {
+ status = "okay";
+};
+
+&vin5 {
+ status = "okay";
+};
+
+&vin6 {
+ status = "okay";
+};
+
+&vin7 {
+ status = "okay";
+};
+
+/* Disconnect the csi40 endpoint from the ADV748x TXA (HDMI) */
+&adv7482_txa {
+ /delete-property/ remote-endpoint;
+ status = "disabled";
+};
+
+&csi40 {
+ status = "okay";
+
+ ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ port@0 {
+ reg = <0>;
+
+ csi40_in: endpoint {
+ clock-lanes = <0>;
+ data-lanes = <1 2 3 4>;
+ remote-endpoint = <&max9286_out0>;
+ };
+ };
+ };
+};
+
+&csi41 {
+ status = "okay";
+
+ ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ port@0 {
+ reg = <0>;
+
+ csi41_in: endpoint {
+ clock-lanes = <0>;
+ data-lanes = <1 2 3 4>;
+ remote-endpoint = <&max9286_out1>;
+ };
+ };
+ };
+};
+
+&i2c4 {
+ gmsl-deserializer@4c {
+ compatible = "maxim,max9286";
+ reg = <0x4c>;
+ poc-supply = <&poc_12v>;
+
+ ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ port@0 {
+ reg = <0>;
+ max9286_in0: endpoint {
+#ifdef MAXIM_CAMERA0
+ remote-endpoint = <&rdacm20_out0>;
+#endif
+ };
+ };
+
+ port@1 {
+ reg = <1>;
+ max9286_in1: endpoint {
+#ifdef MAXIM_CAMERA1
+ remote-endpoint = <&rdacm20_out1>;
+#endif
+ };
+ };
+
+ port@2 {
+ reg = <2>;
+ max9286_in2: endpoint {
+#ifdef MAXIM_CAMERA2
+ remote-endpoint = <&rdacm20_out2>;
+#endif
+ };
+ };
+
+ port@3 {
+ reg = <3>;
+ max9286_in3: endpoint {
+#ifdef MAXIM_CAMERA3
+ remote-endpoint = <&rdacm20_out3>;
+#endif
+ };
+ };
+
+ port@4 {
+ reg = <4>;
+ max9286_out0: endpoint {
+ clock-lanes = <0>;
+ data-lanes = <1 2 3 4>;
+ remote-endpoint = <&csi40_in>;
+ };
+ };
+ };
+
+ i2c-mux {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ i2c@0 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ reg = <0>;
+
+#ifdef MAXIM_CAMERA0
+ camera@31 {
+ compatible = MAXIM_CAMERA0;
+ reg = <0x31>, <0x41>, <0x51>;
+
+ port {
+ rdacm20_out0: endpoint {
+ remote-endpoint = <&max9286_in0>;
+ };
+ };
+
+ };
+#endif
+ };
+
+ i2c@1 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ reg = <1>;
+
+#ifdef MAXIM_CAMERA1
+ camera@32 {
+ compatible = MAXIM_CAMERA1;
+ reg = <0x32>, <0x42>, <0x52>;
+ port {
+ rdacm20_out1: endpoint {
+ remote-endpoint = <&max9286_in1>;
+ };
+ };
+ };
+#endif
+ };
+
+ i2c@2 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ reg = <2>;
+
+#ifdef MAXIM_CAMERA2
+ camera@33 {
+ compatible = MAXIM_CAMERA2;
+ reg = <0x33>, <0x43>, <0x53>;
+ port {
+ rdacm20_out2: endpoint {
+ remote-endpoint = <&max9286_in2>;
+ };
+ };
+ };
+#endif
+ };
+
+ i2c@3 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ reg = <3>;
+
+#ifdef MAXIM_CAMERA3
+ camera@34 {
+ compatible = MAXIM_CAMERA3;
+ reg = <0x34>, <0x44>, <0x54>;
+ port {
+ rdacm20_out3: endpoint {
+ remote-endpoint = <&max9286_in3>;
+ };
+ };
+ };
+#endif
+ };
+ };
+ };
+
+ gmsl-deserializer@6c {
+ compatible = "maxim,max9286";
+ reg = <0x6c>;
+ poc-supply = <&poc_12v>;
+
+ ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ port@0 {
+ reg = <0>;
+ max9286_in4: endpoint {
+#ifdef MAXIM_CAMERA4
+ remote-endpoint = <&rdacm20_out4>;
+#endif
+ };
+ };
+
+ port@1 {
+ reg = <1>;
+ max9286_in5: endpoint {
+#ifdef MAXIM_CAMERA5
+ remote-endpoint = <&rdacm20_out5>;
+#endif
+ };
+ };
+
+ port@2 {
+ reg = <2>;
+ max9286_in6: endpoint {
+#ifdef MAXIM_CAMERA6
+ remote-endpoint = <&rdacm20_out6>;
+#endif
+ };
+ };
+
+ port@3 {
+ reg = <3>;
+ max9286_in7: endpoint {
+#ifdef MAXIM_CAMERA7
+ remote-endpoint = <&rdacm20_out7>;
+#endif
+ };
+ };
+
+ port@4 {
+ reg = <4>;
+ max9286_out1: endpoint {
+ clock-lanes = <0>;
+ data-lanes = <1 2 3 4>;
+ remote-endpoint = <&csi41_in>;
+ };
+ };
+ };
+
+ i2c-mux {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ i2c@0 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ reg = <0>;
+
+#ifdef MAXIM_CAMERA4
+ camera@35 {
+ compatible = MAXIM_CAMERA4;
+ reg = <0x35>, <0x45>, <0x55>;
+ port {
+ rdacm20_out4: endpoint {
+ remote-endpoint = <&max9286_in4>;
+ };
+ };
+ };
+#endif
+ };
+
+ i2c@1 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ reg = <1>;
+
+#ifdef MAXIM_CAMERA5
+ camera@36 {
+ compatible = MAXIM_CAMERA5;
+ reg = <0x36>, <0x46>, <0x56>;
+ port {
+ rdacm20_out5: endpoint {
+ remote-endpoint = <&max9286_in5>;
+ };
+ };
+ };
+#endif
+ };
+
+ i2c@2 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ reg = <2>;
+
+#ifdef MAXIM_CAMERA6
+ camera@37 {
+ compatible = MAXIM_CAMERA6;
+ reg = <0x37>, <0x47>, <0x57>;
+ port {
+ rdacm20_out6: endpoint {
+ remote-endpoint = <&max9286_in6>;
+ };
+ };
+ };
+#endif
+ };
+
+ i2c@3 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ reg = <3>;
+
+#ifdef MAXIM_CAMERA7
+ camera@38 {
+ compatible = MAXIM_CAMERA7;
+ reg = <0x38>, <0x48>, <0x58>;
+ port {
+ rdacm20_out7: endpoint {
+ remote-endpoint = <&max9286_in7>;
+ };
+ };
+ };
+#endif
+ };
+ };
+ };
+};
--
2.29.1