diff --git a/Documentation/devicetree/bindings/display/allwinner,sun6i-a31-mipi-dsi.yaml b/Documentation/devicetree/bindings/display/allwinner,sun6i-a31-mipi-dsi.yaml index c731fbdc2fe0..7b11cb5e5f6d 100644 --- a/Documentation/devicetree/bindings/display/allwinner,sun6i-a31-mipi-dsi.yaml +++ b/Documentation/devicetree/bindings/display/allwinner,sun6i-a31-mipi-dsi.yaml @@ -119,11 +119,11 @@ examples: #size-cells = <0>; panel@0 { - compatible = "bananapi,lhr050h41", "ilitek,ili9881c"; - reg = <0>; - power-supply = <®_display>; - reset-gpios = <&r_pio 0 5 1>; /* PL05 */ - backlight = <&pwm_bl>; + compatible = "bananapi,lhr050h41", "ilitek,ili9881c"; + reg = <0>; + power-supply = <®_display>; + reset-gpios = <&r_pio 0 5 1>; /* PL05 */ + backlight = <&pwm_bl>; }; port { diff --git a/Documentation/devicetree/bindings/display/bridge/fsl,imx8qxp-pxl2dpi.yaml b/Documentation/devicetree/bindings/display/bridge/fsl,imx8qxp-pxl2dpi.yaml index e4e77fad05f1..af9ad07ef08b 100644 --- a/Documentation/devicetree/bindings/display/bridge/fsl,imx8qxp-pxl2dpi.yaml +++ b/Documentation/devicetree/bindings/display/bridge/fsl,imx8qxp-pxl2dpi.yaml @@ -84,8 +84,8 @@ examples: }; mipi_lvds_0_pxl2dpi_dc_pixel_link1: endpoint@1 { - reg = <1>; - remote-endpoint = <&dc_pixel_link1_mipi_lvds_0_pxl2dpi>; + reg = <1>; + remote-endpoint = <&dc_pixel_link1_mipi_lvds_0_pxl2dpi>; }; }; diff --git a/Documentation/devicetree/bindings/display/bridge/lontium,lt8912b.yaml b/Documentation/devicetree/bindings/display/bridge/lontium,lt8912b.yaml index 988351f3cd01..2d2dc9c046fb 100644 --- a/Documentation/devicetree/bindings/display/bridge/lontium,lt8912b.yaml +++ b/Documentation/devicetree/bindings/display/bridge/lontium,lt8912b.yaml @@ -107,11 +107,11 @@ examples: }; port@1 { - reg = <1>; + reg = <1>; - endpoint { - remote-endpoint = <&hdmi_in>; - }; + endpoint { + remote-endpoint = <&hdmi_in>; + }; }; }; }; diff --git a/Documentation/devicetree/bindings/display/bridge/megachips,stdp2690-ge-b850v3-fw.yaml b/Documentation/devicetree/bindings/display/bridge/megachips,stdp2690-ge-b850v3-fw.yaml index dfa6ff6f115e..74539132bf94 100644 --- a/Documentation/devicetree/bindings/display/bridge/megachips,stdp2690-ge-b850v3-fw.yaml +++ b/Documentation/devicetree/bindings/display/bridge/megachips,stdp2690-ge-b850v3-fw.yaml @@ -104,7 +104,7 @@ examples: endpoint { remote-endpoint = <&stdp2690_in>; }; - }; + }; }; }; }; diff --git a/Documentation/devicetree/bindings/display/bridge/nxp,tda998x.yaml b/Documentation/devicetree/bindings/display/bridge/nxp,tda998x.yaml index 1205c8e9de32..0ad55ff8e330 100644 --- a/Documentation/devicetree/bindings/display/bridge/nxp,tda998x.yaml +++ b/Documentation/devicetree/bindings/display/bridge/nxp,tda998x.yaml @@ -106,7 +106,7 @@ examples: video-ports = <0x230145>; #sound-dai-cells = <1>; - /* DAI-format / AP_ENA reg value */ + /* DAI-format / AP_ENA reg value */ audio-ports = , ; diff --git a/Documentation/devicetree/bindings/display/bridge/toshiba,tc358764.yaml b/Documentation/devicetree/bindings/display/bridge/toshiba,tc358764.yaml index 866607400514..23c5b254426b 100644 --- a/Documentation/devicetree/bindings/display/bridge/toshiba,tc358764.yaml +++ b/Documentation/devicetree/bindings/display/bridge/toshiba,tc358764.yaml @@ -81,7 +81,7 @@ examples: port@1 { reg = <1>; lvds_ep: endpoint { - remote-endpoint = <&panel_ep>; + remote-endpoint = <&panel_ep>; }; }; }; diff --git a/Documentation/devicetree/bindings/display/bridge/toshiba,tc358775.yaml b/Documentation/devicetree/bindings/display/bridge/toshiba,tc358775.yaml index 258dd9cfd770..8a0d8a66a9b0 100644 --- a/Documentation/devicetree/bindings/display/bridge/toshiba,tc358775.yaml +++ b/Documentation/devicetree/bindings/display/bridge/toshiba,tc358775.yaml @@ -161,9 +161,9 @@ examples: dsi0_out: endpoint { remote-endpoint = <&d2l_in_test>; }; - }; - }; - }; + }; + }; + }; - | /* For dual-link LVDS display panel */ @@ -227,7 +227,7 @@ examples: dsi0_out_dual: endpoint { remote-endpoint = <&d2l_in_dual>; }; - }; - }; - }; + }; + }; + }; ... diff --git a/Documentation/devicetree/bindings/display/faraday,tve200.yaml b/Documentation/devicetree/bindings/display/faraday,tve200.yaml index b09628b69177..43dbe2778d6b 100644 --- a/Documentation/devicetree/bindings/display/faraday,tve200.yaml +++ b/Documentation/devicetree/bindings/display/faraday,tve200.yaml @@ -54,7 +54,7 @@ examples: display-controller@6a000000 { compatible = "faraday,tve200"; reg = <0x6a000000 0x1000>; - interrupts = <13 IRQ_TYPE_EDGE_RISING>; + interrupts = <13 IRQ_TYPE_LEVEL_HIGH>; resets = <&syscon GEMINI_RESET_TVC>; clocks = <&syscon GEMINI_CLK_GATE_TVC>, <&syscon GEMINI_CLK_TVC>; diff --git a/Documentation/devicetree/bindings/display/fsl,lcdif.yaml b/Documentation/devicetree/bindings/display/fsl,lcdif.yaml index 2dd0411ec651..89cea0c14cf1 100644 --- a/Documentation/devicetree/bindings/display/fsl,lcdif.yaml +++ b/Documentation/devicetree/bindings/display/fsl,lcdif.yaml @@ -68,9 +68,19 @@ properties: maxItems: 1 port: - $ref: /schemas/graph.yaml#/properties/port + $ref: /schemas/graph.yaml#/$defs/port-base + unevaluatedProperties: false description: The LCDIF output port + properties: + endpoint: + $ref: /schemas/media/video-interfaces.yaml + unevaluatedProperties: false + + properties: + bus-width: + enum: [ 16, 18, 24 ] + display: $ref: /schemas/types.yaml#/definitions/phandle description: phandle to display panel diff --git a/Documentation/devicetree/bindings/display/himax,hx8357.yaml b/Documentation/devicetree/bindings/display/himax,hx8357.yaml index 34c3b89bf003..bafcd4418d5a 100644 --- a/Documentation/devicetree/bindings/display/himax,hx8357.yaml +++ b/Documentation/devicetree/bindings/display/himax,hx8357.yaml @@ -74,5 +74,5 @@ examples: dc-gpios = <&gpio0 25 GPIO_ACTIVE_HIGH>; rotation = <90>; backlight = <&backlight>; - }; + }; }; diff --git a/Documentation/devicetree/bindings/display/imx/fsl,imx-lcdc.yaml b/Documentation/devicetree/bindings/display/imx/fsl,imx-lcdc.yaml index c2b29622bceb..84610b5690c4 100644 --- a/Documentation/devicetree/bindings/display/imx/fsl,imx-lcdc.yaml +++ b/Documentation/devicetree/bindings/display/imx/fsl,imx-lcdc.yaml @@ -110,7 +110,7 @@ examples: port { parallel_out: endpoint { - remote-endpoint = <&panel_in>; + remote-endpoint = <&panel_in>; }; }; }; diff --git a/Documentation/devicetree/bindings/display/imx/fsl,imx6q-ldb.yaml b/Documentation/devicetree/bindings/display/imx/fsl,imx6q-ldb.yaml index 1646f41d8f72..cee1b504adf9 100644 --- a/Documentation/devicetree/bindings/display/imx/fsl,imx6q-ldb.yaml +++ b/Documentation/devicetree/bindings/display/imx/fsl,imx6q-ldb.yaml @@ -150,44 +150,44 @@ examples: /* Using an of-graph endpoint link to connect the panel */ lvds-channel@0 { + reg = <0>; + #address-cells = <1>; + #size-cells = <0>; + + port@0 { reg = <0>; - #address-cells = <1>; - #size-cells = <0>; - port@0 { - reg = <0>; - - endpoint { - remote-endpoint = <&ipu_di0_lvds0>; - }; + endpoint { + remote-endpoint = <&ipu_di0_lvds0>; }; + }; - port@2 { - reg = <2>; + port@2 { + reg = <2>; - endpoint { - remote-endpoint = <&panel_in>; - }; - }; + endpoint { + remote-endpoint = <&panel_in>; + }; + }; }; /* Using display-timings and fsl,data-mapping/width instead */ lvds-channel@1 { + reg = <1>; + #address-cells = <1>; + #size-cells = <0>; + fsl,data-mapping = "spwg"; + fsl,data-width = <24>; + + display-timings {/* ... */ + }; + + port@1 { reg = <1>; - #address-cells = <1>; - #size-cells = <0>; - fsl,data-mapping = "spwg"; - fsl,data-width = <24>; - display-timings {/* ... */ - }; - - port@1 { - reg = <1>; - - endpoint { - remote-endpoint = <&ipu_di1_lvds1>; - }; + endpoint { + remote-endpoint = <&ipu_di1_lvds1>; }; + }; }; }; diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,ethdr.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,ethdr.yaml index 98db47894eeb..6c0edbae96d7 100644 --- a/Documentation/devicetree/bindings/display/mediatek/mediatek,ethdr.yaml +++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,ethdr.yaml @@ -158,51 +158,51 @@ examples: #size-cells = <2>; hdr-engine@1c114000 { - compatible = "mediatek,mt8195-disp-ethdr"; - reg = <0 0x1c114000 0 0x1000>, - <0 0x1c115000 0 0x1000>, - <0 0x1c117000 0 0x1000>, - <0 0x1c119000 0 0x1000>, - <0 0x1c11a000 0 0x1000>, - <0 0x1c11b000 0 0x1000>, - <0 0x1c11c000 0 0x1000>; - reg-names = "mixer", "vdo_fe0", "vdo_fe1", "gfx_fe0", "gfx_fe1", - "vdo_be", "adl_ds"; - mediatek,gce-client-reg = <&gce0 SUBSYS_1c11XXXX 0x4000 0x1000>, - <&gce0 SUBSYS_1c11XXXX 0x5000 0x1000>, - <&gce0 SUBSYS_1c11XXXX 0x7000 0x1000>, - <&gce0 SUBSYS_1c11XXXX 0x9000 0x1000>, - <&gce0 SUBSYS_1c11XXXX 0xa000 0x1000>, - <&gce0 SUBSYS_1c11XXXX 0xb000 0x1000>, - <&gce0 SUBSYS_1c11XXXX 0xc000 0x1000>; - clocks = <&vdosys1 CLK_VDO1_DISP_MIXER>, - <&vdosys1 CLK_VDO1_HDR_VDO_FE0>, - <&vdosys1 CLK_VDO1_HDR_VDO_FE1>, - <&vdosys1 CLK_VDO1_HDR_GFX_FE0>, - <&vdosys1 CLK_VDO1_HDR_GFX_FE1>, - <&vdosys1 CLK_VDO1_HDR_VDO_BE>, - <&vdosys1 CLK_VDO1_26M_SLOW>, - <&vdosys1 CLK_VDO1_HDR_VDO_FE0_DL_ASYNC>, - <&vdosys1 CLK_VDO1_HDR_VDO_FE1_DL_ASYNC>, - <&vdosys1 CLK_VDO1_HDR_GFX_FE0_DL_ASYNC>, - <&vdosys1 CLK_VDO1_HDR_GFX_FE1_DL_ASYNC>, - <&vdosys1 CLK_VDO1_HDR_VDO_BE_DL_ASYNC>, - <&topckgen CLK_TOP_ETHDR>; - clock-names = "mixer", "vdo_fe0", "vdo_fe1", "gfx_fe0", "gfx_fe1", - "vdo_be", "adl_ds", "vdo_fe0_async", "vdo_fe1_async", - "gfx_fe0_async", "gfx_fe1_async","vdo_be_async", - "ethdr_top"; - power-domains = <&spm MT8195_POWER_DOMAIN_VDOSYS1>; - iommus = <&iommu_vpp M4U_PORT_L3_HDR_DS>, - <&iommu_vpp M4U_PORT_L3_HDR_ADL>; - interrupts = ; /* disp mixer */ - resets = <&vdosys1 MT8195_VDOSYS1_SW1_RST_B_HDR_VDO_FE0_DL_ASYNC>, - <&vdosys1 MT8195_VDOSYS1_SW1_RST_B_HDR_VDO_FE1_DL_ASYNC>, - <&vdosys1 MT8195_VDOSYS1_SW1_RST_B_HDR_GFX_FE0_DL_ASYNC>, - <&vdosys1 MT8195_VDOSYS1_SW1_RST_B_HDR_GFX_FE1_DL_ASYNC>, - <&vdosys1 MT8195_VDOSYS1_SW1_RST_B_HDR_VDO_BE_DL_ASYNC>; - reset-names = "vdo_fe0_async", "vdo_fe1_async", "gfx_fe0_async", - "gfx_fe1_async", "vdo_be_async"; + compatible = "mediatek,mt8195-disp-ethdr"; + reg = <0 0x1c114000 0 0x1000>, + <0 0x1c115000 0 0x1000>, + <0 0x1c117000 0 0x1000>, + <0 0x1c119000 0 0x1000>, + <0 0x1c11a000 0 0x1000>, + <0 0x1c11b000 0 0x1000>, + <0 0x1c11c000 0 0x1000>; + reg-names = "mixer", "vdo_fe0", "vdo_fe1", "gfx_fe0", "gfx_fe1", + "vdo_be", "adl_ds"; + mediatek,gce-client-reg = <&gce0 SUBSYS_1c11XXXX 0x4000 0x1000>, + <&gce0 SUBSYS_1c11XXXX 0x5000 0x1000>, + <&gce0 SUBSYS_1c11XXXX 0x7000 0x1000>, + <&gce0 SUBSYS_1c11XXXX 0x9000 0x1000>, + <&gce0 SUBSYS_1c11XXXX 0xa000 0x1000>, + <&gce0 SUBSYS_1c11XXXX 0xb000 0x1000>, + <&gce0 SUBSYS_1c11XXXX 0xc000 0x1000>; + clocks = <&vdosys1 CLK_VDO1_DISP_MIXER>, + <&vdosys1 CLK_VDO1_HDR_VDO_FE0>, + <&vdosys1 CLK_VDO1_HDR_VDO_FE1>, + <&vdosys1 CLK_VDO1_HDR_GFX_FE0>, + <&vdosys1 CLK_VDO1_HDR_GFX_FE1>, + <&vdosys1 CLK_VDO1_HDR_VDO_BE>, + <&vdosys1 CLK_VDO1_26M_SLOW>, + <&vdosys1 CLK_VDO1_HDR_VDO_FE0_DL_ASYNC>, + <&vdosys1 CLK_VDO1_HDR_VDO_FE1_DL_ASYNC>, + <&vdosys1 CLK_VDO1_HDR_GFX_FE0_DL_ASYNC>, + <&vdosys1 CLK_VDO1_HDR_GFX_FE1_DL_ASYNC>, + <&vdosys1 CLK_VDO1_HDR_VDO_BE_DL_ASYNC>, + <&topckgen CLK_TOP_ETHDR>; + clock-names = "mixer", "vdo_fe0", "vdo_fe1", "gfx_fe0", "gfx_fe1", + "vdo_be", "adl_ds", "vdo_fe0_async", "vdo_fe1_async", + "gfx_fe0_async", "gfx_fe1_async","vdo_be_async", + "ethdr_top"; + power-domains = <&spm MT8195_POWER_DOMAIN_VDOSYS1>; + iommus = <&iommu_vpp M4U_PORT_L3_HDR_DS>, + <&iommu_vpp M4U_PORT_L3_HDR_ADL>; + interrupts = ; /* disp mixer */ + resets = <&vdosys1 MT8195_VDOSYS1_SW1_RST_B_HDR_VDO_FE0_DL_ASYNC>, + <&vdosys1 MT8195_VDOSYS1_SW1_RST_B_HDR_VDO_FE1_DL_ASYNC>, + <&vdosys1 MT8195_VDOSYS1_SW1_RST_B_HDR_GFX_FE0_DL_ASYNC>, + <&vdosys1 MT8195_VDOSYS1_SW1_RST_B_HDR_GFX_FE1_DL_ASYNC>, + <&vdosys1 MT8195_VDOSYS1_SW1_RST_B_HDR_VDO_BE_DL_ASYNC>; + reset-names = "vdo_fe0_async", "vdo_fe1_async", "gfx_fe0_async", + "gfx_fe1_async", "vdo_be_async"; }; }; ... diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,hdmi.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,hdmi.yaml index b90b6d18a828..9af876329e6a 100644 --- a/Documentation/devicetree/bindings/display/mediatek/mediatek,hdmi.yaml +++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,hdmi.yaml @@ -112,24 +112,24 @@ examples: mediatek,syscon-hdmi = <&mmsys 0x900>; ports { - #address-cells = <1>; - #size-cells = <0>; + #address-cells = <1>; + #size-cells = <0>; - port@0 { - reg = <0>; + port@0 { + reg = <0>; - hdmi0_in: endpoint { - remote-endpoint = <&dpi0_out>; + hdmi0_in: endpoint { + remote-endpoint = <&dpi0_out>; + }; }; - }; - port@1 { - reg = <1>; + port@1 { + reg = <1>; - hdmi0_out: endpoint { - remote-endpoint = <&hdmi_con_in>; + hdmi0_out: endpoint { + remote-endpoint = <&hdmi_con_in>; + }; }; - }; }; }; diff --git a/Documentation/devicetree/bindings/display/panel/ilitek,il79900a.yaml b/Documentation/devicetree/bindings/display/panel/ilitek,il79900a.yaml index 02f7fb1f16dc..f475302b87b0 100644 --- a/Documentation/devicetree/bindings/display/panel/ilitek,il79900a.yaml +++ b/Documentation/devicetree/bindings/display/panel/ilitek,il79900a.yaml @@ -14,10 +14,15 @@ allOf: properties: compatible: - items: - - enum: - - tianma,tl121bvms07-00 - - const: ilitek,il79900a + oneOf: + - items: + - enum: + - raspberrypi,dsi-10inch + - const: ilitek,il79600a + - items: + - enum: + - tianma,tl121bvms07-00 + - const: ilitek,il79900a reg: maxItems: 1 diff --git a/Documentation/devicetree/bindings/display/panel/panel-simple-lvds-dual-ports.yaml b/Documentation/devicetree/bindings/display/panel/panel-simple-lvds-dual-ports.yaml index 8a2f6feafd37..68beb476fb48 100644 --- a/Documentation/devicetree/bindings/display/panel/panel-simple-lvds-dual-ports.yaml +++ b/Documentation/devicetree/bindings/display/panel/panel-simple-lvds-dual-ports.yaml @@ -44,6 +44,8 @@ properties: - auo,t215hvn01 # BOE AV123Z7M-N17 12.3" (1920x720) LVDS TFT LCD panel - boe,av123z7m-n17 + # BOE DV215FHM-R01 21.5" FHD (1920x1080) dual-channel LVDS panel + - boe,dv215fhm-r01 # InnoLux 15.6" FHD (1920x1080) TFT LCD panel - innolux,g156hce-l01 # Kaohsiung Opto-Electronics Inc. 10.1" WUXGA (1920 x 1200) LVDS TFT LCD panel diff --git a/Documentation/devicetree/bindings/display/panel/panel-simple.yaml b/Documentation/devicetree/bindings/display/panel/panel-simple.yaml index 3d1cc11ba3aa..eb49832b26c4 100644 --- a/Documentation/devicetree/bindings/display/panel/panel-simple.yaml +++ b/Documentation/devicetree/bindings/display/panel/panel-simple.yaml @@ -338,6 +338,8 @@ properties: - tpk,f07a-0102 # TPK U.S.A. LLC Fusion 10.1" 1024 x 600 (WSVGA) LCD panel with capacitive touch - tpk,f10a-0102 + # Truly Semiconductors Limited 3.5" QVGA (320 x 240) TFT LCD panel + - truly,tft320240-229-e # United Radiant Technology UMSH-8596MD-xT 7.0" WVGA TFT LCD panel # Supported are LVDS versions (-11T, -19T) and parallel ones # (-T, -1T, -7T, -20T). diff --git a/Documentation/devicetree/bindings/display/panel/samsung,ams495qa01.yaml b/Documentation/devicetree/bindings/display/panel/samsung,ams495qa01.yaml index e081c84a932b..6db87f7d70d8 100644 --- a/Documentation/devicetree/bindings/display/panel/samsung,ams495qa01.yaml +++ b/Documentation/devicetree/bindings/display/panel/samsung,ams495qa01.yaml @@ -51,7 +51,7 @@ examples: port { mipi_in_panel: endpoint { - remote-endpoint = <&mipi_out_panel>; + remote-endpoint = <&mipi_out_panel>; }; }; }; diff --git a/Documentation/devicetree/bindings/display/sitronix,st7567.yaml b/Documentation/devicetree/bindings/display/sitronix,st7567.yaml index 2eb6d00b5a25..c007718541f6 100644 --- a/Documentation/devicetree/bindings/display/sitronix,st7567.yaml +++ b/Documentation/devicetree/bindings/display/sitronix,st7567.yaml @@ -64,5 +64,5 @@ examples: vfront-porch = <0>; vsync-len = <0>; }; - }; - }; + }; + }; diff --git a/Documentation/devicetree/bindings/display/st,stm32-dsi.yaml b/Documentation/devicetree/bindings/display/st,stm32-dsi.yaml index 53560052aaf0..1b5f4317dab2 100644 --- a/Documentation/devicetree/bindings/display/st,stm32-dsi.yaml +++ b/Documentation/devicetree/bindings/display/st,stm32-dsi.yaml @@ -101,35 +101,35 @@ examples: #size-cells = <0>; ports { - #address-cells = <1>; - #size-cells = <0>; + #address-cells = <1>; + #size-cells = <0>; - port@0 { - reg = <0>; - dsi_in: endpoint { - remote-endpoint = <<dc_ep1_out>; - }; - }; + port@0 { + reg = <0>; + dsi_in: endpoint { + remote-endpoint = <<dc_ep1_out>; + }; + }; - port@1 { - reg = <1>; - dsi_out: endpoint { - remote-endpoint = <&panel_in>; - }; - }; + port@1 { + reg = <1>; + dsi_out: endpoint { + remote-endpoint = <&panel_in>; + }; + }; }; panel@0 { - compatible = "orisetech,otm8009a"; - reg = <0>; - reset-gpios = <&gpioe 4 GPIO_ACTIVE_LOW>; - power-supply = <&v3v3>; + compatible = "orisetech,otm8009a"; + reg = <0>; + reset-gpios = <&gpioe 4 GPIO_ACTIVE_LOW>; + power-supply = <&v3v3>; - port { - panel_in: endpoint { - remote-endpoint = <&dsi_out>; - }; - }; + port { + panel_in: endpoint { + remote-endpoint = <&dsi_out>; + }; + }; }; }; diff --git a/Documentation/devicetree/bindings/display/st,stm32-ltdc.yaml b/Documentation/devicetree/bindings/display/st,stm32-ltdc.yaml index 77058a5ccf68..81c7772de25b 100644 --- a/Documentation/devicetree/bindings/display/st,stm32-ltdc.yaml +++ b/Documentation/devicetree/bindings/display/st,stm32-ltdc.yaml @@ -119,9 +119,9 @@ examples: resets = <&rcc LTDC_R>; port { - ltdc_out_dsi: endpoint { - remote-endpoint = <&dsi_in>; - }; + ltdc_out_dsi: endpoint { + remote-endpoint = <&dsi_in>; + }; }; }; diff --git a/Documentation/devicetree/bindings/display/st,stm32mp25-lvds.yaml b/Documentation/devicetree/bindings/display/st,stm32mp25-lvds.yaml index 14e042156179..f8e43c5a656a 100644 --- a/Documentation/devicetree/bindings/display/st,stm32mp25-lvds.yaml +++ b/Documentation/devicetree/bindings/display/st,stm32mp25-lvds.yaml @@ -114,14 +114,14 @@ examples: port@0 { reg = <0>; lvds_in: endpoint { - remote-endpoint = <<dc_ep1_out>; + remote-endpoint = <<dc_ep1_out>; }; }; port@1 { reg = <1>; lvds_out0: endpoint { - remote-endpoint = <&lvds_panel_in>; + remote-endpoint = <&lvds_panel_in>; }; }; }; diff --git a/Documentation/devicetree/bindings/display/tegra/nvidia,tegra20-host1x.yaml b/Documentation/devicetree/bindings/display/tegra/nvidia,tegra20-host1x.yaml index 8312b7699cbe..9b0aab4afb1a 100644 --- a/Documentation/devicetree/bindings/display/tegra/nvidia,tegra20-host1x.yaml +++ b/Documentation/devicetree/bindings/display/tegra/nvidia,tegra20-host1x.yaml @@ -98,6 +98,18 @@ properties: items: - description: phandle to the HEG or core power domain + nvidia,channels: + $ref: /schemas/types.yaml#/definitions/uint32-array + minItems: 2 + maxItems: 2 + description: Describes range of usable Host1x channels as a tuple. + + nvidia,syncpoints: + $ref: /schemas/types.yaml#/definitions/uint32-array + minItems: 2 + maxItems: 2 + description: Describes range of writable Host1x syncpoints as a tuple. + required: - compatible - interrupts @@ -147,14 +159,20 @@ allOf: then: properties: reg-names: - items: - - const: hypervisor - - const: vm + oneOf: + - items: + - const: hypervisor + - const: vm + - items: + - const: vm reg: - items: - - description: region used by the hypervisor - - description: region assigned to the virtual machine + oneOf: + - items: + - description: region used by the hypervisor + - description: region assigned to the virtual machine + - items: + - description: region assigned to the virtual machine resets: maxItems: 1 @@ -198,16 +216,22 @@ allOf: then: properties: reg-names: - items: - - const: common - - const: hypervisor - - const: vm + oneOf: + - items: + - const: common + - const: hypervisor + - const: vm + - items: + - const: vm reg: - items: - - description: region used by host1x server - - description: region used by the hypervisor - - description: region assigned to the virtual machine + oneOf: + - items: + - description: region used by host1x server + - description: region used by the hypervisor + - description: region assigned to the virtual machine + - items: + - description: region assigned to the virtual machine interrupts: items: diff --git a/Documentation/gpu/drm-kms-helpers.rst b/Documentation/gpu/drm-kms-helpers.rst index 400cd0112713..d64f941d34f5 100644 --- a/Documentation/gpu/drm-kms-helpers.rst +++ b/Documentation/gpu/drm-kms-helpers.rst @@ -109,13 +109,13 @@ VBLANK Helper Reference fbdev Helper Functions Reference ================================ -.. kernel-doc:: drivers/gpu/drm/drm_fb_helper.c +.. kernel-doc:: drivers/gpu/drm/clients/drm_fbdev_helper.c :doc: fbdev helpers -.. kernel-doc:: include/drm/drm_fb_helper.h +.. kernel-doc:: include/drm/clients/drm_fbdev_helper.h :internal: -.. kernel-doc:: drivers/gpu/drm/drm_fb_helper.c +.. kernel-doc:: drivers/gpu/drm/clients/drm_fbdev_helper.c :export: Draw Helper Functions Reference @@ -218,7 +218,7 @@ Bridge Connector Helper Reference Panel-Bridge Helper Reference ----------------------------- -.. kernel-doc:: drivers/gpu/drm/bridge/panel.c +.. kernel-doc:: drivers/gpu/drm/drm_panel.c :export: .. _drm_panel_helper: diff --git a/Documentation/gpu/todo.rst b/Documentation/gpu/todo.rst index b7351467dc74..a437ae5c71f4 100644 --- a/Documentation/gpu/todo.rst +++ b/Documentation/gpu/todo.rst @@ -484,21 +484,30 @@ Contact: Douglas Anderson Level: Starter -Remove devm_drm_put_bridge() ----------------------------- +Remove panel_bridge API functions +--------------------------------- -Due to how the panel bridge handles the drm_bridge object lifetime, special -care must be taken to dispose of the drm_bridge object when the -panel_bridge is removed. This is currently managed using -devm_drm_put_bridge(), but that is an unsafe, temporary workaround. To fix -that, the DRM panel lifetime needs to be reworked. After the rework is -done, remove devm_drm_put_bridge() and the TODO in -drm_panel_bridge_remove(). +Now that a drm_bridge is embedded into every drm_panel, the panel_bridge is +not needed anymore. Its APIs are just accessing the embedded drm_bridge +transparently, and the are deprecated. -Contact: Maxime Ripard , - Luca Ceresoli +The funcions to remove are: + - drm_panel_bridge_add_typed() + - devm_drm_of_get_bridge() + - drmm_of_get_bridge() + - drm_panel_bridge_remove() + - drmm_drm_panel_bridge_release() + - devm_drm_panel_bridge_release() + - their direct or indirect callers -Level: Intermediate +Convert users of those functions and eventually remove them when unused, or +make them static drm_panel.c functions when used internally by the +``drm_panel.c`` code. + +Contact: Luca Ceresoli + Maxime Ripard , + +Level: Easy Convert users of of_drm_find_bridge() to of_drm_find_and_get_bridge() --------------------------------------------------------------------- diff --git a/drivers/accel/amdxdna/aie2_ctx.c b/drivers/accel/amdxdna/aie2_ctx.c index 164441e43940..d927c8c9d557 100644 --- a/drivers/accel/amdxdna/aie2_ctx.c +++ b/drivers/accel/amdxdna/aie2_ctx.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -99,9 +100,9 @@ static void aie2_job_put(struct amdxdna_sched_job *job) static void aie2_hwctx_stop(struct amdxdna_dev *xdna, struct amdxdna_hwctx *hwctx, struct drm_sched_job *bad_job) { - drm_sched_stop(&hwctx->priv->sched, bad_job); + drm_sched_stop(hwctx->priv->sched, bad_job); aie2_destroy_context(xdna->dev_handle, hwctx); - drm_sched_start(&hwctx->priv->sched, 0); + drm_sched_start(hwctx->priv->sched, 0); } static int aie2_hwctx_restart(struct amdxdna_dev *xdna, struct amdxdna_hwctx *hwctx) @@ -659,10 +660,19 @@ static void aie2_ctx_syncobj_destroy(struct amdxdna_hwctx *hwctx) drm_syncobj_put(hwctx->priv->syncobj); } -int aie2_hwctx_init(struct amdxdna_hwctx *hwctx) +void aie2_hwctx_sched_fini(struct amdxdna_dev_hdl *ndev) { - struct amdxdna_client *client = hwctx->client; - struct amdxdna_dev *xdna = client->xdna; + int i; + + for (i = 0; i < ndev->priv->hwctx_limit; i++) + drm_sched_fini(&ndev->hwctx_sched[i]); + + ida_destroy(&ndev->hwctx_sched_ida); +} + +int aie2_hwctx_sched_init(struct amdxdna_dev_hdl *ndev) +{ + struct amdxdna_dev *xdna = ndev->aie.xdna; const struct drm_sched_init_args args = { .ops = &sched_ops, .num_rqs = DRM_SCHED_PRIORITY_COUNT, @@ -673,7 +683,55 @@ int aie2_hwctx_init(struct amdxdna_hwctx *hwctx) .name = "amdxdna_js", .dev = xdna->ddev.dev, }; - struct drm_gpu_scheduler *sched; + int i, ret; + + ndev->hwctx_sched = drmm_kcalloc(&xdna->ddev, ndev->priv->hwctx_limit, + sizeof(*ndev->hwctx_sched), GFP_KERNEL); + if (!ndev->hwctx_sched) + return -ENOMEM; + + for (i = 0; i < ndev->priv->hwctx_limit; i++) { + ret = drm_sched_init(&ndev->hwctx_sched[i], &args); + if (ret) { + XDNA_ERR(xdna, "Failed to init DRM scheduler. ret %d", ret); + goto fini_sched; + } + } + + ida_init(&ndev->hwctx_sched_ida); + + return 0; + +fini_sched: + while (--i >= 0) + drm_sched_fini(&ndev->hwctx_sched[i]); + + return ret; +} + +static struct drm_gpu_scheduler *aie2_hwctx_sched_alloc(struct amdxdna_dev_hdl *ndev) +{ + int ret; + + ret = ida_alloc_range(&ndev->hwctx_sched_ida, 0, + ndev->priv->hwctx_limit - 1, GFP_KERNEL); + if (ret < 0) + return ERR_PTR(ret); + + return &ndev->hwctx_sched[ret]; +} + +static void aie2_hwctx_sched_free(struct amdxdna_dev_hdl *ndev, + struct drm_gpu_scheduler *sched) +{ + ida_free(&ndev->hwctx_sched_ida, sched - ndev->hwctx_sched); +} + +int aie2_hwctx_init(struct amdxdna_hwctx *hwctx) +{ + struct amdxdna_client *client = hwctx->client; + struct amdxdna_dev *xdna = client->xdna; + struct amdxdna_dev_hdl *ndev = xdna->dev_handle; struct amdxdna_hwctx_priv *priv; struct amdxdna_gem_obj *heap; int i, ret; @@ -683,13 +741,26 @@ int aie2_hwctx_init(struct amdxdna_hwctx *hwctx) return -ENOMEM; hwctx->priv = priv; + priv->sched = aie2_hwctx_sched_alloc(ndev); + if (IS_ERR(priv->sched)) { + ret = PTR_ERR(priv->sched); + goto free_priv; + } + + ret = drm_sched_entity_init(&priv->entity, DRM_SCHED_PRIORITY_NORMAL, + &priv->sched, 1, NULL); + if (ret) { + XDNA_ERR(xdna, "Failed to initial sched entity. ret %d", ret); + goto free_sched; + } + mutex_lock(&client->mm_lock); heap = xa_load(&client->dev_heap_xa, 0); if (!heap) { XDNA_ERR(xdna, "The client dev heap object not exist"); mutex_unlock(&client->mm_lock); ret = -ENOENT; - goto free_priv; + goto free_entity; } drm_gem_object_get(to_gobj(heap)); mutex_unlock(&client->mm_lock); @@ -722,30 +793,16 @@ int aie2_hwctx_init(struct amdxdna_hwctx *hwctx) priv->cmd_buf[i] = abo; } - sched = &priv->sched; mutex_init(&priv->io_lock); fs_reclaim_acquire(GFP_KERNEL); might_lock(&priv->io_lock); fs_reclaim_release(GFP_KERNEL); - ret = drm_sched_init(sched, &args); - if (ret) { - XDNA_ERR(xdna, "Failed to init DRM scheduler. ret %d", ret); - goto free_cmd_bufs; - } - - ret = drm_sched_entity_init(&priv->entity, DRM_SCHED_PRIORITY_NORMAL, - &sched, 1, NULL); - if (ret) { - XDNA_ERR(xdna, "Failed to initial sched entiry. ret %d", ret); - goto free_sched; - } - ret = aie2_hwctx_col_list(hwctx); if (ret) { XDNA_ERR(xdna, "Create col list failed, ret %d", ret); - goto free_entity; + goto free_cmd_bufs; } ret = amdxdna_pm_resume_get_locked(xdna); @@ -791,10 +848,6 @@ int aie2_hwctx_init(struct amdxdna_hwctx *hwctx) amdxdna_pm_suspend_put(xdna); free_col_list: kfree(hwctx->col_list); -free_entity: - drm_sched_entity_destroy(&priv->entity); -free_sched: - drm_sched_fini(&priv->sched); free_cmd_bufs: for (i = 0; i < ARRAY_SIZE(priv->cmd_buf); i++) { if (!priv->cmd_buf[i]) @@ -805,6 +858,10 @@ int aie2_hwctx_init(struct amdxdna_hwctx *hwctx) amdxdna_gem_unpin(heap); put_heap: drm_gem_object_put(to_gobj(heap)); +free_entity: + drm_sched_entity_destroy(&priv->entity); +free_sched: + aie2_hwctx_sched_free(ndev, priv->sched); free_priv: kfree(priv); return ret; @@ -812,18 +869,20 @@ int aie2_hwctx_init(struct amdxdna_hwctx *hwctx) void aie2_hwctx_fini(struct amdxdna_hwctx *hwctx) { + struct amdxdna_dev_hdl *ndev; struct amdxdna_dev *xdna; int idx; xdna = hwctx->client->xdna; + ndev = xdna->dev_handle; XDNA_DBG(xdna, "%s sequence number %lld", hwctx->name, hwctx->priv->seq); aie2_hwctx_wait_for_idle(hwctx); /* Request fw to destroy hwctx and cancel the rest pending requests */ - drm_sched_stop(&hwctx->priv->sched, NULL); + drm_sched_stop(hwctx->priv->sched, NULL); aie2_release_resource(hwctx); - drm_sched_start(&hwctx->priv->sched, 0); + drm_sched_start(hwctx->priv->sched, 0); mutex_unlock(&xdna->dev_lock); drm_sched_entity_destroy(&hwctx->priv->entity); @@ -834,7 +893,7 @@ void aie2_hwctx_fini(struct amdxdna_hwctx *hwctx) atomic64_read(&hwctx->job_free_cnt)); mutex_lock(&xdna->dev_lock); - drm_sched_fini(&hwctx->priv->sched); + aie2_hwctx_sched_free(ndev, hwctx->priv->sched); aie2_ctx_syncobj_destroy(hwctx); for (idx = 0; idx < ARRAY_SIZE(hwctx->priv->cmd_buf); idx++) { diff --git a/drivers/accel/amdxdna/aie2_msg_priv.h b/drivers/accel/amdxdna/aie2_msg_priv.h index fd65a4236d49..8ed2b5701dcc 100644 --- a/drivers/accel/amdxdna/aie2_msg_priv.h +++ b/drivers/accel/amdxdna/aie2_msg_priv.h @@ -530,6 +530,7 @@ enum aie2_dev_revision { AIE2_DEV_REVISION_GPT1, AIE2_DEV_REVISION_GPT2, AIE2_DEV_REVISION_GPT3, + AIE2_DEV_REVISION_GRGH, AIE2_DEV_REVISION_UNKN, }; diff --git a/drivers/accel/amdxdna/aie2_pci.c b/drivers/accel/amdxdna/aie2_pci.c index daec1f6b4907..7a4314ca843b 100644 --- a/drivers/accel/amdxdna/aie2_pci.c +++ b/drivers/accel/amdxdna/aie2_pci.c @@ -503,10 +503,16 @@ static int aie2_init(struct amdxdna_dev *xdna) ndev->priv = xdna->dev_info->dev_priv; ndev->aie.xdna = xdna; + ret = aie2_hwctx_sched_init(ndev); + if (ret) + return ret; + for (i = 0; i < ARRAY_SIZE(npu_fw); i++) { fw_full_path = kasprintf(GFP_KERNEL, "%s%s", ndev->priv->fw_path, npu_fw[i]); - if (!fw_full_path) - return -ENOMEM; + if (!fw_full_path) { + ret = -ENOMEM; + goto free_hwctx_sched; + } ret = firmware_request_nowarn(&fw, fw_full_path, &pdev->dev); kfree(fw_full_path); @@ -519,7 +525,7 @@ static int aie2_init(struct amdxdna_dev *xdna) if (ret) { XDNA_ERR(xdna, "failed to request_firmware %s, ret %d", ndev->priv->fw_path, ret); - return ret; + goto free_hwctx_sched; } ret = pcim_enable_device(pdev); @@ -623,6 +629,8 @@ static int aie2_init(struct amdxdna_dev *xdna) aie2_hw_stop(xdna); release_fw: release_firmware(fw); +free_hwctx_sched: + aie2_hwctx_sched_fini(ndev); return ret; } @@ -631,6 +639,7 @@ static void aie2_fini(struct amdxdna_dev *xdna) { amdxdna_pm_fini(xdna); aie2_hw_stop(xdna); + aie2_hwctx_sched_fini(xdna->dev_handle); } static int aie2_get_aie_status(struct amdxdna_client *client, diff --git a/drivers/accel/amdxdna/aie2_pci.h b/drivers/accel/amdxdna/aie2_pci.h index ea1dac106400..2c7019bd26b5 100644 --- a/drivers/accel/amdxdna/aie2_pci.h +++ b/drivers/accel/amdxdna/aie2_pci.h @@ -107,7 +107,7 @@ struct amdxdna_hwctx_priv { struct amdxdna_gem_obj *heap; void *mbox_chann; - struct drm_gpu_scheduler sched; + struct drm_gpu_scheduler *sched; struct drm_sched_entity entity; struct mutex io_lock; /* protect seq and cmd order */ @@ -152,6 +152,8 @@ struct amdxdna_dev_hdl { u32 total_col; struct amdxdna_drm_query_aie_version version; struct aie2_exec_msg_ops *exec_msg_ops; + struct drm_gpu_scheduler *hwctx_sched; + struct ida hwctx_sched_ida; /* power management and clock*/ enum amdxdna_power_mode_type pw_mode; @@ -294,6 +296,8 @@ int aie2_update_prop_time_quota(struct amdxdna_dev_hdl *ndev, u32 us); /* aie2_hwctx.c */ int aie2_hwctx_init(struct amdxdna_hwctx *hwctx); void aie2_hwctx_fini(struct amdxdna_hwctx *hwctx); +int aie2_hwctx_sched_init(struct amdxdna_dev_hdl *ndev); +void aie2_hwctx_sched_fini(struct amdxdna_dev_hdl *ndev); int aie2_hwctx_config(struct amdxdna_hwctx *hwctx, u32 type, u64 value, void *buf, u32 size); int aie2_hwctx_sync_debug_bo(struct amdxdna_hwctx *hwctx, u32 debug_bo_hdl); void aie2_hwctx_suspend(struct amdxdna_client *client); diff --git a/drivers/accel/amdxdna/amdxdna_mailbox.c b/drivers/accel/amdxdna/amdxdna_mailbox.c index cc8865f4e79c..05c3786de135 100644 --- a/drivers/accel/amdxdna/amdxdna_mailbox.c +++ b/drivers/accel/amdxdna/amdxdna_mailbox.c @@ -481,7 +481,7 @@ struct mailbox_channel *xdna_mailbox_alloc_channel(struct mailbox *mb) return NULL; INIT_WORK(&mb_chann->rx_work, mailbox_rx_worker); - mb_chann->work_q = create_singlethread_workqueue(MAILBOX_NAME); + mb_chann->work_q = alloc_ordered_workqueue(MAILBOX_NAME, WQ_MEM_RECLAIM); if (!mb_chann->work_q) { MB_ERR(mb_chann, "Create workqueue failed"); goto free_chann; diff --git a/drivers/accel/amdxdna/npu4_regs.c b/drivers/accel/amdxdna/npu4_regs.c index 15a161384625..c9648c8032ec 100644 --- a/drivers/accel/amdxdna/npu4_regs.c +++ b/drivers/accel/amdxdna/npu4_regs.c @@ -153,6 +153,7 @@ const struct amdxdna_rev_vbnv npu4_rev_vbnv_tbl[] = { { AIE2_DEV_REVISION_GPT1, "NPU Gorgon Point 1" }, { AIE2_DEV_REVISION_GPT2, "NPU Gorgon Point 2" }, { AIE2_DEV_REVISION_GPT3, "NPU Gorgon Point 3" }, + { AIE2_DEV_REVISION_GRGH, "NPU Gorgon Halo" }, { 0 } }; diff --git a/drivers/accel/ethosu/ethosu_drv.c b/drivers/accel/ethosu/ethosu_drv.c index 8108622de258..4a24bbd2bb61 100644 --- a/drivers/accel/ethosu/ethosu_drv.c +++ b/drivers/accel/ethosu/ethosu_drv.c @@ -12,10 +12,10 @@ #include #include -#include #include #include #include +#include #include #include "ethosu_drv.h" diff --git a/drivers/accel/ivpu/ivpu_fw.c b/drivers/accel/ivpu/ivpu_fw.c index b78b7c35cd9b..f9ddaa2420c4 100644 --- a/drivers/accel/ivpu/ivpu_fw.c +++ b/drivers/accel/ivpu/ivpu_fw.c @@ -364,6 +364,25 @@ static void ivpu_fw_release(struct ivpu_device *vdev) } +static void ivpu_fw_mem_fini(struct ivpu_device *vdev) +{ + struct ivpu_fw_info *fw = vdev->fw; + + ivpu_bo_free(fw->mem_shave_nn); + ivpu_bo_free(fw->mem_log_verb); + ivpu_bo_free(fw->mem_log_crit); + ivpu_bo_free(fw->mem); + ivpu_bo_free(fw->mem_fw_ver); + ivpu_bo_free(fw->mem_bp); + + fw->mem_shave_nn = NULL; + fw->mem_log_verb = NULL; + fw->mem_log_crit = NULL; + fw->mem = NULL; + fw->mem_fw_ver = NULL; + fw->mem_bp = NULL; +} + static int ivpu_fw_mem_init(struct ivpu_device *vdev) { struct ivpu_fw_info *fw = vdev->fw; @@ -382,7 +401,7 @@ static int ivpu_fw_mem_init(struct ivpu_device *vdev) if (!fw->mem_fw_ver) { ivpu_err(vdev, "Failed to create firmware version memory buffer\n"); ret = -ENOMEM; - goto err_free_bp; + goto err_free; } fw->mem = ivpu_bo_create_runtime(vdev, fw->runtime_addr, fw->runtime_size, @@ -390,14 +409,14 @@ static int ivpu_fw_mem_init(struct ivpu_device *vdev) if (!fw->mem) { ivpu_err(vdev, "Failed to create firmware runtime memory buffer\n"); ret = -ENOMEM; - goto err_free_fw_ver; + goto err_free; } ret = ivpu_mmu_context_set_pages_ro(vdev, &vdev->gctx, fw->read_only_addr, fw->read_only_size); if (ret) { ivpu_err(vdev, "Failed to set firmware image read-only\n"); - goto err_free_fw_mem; + goto err_free; } fw->mem_log_crit = ivpu_bo_create_global(vdev, IVPU_FW_CRITICAL_BUFFER_SIZE, @@ -405,7 +424,7 @@ static int ivpu_fw_mem_init(struct ivpu_device *vdev) if (!fw->mem_log_crit) { ivpu_err(vdev, "Failed to create critical log buffer\n"); ret = -ENOMEM; - goto err_free_fw_mem; + goto err_free; } if (ivpu_fw_log_level <= IVPU_FW_LOG_INFO) @@ -418,7 +437,7 @@ static int ivpu_fw_mem_init(struct ivpu_device *vdev) if (!fw->mem_log_verb) { ivpu_err(vdev, "Failed to create verbose log buffer\n"); ret = -ENOMEM; - goto err_free_log_crit; + goto err_free; } if (fw->shave_nn_size) { @@ -427,47 +446,17 @@ static int ivpu_fw_mem_init(struct ivpu_device *vdev) if (!fw->mem_shave_nn) { ivpu_err(vdev, "Failed to create shavenn buffer\n"); ret = -ENOMEM; - goto err_free_log_verb; + goto err_free; } } return 0; -err_free_log_verb: - ivpu_bo_free(fw->mem_log_verb); -err_free_log_crit: - ivpu_bo_free(fw->mem_log_crit); -err_free_fw_mem: - ivpu_bo_free(fw->mem); -err_free_fw_ver: - ivpu_bo_free(fw->mem_fw_ver); -err_free_bp: - ivpu_bo_free(fw->mem_bp); +err_free: + ivpu_fw_mem_fini(vdev); return ret; } -static void ivpu_fw_mem_fini(struct ivpu_device *vdev) -{ - struct ivpu_fw_info *fw = vdev->fw; - - if (fw->mem_shave_nn) { - ivpu_bo_free(fw->mem_shave_nn); - fw->mem_shave_nn = NULL; - } - - ivpu_bo_free(fw->mem_log_verb); - ivpu_bo_free(fw->mem_log_crit); - ivpu_bo_free(fw->mem); - ivpu_bo_free(fw->mem_fw_ver); - ivpu_bo_free(fw->mem_bp); - - fw->mem_log_verb = NULL; - fw->mem_log_crit = NULL; - fw->mem = NULL; - fw->mem_fw_ver = NULL; - fw->mem_bp = NULL; -} - int ivpu_fw_init(struct ivpu_device *vdev) { int ret; diff --git a/drivers/accel/ivpu/ivpu_gem.c b/drivers/accel/ivpu/ivpu_gem.c index 4f2005a8d496..c521a53f89bb 100644 --- a/drivers/accel/ivpu/ivpu_gem.c +++ b/drivers/accel/ivpu/ivpu_gem.c @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include "ivpu_drv.h" #include "ivpu_fw.h" @@ -471,6 +471,9 @@ struct ivpu_bo *ivpu_bo_create_global(struct ivpu_device *vdev, u64 size, u32 fl void ivpu_bo_free(struct ivpu_bo *bo) { + if (!bo) + return; + struct iosys_map map = IOSYS_MAP_INIT_VADDR(bo->base.vaddr); if (bo->flags & DRM_IVPU_BO_MAPPABLE) { diff --git a/drivers/accel/ivpu/ivpu_ipc.c b/drivers/accel/ivpu/ivpu_ipc.c index 8e960293b77a..79d34f9b1f07 100644 --- a/drivers/accel/ivpu/ivpu_ipc.c +++ b/drivers/accel/ivpu/ivpu_ipc.c @@ -509,7 +509,7 @@ int ivpu_ipc_init(struct ivpu_device *vdev) if (!ipc->mem_rx) { ivpu_err(vdev, "Failed to allocate mem_rx\n"); ret = -ENOMEM; - goto err_free_tx; + goto err_free_bo; } ipc->mm_tx = devm_gen_pool_create(vdev->drm.dev, __ffs(IVPU_IPC_ALIGNMENT), @@ -517,13 +517,13 @@ int ivpu_ipc_init(struct ivpu_device *vdev) if (IS_ERR(ipc->mm_tx)) { ret = PTR_ERR(ipc->mm_tx); ivpu_err(vdev, "Failed to create gen pool, %pe\n", ipc->mm_tx); - goto err_free_rx; + goto err_free_bo; } ret = gen_pool_add(ipc->mm_tx, ipc->mem_tx->vpu_addr, ivpu_bo_size(ipc->mem_tx), -1); if (ret) { ivpu_err(vdev, "gen_pool_add failed, ret %d\n", ret); - goto err_free_rx; + goto err_free_bo; } spin_lock_init(&ipc->cons_lock); @@ -532,14 +532,13 @@ int ivpu_ipc_init(struct ivpu_device *vdev) ret = drmm_mutex_init(&vdev->drm, &ipc->lock); if (ret) { ivpu_err(vdev, "Failed to initialize ipc->lock, ret %d\n", ret); - goto err_free_rx; + goto err_free_bo; } ivpu_ipc_reset(vdev); return 0; -err_free_rx: +err_free_bo: ivpu_bo_free(ipc->mem_rx); -err_free_tx: ivpu_bo_free(ipc->mem_tx); err_destroy_cache: kmem_cache_destroy(ipc->rx_msg_cache); diff --git a/drivers/accel/ivpu/ivpu_job.c b/drivers/accel/ivpu/ivpu_job.c index 96023221eb55..bfdee29cd91c 100644 --- a/drivers/accel/ivpu/ivpu_job.c +++ b/drivers/accel/ivpu/ivpu_job.c @@ -64,10 +64,8 @@ static int ivpu_preemption_buffers_create(struct ivpu_device *vdev, static void ivpu_preemption_buffers_free(struct ivpu_device *vdev, struct ivpu_file_priv *file_priv, struct ivpu_cmdq *cmdq) { - if (cmdq->primary_preempt_buf) - ivpu_bo_free(cmdq->primary_preempt_buf); - if (cmdq->secondary_preempt_buf) - ivpu_bo_free(cmdq->secondary_preempt_buf); + ivpu_bo_free(cmdq->primary_preempt_buf); + ivpu_bo_free(cmdq->secondary_preempt_buf); } static int ivpu_preemption_job_init(struct ivpu_device *vdev, struct ivpu_file_priv *file_priv, diff --git a/drivers/accel/ivpu/ivpu_ms.c b/drivers/accel/ivpu/ivpu_ms.c index cd176e77b9a0..489ab51d3341 100644 --- a/drivers/accel/ivpu/ivpu_ms.c +++ b/drivers/accel/ivpu/ivpu_ms.c @@ -69,7 +69,7 @@ int ivpu_ms_start_ioctl(struct drm_device *dev, void *data, struct drm_file *fil ret = ivpu_jsm_metric_streamer_info(vdev, ms->mask, 0, 0, &sample_size, NULL); if (ret) - goto err_free_ms; + goto err_free; buf_size = PAGE_ALIGN((u64)args->read_period_samples * sample_size * MS_READ_PERIOD_MULTIPLIER * MS_NUM_BUFFERS); @@ -77,14 +77,14 @@ int ivpu_ms_start_ioctl(struct drm_device *dev, void *data, struct drm_file *fil ivpu_dbg(vdev, IOCTL, "Requested MS buffer size %llu exceeds range size %llu\n", buf_size, ivpu_hw_range_size(&vdev->hw->ranges.global)); ret = -EINVAL; - goto err_free_ms; + goto err_free; } ms->bo = ivpu_bo_create_global(vdev, buf_size, DRM_IVPU_BO_CACHED | DRM_IVPU_BO_MAPPABLE); if (!ms->bo) { ivpu_dbg(vdev, IOCTL, "Failed to allocate MS buffer (size %llu)\n", buf_size); ret = -ENOMEM; - goto err_free_ms; + goto err_free; } ms->buff_size = ivpu_bo_size(ms->bo) / MS_NUM_BUFFERS; @@ -96,16 +96,15 @@ int ivpu_ms_start_ioctl(struct drm_device *dev, void *data, struct drm_file *fil ret = ivpu_jsm_metric_streamer_start(vdev, ms->mask, args->sampling_period_ns, ms->active_buff_vpu_addr, ms->buff_size); if (ret) - goto err_free_bo; + goto err_free; args->sample_size = sample_size; args->max_data_size = ivpu_bo_size(ms->bo); list_add_tail(&ms->ms_instance_node, &file_priv->ms_instance_list); goto unlock; -err_free_bo: +err_free: ivpu_bo_free(ms->bo); -err_free_ms: kfree(ms); unlock: mutex_unlock(&file_priv->ms_lock); @@ -322,10 +321,8 @@ void ivpu_ms_cleanup(struct ivpu_file_priv *file_priv) mutex_lock(&file_priv->ms_lock); - if (file_priv->ms_info_bo) { - ivpu_bo_free(file_priv->ms_info_bo); - file_priv->ms_info_bo = NULL; - } + ivpu_bo_free(file_priv->ms_info_bo); + file_priv->ms_info_bo = NULL; list_for_each_entry_safe(ms, tmp, &file_priv->ms_instance_list, ms_instance_node) free_instance(file_priv, ms); diff --git a/drivers/accel/rocket/rocket_gem.c b/drivers/accel/rocket/rocket_gem.c index a5fffa51ff35..d981c6a93ff1 100644 --- a/drivers/accel/rocket/rocket_gem.c +++ b/drivers/accel/rocket/rocket_gem.c @@ -3,7 +3,7 @@ #include #include -#include +#include #include #include #include diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig index 65d46dfa7266..61111d50b1c6 100644 --- a/drivers/gpu/drm/Kconfig +++ b/drivers/gpu/drm/Kconfig @@ -46,7 +46,6 @@ config DRM_KMS_HELPER tristate depends on DRM select DRM_PANIC_HELPER if DRM_PANIC - select FB_CORE if DRM_FBDEV_EMULATION help CRTC helpers for KMS drivers. @@ -256,7 +255,7 @@ config DRM_TTM_HELPER tristate depends on DRM select DRM_TTM - select DRM_KMS_HELPER if DRM_FBDEV_EMULATION + select DRM_CLIENT_LIB if DRM_FBDEV_EMULATION select FB_CORE if DRM_FBDEV_EMULATION select FB_SYSMEM_HELPERS_DEFERRED if DRM_FBDEV_EMULATION help @@ -265,7 +264,7 @@ config DRM_TTM_HELPER config DRM_GEM_DMA_HELPER tristate depends on DRM - select DRM_KMS_HELPER if DRM_FBDEV_EMULATION + select DRM_CLIENT_LIB if DRM_FBDEV_EMULATION select FB_CORE if DRM_FBDEV_EMULATION select FB_DMAMEM_HELPERS_DEFERRED if DRM_FBDEV_EMULATION help @@ -274,7 +273,7 @@ config DRM_GEM_DMA_HELPER config DRM_GEM_SHMEM_HELPER tristate depends on DRM && MMU - select DRM_KMS_HELPER if DRM_FBDEV_EMULATION + select DRM_CLIENT_LIB if DRM_FBDEV_EMULATION select FB_CORE if DRM_FBDEV_EMULATION select FB_SYSMEM_HELPERS_DEFERRED if DRM_FBDEV_EMULATION help diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile index f0c340aa2ec6..2c6bc093a923 100644 --- a/drivers/gpu/drm/Makefile +++ b/drivers/gpu/drm/Makefile @@ -68,6 +68,7 @@ drm-y := \ drm_rect.o \ drm_syncobj.o \ drm_sysfs.o \ + drm_timeout.o \ drm_trace_points.o \ drm_vblank.o \ drm_vblank_work.o \ @@ -79,7 +80,6 @@ drm-$(CONFIG_DRM_CLIENT) += \ drm_client_modeset.o \ drm_client_sysrq.o drm-$(CONFIG_COMPAT) += drm_ioc32.o -drm-$(CONFIG_DRM_PANEL) += drm_panel.o drm-$(CONFIG_OF) += drm_of.o drm-$(CONFIG_PCI) += drm_pci.o drm-$(CONFIG_DEBUG_FS) += \ @@ -95,6 +95,7 @@ drm-$(CONFIG_DRM_DRAW) += drm_draw.o drm-$(CONFIG_DRM_RAS) += drm_ras.o drm_ras_nl.o drm_ras_genl_family.o obj-$(CONFIG_DRM) += drm.o +obj-$(CONFIG_DRM_PANEL) += drm_panel.o obj-$(CONFIG_DRM_PANEL_ORIENTATION_QUIRKS) += drm_panel_orientation_quirks.o obj-$(CONFIG_DRM_PANEL_BACKLIGHT_QUIRKS) += drm_panel_backlight_quirks.o @@ -155,10 +156,8 @@ drm_kms_helper-y := \ drm_self_refresh_helper.o \ drm_simple_kms_helper.o \ drm_vblank_helper.o -drm_kms_helper-$(CONFIG_DRM_PANEL_BRIDGE) += bridge/panel.o drm_kms_helper-$(CONFIG_DRM_PANIC_HELPER) += drm_panic_helper.o drm_kms_helper-$(CONFIG_DRM_PANIC_SCREEN_QR_CODE) += drm_panic_helper_qr.o -drm_kms_helper-$(CONFIG_DRM_FBDEV_EMULATION) += drm_fb_helper.o obj-$(CONFIG_DRM_KMS_HELPER) += drm_kms_helper.o # diff --git a/drivers/gpu/drm/adp/adp-mipi.c b/drivers/gpu/drm/adp/adp-mipi.c index 232bb9539423..956533870781 100644 --- a/drivers/gpu/drm/adp/adp-mipi.c +++ b/drivers/gpu/drm/adp/adp-mipi.c @@ -8,6 +8,7 @@ #include #include #include +#include #define DSI_GEN_HDR 0x6c #define DSI_GEN_PLD_DATA 0x70 diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c index 59ea338b554c..126bfd9bb89e 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c @@ -38,11 +38,11 @@ #include #include +#include #include #include #include #include -#include #include #include #include diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c index 56eaf05899a8..7fa321c41f63 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c @@ -25,7 +25,6 @@ * Alex Deucher * Jerome Glisse */ -#include #include #include #include @@ -40,6 +39,7 @@ #include #include #include +#include #include "amdgpu.h" #include "amdgpu_display.h" @@ -652,23 +652,11 @@ int amdgpu_gem_mmap_ioctl(struct drm_device *dev, void *data, */ unsigned long amdgpu_gem_timeout(uint64_t timeout_ns) { - unsigned long timeout_jiffies; - ktime_t timeout; - - /* clamp timeout if it's to large */ - if (((int64_t)timeout_ns) < 0) + /* Map anything that doesn't fit in a s64 to an infinite wait */ + if (timeout_ns > S64_MAX) return MAX_SCHEDULE_TIMEOUT; - timeout = ktime_sub(ns_to_ktime(timeout_ns), ktime_get()); - if (ktime_to_ns(timeout) < 0) - return 0; - - timeout_jiffies = nsecs_to_jiffies(ktime_to_ns(timeout)); - /* clamp timeout to avoid unsigned-> signed overflow */ - if (timeout_jiffies > MAX_SCHEDULE_TIMEOUT) - return MAX_SCHEDULE_TIMEOUT - 1; - - return timeout_jiffies; + return drm_timeout_abs_to_jiffies(timeout_ns); } int amdgpu_gem_wait_idle_ioctl(struct drm_device *dev, void *data, diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c index f2f179421c4d..51a7a4091376 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c @@ -28,8 +28,8 @@ #include "amdgpu.h" #include +#include #include -#include #include "amdgpu_uvd.h" #include "amdgpu_vce.h" #include "atom.h" diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c index 2b0686bcc7fd..cd5cbb851075 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -98,7 +98,6 @@ #include #include #include -#include #include #include #include diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_backlight.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_backlight.c index 45e1732a5b04..8dc57903de9e 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_backlight.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_backlight.c @@ -41,7 +41,7 @@ #include #include #include -#include +#include #include diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c index 2a63a1c9b79d..25f168a8ea31 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c @@ -62,7 +62,6 @@ #include #include #include -#include #include #include #include diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c index 3d81b413efae..0fd069fc3386 100644 --- a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c +++ b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c @@ -15,6 +15,7 @@ #include #include #include +#include #include "komeda_dev.h" #include "komeda_kms.h" diff --git a/drivers/gpu/drm/armada/armada_fbdev.c b/drivers/gpu/drm/armada/armada_fbdev.c index 8bbae94804f8..f35afec2125f 100644 --- a/drivers/gpu/drm/armada/armada_fbdev.c +++ b/drivers/gpu/drm/armada/armada_fbdev.c @@ -9,9 +9,9 @@ #include #include +#include #include #include -#include #include #include diff --git a/drivers/gpu/drm/bridge/Kconfig b/drivers/gpu/drm/bridge/Kconfig index 837db36cdf48..c7da6b02d7b6 100644 --- a/drivers/gpu/drm/bridge/Kconfig +++ b/drivers/gpu/drm/bridge/Kconfig @@ -87,7 +87,6 @@ config DRM_FSL_LDB depends on OF depends on ARCH_MXC || COMPILE_TEST select DRM_KMS_HELPER - select DRM_PANEL_BRIDGE help Support for i.MX8MP DPI-to-LVDS on-SoC encoder. @@ -151,6 +150,7 @@ config DRM_LONTIUM_LT8912B config DRM_LONTIUM_LT9211 tristate "Lontium LT9211 DSI/LVDS/DPI bridge" depends on OF + select DRM_PANEL select DRM_PANEL_BRIDGE select DRM_KMS_HELPER select DRM_MIPI_DSI @@ -259,7 +259,7 @@ config DRM_NXP_PTN3460 tristate "NXP PTN3460 DP/LVDS bridge" depends on OF select DRM_KMS_HELPER - select DRM_PANEL + select DRM_PANEL_BRIDGE help NXP PTN3460 eDP-LVDS bridge chip driver. @@ -276,7 +276,7 @@ config DRM_OF_DISPLAY_MODE_BRIDGE config DRM_PARADE_PS8622 tristate "Parade eDP/LVDS bridge" depends on OF - select DRM_PANEL + select DRM_PANEL_BRIDGE select DRM_KMS_HELPER select BACKLIGHT_CLASS_DEVICE help @@ -302,7 +302,6 @@ config DRM_SAMSUNG_DSIM depends on OF && HAS_IOMEM select DRM_KMS_HELPER select DRM_MIPI_DSI - select DRM_PANEL_BRIDGE select GENERIC_PHY select GENERIC_PHY_MIPI_DPHY help @@ -350,7 +349,6 @@ config DRM_SOLOMON_SSD2825 depends on SPI_MASTER && OF select DRM_MIPI_DSI select DRM_KMS_HELPER - select DRM_PANEL help Say Y here if you want support for the Solomon SSD2825 RGB/DSI SPI bridge driver. @@ -388,7 +386,7 @@ config DRM_TOSHIBA_TC358764 depends on OF select DRM_MIPI_DSI select DRM_KMS_HELPER - select DRM_PANEL + select DRM_PANEL_BRIDGE help Toshiba TC358764 DSI/LVDS bridge driver. @@ -400,7 +398,6 @@ config DRM_TOSHIBA_TC358767 select DRM_KMS_HELPER select REGMAP_I2C select DRM_MIPI_DSI - select DRM_PANEL help Toshiba TC358767 eDP bridge chip driver. @@ -409,7 +406,6 @@ config DRM_TOSHIBA_TC358768 depends on OF select DRM_KMS_HELPER select REGMAP_I2C - select DRM_PANEL select DRM_MIPI_DSI select VIDEOMODE_HELPERS help @@ -422,16 +418,17 @@ config DRM_TOSHIBA_TC358775 select DRM_DISPLAY_HELPER select DRM_KMS_HELPER select REGMAP_I2C - select DRM_PANEL + select DRM_PANEL_BRIDGE select DRM_MIPI_DSI help Toshiba TC358775 DSI/LVDS bridge chip driver. config DRM_TI_DLPC3433 tristate "TI DLPC3433 Display controller" - depends on DRM && DRM_PANEL + depends on DRM depends on OF select DRM_MIPI_DSI + select DRM_PANEL_BRIDGE help TI DLPC3433 is a MIPI DSI based display controller bridge for processing high resolution DMD based projectors. @@ -494,6 +491,7 @@ config DRM_WAVESHARE_BRIDGE tristate "Waveshare DSI bridge" depends on OF depends on BACKLIGHT_CLASS_DEVICE + select DRM_PANEL select DRM_PANEL_BRIDGE select DRM_KMS_HELPER select DRM_MIPI_DSI diff --git a/drivers/gpu/drm/bridge/analogix/Kconfig b/drivers/gpu/drm/bridge/analogix/Kconfig index 57bb2daa5aaf..5672d83cb4a1 100644 --- a/drivers/gpu/drm/bridge/analogix/Kconfig +++ b/drivers/gpu/drm/bridge/analogix/Kconfig @@ -6,6 +6,7 @@ config DRM_ANALOGIX_ANX6345 select DRM_DISPLAY_DP_HELPER select DRM_DISPLAY_HELPER select DRM_KMS_HELPER + select DRM_PANEL select REGMAP_I2C help ANX6345 is an ultra-low power Full-HD DisplayPort/eDP diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c index 18e76d1e78e1..6df6963740d2 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c @@ -29,7 +29,6 @@ #include #include #include -#include #include #include @@ -1567,15 +1566,6 @@ int analogix_dp_bind(struct analogix_dp_device *dp, struct drm_device *drm_dev) if (ret) goto err_unregister_aux; - if (dp->plat_data->panel) { - dp->plat_data->next_bridge = devm_drm_panel_bridge_add(dp->dev, - dp->plat_data->panel); - if (IS_ERR(dp->plat_data->next_bridge)) { - ret = PTR_ERR(dp->plat_data->next_bridge); - goto err_unregister_aux; - } - } - ret = drm_bridge_attach(dp->encoder, bridge, NULL, DRM_BRIDGE_ATTACH_NO_CONNECTOR); if (ret) { DRM_ERROR("failed to create bridge (%d)\n", ret); @@ -1647,6 +1637,11 @@ struct drm_dp_aux *analogix_dp_get_aux(struct analogix_dp_device *dp) } EXPORT_SYMBOL_GPL(analogix_dp_get_aux); +static void analogix_dp_put_bridge(void *data) +{ + drm_bridge_put(data); +} + static int analogix_dp_aux_done_probing(struct drm_dp_aux *aux) { struct analogix_dp_device *dp = to_dp(aux); @@ -1655,14 +1650,25 @@ static int analogix_dp_aux_done_probing(struct drm_dp_aux *aux) int ret; /* - * If drm_of_find_panel_or_bridge() returns -ENODEV, there may be no valid panel - * or bridge nodes. The driver should go on for the driver-free bridge or the DP - * mode applications. + * If of_drm_get_bridge_by_endpoint() returns -ENODEV, there may be no + * valid panel or bridge nodes. The driver should go on for the + * driver-free bridge or the DP mode applications. */ - ret = drm_of_find_panel_or_bridge(dp->dev->of_node, port, 0, - &plat_data->panel, &plat_data->next_bridge); - if (ret && ret != -ENODEV) - return ret; + plat_data->next_bridge = of_drm_get_bridge_by_endpoint(dp->dev->of_node, + port, 0); + if (IS_ERR(plat_data->next_bridge)) { + if (PTR_ERR(plat_data->next_bridge) == -ENODEV) + plat_data->next_bridge = NULL; + else + return PTR_ERR(plat_data->next_bridge); + } + + if (plat_data->next_bridge) { + ret = devm_add_action_or_reset(dp->dev, analogix_dp_put_bridge, + plat_data->next_bridge); + if (ret) + return ret; + } return component_add(dp->dev, plat_data->ops); } diff --git a/drivers/gpu/drm/bridge/aux-bridge.c b/drivers/gpu/drm/bridge/aux-bridge.c index 169939d23310..90f76bb529cc 100644 --- a/drivers/gpu/drm/bridge/aux-bridge.c +++ b/drivers/gpu/drm/bridge/aux-bridge.c @@ -12,6 +12,7 @@ #include #include #include +#include static DEFINE_IDA(drm_aux_bridge_ida); diff --git a/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c b/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c index c3e466ded84a..1e28ea579b06 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c @@ -7,6 +7,7 @@ #include #include +#include #include #include