Part Number: AM623
Tool/software:
I'm trying to determine the correct device tree setup to use our LCD panel on the OLDI interface. Examples and reference materials seem to quite scarce, and seem to relate to instead using the VOUT interface, which is tied up on our board with other signals.
The best reference I've found is this:
LVDS Panel Integration on AM62P
I'm looking at the various examples in the DTS (this is the 6.12 kernel) also and have cobbled together a DTS from all this which is clearly not 100% correct. There did seem to be some renaming from dss -> dss0 etc as well, but I'm not clear if this is processor-specific or something not updated in all the DTS.
When I boot, I get:
[ 20.932104] platform 30200000.dss: deferred probe pending: tidss: no panel/bridge for OLDI0.
I'm not 100% sure what it's after - the driver code here is pretty terse.
DTS pasted here. Forgive all the commented sections - as I said, it was assembled from various pieces (and cut and paste lost the indentation). Let me know what other information I can provide.
/ {
display {
compatible = "panel-lvds";
data-mapping = "vesa-24";
width-mm = <154>;
height-mm = <86>;
//enable-gpios = <&gpio1 12 GPIO_ACTIVE_HIGH>;
panel-timing {
clock-frequency = <51200000>;
hactive = <1024>;
vactive = <600>;
hback-porch = <160>;
hfront-porch = <160>;
vback-porch = <23>;
vfront-porch = <12>;
hsync-len = <70>;
vsync-len = <10>;
hsync-active = <0>;
vsync-active = <0>;
de-active = <1>;
pixelclk-active = <0>;
};
/*
* Note that the OLDI TX 0 transmits the odd set of pixels
* while the OLDI TX 1 transmits the even set. This is a
* fixed configuration in the IP integration and is not
* changeable. The properties, "dual-lvds-odd-pixels" and
* "dual-lvds-even-pixels" have been used to merely
* identify if a Dual Link configuration is required.
* Swapping them will cause an error in the dss oldi driver.
*/
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
dual-lvds-odd-pixels;
lcd_in0: endpoint {
//remote-endpoint = <&oldi0_dss0_out>;
remote-endpoint = <&oldi_out0>;
};
};
port@1 {
reg = <1>;
dual-lvds-even-pixels;
lcd_in1: endpoint {
//remote-endpoint = <&oldi1_dss0_out>;
remote-endpoint = <&oldi_out1>;
};
};
};
};
dss0_vp1_clk: clock-divider-oldi-dss0 {
compatible = "fixed-factor-clock";
clocks = <&k3_clks 186 0>;
#clock-cells = <0>;
clock-div = <7>;
clock-mult = <1>;
};
dss1_vp1_clk: clock-divider-oldi-dss1 {
compatible = "fixed-factor-clock";
clocks = <&k3_clks 232 0>;
#clock-cells = <0>;
clock-div = <7>;
clock-mult = <1>;
};
};
&main_pmx0 {
main_oldi0_pins_default: main-oldi0-pins-default {
pinctrl-single,pins = <
AM62X_IOPAD(0x0260, PIN_OUTPUT, 0) /* (AA5) OLDI0_A0N */
AM62X_IOPAD(0x025c, PIN_OUTPUT, 0) /* (Y6) OLDI0_A0P */
AM62X_IOPAD(0x0268, PIN_OUTPUT, 0) /* (AD3) OLDI0_A1N */
AM62X_IOPAD(0x0264, PIN_OUTPUT, 0) /* (AB4) OLDI0_A1P */
AM62X_IOPAD(0x0270, PIN_OUTPUT, 0) /* (Y8) OLDI0_A2N */
AM62X_IOPAD(0x026c, PIN_OUTPUT, 0) /* (AA8) OLDI0_A2P */
AM62X_IOPAD(0x0278, PIN_OUTPUT, 0) /* (AB6) OLDI0_A3N */
AM62X_IOPAD(0x0274, PIN_OUTPUT, 0) /* (AA7) OLDI0_A3P */
AM62X_IOPAD(0x0280, PIN_OUTPUT, 0) /* (AC6) OLDI0_A4N */
AM62X_IOPAD(0x027c, PIN_OUTPUT, 0) /* (AC5) OLDI0_A4P */
AM62X_IOPAD(0x0288, PIN_OUTPUT, 0) /* (AE5) OLDI0_A5N */
AM62X_IOPAD(0x0284, PIN_OUTPUT, 0) /* (AD6) OLDI0_A5P */
AM62X_IOPAD(0x0290, PIN_OUTPUT, 0) /* (AE6) OLDI0_A6N */
AM62X_IOPAD(0x028c, PIN_OUTPUT, 0) /* (AD7) OLDI0_A6P */
AM62X_IOPAD(0x0298, PIN_OUTPUT, 0) /* (AD8) OLDI0_A7N */
AM62X_IOPAD(0x0294, PIN_OUTPUT, 0) /* (AE7) OLDI0_A7P */
AM62X_IOPAD(0x02a0, PIN_OUTPUT, 0) /* (AD4) OLDI0_CLK0N */
AM62X_IOPAD(0x029c, PIN_OUTPUT, 0) /* (AE3) OLDI0_CLK0P */
AM62X_IOPAD(0x02a8, PIN_OUTPUT, 0) /* (AE4) OLDI0_CLK1N */
AM62X_IOPAD(0x02a4, PIN_OUTPUT, 0) /* (AD5) OLDI0_CLK1P */
>;
};
};
&dss0 {
pinctrl-names = "default";
pinctrl-0 = <&main_oldi0_pins_default>;
status = "okay";
};
&oldi0_dss0 {
status = "okay";
};
&oldi1_dss0 {
status = "okay";
};
/*
&oldi0_dss0_ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
oldi0_dss0_in: endpoint {
remote-endpoint = <&dss0_dpi0_out0>;
};
};
port@1 {
reg = <1>;
oldi0_dss0_out: endpoint {
remote-endpoint = <&lcd_in0>;
};
};
};
&oldi1_dss0_ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
oldi1_dss0_in: endpoint {
remote-endpoint = <&dss0_dpi0_out1>;
};
};
port@1 {
reg = <1>;
oldi1_dss0_out: endpoint {
remote-endpoint = <&lcd_in1>;
};
};
};*/
&dss0_ports {
#address-cells = <1>;
#size-cells = <0>;
/* VP1: LVDS Output (OLDI TX 0) */
port@0 {
reg = <0>;
// #address-cells = <1>;
// #size-cells = <0>;
oldi_out0: endpoint {
remote-endpoint = <&lcd_in0>;
};
};
/* VP1: LVDS Output (OLDI TX 1) */
port@2 {
reg = <2>;
// #address-cells = <1>;
// #size-cells = <0>;
oldi_out1: endpoint {
remote-endpoint = <&lcd_in1>;
};
};
/* dss0_dpi0_out0: endpoint@0 {
reg = <0>;
remote-endpoint = <&oldi0_dss0_in>;
};
dss0_dpi0_out1: endpoint@1 {
reg = <1>;
remote-endpoint = <&oldi1_dss0_in>;
};
};*/
};
Finally, I think the correct kernel options are on:
CONFIG_DRM=y CONFIG_DRM_KMS_HELPER=y CONFIG_DRM_FBDEV_EMULATION=y CONFIG_DRM_DISPLAY_HELPER=y CONFIG_DRM_BRIDGE_CONNECTOR=y CONFIG_DRM_DISPLAY_HDMI_HELPER=y CONFIG_DRM_DISPLAY_HDMI_STATE_HELPER=y CONFIG_DRM_GEM_DMA_HELPER=y CONFIG_DRM_PANEL=y CONFIG_DRM_PANEL_SIMPLE=y CONFIG_DRM_BRIDGE=y CONFIG_DRM_PANEL_BRIDGE=y CONFIG_DRM_TIDSS=y CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y