Syntax error when compiling device tree

I am currently trying to recompile the device tree after some concerns were brought up regarding the source of our original device tree.

The file tegra186-tx2nx-lt6911uxc.dtsi was added as an included file in hardware/nvidia/platform/t18x/common/kernel-dts/t18x-common-platforms/tegra186-quill-common.dtsi. When I try to compile the device tree using the make command make -C kernel/kernel-4.9/ ARCH=arm64 O=$TEGRA_KERNEL_OUT LOCALVERSION=-tegra CROSS_COMPILE=${TOOLCHAIN_PREFIX} -j$(nproc) dtbs I get the following syntax errors:

Error: /opt/Linux_for_Tegra/source/public/kernel/kernel-4.9/../../hardware/nvidia/platform/t18x/common/kernel-dts/t18x-common-platforms/tegra186-tx2nx-lt6911uxc.dtsi:13.38-39 syntax error
FATAL ERROR: Unable to parse input tree
Error: /opt/Linux_for_Tegra/source/public/kernel/kernel-4.9/../../hardware/nvidia/platform/t18x/common/kernel-dts/t18x-common-platforms/tegra186-tx2nx-lt6911uxc.dtsi:13.38-39 syntax error
FATAL ERROR: Unable to parse input tree

I read this as there being an issue on line 13, which is where I set the reset GPIO.
reset-gpio = <&tegra_main_gpio TEGRA186_MAIN_GPIO(N, 1) GPIO_ACTIVE_LOW>;

Is this the incorrect syntax, or am I missing something else?

hello miles.heaton,

it’s due to the property is missing while compiling the sources.
please check you’ve include the dtsi files correctly, thanks

That definitely makes sense. I went and included what I expected to be the relevant gpio files for the TX2 NX and tried recompiling, but ran into similar errors. So I’m not certain what include file I could be missing.

I captured the errors into the file dtb_compile_errors.txt (7.3 KB)

Please see the full dtsi file tegra186-tx2nx-lt6911uxc.dtsi:

#define LT6911_EN "okay"

#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/gpio/tegra186-gpio.h>

/ {
        i2c@3180000 {
                clock-frequency = <100000>;

                lt6911uxc_a@2b {
                        compatible = "nvidia,lt6911uxc";
                        reg = <0x2b>;
                        status = "okay";
                        devnode = "video0";
                        /* Reset */
                        reset-gpio = <&tegra_main_gpio TEGRA186_MAIN_GPIO(N, 1) GPIO_ACTIVE_LOW>;
                        /* Interrupt */
                        interrupt-parent = <&tegra_main_gpio>;
                        interrupts = <&tegra_main_gpio TEGRA186_MAIN_GPIO(E, 2) IRQ_TYPE_LEVEL_HIGH>;
                        mclk = <&tegra_main_gpio TEGRA186_MAIN_GPIO(J, 3)>;
                        set_mode_delay_ms = "5000";

                        port@0 {
                                ret = <0>;
                                status = "okay";
                                hdmi2csi_lt6911_out0: endpoint {
                                        status = "okay";
                                        port-index = <0>;
                                        bus-width = <4>;
                                        remote-endpoint = <&hdmi2csi_csi_in0>;
                                };
                        };
                };
        };

        host1x {
                /* Delete existing VI node to avoid conflicts */
        /delete-node/ vi;
                vi@15c10000 {
                        num-channels = <1>;
                        status = LT6911_EN;
                        ports {
                                #address-cells = <1>;
                                #size-cells = <0>;
                                port@0 {
                                        status = LT6911_EN;
                                        reg = <0>;
                                        hdmi2csi_vi_in0: endpoint {
                                                status = LT6911_EN;
                                                port-index =<0>;
                                                bus-width = <4>;
                                                remote-endpoint = <&hdmi2csi_csi_out0>;
                                        };
                                };
                        };
                };

                nvcsi@15a00000 {
                        num-channels = <1>;
                        #address-cells = <1>;
                        #size-cells = <0>;
                        status = LT6911_EN;
                        channel@0 {
                                status = LT6911_EN;
                                reg = <0>;
                                discontinuous_clk = "no";
                                ports {
                                        #address-cells = <1>;
                                        #size-cells = <0>;
                                        port@0 {
                                                status = LT6911_EN;
                                                reg = <0>;
                                                hdmi2csi_csi_in0: endpoint@0 {
                                                        status = LT6911_EN;
                                                        port-index = <0>;
                                                        bus-width = <4>;
                                                        remote-endpoint = <&hdmi2csi_lt6911_out0>;
                                                };
                                        };
                                        port@1 {
                        status = LT6911_EN;
                        reg = <1>;
                        hdmi2csi_csi_out0: endpoint@1 {
                            status = LT6911_EN;
                            remote-endpoint = <&hdmi2csi_vi_in0>;
                        };
                    };
                                };
                        };
                };
        };


        tegra-camera-platform {
                compatible = "nvidia, tegra-camera-platform";
                /**
                * Physical settings to calculate max ISO BW
                *
                * num_csi_lanes = <>;
                * Total number of CSI lanes when all cameras are active
                *
                * max_lane_speed = <>;
                * Max lane speed in Kbit/s
                *
                * min_bits_per_pixel = <>;
                * Min bits per pixel
                *
                * vi_peak_byte_per_pixel = <>;
                * Max byte per pixel for the VI ISO case
                *
                * vi_bw_margin_pct = <>;
                * Vi bandwidth margin in percentage
                *
                * max_pixel_rate = <>;
                * Max pixel rate in Kpixel/s for the ISP ISO case
                *
                * isp_peak_byte_per_pixel = <>;
                * Max byte per pixel for the ISP ISO case
                *
                * isp_bw_margin_pct = <>;
                * Isp bandwidth margin in percentage
                */
                num_csi_lanes = <8>;
                max_lane_speed = <2500000>;
                min_bits_per_pixel = <16>;
                vi_peak_byte_per_pixel = <3>;
                vi_bw_margin_pct = <25>;
                isp_peak_byte_per_pixel = <3>;
                isp_bw_margin_pct = <25>;
                status = LT6911_EN;

                /**
                * 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
                * platform, then use the platform name for this part.
                * The second part contains the position of the module, ex. “rear” or “front”.
                * The third part contains the last 6 characters of a part number which is found
                * in the module's specsheet from the vender.
                */
                modules {
                        module0 {
                                status = LT6911_EN;
                                badge = "hdmi2csi_left_6911";
                                position = "left";
                                orientation = "1";
                                drivernode0 {
                                        /* Declare PCL support driver (classically known as guid)  */
                                        pcl_id = "v4l2_sensor";
                                        /* Driver v4l2 device name */
                                        devname = "lt6911uxc 2-002b";
                                        /* Declare the device-tree hierarchy to driver instance */
                                        proc-device-tree = "/proc/device-tree/i2c@3180000/lt6911uxc_a@2b";
                                };
                        };
                };
        };
};

