overlay: t23x: enable IMX390 WDR mode

Enable WDR(wide dynamic range) mode for IMX390.
1 Add WDR mode table to IMX390 overlay.
2 Support only link A in desrializer
  (only one sensor is supported for now).

Add tegra234-p3737-camera-imx390-addr-0x21-overlay.dtbo
for IMX390 sensor with i2c address 0x21.

Bug 4505240

Change-Id: I6ccff56d0943674bc2f0142c8829fb4c812569a1
Signed-off-by: Ankur Pawar <ankurp@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/device/hardware/nvidia/t23x-public-dts/+/3105263
(cherry picked from commit 92a36dcc76)
Reviewed-on: https://git-master.nvidia.com/r/c/device/hardware/nvidia/t23x-public-dts/+/3180606
Reviewed-by: Praveen AC <pac@nvidia.com>
GVS: buildbot_gerritrpt <buildbot_gerritrpt@nvidia.com>
Reviewed-by: Bitan Biswas <bbiswas@nvidia.com>
This commit is contained in:
Ankur Pawar
2024-03-27 10:48:46 +00:00
committed by mobile promotions
parent 8ab20e086b
commit 899583ad98
5 changed files with 316 additions and 412 deletions

View File

@@ -56,6 +56,7 @@ dtbo-y += tegra234-p3767-camera-p3768-imx477-dual-4lane.dtbo
dtbo-y += tegra234-p3767-camera-p3768-imx477-imx219.dtbo dtbo-y += tegra234-p3767-camera-p3768-imx477-imx219.dtbo
dtbo-y += tegra234-p3737-camera-eCAM130A-overlay.dtbo dtbo-y += tegra234-p3737-camera-eCAM130A-overlay.dtbo
dtbo-y += tegra234-p3737-camera-dual-hawk-ar0234-e3653-overlay.dtbo dtbo-y += tegra234-p3737-camera-dual-hawk-ar0234-e3653-overlay.dtbo
dtbo-y += tegra234-p3737-camera-imx390-addr-0x21-overlay.dtbo
dtbo-y += tegra234-p3737-camera-imx390-overlay.dtbo dtbo-y += tegra234-p3737-camera-imx390-overlay.dtbo
dtbo-y += tegra234-p3767-camera-p3768-imx219-C.dtbo dtbo-y += tegra234-p3767-camera-p3768-imx219-C.dtbo
dtbo-y += tegra234-p3767-camera-p3768-imx219-A.dtbo dtbo-y += tegra234-p3767-camera-p3768-imx219-A.dtbo

View File

