diff --git a/arch/arm/boot/dts/overlays/Makefile b/arch/arm/boot/dts/overlays/Makefile index 398c8d65de1940..261dfb885a0362 100644 --- a/arch/arm/boot/dts/overlays/Makefile +++ b/arch/arm/boot/dts/overlays/Makefile @@ -343,6 +343,7 @@ dtbo-$(CONFIG_ARCH_BCM2835) += \ vc4-kms-dsi-ili9881-7inch.dtbo \ vc4-kms-dsi-lt070me05000.dtbo \ vc4-kms-dsi-lt070me05000-v2.dtbo \ + vc4-kms-dsi-tdo-panel.dtbo \ vc4-kms-dsi-waveshare-800x480.dtbo \ vc4-kms-dsi-waveshare-panel.dtbo \ vc4-kms-dsi-waveshare-panel-v2.dtbo \ diff --git a/arch/arm/boot/dts/overlays/README b/arch/arm/boot/dts/overlays/README index 7ab189972291e7..fd84e0256b6c2b 100644 --- a/arch/arm/boot/dts/overlays/README +++ b/arch/arm/boot/dts/overlays/README @@ -5887,6 +5887,18 @@ Load: dtoverlay=vc4-kms-dsi-lt070me05000-v2 Params: +Name: vc4-kms-dsi-tdo-panel +Info: Enable the Tdo DSI screen,keep adding. + Requires vc4-kms-v3d to be loaded. +Load: dtoverlay=vc4-kms-dsi-tdo-panel,= +Params: tl034wvs03 4.0" 480x480 2lane + tl040wvs17 4.0" 480x480 2lane + tl040hds31 4.0" 720x720 2lane + rotation Display rotation {0,90,180,270} + dsi0 Use DSI0 and i2c_csi_dsi0 (rather than + the default DSI1 and i2c_csi_dsi). + + Name: vc4-kms-dsi-waveshare-800x480 Info: Enable the Waveshare 4.3" 800x480 DSI screen. It tries to look like the Pi 7" display, but won't accept some of the diff --git a/arch/arm/boot/dts/overlays/vc4-kms-dsi-tdo-panel-overlay.dts b/arch/arm/boot/dts/overlays/vc4-kms-dsi-tdo-panel-overlay.dts new file mode 100644 index 00000000000000..a151190af7bf62 --- /dev/null +++ b/arch/arm/boot/dts/overlays/vc4-kms-dsi-tdo-panel-overlay.dts @@ -0,0 +1,69 @@ +/* + * Device Tree overlay for TDO DSI Touchscreens + * + */ + +/dts-v1/; +/plugin/; + +/ { + compatible = "brcm,bcm2835"; + + dsi_frag: fragment@0 { + target = <&dsi1>; + __overlay__ { + #address-cells = <1>; + #size-cells = <0>; + status = "okay"; + port { + dsi_out: endpoint { + remote-endpoint = <&panel_in>; + }; + }; + + panel: panel_dsi1@0 { + compatible = "tdo,4.0-dsi-tl040wvs17"; + status = "okay"; + reg = <0>; + reset-gpios = <&gpio 47 1>; + port { + panel_in: endpoint { + remote-endpoint = <&dsi_out>; + }; + }; + }; + }; + }; + + i2c_frag: fragment@1 { + target = <&i2c_csi_dsi>; + i2cbus: __overlay__ { + #address-cells = <1>; + #size-cells = <0>; + status = "okay"; + }; + }; + + fragment@2 { + target = <&i2c0if>; + __overlay__ { + status = "okay"; + }; + }; + + fragment@3 { + target = <&i2c0mux>; + __overlay__ { + status = "okay"; + }; + }; + + __overrides__ { + tl034wvs03 = <&panel>, "compatible=tdo,4.0-dsi-tl034wvs03"; + tl040wvs17 = <&panel>, "compatible=tdo,4.0-dsi-tl040wvs17"; + tl040hds31 = <&panel>, "compatible=tdo,4.0-dsi-tl040hds31"; + rotation = <&panel>, "rotation:0"; + dsi0 = <&dsi_frag>, "target:0=",<&dsi0>, + <&i2c_frag>, "target:0=",<&i2c_csi_dsi0>; + }; +}; diff --git a/arch/arm/configs/bcm2709_defconfig b/arch/arm/configs/bcm2709_defconfig index eaf62d36314b96..059182de80ea47 100644 --- a/arch/arm/configs/bcm2709_defconfig +++ b/arch/arm/configs/bcm2709_defconfig @@ -983,6 +983,7 @@ CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN=m CONFIG_DRM_PANEL_SITRONIX_ST7701=m CONFIG_DRM_PANEL_SIMPLE=m CONFIG_DRM_PANEL_TPO_Y17P=m +CONFIG_DRM_PANEL_TDO_DSI_V1=m CONFIG_DRM_PANEL_WAVESHARE_TOUCHSCREEN=m CONFIG_DRM_PANEL_WAVESHARE_TOUCHSCREEN_V2=m CONFIG_DRM_DISPLAY_CONNECTOR=m diff --git a/arch/arm/configs/bcmrpi_defconfig b/arch/arm/configs/bcmrpi_defconfig index 12c9f5051eeb71..728216544d6038 100644 --- a/arch/arm/configs/bcmrpi_defconfig +++ b/arch/arm/configs/bcmrpi_defconfig @@ -976,6 +976,7 @@ CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN=m CONFIG_DRM_PANEL_SITRONIX_ST7701=m CONFIG_DRM_PANEL_SIMPLE=m CONFIG_DRM_PANEL_TPO_Y17P=m +CONFIG_DRM_PANEL_TDO_DSI_V1=m CONFIG_DRM_PANEL_WAVESHARE_TOUCHSCREEN=m CONFIG_DRM_PANEL_WAVESHARE_TOUCHSCREEN_V2=m CONFIG_DRM_DISPLAY_CONNECTOR=m diff --git a/arch/arm64/configs/bcm2711_defconfig b/arch/arm64/configs/bcm2711_defconfig index f7081ebff6bd2f..3ca12507d0f683 100644 --- a/arch/arm64/configs/bcm2711_defconfig +++ b/arch/arm64/configs/bcm2711_defconfig @@ -1081,6 +1081,7 @@ CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN=m CONFIG_DRM_PANEL_SITRONIX_ST7701=m CONFIG_DRM_PANEL_SIMPLE=m CONFIG_DRM_PANEL_TPO_Y17P=m +CONFIG_DRM_PANEL_TDO_DSI_V1=m CONFIG_DRM_PANEL_WAVESHARE_TOUCHSCREEN=m CONFIG_DRM_PANEL_WAVESHARE_TOUCHSCREEN_V2=m CONFIG_DRM_DISPLAY_CONNECTOR=m diff --git a/arch/arm64/configs/bcm2711_rt_defconfig b/arch/arm64/configs/bcm2711_rt_defconfig index c3842d841a445a..a90c06af912be9 100644 --- a/arch/arm64/configs/bcm2711_rt_defconfig +++ b/arch/arm64/configs/bcm2711_rt_defconfig @@ -1078,6 +1078,7 @@ CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN=m CONFIG_DRM_PANEL_SITRONIX_ST7701=m CONFIG_DRM_PANEL_SIMPLE=m CONFIG_DRM_PANEL_TPO_Y17P=m +CONFIG_DRM_PANEL_TDO_DSI_V1=m CONFIG_DRM_PANEL_WAVESHARE_TOUCHSCREEN=m CONFIG_DRM_PANEL_WAVESHARE_TOUCHSCREEN_V2=m CONFIG_DRM_DISPLAY_CONNECTOR=m diff --git a/arch/arm64/configs/bcm2712_defconfig b/arch/arm64/configs/bcm2712_defconfig index f873143ea5ffb5..1d27063139c6d6 100644 --- a/arch/arm64/configs/bcm2712_defconfig +++ b/arch/arm64/configs/bcm2712_defconfig @@ -1083,6 +1083,7 @@ CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN=m CONFIG_DRM_PANEL_SITRONIX_ST7701=m CONFIG_DRM_PANEL_SIMPLE=m CONFIG_DRM_PANEL_TPO_Y17P=m +CONFIG_DRM_PANEL_TDO_DSI_V1=m CONFIG_DRM_PANEL_WAVESHARE_TOUCHSCREEN=m CONFIG_DRM_PANEL_WAVESHARE_TOUCHSCREEN_V2=m CONFIG_DRM_DISPLAY_CONNECTOR=m diff --git a/drivers/gpu/drm/panel/Kconfig b/drivers/gpu/drm/panel/Kconfig index edaaf7eb2f0948..7dafffe00f24b5 100644 --- a/drivers/gpu/drm/panel/Kconfig +++ b/drivers/gpu/drm/panel/Kconfig @@ -1087,6 +1087,20 @@ config DRM_PANEL_TPO_Y17P Say Y if you want to enable support for panels based on the TDO Y17P controller. +config DRM_PANEL_TDO_DSI_V1 + tristate "TDO touchscreen panels V1" + depends on DRM_MIPI_DSI + depends on I2C + depends on BACKLIGHT_CLASS_DEVICE + help + Say Y here if you want to enable support for TDO DSI + touchscreen panels, e.g. tl034wvs03, tl040hds31, etc. + This driver provides MIPI DSI display interface. + It also handles backlight control via the backlight + class device. + To compile this driver as a module, choose M here; the + module will be called panel-tdo-dsi-v1. + config DRM_PANEL_TPO_TD028TTEC1 tristate "Toppoly (TPO) TD028TTEC1 panel driver" depends on OF && SPI diff --git a/drivers/gpu/drm/panel/Makefile b/drivers/gpu/drm/panel/Makefile index 19871edb64366a..75f6bf2729a602 100644 --- a/drivers/gpu/drm/panel/Makefile +++ b/drivers/gpu/drm/panel/Makefile @@ -108,6 +108,7 @@ obj-$(CONFIG_DRM_PANEL_SONY_TULIP_TRULY_NT35521) += panel-sony-tulip-truly-nt355 obj-$(CONFIG_DRM_PANEL_STARTEK_KD070FHFID015) += panel-startek-kd070fhfid015.o obj-$(CONFIG_DRM_PANEL_TDO_TL070WSH30) += panel-tdo-tl070wsh30.o obj-$(CONFIG_DRM_PANEL_TPO_Y17P) += panel-tdo-y17p.o +obj-$(CONFIG_DRM_PANEL_TDO_DSI_V1) += panel-tdo-dsi-v1.o obj-$(CONFIG_DRM_PANEL_TPO_TD028TTEC1) += panel-tpo-td028ttec1.o obj-$(CONFIG_DRM_PANEL_TPO_TD043MTEA1) += panel-tpo-td043mtea1.o obj-$(CONFIG_DRM_PANEL_TPO_TPG110) += panel-tpo-tpg110.o diff --git a/drivers/gpu/drm/panel/panel-tdo-dsi-v1.c b/drivers/gpu/drm/panel/panel-tdo-dsi-v1.c new file mode 100644 index 00000000000000..ffba274c5dd9c6 --- /dev/null +++ b/drivers/gpu/drm/panel/panel-tdo-dsi-v1.c @@ -0,0 +1,487 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2026 TDO International Limited + * + * Based on panel-raspberrypi-touchscreen by Broadcom + */ + + +#include +#include +#include +#include +#include + +#include