hello miles.heaton,

these two is not necessary.

as you can see,
it’s tegra186-soc-base.dtsi to define this tegra_main_gpio.
for example,

        tegra_main_gpio: gpio@2200000 {
                compatible = "nvidia,tegra186-gpio";

The above solution didn’t work for me.

From what I can tell, the issue was due to where the function calls for TEGRA186_MAIN_GPIO() were located.

By defining those function calls at the top of the file (see the #define section in the code below) as different names, the compile went through without issue. Commented out in the code are the original definitions (reset-gpio, interrupts, and mclk).

@JerryChang I did not see any note in the documentation specifying that GPIO pins should be defined outside of the main code body in a .dtsi file, so I don’t know if this is a bug or just some idiosyncrasy I worked around. Do you have any insight as to whether this is expected functionality?

#define LT6911_EN "okay"

#include <dt-bindings/media/camera.h>

#define RSTN    TEGRA_MAIN_GPIO(N, 1)
#define INTR    TEGRA_MAIN_GPIO(E, 2)
#define LRCK    TEGRA_MAIN_GPIO(J, 3)
/ {

        i2c@3180000 {
                clock-frequency = <100000>;

                lt6911uxc_a@2b {
                        compatible = "nvidia,lt6911uxc";
                        reg = <0x2b>;
                        status = "okay";
                        devnode = "video0";
                        /* Reset */
                        //reset-gpio = <&tegra_main_gpio TEGRA186_MAIN_GPIO(N, 1) GPIO_ACTIVE_LOW>;
                        reset-gpio = <&tegra_main_gpio RSTN GPIO_ACTIVE_LOW>;
                        /* Interrupt */
                        interrupt-parent = <&tegra_main_gpio>;
                        //interrupts = <TEGRA186_MAIN_GPIO(E, 2) IRQ_TYPE_LEVEL_HIGH>;
                        interrupts = <INTR IRQ_TYPE_LEVEL_HIGH>;
                        //mclk = <TEGRA186_MAIN_GPIO(J, 3)>;
                        mclk = <LRCK>;
                        set_mode_delay_ms = "5000";

hello miles.heaton,

I don’t understand your point.
syntax errors basically caused by error definition or property is missing.

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.