From 0233026961113958b30fc4691166de6af289b334 Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Thu, 22 Dec 2022 14:12:54 +0000 Subject: [PATCH] dtoverlays: Add overlays for the IMX708 image sensor New overlay to support the Sony IMX708 image sensor. This includes a VCM for lens control. Also adds support to the camera mux overlays. Signed-off-by: Dave Stevenson [sw0312.kim: cherry-pick raspberry pi kernel upstream to support rpi camera module v3] Signed-off-by: Seung-Woo Kim Change-Id: I380c4c25ec09e786615dfc13e61fc9fe5ebbbc37 --- arch/arm/boot/dts/overlays/Makefile | 1 + arch/arm/boot/dts/overlays/README | 21 +++++ .../boot/dts/overlays/camera-mux-2port-overlay.dts | 32 +++++++ .../boot/dts/overlays/camera-mux-4port-overlay.dts | 64 +++++++++++++ arch/arm/boot/dts/overlays/imx708-overlay.dts | 104 +++++++++++++++++++++ arch/arm/boot/dts/overlays/imx708.dtsi | 35 +++++++ 6 files changed, 257 insertions(+) create mode 100644 arch/arm/boot/dts/overlays/imx708-overlay.dts create mode 100644 arch/arm/boot/dts/overlays/imx708.dtsi diff --git a/arch/arm/boot/dts/overlays/Makefile b/arch/arm/boot/dts/overlays/Makefile index 8bc3251..9221c97 100644 --- a/arch/arm/boot/dts/overlays/Makefile +++ b/arch/arm/boot/dts/overlays/Makefile @@ -120,6 +120,7 @@ dtbo-$(CONFIG_ARCH_BCM2835) += \ imx462.dtbo \ imx477.dtbo \ imx519.dtbo \ + imx708.dtbo \ iqaudio-codec.dtbo \ iqaudio-dac.dtbo \ iqaudio-dacplus.dtbo \ diff --git a/arch/arm/boot/dts/overlays/README b/arch/arm/boot/dts/overlays/README index 04ba527..cfc61c1 100644 --- a/arch/arm/boot/dts/overlays/README +++ b/arch/arm/boot/dts/overlays/README @@ -710,6 +710,7 @@ Params: cam0-imx219 Select IMX219 for camera on port 0 cam0-imx258 Select IMX258 for camera on port 0 cam0-imx290 Select IMX290 for camera on port 0 cam0-imx477 Select IMX477 for camera on port 0 + cam0-imx708 Select IMX708 for camera on port 0 cam0-ov2311 Select OV2311 for camera on port 0 cam0-ov5647 Select OV5647 for camera on port 0 cam0-ov7251 Select OV7251 for camera on port 0 @@ -719,6 +720,7 @@ Params: cam0-imx219 Select IMX219 for camera on port 0 cam1-imx258 Select IMX258 for camera on port 1 cam1-imx290 Select IMX290 for camera on port 1 cam1-imx477 Select IMX477 for camera on port 1 + cam1-imx708 Select IMX708 for camera on port 1 cam1-ov2311 Select OV2311 for camera on port 1 cam1-ov5647 Select OV5647 for camera on port 1 cam1-ov7251 Select OV7251 for camera on port 1 @@ -735,6 +737,7 @@ Params: cam0-imx219 Select IMX219 for camera on port 0 cam0-imx258 Select IMX258 for camera on port 0 cam0-imx290 Select IMX290 for camera on port 0 cam0-imx477 Select IMX477 for camera on port 0 + cam0-imx708 Select IMX708 for camera on port 0 cam0-ov2311 Select OV2311 for camera on port 0 cam0-ov5647 Select OV5647 for camera on port 0 cam0-ov7251 Select OV7251 for camera on port 0 @@ -744,6 +747,7 @@ Params: cam0-imx219 Select IMX219 for camera on port 0 cam1-imx258 Select IMX258 for camera on port 1 cam1-imx290 Select IMX290 for camera on port 1 cam1-imx477 Select IMX477 for camera on port 1 + cam1-imx708 Select IMX708 for camera on port 1 cam1-ov2311 Select OV2311 for camera on port 1 cam1-ov5647 Select OV5647 for camera on port 1 cam1-ov7251 Select OV7251 for camera on port 1 @@ -753,6 +757,7 @@ Params: cam0-imx219 Select IMX219 for camera on port 0 cam2-imx258 Select IMX258 for camera on port 2 cam2-imx290 Select IMX290 for camera on port 2 cam2-imx477 Select IMX477 for camera on port 2 + cam2-imx708 Select IMX708 for camera on port 2 cam2-ov2311 Select OV2311 for camera on port 2 cam2-ov5647 Select OV5647 for camera on port 2 cam2-ov7251 Select OV7251 for camera on port 2 @@ -762,6 +767,7 @@ Params: cam0-imx219 Select IMX219 for camera on port 0 cam3-imx258 Select IMX258 for camera on port 3 cam3-imx290 Select IMX290 for camera on port 3 cam3-imx477 Select IMX477 for camera on port 3 + cam3-imx708 Select IMX708 for camera on port 3 cam3-ov2311 Select OV2311 for camera on port 3 cam3-ov5647 Select OV5647 for camera on port 3 cam3-ov7251 Select OV7251 for camera on port 3 @@ -2304,6 +2310,21 @@ Params: rotation Mounting rotation of the camera sensor (0 or Compute Module (CSI0, i2c_vc, and cam0_reg). +Name: imx708 +Info: Sony IMX708 camera module. + Uses Unicam 1, which is the standard camera connector on most Pi + variants. +Load: dtoverlay=imx708,= +Params: rotation Mounting rotation of the camera sensor (0 or + 180, default 180) + vcm Select lens driver state. Default is enabled, + but vcm=off will disable. + media-controller Configure use of Media Controller API for + configuring the sensor (default on) + cam0 Adopt the default configuration for CAM0 on a + Compute Module (CSI0, i2c_vc, and cam0_reg). + + Name: iqaudio-codec Info: Configures the IQaudio Codec audio card Load: dtoverlay=iqaudio-codec diff --git a/arch/arm/boot/dts/overlays/camera-mux-2port-overlay.dts b/arch/arm/boot/dts/overlays/camera-mux-2port-overlay.dts index ef24d5a..705c7ee 100644 --- a/arch/arm/boot/dts/overlays/camera-mux-2port-overlay.dts +++ b/arch/arm/boot/dts/overlays/camera-mux-2port-overlay.dts @@ -112,6 +112,16 @@ #undef cam_endpoint #undef cam1_clk + #define cam_node imx708_0 + #define cam_endpoint imx708_0_ep + #define vcm_node imx708_0_vcm + #define cam1_clk clk_24mhz + #include "imx708.dtsi" + #undef cam_node + #undef cam_endpoint + #undef vcm_node + #undef cam1_clk + #define cam_node ov5647_0 #define cam_endpoint ov5647_0_ep #define cam1_clk clk_25mhz @@ -182,6 +192,16 @@ #undef cam_endpoint #undef cam1_clk + #define cam_node imx708_1 + #define cam_endpoint imx708_1_ep + #define vcm_node imx708_1_vcm + #define cam1_clk clk_24mhz + #include "imx708.dtsi" + #undef cam_node + #undef cam_endpoint + #undef vcm_node + #undef cam1_clk + #define cam_node ov5647_1 #define cam_endpoint ov5647_1_ep #define cam1_clk clk_25mhz @@ -353,6 +373,12 @@ <&imx477_0_ep>, "remote-endpoint:0=",<&mux_in0>, <&mux_in0>, "clock-noncontinuous?", <&imx477_0>, "status=okay"; + cam0-imx708 = <&mux_in0>, "remote-endpoint:0=",<&imx708_0_ep>, + <&imx708_0_ep>, "remote-endpoint:0=",<&mux_in0>, + <&mux_in0>, "clock-noncontinuous?", + <&imx708_0>, "status=okay", + <&imx708_0_vcm>, "status=okay", + <&imx708_0>,"lens-focus:0=", <&imx708_0_vcm>; cam0-ov5647 = <&mux_in0>, "remote-endpoint:0=",<&ov5647_0_ep>, <&ov5647_0_ep>, "remote-endpoint:0=",<&mux_in0>, <&ov5647_0>, "status=okay"; @@ -381,6 +407,12 @@ <&imx477_1_ep>, "remote-endpoint:0=",<&mux_in1>, <&mux_in1>, "clock-noncontinuous?", <&imx477_1>, "status=okay"; + cam1-imx708 = <&mux_in1>, "remote-endpoint:0=",<&imx708_1_ep>, + <&imx708_1_ep>, "remote-endpoint:0=",<&mux_in1>, + <&mux_in1>, "clock-noncontinuous?", + <&imx708_1>, "status=okay", + <&imx708_1_vcm>, "status=okay", + <&imx708_1>,"lens-focus:0=", <&imx708_1_vcm>; cam1-ov5647 = <&mux_in1>, "remote-endpoint:0=",<&ov5647_1_ep>, <&ov5647_1_ep>, "remote-endpoint:0=",<&mux_in1>, <&ov5647_1>, "status=okay"; diff --git a/arch/arm/boot/dts/overlays/camera-mux-4port-overlay.dts b/arch/arm/boot/dts/overlays/camera-mux-4port-overlay.dts index e1a9529..222fda6 100644 --- a/arch/arm/boot/dts/overlays/camera-mux-4port-overlay.dts +++ b/arch/arm/boot/dts/overlays/camera-mux-4port-overlay.dts @@ -170,6 +170,16 @@ #undef cam_endpoint #undef cam1_clk + #define cam_node imx708_0 + #define cam_endpoint imx708_0_ep + #define vcm_node imx708_0_vcm + #define cam1_clk clk_24mhz + #include "imx708.dtsi" + #undef cam_node + #undef cam_endpoint + #undef vcm_node + #undef cam1_clk + #define cam_node ov5647_0 #define cam_endpoint ov5647_0_ep #define cam1_clk clk_25mhz @@ -240,6 +250,16 @@ #undef cam_endpoint #undef cam1_clk + #define cam_node imx708_1 + #define cam_endpoint imx708_1_ep + #define vcm_node imx708_1_vcm + #define cam1_clk clk_24mhz + #include "imx708.dtsi" + #undef cam_node + #undef cam_endpoint + #undef vcm_node + #undef cam1_clk + #define cam_node ov5647_1 #define cam_endpoint ov5647_1_ep #define cam1_clk clk_25mhz @@ -310,6 +330,16 @@ #undef cam_endpoint #undef cam1_clk + #define cam_node imx708_2 + #define cam_endpoint imx708_2_ep + #define vcm_node imx708_2_vcm + #define cam1_clk clk_24mhz + #include "imx708.dtsi" + #undef cam_node + #undef cam_endpoint + #undef vcm_node + #undef cam1_clk + #define cam_node ov5647_2 #define cam_endpoint ov5647_2_ep #define cam1_clk clk_25mhz @@ -380,6 +410,16 @@ #undef cam_endpoint #undef cam1_clk + #define cam_node imx708_3 + #define cam_endpoint imx708_3_ep + #define vcm_node imx708_3_vcm + #define cam1_clk clk_24mhz + #include "imx708.dtsi" + #undef cam_node + #undef cam_endpoint + #undef vcm_node + #undef cam1_clk + #define cam_node ov5647_3 #define cam_endpoint ov5647_3_ep #define cam1_clk clk_25mhz @@ -568,6 +608,12 @@ <&imx477_0_ep>, "remote-endpoint:0=",<&mux_in0>, <&mux_in0>, "clock-noncontinuous?", <&imx477_0>, "status=okay"; + cam0-imx708 = <&mux_in0>, "remote-endpoint:0=",<&imx708_0_ep>, + <&imx708_0_ep>, "remote-endpoint:0=",<&mux_in0>, + <&mux_in0>, "clock-noncontinuous?", + <&imx708_0>, "status=okay", + <&imx708_0_vcm>, "status=okay", + <&imx708_0>,"lens-focus:0=", <&imx708_0_vcm>; cam0-ov5647 = <&mux_in0>, "remote-endpoint:0=",<&ov5647_0_ep>, <&ov5647_0_ep>, "remote-endpoint:0=",<&mux_in0>, <&ov5647_0>, "status=okay"; @@ -596,6 +642,12 @@ <&imx477_1_ep>, "remote-endpoint:0=",<&mux_in1>, <&mux_in1>, "clock-noncontinuous?", <&imx477_1>, "status=okay"; + cam1-imx708 = <&mux_in1>, "remote-endpoint:0=",<&imx708_1_ep>, + <&imx708_1_ep>, "remote-endpoint:0=",<&mux_in1>, + <&mux_in1>, "clock-noncontinuous?", + <&imx708_1>, "status=okay", + <&imx708_1_vcm>, "status=okay", + <&imx708_1>,"lens-focus:0=", <&imx708_1_vcm>; cam1-ov5647 = <&mux_in1>, "remote-endpoint:0=",<&ov5647_1_ep>, <&ov5647_1_ep>, "remote-endpoint:0=",<&mux_in1>, <&ov5647_1>, "status=okay"; @@ -624,6 +676,12 @@ <&imx477_2_ep>, "remote-endpoint:0=",<&mux_in2>, <&mux_in2>, "clock-noncontinuous?", <&imx477_2>, "status=okay"; + cam2-imx708 = <&mux_in2>, "remote-endpoint:0=",<&imx708_2_ep>, + <&imx708_2_ep>, "remote-endpoint:0=",<&mux_in2>, + <&mux_in2>, "clock-noncontinuous?", + <&imx708_2>, "status=okay", + <&imx708_2_vcm>, "status=okay", + <&imx708_2>,"lens-focus:0=", <&imx708_2_vcm>; cam2-ov5647 = <&mux_in2>, "remote-endpoint:0=",<&ov5647_2_ep>, <&ov5647_2_ep>, "remote-endpoint:0=",<&mux_in2>, <&ov5647_2>, "status=okay"; @@ -652,6 +710,12 @@ <&imx477_3_ep>, "remote-endpoint:0=",<&mux_in3>, <&mux_in3>, "clock-noncontinuous?", <&imx477_3>, "status=okay"; + cam3-imx708 = <&mux_in3>, "remote-endpoint:0=",<&imx708_3_ep>, + <&imx708_3_ep>, "remote-endpoint:0=",<&mux_in3>, + <&mux_in3>, "clock-noncontinuous?", + <&imx708_3>, "status=okay", + <&imx708_3_vcm>, "status=okay", + <&imx708_3>,"lens-focus:0=", <&imx708_3_vcm>; cam3-ov5647 = <&mux_in3>, "remote-endpoint:0=",<&ov5647_3_ep>, <&ov5647_3_ep>, "remote-endpoint:0=",<&mux_in3>, <&ov5647_3>, "status=okay"; diff --git a/arch/arm/boot/dts/overlays/imx708-overlay.dts b/arch/arm/boot/dts/overlays/imx708-overlay.dts new file mode 100644 index 0000000..9107e985 --- /dev/null +++ b/arch/arm/boot/dts/overlays/imx708-overlay.dts @@ -0,0 +1,104 @@ +// SPDX-License-Identifier: GPL-2.0-only +// Definitions for IMX708 camera module on VC I2C bus +/dts-v1/; +/plugin/; + +#include + +/{ + compatible = "brcm,bcm2835"; + + fragment@0 { + target = <&i2c0if>; + __overlay__ { + status = "okay"; + }; + }; + + clk_frag: fragment@1 { + target = <&cam1_clk>; + __overlay__ { + status = "okay"; + clock-frequency = <24000000>; + }; + }; + + fragment@2 { + target = <&i2c0mux>; + __overlay__ { + status = "okay"; + }; + }; + + reg_frag: fragment@3 { + target = <&cam1_reg>; + cam_reg: __overlay__ { + startup-delay-us = <70000>; + off-on-delay-us = <30000>; + regulator-min-microvolt = <2700000>; + regulator-max-microvolt = <2700000>; + }; + }; + + fragment@4 { + target = <&cam_node>; + __overlay__ { + lens-focus = <&vcm_node>; + }; + }; + + i2c_frag: fragment@100 { + target = <&i2c_csi_dsi>; + __overlay__ { + #address-cells = <1>; + #size-cells = <0>; + status = "okay"; + + #include "imx708.dtsi" + }; + }; + + csi_frag: fragment@101 { + target = <&csi1>; + csi: __overlay__ { + status = "okay"; + brcm,media-controller; + + port { + csi_ep: endpoint { + remote-endpoint = <&cam_endpoint>; + clock-lanes = <0>; + data-lanes = <1 2>; + clock-noncontinuous; + }; + }; + }; + }; + + __overrides__ { + rotation = <&cam_node>,"rotation:0"; + orientation = <&cam_node>,"orientation:0"; + media-controller = <&csi>,"brcm,media-controller?"; + cam0 = <&i2c_frag>, "target:0=",<&i2c_vc>, + <&csi_frag>, "target:0=",<&csi0>, + <&clk_frag>, "target:0=",<&cam0_clk>, + <®_frag>, "target:0=",<&cam0_reg>, + <&cam_node>, "clocks:0=",<&cam0_clk>, + <&cam_node>, "VANA1-supply:0=",<&cam0_reg>, + <&vcm_node>, "VDD-supply:0=",<&cam0_reg>; + vcm = <&vcm_node>, "status", + <0>, "=4"; + }; +}; + +&cam_node { + status = "okay"; +}; + +&cam_endpoint { + remote-endpoint = <&csi_ep>; +}; + +&vcm_node { + status = "okay"; +}; diff --git a/arch/arm/boot/dts/overlays/imx708.dtsi b/arch/arm/boot/dts/overlays/imx708.dtsi new file mode 100644 index 0000000..1381caf --- /dev/null +++ b/arch/arm/boot/dts/overlays/imx708.dtsi @@ -0,0 +1,35 @@ +// Fragment that configures a Sony IMX708 + +cam_node: imx708@1a { + compatible = "sony,imx708"; + reg = <0x1a>; + status = "disabled"; + + clocks = <&cam1_clk>; + clock-names = "xclk"; + + VANA1-supply = <&cam1_reg>; /* 2.8v */ + VANA2-supply = <&cam_dummy_reg>;/* 1.8v */ + VDIG-supply = <&cam_dummy_reg>; /* 1.1v */ + VDDL-supply = <&cam_dummy_reg>; /* 1.8v */ + + rotation = <180>; + orientation = <2>; + + port { + cam_endpoint: endpoint { + clock-lanes = <0>; + data-lanes = <1 2>; + clock-noncontinuous; + link-frequencies = + /bits/ 64 <450000000>; + }; + }; +}; + +vcm_node: dw9817@c { + compatible = "dongwoon,dw9817-vcm"; + reg = <0x0c>; + status = "disabled"; + VDD-supply = <&cam1_reg>; +}; -- 2.7.4