diff --git a/arch/arm/boot/dts/overlays/Makefile b/arch/arm/boot/dts/overlays/Makefile index f4696c04638c35..e32dd9dc89f19a 100644 --- a/arch/arm/boot/dts/overlays/Makefile +++ b/arch/arm/boot/dts/overlays/Makefile @@ -338,6 +338,7 @@ dtbo-$(CONFIG_ARCH_BCM2835) += \ vc4-kms-dpi-panel.dtbo \ vc4-kms-dsi-7inch.dtbo \ vc4-kms-dsi-generic.dtbo \ + vc4-kms-dsi-ili79600-10-1inch.dtbo \ vc4-kms-dsi-ili9881-5inch.dtbo \ vc4-kms-dsi-ili9881-7inch.dtbo \ vc4-kms-dsi-lt070me05000.dtbo \ diff --git a/arch/arm/boot/dts/overlays/README b/arch/arm/boot/dts/overlays/README index 8f4ae928987846..c88cdae247909b 100644 --- a/arch/arm/boot/dts/overlays/README +++ b/arch/arm/boot/dts/overlays/README @@ -5725,6 +5725,21 @@ Params: clock-frequency Display clock frequency (Hz) Only supported on Pi5 and CM +Name: vc4-kms-dsi-ili79600-10-1inch +Info: Enable the Raspberry Pi 10" ILI79600 based touchscreen panel. + Requires vc4-kms-v3d to be loaded. +Load: dtoverlay=vc4-kms-dsi-ili79600-10-1inch, +Params: sizex Touchscreen size x (default 1200) + sizey Touchscreen size y (default 1920) + invx Touchscreen inverted x axis + invy Touchscreen inverted y axis + swapxy Touchscreen swapped x y axis + disable_touch Disables the touch screen overlay driver + rotation Display rotation {0,90,180,270} (default 0) + dsi0 Use DSI0 and i2c_csi_dsi0 (rather than + the default DSI1 and i2c_csi_dsi). + + Name: vc4-kms-dsi-ili9881-5inch Info: Enable the Raspberry Pi 5" ILI9881 based touchscreen panel. Requires vc4-kms-v3d to be loaded. diff --git a/arch/arm/boot/dts/overlays/vc4-kms-dsi-ili79600-10-1inch-overlay.dts b/arch/arm/boot/dts/overlays/vc4-kms-dsi-ili79600-10-1inch-overlay.dts new file mode 100644 index 00000000000000..7aec9e59fcb878 --- /dev/null +++ b/arch/arm/boot/dts/overlays/vc4-kms-dsi-ili79600-10-1inch-overlay.dts @@ -0,0 +1,126 @@ +/* + * vc4-kms-dsi-ili79600-10-1inch-overlay.dts + */ + +/dts-v1/; +/plugin/; + +#include + +/ { + compatible = "brcm,bcm2835"; + + i2c_frag: fragment@0 { + target = <&i2c_csi_dsi>; + __overlay__ { + #address-cells = <1>; + #size-cells = <0>; + status = "okay"; + + display_mcu: display_mcu@45 + { + compatible = "raspberrypi,v2-touchscreen-panel-regulator"; + reg = <0x45>; + gpio-controller; + #gpio-cells = <2>; + }; + + touch: ts@41 { + compatible = "ilitek,ili79600a"; + reg = <0x41>; + + reset-gpio = <&display_mcu 1 GPIO_ACTIVE_LOW>; + + touchscreen-size-x = < 1200 >; + touchscreen-size-y = < 1920 >; + vcc-supply = <&display_reg>; + + panel = <&dsi_panel>; + }; + }; + }; + + dsi_frag: fragment@1 { + target = <&dsi1>; + __overlay__ { + #address-cells = <1>; + #size-cells = <0>; + status = "okay"; + + port { + dsi_out: endpoint { + remote-endpoint = <&panel_in>; + }; + }; + + dsi_panel: dsi_panel@0 { + reg = <0>; + compatible = "raspberrypi,dsi-10-1inch"; + power-supply = <&display_reg>; + backlight = <&display_mcu>; + + port { + panel_in: endpoint { + remote-endpoint = <&dsi_out>; + }; + }; + }; + }; + }; + + fragment@2 { + target = <&i2c0if>; + __overlay__ { + status = "okay"; + }; + }; + + fragment@3 { + target = <&i2c0mux>; + __overlay__ { + status = "okay"; + }; + }; + + fragment@4 { + target-path = "/"; + __overlay__ { + display_reg: display_reg@1 { + reg = <1>; + compatible = "regulator-fixed"; + regulator-name = "display_reg_1"; + gpio = <&display_mcu 0 GPIO_ACTIVE_HIGH>; + startup-delay-us = <50000>; + enable-active-high; + }; + }; + }; + + fragment@10 { + target = <&touch>; + __dormant__ { + touchscreen-inverted-x; + }; + }; + + fragment@11 { + target = <&touch>; + __dormant__ { + touchscreen-inverted-y; + }; + }; + + __overrides__ { + sizex = <&touch>,"touchscreen-size-x:0"; + sizey = <&touch>,"touchscreen-size-y:0"; + invx = <0>, "+10"; + invy = <0>, "+11"; + swapxy = <&touch>,"touchscreen-swapped-x-y?"; + disable_touch = <&touch>, "status=disabled"; + rotation = <&dsi_panel>, "rotation:0"; + dsi0 = <&dsi_frag>, "target:0=",<&dsi0>, + <&i2c_frag>, "target:0=",<&i2c_csi_dsi0>, + <&display_reg>, "reg:0=0", + <&display_reg>, "regulator-name=display_reg_0"; + }; +}; diff --git a/arch/arm64/configs/bcm2711_defconfig b/arch/arm64/configs/bcm2711_defconfig index af192047b411be..80d0d8a9ec784f 100644 --- a/arch/arm64/configs/bcm2711_defconfig +++ b/arch/arm64/configs/bcm2711_defconfig @@ -709,6 +709,7 @@ CONFIG_TOUCHSCREEN_EXC3000=m CONFIG_TOUCHSCREEN_GOODIX=m CONFIG_TOUCHSCREEN_ILI210X=m CONFIG_TOUCHSCREEN_ILITEK=m +CONFIG_TOUCHSCREEN_ILITEK_V3=m CONFIG_TOUCHSCREEN_EDT_FT5X06=m CONFIG_TOUCHSCREEN_RASPBERRYPI_FW=m CONFIG_TOUCHSCREEN_USB_COMPOSITE=m @@ -1076,6 +1077,7 @@ CONFIG_DRM=m CONFIG_DRM_LOAD_EDID_FIRMWARE=y CONFIG_DRM_UDL=m CONFIG_DRM_PANEL_LVDS=m +CONFIG_DRM_PANEL_ILITEK_IL79600A=m CONFIG_DRM_PANEL_ILITEK_ILI9806E=m CONFIG_DRM_PANEL_ILITEK_ILI9806E_SPI=m CONFIG_DRM_PANEL_ILITEK_ILI9881C=m diff --git a/arch/arm64/configs/bcm2712_defconfig b/arch/arm64/configs/bcm2712_defconfig index 91af35ccc0dcae..39874533c079d6 100644 --- a/arch/arm64/configs/bcm2712_defconfig +++ b/arch/arm64/configs/bcm2712_defconfig @@ -712,6 +712,7 @@ CONFIG_TOUCHSCREEN_EXC3000=m CONFIG_TOUCHSCREEN_GOODIX=m CONFIG_TOUCHSCREEN_ILI210X=m CONFIG_TOUCHSCREEN_ILITEK=m +CONFIG_TOUCHSCREEN_ILITEK_V3=m CONFIG_TOUCHSCREEN_EDT_FT5X06=m CONFIG_TOUCHSCREEN_RASPBERRYPI_FW=m CONFIG_TOUCHSCREEN_USB_COMPOSITE=m @@ -1078,6 +1079,7 @@ CONFIG_DRM=m CONFIG_DRM_LOAD_EDID_FIRMWARE=y CONFIG_DRM_UDL=m CONFIG_DRM_PANEL_LVDS=m +CONFIG_DRM_PANEL_ILITEK_IL79600A=m CONFIG_DRM_PANEL_ILITEK_ILI9806E=m CONFIG_DRM_PANEL_ILITEK_ILI9806E_SPI=m CONFIG_DRM_PANEL_ILITEK_ILI9881C=m diff --git a/drivers/gpu/drm/panel/Kconfig b/drivers/gpu/drm/panel/Kconfig index 928b9f1bf7d52f..c093242c26a77a 100644 --- a/drivers/gpu/drm/panel/Kconfig +++ b/drivers/gpu/drm/panel/Kconfig @@ -185,6 +185,15 @@ config DRM_PANEL_HIMAX_HX8394 If M is selected the module will be called panel-himax-hx8394. +config DRM_PANEL_ILITEK_IL79600A + tristate "Ilitek ILI79960A-based panels" + depends on OF + depends on DRM_MIPI_DSI + depends on BACKLIGHT_CLASS_DEVICE + help + Say Y if you want to enable support for panels based on the + Ilitek ILI79960A controller. + config DRM_PANEL_ILITEK_IL9322 tristate "Ilitek ILI9322 320x240 QVGA panels" depends on OF && SPI diff --git a/drivers/gpu/drm/panel/Makefile b/drivers/gpu/drm/panel/Makefile index c13a08111d0c26..5760902b7a5581 100644 --- a/drivers/gpu/drm/panel/Makefile +++ b/drivers/gpu/drm/panel/Makefile @@ -19,6 +19,7 @@ obj-$(CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D) += panel-feiyang-fy07024di26a30d obj-$(CONFIG_DRM_PANEL_HIMAX_HX83102) += panel-himax-hx83102.o obj-$(CONFIG_DRM_PANEL_HIMAX_HX83112A) += panel-himax-hx83112a.o obj-$(CONFIG_DRM_PANEL_HIMAX_HX8394) += panel-himax-hx8394.o +obj-$(CONFIG_DRM_PANEL_ILITEK_IL79600A) += panel-ilitek-ili79600a.o obj-$(CONFIG_DRM_PANEL_ILITEK_IL9322) += panel-ilitek-ili9322.o obj-$(CONFIG_DRM_PANEL_ILITEK_ILI9341) += panel-ilitek-ili9341.o obj-$(CONFIG_DRM_PANEL_ILITEK_ILI9805) += panel-ilitek-ili9805.o diff --git a/drivers/gpu/drm/panel/panel-ilitek-ili79600a.c b/drivers/gpu/drm/panel/panel-ilitek-ili79600a.c new file mode 100644 index 00000000000000..b91ba5511284d7 --- /dev/null +++ b/drivers/gpu/drm/panel/panel-ilitek-ili79600a.c @@ -0,0 +1,467 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2025, Raspberry Pi + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +#include