@@ -1,31 +1,21 @@
// SPDX-License-Identifier: GPL-2.0-only // SPDX-License-Identifier: GPL-2.0-only
// SPDX-FileCopyrightText: Copyright (c) 2018-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved. // SPDX-FileCopyrightText: Copyright (c) 2016-2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
/ { / {
fragment-camera@0 { fragment-camera@0 {
target-path = "/"; target-path = "/";
__overlay__ { __overlay__ {
tegra-capture-vi { tegra-capture-vi {
num-channels = <2>; num-channels = <1>;
ports { ports {
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
port@0 { port@0 {
reg = <0>; reg = <0>;
imx390_vi_in0: endpoint { liimx390_vi_in0: endpoint {
vc-id = <0>;
port-index = <0>; port-index = <0>;
bus-width = <2>; bus-width = <4>;
remote-endpoint = <&imx390_csi_out0>; remote-endpoint = <&liimx390_csi_out0>;
};
};
port@1 {
reg = <1>;
imx390_vi_in1: endpoint {
vc-id = <1>;
port-index = <0>;
bus-width = <2>;
remote-endpoint = <&imx390_csi_out1>;
}; };
}; };
}; };
@@ -34,7 +24,7 @@
bus@0{ bus@0{
host1x@13e00000 { host1x@13e00000 {
nvcsi@15a00000 { nvcsi@15a00000 {
num-channels = <2>; num-channels = <1>;
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
channel@0 { channel@0 {
@@ -44,86 +34,74 @@
#size-cells = <0>; #size-cells = <0>;
port@0 { port@0 {
reg = <0>; reg = <0>;
imx390_csi_in0: endpoint@0 { liimx390_csi_in0: endpoint@0 {
port-index = <0>; port-index = <0>;
bus-width = <2>; bus-width = <4>;
remote-endpoint = <&imx390_imx390_out0>; remote-endpoint = <&liimx390_imx390_out0>;
}; };
}; };
port@1 { port@1 {
reg = <1>; reg = <1>;
imx390_csi_out0: endpoint@1 { liimx390_csi_out0: endpoint@1 {
remote-endpoint = <&imx390_vi_in0>; remote-endpoint = <&liimx390_vi_in0>;
};
};
};
};
channel@1 {
reg = <1>;
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
imx390_csi_in1: endpoint@2 {
port-index = <0>;
bus-width = <2>;
remote-endpoint = <&imx390_imx390_out1>;
};
};
port@1 {
reg = <1>;
imx390_csi_out1: endpoint@3 {
remote-endpoint = <&imx390_vi_in1>;
}; };
}; };
}; };
}; };
}; };
}; };
i2c@3180000 { i2c@3180000 {
tca9546@70 { tca9546@70 {
i2c@0 { i2c@0 {
imx390_a@1b { imx390_a@21 {
compatible = "sony,imx390"; compatible = "sony,imx390";
reg = <0x1b>; reg = <0x21>;
devnode = "video0";
/* Physical dimensions of sensor */ /* Physical dimensions of sensor */
physical_w = "15.0"; physical_w = "15.0";
physical_h = "12.5"; physical_h = "12.5";
sensor_model ="imx390"; sensor_model ="imx390";
/* Define any required hw resources needed by driver */
/* ie. clocks, io pins, power sources */
/* Defines number of frames to be dropped by driver internally after applying */ /* Defines number of frames to be dropped by driver internally after applying */
/* sensor crop settings. Some sensors send corrupt frames after applying */ /* sensor crop settings. Some sensors send corrupt frames after applying */
/* crop co-ordinates */ /* crop co-ordinates */
post_crop_frame_drop = "0"; post_crop_frame_drop = "0";
/* Convert Gain to unit of dB (decibel) befor passing to kernel driver */ /* Convert Gain to unit of dB (decibel) befor passing to kernel driver */
use_decibel_gain = "true";
/* if true, delay gain setting by one frame to be in sync with exposure */
/* enable CID_SENSOR_MODE_ID for sensor modes selection */ /* enable CID_SENSOR_MODE_ID for sensor modes selection */
use_sensor_mode_id = "true"; use_sensor_mode_id = "true";
/* WAR to prevent banding by reducing analog gain. Bug 2229902 */
/** /**
* ==== Modes ====
* A modeX node is required to support v4l2 driver * A modeX node is required to support v4l2 driver
* implementation with NVIDIA camera software stack * implementation with NVIDIA camera software stack
* *
* mclk_khz = ""; * == Signal properties ==
* Standard MIPI driving clock, typically 24MHz
* *
* num_lanes = ""; * phy_mode = "";
* Number of lane channels sensor is programmed to output * PHY mode used by the MIPI lanes for this device
* *
* tegra_sinterface = ""; * tegra_sinterface = "";
* The base tegra serial interface lanes are connected to * CSI Serial interface connected to tegra
* Incase of virtual HW devices, use virtual
* For SW emulated devices, use host
* *
* vc_id = ""; * pix_clk_hz = "";
* The virtual channel id of the sensor. * Sensor pixel clock used for calculations like exposure and framerate
* *
* discontinuous_clk = ""; * readout_orientation = "0";
* The sensor is programmed to use a discontinuous clock on MIPI lanes * Based on camera module orientation.
* Only change readout_orientation if you specifically
* Program a different readout order for this mode
* *
* dpcm_enable = "true"; * == Image format Properties ==
* The sensor is programmed to use a DPCM modes
*
* cil_settletime = "";
* MIPI lane settle time value.
* A "0" value attempts to autocalibrate based on mclk_khz and pix_clk_hz
* *
* active_w = ""; * active_w = "";
* Pixel active region width * Pixel active region width
@@ -131,61 +109,117 @@
* active_h = ""; * active_h = "";
* Pixel active region height * Pixel active region height
* *
* dynamic_pixel_bit_depth = ""; * pixel_t = "";
* sensor dynamic bit depth for sensor mode * The sensor readout pixel pattern
*
* csi_pixel_bit_depth = "";
* sensor output bit depth for sensor mode
*
* mode_type="";
* Sensor mode type, For eg: yuv, Rgb, bayer, bayer_wdr_pwl
*
* pixel_phase="";
* Pixel phase for sensor mode, For eg: rggb, vyuy, rgb888
*
* readout_orientation = "0";
* Based on camera module orientation.
* Only change readout_orientation if you specifically
* Program a different readout order for this mode
* *
* line_length = ""; * line_length = "";
* Pixel line length (width) for sensor mode. * Pixel line length (width) for sensor mode.
* This is used to calibrate features in our camera stack.
* *
* pix_clk_hz = ""; * == Source Control Settings ==
* Sensor pixel clock used for calculations like exposure and framerate
* *
* Gain factor used to convert fixed point integer to float
* Gain range [min_gain/gain_factor, max_gain/gain_factor]
* Gain step [step_gain/gain_factor is the smallest step that can be configured]
* Default gain [Default gain to be initialized for the control.
* use min_gain_val as default for optimal results]
* Framerate factor used to convert fixed point integer to float
* Framerate range [min_framerate/framerate_factor, max_framerate/framerate_factor]
* Framerate step [step_framerate/framerate_factor is the smallest step that can be configured]
* Default Framerate [Default framerate to be initialized for the control.
* use max_framerate to get required performance]
* Exposure factor used to convert fixed point integer to float
* For convenience use 1 sec = 1000000us as conversion factor
* Exposure range [min_exp_time/exposure_factor, max_exp_time/exposure_factor]
* Exposure step [step_exp_time/exposure_factor is the smallest step that can be configured]
* Default Exposure Time [Default exposure to be initialized for the control.
* Set default exposure based on the default_framerate for optimal exposure settings]
* *
* * gain_factor = ""; (integer factor used for floating to fixed point conversion)
* * min_gain_val = ""; (ceil to integer)
* inherent_gain = ""; * max_gain_val = ""; (ceil to integer)
* Gain obtained inherently from mode (ie. pixel binning) * step_gain_val = ""; (ceil to integer)
* * default_gain = ""; (ceil to integer)
* min_gain_val = ""; (floor to 6 decimal places)
* max_gain_val = ""; (floor to 6 decimal places)
* Gain limits for mode * Gain limits for mode
* if use_decibel_gain = "true", please set the gain as decibel
* *
* exposure_factor = ""; (integer factor used for floating to fixed point conversion)
* min_exp_time = ""; (ceil to integer) * min_exp_time = ""; (ceil to integer)
* max_exp_time = ""; (ceil to integer) * max_exp_time = ""; (ceil to integer)
* Exposure Time limits for mode (us) * step_exp_time = ""; (ceil to integer)
* default_exp_time = ""; (ceil to integer)
* Exposure Time limits for mode (sec)
* *
* * framerate_factor = ""; (integer factor used for floating to fixed point conversion)
* min_hdr_ratio = ""; * min_framerate = ""; (ceil to integer)
* max_hdr_ratio = ""; * max_framerate = ""; (ceil to integer)
* HDR Ratio limits for mode * step_framerate = ""; (ceil to integer)
* * default_framerate = ""; (ceil to integer)
* min_framerate = "";
* max_framerate = "";
* Framerate limits for mode (fps) * Framerate limits for mode (fps)
* *
* embedded_metadata_height = ""; * embedded_metadata_height = "";
* Sensor embedded metadata height in units of rows. * Sensor embedded metadata height in units of rows.
* If sensor does not support embedded metadata value should be 0. * If sensor does not support embedded metadata value should be 0.
*/ */
mode0 {/*mode IMX390_MODE_1920X1080_CROP_30FPS*/ mode0 {/*mode IMX390_MODE_1936X1096_CROP_30FPS*/
mclk_khz = "24000"; mclk_khz = "24000";
num_lanes = "2"; num_lanes = "4";
tegra_sinterface = "serial_a";
discontinuous_clk = "no";
dpcm_enable = "false";
cil_settletime = "0";
dynamic_pixel_bit_depth = "20";
csi_pixel_bit_depth = "12";
mode_type = "bayer_wdr_pwl";
pixel_phase = "rggb";
active_w = "1936";
active_h = "1096";
readout_orientation = "0";
line_length = "4400";
inherent_gain = "1";
mclk_multiplier = "14.58";
pix_clk_hz = "148500000";
serdes_pix_clk_hz = "500000000";
gain_factor = "10";
min_gain_val = "84"; /* dB */
max_gain_val = "240"; /* dB */
step_gain_val = "1"; /* 0.1 */
default_gain = "84";
framerate_factor = "1000000";
min_framerate = "30000000";
max_framerate = "30000000";
step_framerate = "1";
default_framerate = "30000000";
exposure_factor = "1000000";
min_exp_time = "2000"; /*us, 2 lines*/
max_exp_time = "33000";
step_exp_time = "1";
default_exp_time = "11000";/* us */
embedded_metadata_height = "0";
min_hdr_ratio = "64.0";
max_hdr_ratio = "64.0";
num_control_point = "9";
control_point_x_0 = "0";
control_point_y_0 = "0";
control_point_x_1="479";
control_point_y_1="479";
control_point_x_2="1438";
control_point_y_2="837";
control_point_x_3="4315";
control_point_y_3="1238";
control_point_x_4="12945";
control_point_y_4="1688";
control_point_x_5="38836";
control_point_y_5="2191";
control_point_x_6="116508";
control_point_y_6="2755";
control_point_x_7="349525";
control_point_y_7="3387";
control_point_x_8="1048575";
control_point_y_8="4095";
};
mode1 {/*mode IMX390_MODE_1920X1080_CROP_30FPS*/
mclk_khz = "24000";
num_lanes = "4";
tegra_sinterface = "serial_a"; tegra_sinterface = "serial_a";
vc_id = "0"; vc_id = "0";
discontinuous_clk = "no"; discontinuous_clk = "no";
@@ -195,6 +229,7 @@
csi_pixel_bit_depth = "12"; csi_pixel_bit_depth = "12";
mode_type = "bayer"; mode_type = "bayer";
pixel_phase = "rggb"; pixel_phase = "rggb";
active_w = "1920"; active_w = "1920";
active_h = "1080"; active_h = "1080";
readout_orientation = "0"; readout_orientation = "0";
@@ -202,6 +237,7 @@
inherent_gain = "1"; inherent_gain = "1";
pix_clk_hz = "74250000"; pix_clk_hz = "74250000";
serdes_pix_clk_hz = "200000000"; serdes_pix_clk_hz = "200000000";
gain_factor = "10"; gain_factor = "10";
min_gain_val = "0"; /* dB */ min_gain_val = "0"; /* dB */
max_gain_val = "300"; /* dB */ max_gain_val = "300"; /* dB */
@@ -221,190 +257,19 @@
default_exp_time = "33333";/* us */ default_exp_time = "33333";/* us */
embedded_metadata_height = "0"; embedded_metadata_height = "0";
}; };
ports { ports {
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
port@0 { port@0 {
reg = <0>; reg = <0>;
imx390_imx390_out0: endpoint { liimx390_imx390_out0: endpoint {
vc-id = <0>;
port-index = <0>; port-index = <0>;
bus-width = <2>; bus-width = <4>;
remote-endpoint = <&imx390_csi_in0>; remote-endpoint = <&liimx390_csi_in0>;
}; };
}; };
}; };
gmsl-link {
src-csi-port = "b";
dst-csi-port = "a";
serdes-csi-link = "a";
csi-mode = "1x4";
st-vc = <0>;
vc-id = <0>;
num-lanes = <2>;
streams = "ued-u1", "raw12";
};
};
imx390_b@1c {
compatible = "sony,imx390";
reg = <0x1c>;
/* Physical dimensions of sensor */
physical_w = "15.0";
physical_h = "12.5";
sensor_model ="imx390";
/* Defines number of frames to be dropped by driver internally after applying */
/* sensor crop settings. Some sensors send corrupt frames after applying */
/* crop co-ordinates */
post_crop_frame_drop = "0";
/* Convert Gain to unit of dB (decibel) befor passing to kernel driver */
use_decibel_gain = "true";
/* enable CID_SENSOR_MODE_ID for sensor modes selection */
use_sensor_mode_id = "true";
/**
* A modeX node is required to support v4l2 driver
* implementation with NVIDIA camera software stack
*
* mclk_khz = "";
* Standard MIPI driving clock, typically 24MHz
*
* num_lanes = "";
* Number of lane channels sensor is programmed to output
*
* tegra_sinterface = "";
* The base tegra serial interface lanes are connected to
*
* vc_id = "";
* The virtual channel id of the sensor.
*
* discontinuous_clk = "";
* The sensor is programmed to use a discontinuous clock on MIPI lanes
*
* dpcm_enable = "true";
* The sensor is programmed to use a DPCM modes
*
* cil_settletime = "";
* MIPI lane settle time value.
* A "0" value attempts to autocalibrate based on mclk_khz and pix_clk_hz
*
* active_w = "";
* Pixel active region width
*
* active_h = "";
* Pixel active region height
*
* dynamic_pixel_bit_depth = "";
* sensor dynamic bit depth for sensor mode
*
* csi_pixel_bit_depth = "";
* sensor output bit depth for sensor mode
*
* mode_type="";
* Sensor mode type, For eg: yuv, Rgb, bayer, bayer_wdr_pwl
*
* pixel_phase="";
* Pixel phase for sensor mode, For eg: rggb, vyuy, rgb888
*
* readout_orientation = "0";
* Based on camera module orientation.
* Only change readout_orientation if you specifically
* Program a different readout order for this mode
*
* line_length = "";
* Pixel line length (width) for sensor mode.
* This is used to calibrate features in our camera stack.
*
* pix_clk_hz = "";
* Sensor pixel clock used for calculations like exposure and framerate
*
*
*
*
* inherent_gain = "";
* Gain obtained inherently from mode (ie. pixel binning)
*
* min_gain_val = ""; (floor to 6 decimal places)
* max_gain_val = ""; (floor to 6 decimal places)
* Gain limits for mode
* if use_decibel_gain = "true", please set the gain as decibel
*
* min_exp_time = ""; (ceil to integer)
* max_exp_time = ""; (ceil to integer)
* Exposure Time limits for mode (us)
*
*
* min_hdr_ratio = "";
* max_hdr_ratio = "";
* HDR Ratio limits for mode
*
* min_framerate = "";
* max_framerate = "";
* Framerate limits for mode (fps)
*
* embedded_metadata_height = "";
* Sensor embedded metadata height in units of rows.
* If sensor does not support embedded metadata value should be 0.
*/
mode0 {/*mode IMX390_MODE_1920X1080_CROP_30FPS*/
mclk_khz = "24000";
num_lanes = "2";
tegra_sinterface = "serial_a";
vc_id = "1";
discontinuous_clk = "no";
dpcm_enable = "false";
cil_settletime = "0";
dynamic_pixel_bit_depth = "12";
csi_pixel_bit_depth = "12";
mode_type = "bayer";
pixel_phase = "rggb";
active_w = "1920";
active_h = "1080";
readout_orientation = "0";
line_length = "2200";
inherent_gain = "1";
pix_clk_hz = "74250000";
serdes_pix_clk_hz = "200000000";
gain_factor = "10";
min_gain_val = "0"; /* dB */
max_gain_val = "300"; /* dB */
step_gain_val = "3"; /* 0.3 */
default_gain = "0";
min_hdr_ratio = "1";
max_hdr_ratio = "1";
framerate_factor = "1000000";
min_framerate = "30000000";
max_framerate = "30000000";
step_framerate = "1";
default_framerate = "30000000";
exposure_factor = "1000000";
min_exp_time = "59"; /*us, 2 lines*/
max_exp_time = "33333";
step_exp_time = "1";
default_exp_time = "33333";/* us */
embedded_metadata_height = "0";
};
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
imx390_imx390_out1: endpoint {
vc-id = <1>;
port-index = <0>;
bus-width = <2>;
remote-endpoint = <&imx390_csi_in1>;
};
};
};
gmsl-link {
src-csi-port = "b";
dst-csi-port = "a";
serdes-csi-link = "b";
csi-mode = "1x4";
st-vc = <0>;
vc-id = <1>;
num-lanes = <2>;
streams = "ued-u1", "raw12";
};
}; };
}; };
}; };
@@ -413,7 +278,6 @@
tegra-camera-platform { tegra-camera-platform {
compatible = "nvidia, tegra-camera-platform"; compatible = "nvidia, tegra-camera-platform";
/** /**
* The general guideline for naming badge_info contains 3 parts, and is as follows, * The general guideline for naming badge_info contains 3 parts, and is as follows,
* The first part is the camera_board_id for the module; if the module is in a FFD * The first part is the camera_board_id for the module; if the module is in a FFD
@@ -424,25 +288,14 @@
*/ */
modules { modules {
module0 { module0 {
badge = "imx390_rear"; badge = "imx390_bottomleft_liimx390";
position = "rear"; position = "bottomleft";
orientation = "1"; orientation = "0";
drivernode0 { drivernode0 {
/* Declare PCL support driver (classically known as guid) */ /* Declare PCL support driver (classically known as guid) */
pcl_id = "v4l2_sensor"; pcl_id = "v4l2_sensor";
/* Declare the device-tree hierarchy to driver instance */ /* Declare the device-tree hierarchy to driver instance */
sysfs-device-tree = "/sys/firmware/devicetree/base/bus@0/i2c@3180000/tca9546@70/i2c@0/imx390_a@1b"; sysfs-device-tree = "/sys/firmware/devicetree/base/bus@0/i2c@3180000/tca9546@70/i2c@0/imx390_a@21";
};
};
module1 {
badge = "imx390_front";
position = "front";
orientation = "1";
drivernode0 {
/* Declare PCL support driver (classically known as guid) */
pcl_id = "v4l2_sensor";
/* Declare the device-tree hierarchy to driver instance */
sysfs-device-tree = "/sys/firmware/devicetree/base/bus@0/i2c@3180000/tca9546@70/i2c@0/imx390_b@1c";
}; };
}; };
}; };

View File

@@ -0,0 +1,135 @@
// SPDX-License-Identifier: GPL-2.0-only
// SPDX-FileCopyrightText: Copyright (c) 2018-2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
/dts-v1/;
/plugin/;
#include <dt-bindings/clock/tegra234-clock.h>
#include <dt-bindings/gpio/tegra234-gpio.h>
#include <dt-bindings/tegra234-p3737-0000+p3701-0000.h>
#define CAM0_RST_L TEGRA234_MAIN_GPIO(H, 3)
/* camera control gpio definitions */
/ {
overlay-name = "Jetson Camera IMX390 sensor 0x21";
jetson-header-name = "Jetson AGX CSI Connector";
compatible = JETSON_COMPATIBLE;
fragment@0 {
target-path = "/";
__overlay__ {
tegra-capture-vi {
num-channels = <1>;
ports {
status = "okay";
port@0 {
status = "okay";
liimx390_vi_in0: endpoint {
status = "okay";
port-index = <0>;
bus-width = <4>;
remote-endpoint = <&liimx390_csi_out0>;
};
};
};
};
tegra-camera-platform {
modules {
status = "okay";
module0 {
badge = "imx390_rear";
position = "rear";
orientation = "1";
status = "okay";
drivernode0 {
status = "okay";
/* Declare PCL support driver (classically known as guid) */
pcl_id = "v4l2_sensor";
/* Declare the device-tree hierarchy to driver instance */
sysfs-device-tree = "/sys/firmware/devicetree/base/bus@0/i2c@3180000/tca9546@70/i2c@0/imx390_a@21";
};
};
};
};
bus@0{
host1x@13e00000 {
nvcsi@15a00000 {
num-channels = <1>;
channel@0 {
status = "okay";
ports {
status = "okay";
port@0 {
status = "okay";
liimx390_csi_in0: endpoint@0 {
status = "okay";
port-index = <0>;
bus-width = <4>;
remote-endpoint = <&liimx390_imx390_out0>;
};
};
port@1 {
status = "okay";
liimx390_csi_out0: endpoint@1 {
status = "okay";
remote-endpoint = <&liimx390_vi_in0>;
};
};
};
};
};
};
i2c@3180000 {
tca9546@70 {
status = "okay";
compatible = "nxp,pca9546";
reg = <0x70>;
#address-cells = <1>;
#size-cells = <0>;
skip_mux_detect = "yes";
i2c@0 {
reg = <0>;
i2c-mux,deselect-on-exit;
#address-cells = <1>;
#size-cells = <0>;
status = "okay";
dser: max929x_a@64 {
compatible = "Maxim,max929x";
reg = <0x64>;
pwdn-gpios = <&gpio CAM0_RST_L GPIO_ACTIVE_HIGH>;
status = "okay";
};
imx390_a@21 {
/* Define any required hw resources needed by driver */
/* ie. clocks, io pins, power sources */
clocks = <&bpmp TEGRA234_CLK_EXTPERIPH1>,
<&bpmp TEGRA234_CLK_EXTPERIPH1>;
clock-names = "extperiph1", "pllp_grtba";
mclk = "extperiph1";
channel = "a";
status = "okay";
reg = <0x21>;
nvidia,gmsl-dser-device = <&dser>;
ports {
status = "okay";
port@0 {
status = "okay";
liimx390_imx390_out0: endpoint {
status = "okay";
port-index = <0>;
bus-width = <4>;
remote-endpoint = <&liimx390_csi_in0>;
};
};
};
};
};
};
};
};
};
};
};

View File

@@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only // SPDX-License-Identifier: GPL-2.0-only
// SPDX-FileCopyrightText: Copyright (c) 2018-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved. // SPDX-FileCopyrightText: Copyright (c) 2018-2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
/dts-v1/; /dts-v1/;
/plugin/; /plugin/;
@@ -21,27 +21,16 @@
__overlay__ { __overlay__ {
tegra-capture-vi { tegra-capture-vi {
num-channels = <2>; num-channels = <1>;
ports { ports {
status = "okay"; status = "okay";
port@0 { port@0 {
status = "okay"; status = "okay";
imx390_vi_in0: endpoint { liimx390_vi_in0: endpoint {
status = "okay"; status = "okay";
vc-id = <0>;
port-index = <0>; port-index = <0>;
bus-width = <2>; bus-width = <4>;
remote-endpoint = <&imx390_csi_out0>; remote-endpoint = <&liimx390_csi_out0>;
};
};
port@1 {
status = "okay";
imx390_vi_in1: endpoint {
status = "okay";
vc-id = <1>;
port-index = <0>;
bus-width = <2>;
remote-endpoint = <&imx390_csi_out1>;
}; };
}; };
}; };
@@ -59,20 +48,7 @@
/* Declare PCL support driver (classically known as guid) */ /* Declare PCL support driver (classically known as guid) */
pcl_id = "v4l2_sensor"; pcl_id = "v4l2_sensor";
/* Declare the device-tree hierarchy to driver instance */ /* Declare the device-tree hierarchy to driver instance */
sysfs-device-tree = "/sys/firmware/devicetree/base/bus@0/i2c@3180000/tca9546@70/i2c@0/imx390_a@1b"; sysfs-device-tree = "/sys/firmware/devicetree/base/bus@0/i2c@3180000/tca9546@70/i2c@0/imx390_a@21";
};
};
module1 {
status = "okay";
badge = "imx390_front";
position = "front";
orientation = "1";
drivernode0 {
status = "okay";
/* Declare PCL support driver (classically known as guid) */
pcl_id = "v4l2_sensor";
/* Declare the device-tree hierarchy to driver instance */
sysfs-device-tree = "/sys/firmware/devicetree/base/bus@0/i2c@3180000/tca9546@70/i2c@0/imx390_b@1c";
}; };
}; };
}; };
@@ -80,53 +56,32 @@
bus@0{ bus@0{
host1x@13e00000 { host1x@13e00000 {
nvcsi@15a00000 { nvcsi@15a00000 {
num-channels = <2>; num-channels = <1>;
channel@0 { channel@0 {
status = "okay"; status = "okay";
ports { ports {
status = "okay"; status = "okay";
port@0 { port@0 {
status = "okay"; status = "okay";
imx390_csi_in0: endpoint@0 { liimx390_csi_in0: endpoint@0 {
status = "okay"; status = "okay";
port-index = <0>; port-index = <0>;
bus-width = <2>; bus-width = <4>;
remote-endpoint = <&imx390_imx390_out0>; remote-endpoint = <&liimx390_imx390_out0>;
}; };
}; };
port@1 { port@1 {
status = "okay"; status = "okay";
imx390_csi_out0: endpoint@1 { liimx390_csi_out0: endpoint@1 {
status = "okay"; status = "okay";
remote-endpoint = <&imx390_vi_in0>; remote-endpoint = <&liimx390_vi_in0>;
};
};
};
};
channel@1 {
status = "okay";
ports {
status = "okay";
port@0 {
status = "okay";
imx390_csi_in1: endpoint@2 {
status = "okay";
port-index = <0>;
bus-width = <2>;
remote-endpoint = <&imx390_imx390_out1>;
};
};
port@1 {
status = "okay";
imx390_csi_out1: endpoint@3 {
status = "okay";
remote-endpoint = <&imx390_vi_in1>;
}; };
}; };
}; };
}; };
}; };
}; };
i2c@3180000 { i2c@3180000 {
tca9546@70 { tca9546@70 {
status = "okay"; status = "okay";
@@ -141,78 +96,32 @@
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
status = "okay"; status = "okay";
dser: max9296@48 { dser: max929x_a@64 {
compatible = "Maxim,max929x";
reg = <0x64>;
pwdn-gpios = <&gpio CAM0_RST_L GPIO_ACTIVE_HIGH>;
status = "okay"; status = "okay";
compatible = "maxim,max9296";
reg = <0x48>;
csi-mode = "2x4";
max-src = <2>;
reset-gpios = <&gpio CAM0_RST_L GPIO_ACTIVE_HIGH>;
}; };
ser_prim: max9295_prim@62 { imx390_a@21 {
status = "okay";
compatible = "maxim,max9295";
reg = <0x62>;
is-prim-ser;
};
ser_a: max9295_a@40 {
status = "okay";
compatible = "maxim,max9295";
reg = <0x40>;
nvidia,gmsl-dser-device = <&dser>;
};
ser_b: max9295_b@60 {
status = "okay";
compatible = "maxim,max9295";
reg = <0x60>;
nvidia,gmsl-dser-device = <&dser>;
};
imx390_a@1b {
status = "okay";
def-addr = <0x1a>;
/* Define any required hw resources needed by driver */ /* Define any required hw resources needed by driver */
/* ie. clocks, io pins, power sources */ /* ie. clocks, io pins, power sources */
clocks = <&bpmp TEGRA234_CLK_EXTPERIPH1>, clocks = <&bpmp TEGRA234_CLK_EXTPERIPH1>,
<&bpmp TEGRA234_CLK_EXTPERIPH1>; <&bpmp TEGRA234_CLK_EXTPERIPH1>;
clock-names = "extperiph1", "pllp_grtba"; clock-names = "extperiph1", "pllp_grtba";
mclk = "extperiph1"; mclk = "extperiph1";
nvidia,gmsl-ser-device = <&ser_a>; channel = "a";
status = "okay";
reg = <0x1a>;
nvidia,gmsl-dser-device = <&dser>; nvidia,gmsl-dser-device = <&dser>;
ports { ports {
status = "okay"; status = "okay";
port@0 { port@0 {
status = "okay"; status = "okay";
imx390_imx390_out0: endpoint { liimx390_imx390_out0: endpoint {
status = "okay"; status = "okay";
vc-id = <0>;
port-index = <0>; port-index = <0>;
bus-width = <2>; bus-width = <4>;
remote-endpoint = <&imx390_csi_in0>; remote-endpoint = <&liimx390_csi_in0>;
};
};
};
};
imx390_b@1c {
status = "okay";
def-addr = <0x1a>;
/* Define any required hw resources needed by driver */
/* ie. clocks, io pins, power sources */
clocks = <&bpmp TEGRA234_CLK_EXTPERIPH1>,
<&bpmp TEGRA234_CLK_EXTPERIPH1>;
clock-names = "extperiph1", "pllp_grtba";
mclk = "extperiph1";
nvidia,gmsl-ser-device = <&ser_b>;
nvidia,gmsl-dser-device = <&dser>;
ports {
status = "okay";
port@0 {
status = "okay";
imx390_imx390_out1: endpoint {
status = "okay";
vc-id = <1>;
port-index = <0>;
bus-width = <2>;
remote-endpoint = <&imx390_csi_in1>;
}; };
}; };
}; };

View File

@@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only // SPDX-License-Identifier: GPL-2.0-only
// SPDX-FileCopyrightText: Copyright (c) 2022-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved. // SPDX-FileCopyrightText: Copyright (c) 2022-2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
#include "tegra234-camera-e3331-a00.dtsi" #include "tegra234-camera-e3331-a00.dtsi"
#include "tegra234-camera-e3333-a00.dtsi" #include "tegra234-camera-e3333-a00.dtsi"
@@ -355,12 +355,18 @@
max9295_b@60 { max9295_b@60 {
status = "disabled"; status = "disabled";
}; };
max929x_a@64 {
status = "disabled";
};
imx390_a@1b { imx390_a@1b {
status = "disabled"; status = "disabled";
}; };
imx390_b@1c { imx390_b@1c {
status = "disabled"; status = "disabled";
}; };
imx390_a@21 {
status = "disabled";
};
}; };
i2c@1 { i2c@1 {
dual_hawk2: dual_hawk_c@18 { dual_hawk2: dual_hawk_c@18 {