[PATCH] arm64: dts: qcom: qcs6490-rubikpi3: Enable cameras
From: Hongyang Zhao
Date: Tue Jun 16 2026 - 05:56:33 EST
Enable the two Raspberry Pi camera connectors on RubikPi 3 with
IMX219 sensors. CAM1 is connected to CCI1 and CSIPHY1, while CAM2
is connected to CCI0 and CSIPHY4.
Add the shared 24 MHz camera oscillator, camera power enable
regulators, CAMSS endpoints, CCI sensor nodes and privacy LED GPIOs.
Signed-off-by: Hongyang Zhao <hongyang.zhao@xxxxxxxxxxxxxxx>
---
Enable the two Raspberry Pi camera connectors on Thundercomm RUBIK Pi 3.
Both connectors are populated with IMX219 camera modules.
CAM1 is wired to CCI1 and CSIPHY1, while CAM2 is wired to CCI0 and
CSIPHY4. Add the fixed 24 MHz camera oscillator, camera power enable
regulators, CAMSS endpoints, CCI sensor nodes, and the privacy LED GPIOs.
The cameras were validated on RUBIK Pi 3 with two IMX219 modules. Both
sensors enumerate through CAMSS and can capture 3280x2464 RGGB frames. The
privacy LEDs are also toggled by the V4L2 subdev privacy LED support while
streaming.
---
.../boot/dts/qcom/qcs6490-thundercomm-rubikpi3.dts | 204 +++++++++++++++++++++
1 file changed, 204 insertions(+)
diff --git a/arch/arm64/boot/dts/qcom/qcs6490-thundercomm-rubikpi3.dts b/arch/arm64/boot/dts/qcom/qcs6490-thundercomm-rubikpi3.dts
index f47efca42d48..280ce9316f50 100644
--- a/arch/arm64/boot/dts/qcom/qcs6490-thundercomm-rubikpi3.dts
+++ b/arch/arm64/boot/dts/qcom/qcs6490-thundercomm-rubikpi3.dts
@@ -47,6 +47,12 @@ chosen {
stdout-path = "serial0:115200n8";
};
+ cam_osc_24m: clock-24000000 {
+ compatible = "fixed-clock";
+ #clock-cells = <0>;
+ clock-frequency = <24000000>;
+ };
+
gpio-keys {
compatible = "gpio-keys";
@@ -61,6 +67,27 @@ key-volume-up {
};
};
+ gpio-leds {
+ compatible = "gpio-leds";
+
+ pinctrl-0 = <&cam1_privacy_led_state>, <&cam2_privacy_led_state>;
+ pinctrl-names = "default";
+
+ cam1_privacy_led: led-camera1 {
+ function = LED_FUNCTION_INDICATOR;
+ function-enumerator = <1>;
+ gpios = <&tlmm 18 GPIO_ACTIVE_HIGH>;
+ default-state = "off";
+ };
+
+ cam2_privacy_led: led-camera2 {
+ function = LED_FUNCTION_INDICATOR;
+ function-enumerator = <2>;
+ gpios = <&tlmm 19 GPIO_ACTIVE_HIGH>;
+ default-state = "off";
+ };
+ };
+
hdmi-connector {
compatible = "hdmi-connector";
type = "a";
@@ -128,6 +155,38 @@ fan0: pwm-fan {
pinctrl-names = "default";
};
+ vreg_cam1_pwr: regulator-camera1-pwr {
+ compatible = "regulator-fixed";
+
+ regulator-name = "vreg_camera1_pwr";
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+
+ gpio = <&tlmm 57 GPIO_ACTIVE_HIGH>;
+ enable-active-high;
+
+ pinctrl-0 = <&cam1_pwr_en>;
+ pinctrl-names = "default";
+
+ vin-supply = <&vreg_vcc3v3_output>;
+ };
+
+ vreg_cam2_pwr: regulator-camera2-pwr {
+ compatible = "regulator-fixed";
+
+ regulator-name = "vreg_camera2_pwr";
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+
+ gpio = <&tlmm 58 GPIO_ACTIVE_HIGH>;
+ enable-active-high;
+
+ pinctrl-0 = <&cam2_pwr_en>;
+ pinctrl-names = "default";
+
+ vin-supply = <&vreg_vcc3v3_output>;
+ };
+
vreg_eth_1v8: regulator-eth-1v8 {
compatible = "regulator-fixed";
@@ -214,6 +273,23 @@ vreg_usbhub_rest_1v8: regulator-usbhub-rest-1v8 {
regulator-boot-on;
};
+ vreg_vcc3v3_output: regulator-vcc3v3-output {
+ compatible = "regulator-fixed";
+
+ regulator-name = "vcc3v3_output";
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+
+ gpio = <&tlmm 14 GPIO_ACTIVE_HIGH>;
+ enable-active-high;
+
+ pinctrl-0 = <&vcc3v3_output_en>;
+ pinctrl-names = "default";
+
+ regulator-always-on;
+ regulator-boot-on;
+ };
+
vph_pwr: regulator-vph-pwr {
compatible = "regulator-fixed";
@@ -694,6 +770,94 @@ vreg_bob_3p296: bob {
};
};
+&camss {
+ vdda-phy-supply = <&vreg_l10c_0p88>;
+ vdda-pll-supply = <&vreg_l6b_1p2>;
+
+ status = "okay";
+
+ ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ /* CAM1 is routed to CSI1 / CSIPHY1. */
+ port@1 {
+ reg = <1>;
+
+ csiphy1_ep: endpoint {
+ data-lanes = <0 1>;
+ remote-endpoint = <&cam1_imx219_ep>;
+ };
+ };
+
+ /* CAM2 is routed to CSI4 / CSIPHY4. */
+ port@4 {
+ reg = <4>;
+
+ csiphy4_ep: endpoint {
+ data-lanes = <0 1>;
+ remote-endpoint = <&cam2_imx219_ep>;
+ };
+ };
+ };
+};
+
+&cci0 {
+ status = "okay";
+};
+
+&cci0_i2c0 {
+ cam2_imx219: camera@10 {
+ compatible = "sony,imx219";
+ reg = <0x10>;
+
+ clocks = <&cam_osc_24m>;
+
+ VANA-supply = <&vreg_cam2_pwr>;
+ VDIG-supply = <&vreg_l18b_1p8>;
+ VDDL-supply = <&vreg_cam2_pwr>;
+
+ leds = <&cam2_privacy_led>;
+ led-names = "privacy";
+
+ port {
+ cam2_imx219_ep: endpoint {
+ data-lanes = <1 2>;
+ link-frequencies = /bits/ 64 <456000000>;
+ remote-endpoint = <&csiphy4_ep>;
+ };
+ };
+ };
+};
+
+&cci1 {
+ status = "okay";
+};
+
+&cci1_i2c0 {
+ cam1_imx219: camera@10 {
+ compatible = "sony,imx219";
+ reg = <0x10>;
+
+ clocks = <&cam_osc_24m>;
+
+ VANA-supply = <&vreg_cam1_pwr>;
+ VDIG-supply = <&vreg_l18b_1p8>;
+ VDDL-supply = <&vreg_cam1_pwr>;
+
+ leds = <&cam1_privacy_led>;
+ led-names = "privacy";
+
+ port {
+ cam1_imx219_ep: endpoint {
+ data-lanes = <1 2>;
+ link-frequencies = /bits/ 64 <456000000>;
+ remote-endpoint = <&csiphy1_ep>;
+ };
+ };
+ };
+};
+
&gcc {
protected-clocks = <GCC_CFG_NOC_LPASS_CLK>,
<GCC_MSS_CFG_AHB_CLK>,
@@ -1243,6 +1407,14 @@ usb_eth_power: usb-eth-power-state {
bias-disable;
};
+ vcc3v3_output_en: vcc3v3-output-en-state {
+ pins = "gpio14";
+ function = "gpio";
+ drive-strength = <8>;
+ output-high;
+ bias-disable;
+ };
+
wifi_reset_active: wifi-reset-active-state {
pins = "gpio16";
function = "gpio";
@@ -1258,6 +1430,22 @@ bt_reset: bt-reset-state {
bias-disable;
};
+ cam1_privacy_led_state: cam1-privacy-led-state {
+ pins = "gpio18";
+ function = "gpio";
+ drive-strength = <8>;
+ output-low;
+ bias-disable;
+ };
+
+ cam2_privacy_led_state: cam2-privacy-led-state {
+ pins = "gpio19";
+ function = "gpio";
+ drive-strength = <8>;
+ output-low;
+ bias-disable;
+ };
+
lt9611_irq_pin: lt9611-irq-state {
pins = "gpio20";
function = "gpio";
@@ -1358,6 +1546,22 @@ m2_vcc_pin: m2-vcc-state {
input-disable;
};
+ cam1_pwr_en: cam1-pwr-en-state {
+ pins = "gpio57";
+ function = "gpio";
+ drive-strength = <8>;
+ output-low;
+ bias-disable;
+ };
+
+ cam2_pwr_en: cam2-pwr-en-state {
+ pins = "gpio58";
+ function = "gpio";
+ drive-strength = <8>;
+ output-low;
+ bias-disable;
+ };
+
lt9611_vcc_pin: lt9611-vcc-pin-state {
pins = "gpio83";
function = "gpio";
---
base-commit: 8d6dbbbe3ba62de0a63e962ee004afb848c8e3ac
change-id: 20260616-rubikpi-next-20260615-462417aa865a
Best regards,
--
Hongyang Zhao <hongyang.zhao@xxxxxxxxxxxxxxx>