diff --git a/arch/arm/boot/dts/overlays/Makefile b/arch/arm/boot/dts/overlays/Makefile
index 261dfb885a0362..ea5a30939dca43 100644
--- a/arch/arm/boot/dts/overlays/Makefile
+++ b/arch/arm/boot/dts/overlays/Makefile
@@ -337,6 +337,8 @@ dtbo-$(CONFIG_ARCH_BCM2835) += \
vc4-kms-dpi-hyperpixel4sq.dtbo \
vc4-kms-dpi-panel.dtbo \
vc4-kms-dsi-7inch.dtbo \
+ vc4-kms-dsi-edatec-panel-070c.dtbo \
+ vc4-kms-dsi-edatec-panel-101c.dtbo \
vc4-kms-dsi-generic.dtbo \
vc4-kms-dsi-ili79600-10-1inch.dtbo \
vc4-kms-dsi-ili9881-5inch.dtbo \
diff --git a/arch/arm/boot/dts/overlays/README b/arch/arm/boot/dts/overlays/README
index 3076ead83fe8dc..6a52a7744dc6da 100644
--- a/arch/arm/boot/dts/overlays/README
+++ b/arch/arm/boot/dts/overlays/README
@@ -5791,6 +5791,36 @@ Params: sizex Touchscreen size x (default 800)
the default DSI1 and i2c_csi_dsi).
+Name: vc4-kms-dsi-edatec-panel-070c
+Info: Enable the edatec DSI 7" screen.
+ support ed-dispr-070c.
+ support ed-dispr5-070c.
+ support ed-dispr4-070c.
+Load: dtoverlay=vc4-kms-dsi-edatec-panel-070c,=
+Params: i2c1 Use i2c1
+ interrupt GPIO pin for interrupt signal(default 2)
+ cm0 the default DSI1 and i2c_csi_dsi
+ pi4 the default DSI1 and i2c_csi_dsi
+ cm4 the default DSI1 and i2c_csi_dsi
+ pi5 the default DSI1 and i2c_csi_dsi
+ cm5 the default DSI0 and i2c_csi_dsi0
+
+
+Name: vc4-kms-dsi-edatec-panel-101c
+Info: Enable the edatec DSI 10" screen.
+ support ed-dispr-101c.
+ support ed-dispr5-101c.
+ support ed-dispr4-101c.
+Load: dtoverlay=vc4-kms-dsi-edatec-panel-101c,=
+Params: rotation Display rotation {0,90,180,270} (default 0)
+ interrupt GPIO pin for interrupt signal(default 2)
+ cm0 the default DSI1 and i2c_csi_dsi
+ pi4 the default DSI1 and i2c_csi_dsi
+ cm4 the default DSI1 and i2c_csi_dsi
+ pi5 the default DSI1 and i2c_csi_dsi
+ cm5 the default DSI0 and i2c_csi_dsi0
+
+
Name: vc4-kms-dsi-generic
Info: Enable a generic DSI display under KMS.
Default timings are for a 840x480 RGB888 panel.
diff --git a/arch/arm/boot/dts/overlays/vc4-kms-dsi-edatec-panel-070c-overlay.dts b/arch/arm/boot/dts/overlays/vc4-kms-dsi-edatec-panel-070c-overlay.dts
new file mode 100644
index 00000000000000..5465d3a8dfd804
--- /dev/null
+++ b/arch/arm/boot/dts/overlays/vc4-kms-dsi-edatec-panel-070c-overlay.dts
@@ -0,0 +1,124 @@
+/dts-v1/;
+/plugin/;
+
+/ {
+ compatible = "brcm,bcm2835";
+
+ i2c_frag: fragment@0 {
+ target = <&i2c_csi_dsi>;
+ __overlay__ {
+ #gpio-cells = <2>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "okay";
+
+ reg_display: reg_display@27 {
+ reg = <0x27>;
+ compatible = "edatec,disp-regulator";
+
+ gpio-controller;
+ #gpio-cells = <2>;
+ };
+
+ gt911: gt911@14 {
+ compatible = "goodix,gt911";
+ reg = <0x14>;
+ pinctrl-names = "default";
+ pinctrl-0 = <>911_pins>;
+
+ reset-gpios = <®_display 3 0>;
+ interrupt-parent = <&gpio>;
+ interrupts = <2 2>;
+ irq-gpios = <&gpio 2 0>;
+ };
+ };
+ };
+
+ fragment@1 {
+ target = <&dsi1>;
+ __overlay__ {
+ status = "okay";
+ port {
+ dsi_out: endpoint {
+ remote-endpoint = <&panel_in>;
+ };
+ };
+
+ panel: panel@0 {
+ reg = <0>;
+ compatible = "rzw,t70p383rk", "panel-dsi";
+ backlight = <®_display>;
+
+ width-mm = <154>;
+ height-mm = <86>;
+ dsi-color-format = "RGB888";
+ mode = "MODE_VIDEO","MODE_VIDEO_SYNC_PULSE";
+
+ timing: panel-timing {
+ clock-frequency = <41000000>;
+ hactive = <1024>;
+ hfront-porch = <40>;
+ hsync-len = <10>;
+ hback-porch = <40>;
+ vactive = <600>;
+ vfront-porch = <4>;
+ vsync-len = <2>;
+ vback-porch = <4>;
+ };
+
+ port {
+ panel_in: endpoint {
+ data-lanes = <1 2>;
+ remote-endpoint = <&dsi_out>;
+ };
+ };
+ };
+ };
+ };
+
+ fragment@2 {
+ target = <&i2c0if>;
+ __overlay__ {
+ status = "okay";
+ };
+ };
+
+ fragment@3 {
+ target = <&i2c0mux>;
+ __overlay__ {
+ status = "okay";
+ };
+ };
+
+ fragment@4 {
+ target = <&i2c1>;
+ __dormant__ {
+ status = "okay";
+ };
+ };
+
+ fragment@5 {
+ target = <&gpio>;
+ __overlay__ {
+ gt911_pins: gt911_pins {
+ brcm,pins = <2>;
+ brcm,function = <0>;
+ brcm,pull = <2>;
+ };
+ };
+ };
+
+ __overrides__ {
+ i2c1 = <&i2c_frag>, "target:0=",<&i2c1>,
+ <0>,"-2-3+4";
+ interrupt = <>911_pins>,"brcm,pins:0",
+ <>911>,"interrupts:0",
+ <>911>,"irq-gpios:4";
+
+ pi4 = <&i2c_frag>, "target:0=",<&i2c_csi_dsi>;
+ cm4 = <&i2c_frag>, "target:0=",<&i2c_csi_dsi>;
+ pi5 = <&i2c_frag>, "target:0=",<&i2c_csi_dsi>;
+ cm5 = <&i2c_frag>, "target:0=",<&i2c_csi_dsi0>;
+ cm0 = <&i2c_frag>, "target:0=",<&i2c_csi_dsi>;
+ };
+};
diff --git a/arch/arm/boot/dts/overlays/vc4-kms-dsi-edatec-panel-101c-overlay.dts b/arch/arm/boot/dts/overlays/vc4-kms-dsi-edatec-panel-101c-overlay.dts
new file mode 100644
index 00000000000000..0218978b9a0b4d
--- /dev/null
+++ b/arch/arm/boot/dts/overlays/vc4-kms-dsi-edatec-panel-101c-overlay.dts
@@ -0,0 +1,134 @@
+/dts-v1/;
+/plugin/;
+
+#include
+
+/ {
+ compatible = "brcm,bcm2835";
+
+ fragment@0 {
+ target-path = "/";
+ __overlay__ {
+ vdd_lcd: fixedregulator_lcd {
+ compatible = "regulator-fixed";
+ regulator-name = "vdd_lcd";
+
+ gpios = <®_display 4 0>;
+ startup-delay-us = <5000>;
+ regulator-boot-on;
+ enable-active-high;
+ };
+ };
+ };
+
+ fragment@1 {
+ target = <&dsi1>;
+ __overlay__{
+ status = "okay";
+ #address-cells = <1>;
+ #size-cells = <0>;
+ port {
+ dsi_out_port:endpoint {
+ remote-endpoint = <&panel_dsi_port>;
+ };
+ };
+
+ ili9881c:ili9881c@0 {
+ compatible = "rzw,t101p136cq-rpi4";
+ status = "okay";
+ reg = <0>;
+
+ reset-gpios = <®_display 2 GPIO_ACTIVE_LOW>;
+ backlight = <®_display>;
+ power-supply = <&vdd_lcd>;
+ rotation = <270>;
+
+ port {
+ panel_dsi_port: endpoint {
+ remote-endpoint = <&dsi_out_port>;
+ };
+ };
+ };
+ };
+ };
+
+ fragment@2 {
+ target = <&i2c0if>;
+ __overlay__ {
+ status = "okay";
+ };
+ };
+
+ fragment@3 {
+ target = <&i2c0mux>;
+ __overlay__ {
+ status = "okay";
+ };
+ };
+
+ fragment@4 {
+ target = <&gpio>;
+ __overlay__ {
+ gt928_pins: gt928_pins {
+ brcm,pins = <16>;
+ brcm,function = <0>;
+ brcm,pull = <2>;
+ };
+ };
+ };
+
+ i2c_frag: fragment@5 {
+ target = <&i2c_csi_dsi>;
+ __overlay__ {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "okay";
+
+ reg_display: reg_display@27 {
+ compatible = "edatec,disp-regulator";
+ reg = <0x27>;
+ gpio-controller;
+ #gpio-cells = <2>;
+ };
+
+ gt928:gt928@14 {
+ compatible = "goodix,gt928";
+ reg = <0x14>;
+ pinctrl-names = "default";
+ pinctrl-0 = <>928_pins>;
+
+ reset-gpios = <®_display 3 0>;
+ interrupt-parent = <&gpio>;
+ interrupts = <16 2>;
+ irq-gpios = <&gpio 16 0>;
+ };
+ };
+ };
+
+ fragment@6 {
+ target = <&ili9881c>;
+ __dormant__ {
+ compatible = "rzw,t101p136cq-rpi4-lite";
+ };
+ };
+
+ fragment@7 {
+ target = <&ili9881c>;
+ __dormant__ {
+ compatible = "rzw,t101p136cq-rpi5";
+ };
+ };
+
+ __overrides__ {
+ interrupt = <>928_pins>,"brcm,pins:0",
+ <>928>,"interrupts:0",
+ <>928>,"irq-gpios:4";
+ rotation = <&ili9881c>,"rotation:0";
+
+ pi4 = <&i2c_frag>, "target:0=",<&i2c_csi_dsi>,<0>, "+6";
+ cm4 = <&i2c_frag>, "target:0=",<&i2c_csi_dsi>;
+ pi5 = <&i2c_frag>, "target:0=",<&i2c_csi_dsi>,<0>, "+7";
+ cm5 = <&i2c_frag>, "target:0=",<&i2c_csi_dsi0>,<0>, "+7";
+ cm0 = <&i2c_frag>, "target:0=",<&i2c_csi_dsi>,<0>, "+6";
+ };
+};
diff --git a/arch/arm/configs/edatec_10_defconfig b/arch/arm/configs/edatec_10_defconfig
new file mode 100644
index 00000000000000..4ee70dfc01aac2
--- /dev/null
+++ b/arch/arm/configs/edatec_10_defconfig
@@ -0,0 +1,183 @@
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SYSVIPC=y
+CONFIG_NO_HZ_IDLE=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_PREEMPT_VOLUNTARY=y
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_BSD_PROCESS_ACCT_V3=y
+CONFIG_LOG_BUF_SHIFT=18
+CONFIG_CFS_BANDWIDTH=y
+CONFIG_CGROUP_FREEZER=y
+CONFIG_CGROUP_DEVICE=y
+CONFIG_CGROUP_CPUACCT=y
+CONFIG_CGROUP_PERF=y
+CONFIG_NAMESPACES=y
+CONFIG_SCHED_AUTOGROUP=y
+CONFIG_RELAY=y
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_EXPERT=y
+CONFIG_KALLSYMS_ALL=y
+CONFIG_PROFILING=y
+CONFIG_KEXEC=y
+CONFIG_ARCH_MULTI_V6=y
+CONFIG_ARCH_BCM=y
+CONFIG_ARCH_BCM2835=y
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_STAT=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=y
+CONFIG_CPU_FREQ_GOV_USERSPACE=y
+CONFIG_CPU_FREQ_GOV_ONDEMAND=y
+CONFIG_CPUFREQ_DT=y
+CONFIG_ARM_RASPBERRYPI_CPUFREQ=y
+CONFIG_VFP=y
+# CONFIG_SUSPEND is not set
+CONFIG_PM=y
+CONFIG_JUMP_LABEL=y
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+# CONFIG_COMPAT_BRK is not set
+CONFIG_KSM=y
+CONFIG_CMA=y
+CONFIG_NET=y
+CONFIG_PACKET=y
+CONFIG_UNIX=y
+CONFIG_INET=y
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+CONFIG_NETWORK_SECMARK=y
+CONFIG_NETFILTER=y
+CONFIG_BT=y
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_BCM=y
+CONFIG_CFG80211=y
+CONFIG_MAC80211=y
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+# CONFIG_STANDALONE is not set
+CONFIG_RASPBERRYPI_FIRMWARE=y
+CONFIG_SCSI=y
+CONFIG_BLK_DEV_SD=y
+CONFIG_SCSI_CONSTANTS=y
+CONFIG_SCSI_SCAN_ASYNC=y
+CONFIG_NETDEVICES=y
+CONFIG_BCMGENET=y
+CONFIG_USB_LAN78XX=y
+CONFIG_USB_USBNET=y
+CONFIG_USB_NET_SMSC95XX=y
+CONFIG_BRCMFMAC=m
+CONFIG_ZD1211RW=y
+CONFIG_INPUT_EVDEV=y
+# CONFIG_LEGACY_PTYS is not set
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_EXTENDED=y
+CONFIG_SERIAL_8250_SHARE_IRQ=y
+CONFIG_SERIAL_8250_BCM2835AUX=y
+CONFIG_SERIAL_AMBA_PL011=y
+CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
+CONFIG_SERIAL_DEV_BUS=y
+CONFIG_TTY_PRINTK=y
+CONFIG_I2C_CHARDEV=y
+CONFIG_I2C_BCM2835=y
+CONFIG_SPI=y
+CONFIG_SPI_BCM2835=y
+CONFIG_SPI_BCM2835AUX=y
+CONFIG_GPIO_SYSFS=y
+CONFIG_SENSORS_RASPBERRYPI_HWMON=m
+CONFIG_THERMAL=y
+CONFIG_BCM2711_THERMAL=y
+CONFIG_BCM2835_THERMAL=y
+CONFIG_WATCHDOG=y
+CONFIG_BCM2835_WDT=y
+CONFIG_REGULATOR=y
+CONFIG_REGULATOR_FIXED_VOLTAGE=y
+CONFIG_REGULATOR_GPIO=y
+CONFIG_REGULATOR_EDATEC_10INCH=m
+CONFIG_MEDIA_SUPPORT=y
+CONFIG_DRM=y
+CONFIG_DRM_SIMPLEDRM=y
+CONFIG_DRM_PANEL_ILITEK_ILI9881C=m
+CONFIG_DRM_V3D=y
+CONFIG_DRM_VC4=y
+CONFIG_FB=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=m
+CONFIG_SOUND=y
+CONFIG_SND=y
+CONFIG_SND_SOC=y
+CONFIG_SND_BCM2835_SOC_I2S=y
+CONFIG_USB=y
+CONFIG_USB_OTG=y
+CONFIG_USB_STORAGE=y
+CONFIG_USB_DWC2=y
+CONFIG_NOP_USB_XCEIV=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_EEM=y
+CONFIG_USB_G_SERIAL=m
+CONFIG_MMC=y
+CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_PLTFM=y
+CONFIG_MMC_SDHCI_IPROC=y
+CONFIG_MMC_BCM2835=y
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+CONFIG_LEDS_GPIO=y
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_ONESHOT=y
+CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+CONFIG_LEDS_TRIGGER_CPU=y
+CONFIG_LEDS_TRIGGER_GPIO=y
+CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
+CONFIG_LEDS_TRIGGER_TRANSIENT=y
+CONFIG_LEDS_TRIGGER_CAMERA=y
+CONFIG_DMADEVICES=y
+CONFIG_DMA_BCM2835=y
+CONFIG_STAGING=y
+CONFIG_SND_BCM2835=m
+CONFIG_VIDEO_BCM2835=m
+CONFIG_CLK_RASPBERRYPI=y
+CONFIG_MAILBOX=y
+CONFIG_BCM2835_MBOX=y
+# CONFIG_IOMMU_SUPPORT is not set
+CONFIG_RASPBERRYPI_POWER=y
+CONFIG_PWM=y
+CONFIG_PWM_BCM2835=y
+CONFIG_EXT2_FS=y
+CONFIG_EXT2_FS_XATTR=y
+CONFIG_EXT2_FS_POSIX_ACL=y
+CONFIG_EXT4_FS=y
+CONFIG_EXT4_FS_POSIX_ACL=y
+CONFIG_FANOTIFY=y
+CONFIG_MSDOS_FS=y
+CONFIG_VFAT_FS=y
+CONFIG_TMPFS=y
+CONFIG_TMPFS_POSIX_ACL=y
+# CONFIG_MISC_FILESYSTEMS is not set
+CONFIG_NFS_FS=y
+CONFIG_ROOT_NFS=y
+CONFIG_NFSD=y
+CONFIG_NLS_CODEPAGE_437=y
+CONFIG_NLS_ASCII=y
+CONFIG_NLS_ISO8859_1=y
+CONFIG_NLS_UTF8=y
+# CONFIG_XZ_DEC_ARM is not set
+# CONFIG_XZ_DEC_ARMTHUMB is not set
+CONFIG_DMA_CMA=y
+CONFIG_CMA_SIZE_MBYTES=32
+CONFIG_PRINTK_TIME=y
+CONFIG_BOOT_PRINTK_DELAY=y
+CONFIG_DYNAMIC_DEBUG=y
+CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y
+CONFIG_DEBUG_FS=y
+CONFIG_KGDB=y
+CONFIG_KGDB_KDB=y
+CONFIG_DEBUG_MEMORY_INIT=y
+CONFIG_FUNCTION_PROFILER=y
+CONFIG_STACK_TRACER=y
+CONFIG_SCHED_TRACER=y
+CONFIG_STRICT_DEVMEM=y
+CONFIG_TEST_KSTRTOX=y
diff --git a/arch/arm/configs/edatec_7_defconfig b/arch/arm/configs/edatec_7_defconfig
new file mode 100644
index 00000000000000..40f70e28217a11
--- /dev/null
+++ b/arch/arm/configs/edatec_7_defconfig
@@ -0,0 +1,182 @@
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SYSVIPC=y
+CONFIG_NO_HZ_IDLE=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_PREEMPT_VOLUNTARY=y
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_BSD_PROCESS_ACCT_V3=y
+CONFIG_LOG_BUF_SHIFT=18
+CONFIG_CFS_BANDWIDTH=y
+CONFIG_CGROUP_FREEZER=y
+CONFIG_CGROUP_DEVICE=y
+CONFIG_CGROUP_CPUACCT=y
+CONFIG_CGROUP_PERF=y
+CONFIG_NAMESPACES=y
+CONFIG_SCHED_AUTOGROUP=y
+CONFIG_RELAY=y
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_EXPERT=y
+CONFIG_KALLSYMS_ALL=y
+CONFIG_PROFILING=y
+CONFIG_KEXEC=y
+CONFIG_ARCH_MULTI_V6=y
+CONFIG_ARCH_BCM=y
+CONFIG_ARCH_BCM2835=y
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_STAT=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=y
+CONFIG_CPU_FREQ_GOV_USERSPACE=y
+CONFIG_CPU_FREQ_GOV_ONDEMAND=y
+CONFIG_CPUFREQ_DT=y
+CONFIG_ARM_RASPBERRYPI_CPUFREQ=y
+CONFIG_VFP=y
+# CONFIG_SUSPEND is not set
+CONFIG_PM=y
+CONFIG_JUMP_LABEL=y
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+# CONFIG_COMPAT_BRK is not set
+CONFIG_KSM=y
+CONFIG_CMA=y
+CONFIG_NET=y
+CONFIG_PACKET=y
+CONFIG_UNIX=y
+CONFIG_INET=y
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+CONFIG_NETWORK_SECMARK=y
+CONFIG_NETFILTER=y
+CONFIG_BT=y
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_BCM=y
+CONFIG_CFG80211=y
+CONFIG_MAC80211=y
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+# CONFIG_STANDALONE is not set
+CONFIG_RASPBERRYPI_FIRMWARE=y
+CONFIG_SCSI=y
+CONFIG_BLK_DEV_SD=y
+CONFIG_SCSI_CONSTANTS=y
+CONFIG_SCSI_SCAN_ASYNC=y
+CONFIG_NETDEVICES=y
+CONFIG_BCMGENET=y
+CONFIG_USB_LAN78XX=y
+CONFIG_USB_USBNET=y
+CONFIG_USB_NET_SMSC95XX=y
+CONFIG_BRCMFMAC=m
+CONFIG_ZD1211RW=y
+CONFIG_INPUT_EVDEV=y
+# CONFIG_LEGACY_PTYS is not set
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_EXTENDED=y
+CONFIG_SERIAL_8250_SHARE_IRQ=y
+CONFIG_SERIAL_8250_BCM2835AUX=y
+CONFIG_SERIAL_AMBA_PL011=y
+CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
+CONFIG_SERIAL_DEV_BUS=y
+CONFIG_TTY_PRINTK=y
+CONFIG_I2C_CHARDEV=y
+CONFIG_I2C_BCM2835=y
+CONFIG_SPI=y
+CONFIG_SPI_BCM2835=y
+CONFIG_SPI_BCM2835AUX=y
+CONFIG_GPIO_SYSFS=y
+CONFIG_SENSORS_RASPBERRYPI_HWMON=m
+CONFIG_THERMAL=y
+CONFIG_BCM2711_THERMAL=y
+CONFIG_BCM2835_THERMAL=y
+CONFIG_WATCHDOG=y
+CONFIG_BCM2835_WDT=y
+CONFIG_REGULATOR=y
+CONFIG_REGULATOR_FIXED_VOLTAGE=y
+CONFIG_REGULATOR_GPIO=y
+CONFIG_MEDIA_SUPPORT=y
+CONFIG_DRM=y
+CONFIG_DRM_SIMPLEDRM=y
+CONFIG_DRM_PANEL_EDATEC_7INCH=m
+CONFIG_DRM_V3D=y
+CONFIG_DRM_VC4=y
+CONFIG_FB=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=m
+CONFIG_SOUND=y
+CONFIG_SND=y
+CONFIG_SND_SOC=y
+CONFIG_SND_BCM2835_SOC_I2S=y
+CONFIG_USB=y
+CONFIG_USB_OTG=y
+CONFIG_USB_STORAGE=y
+CONFIG_USB_DWC2=y
+CONFIG_NOP_USB_XCEIV=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_EEM=y
+CONFIG_USB_G_SERIAL=m
+CONFIG_MMC=y
+CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_PLTFM=y
+CONFIG_MMC_SDHCI_IPROC=y
+CONFIG_MMC_BCM2835=y
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+CONFIG_LEDS_GPIO=y
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_ONESHOT=y
+CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+CONFIG_LEDS_TRIGGER_CPU=y
+CONFIG_LEDS_TRIGGER_GPIO=y
+CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
+CONFIG_LEDS_TRIGGER_TRANSIENT=y
+CONFIG_LEDS_TRIGGER_CAMERA=y
+CONFIG_DMADEVICES=y
+CONFIG_DMA_BCM2835=y
+CONFIG_STAGING=y
+CONFIG_SND_BCM2835=m
+CONFIG_VIDEO_BCM2835=m
+CONFIG_CLK_RASPBERRYPI=y
+CONFIG_MAILBOX=y
+CONFIG_BCM2835_MBOX=y
+# CONFIG_IOMMU_SUPPORT is not set
+CONFIG_RASPBERRYPI_POWER=y
+CONFIG_PWM=y
+CONFIG_PWM_BCM2835=y
+CONFIG_EXT2_FS=y
+CONFIG_EXT2_FS_XATTR=y
+CONFIG_EXT2_FS_POSIX_ACL=y
+CONFIG_EXT4_FS=y
+CONFIG_EXT4_FS_POSIX_ACL=y
+CONFIG_FANOTIFY=y
+CONFIG_MSDOS_FS=y
+CONFIG_VFAT_FS=y
+CONFIG_TMPFS=y
+CONFIG_TMPFS_POSIX_ACL=y
+# CONFIG_MISC_FILESYSTEMS is not set
+CONFIG_NFS_FS=y
+CONFIG_ROOT_NFS=y
+CONFIG_NFSD=y
+CONFIG_NLS_CODEPAGE_437=y
+CONFIG_NLS_ASCII=y
+CONFIG_NLS_ISO8859_1=y
+CONFIG_NLS_UTF8=y
+# CONFIG_XZ_DEC_ARM is not set
+# CONFIG_XZ_DEC_ARMTHUMB is not set
+CONFIG_DMA_CMA=y
+CONFIG_CMA_SIZE_MBYTES=32
+CONFIG_PRINTK_TIME=y
+CONFIG_BOOT_PRINTK_DELAY=y
+CONFIG_DYNAMIC_DEBUG=y
+CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y
+CONFIG_DEBUG_FS=y
+CONFIG_KGDB=y
+CONFIG_KGDB_KDB=y
+CONFIG_DEBUG_MEMORY_INIT=y
+CONFIG_FUNCTION_PROFILER=y
+CONFIG_STACK_TRACER=y
+CONFIG_SCHED_TRACER=y
+CONFIG_STRICT_DEVMEM=y
+CONFIG_TEST_KSTRTOX=y
diff --git a/drivers/gpu/drm/panel/Kconfig b/drivers/gpu/drm/panel/Kconfig
index 71b550a06ab01a..a5f0a1ee8b33f7 100644
--- a/drivers/gpu/drm/panel/Kconfig
+++ b/drivers/gpu/drm/panel/Kconfig
@@ -1221,4 +1221,5 @@ config DRM_PANEL_XINPENG_XPP055C272
Say Y here if you want to enable support for the Xinpeng
XPP055C272 controller for 720x1280 LCD panels with MIPI/RGB/SPI
system interfaces.
+
endmenu
diff --git a/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c b/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c
index fe8964d9f8f04f..7220b005067ec5 100644
--- a/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c
+++ b/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c
@@ -2230,6 +2230,444 @@ static const struct ili9881c_instr bsd1218_a101kl68_init[] = {
ILI9881C_COMMAND_INSTR(0xd3, 0x3f),
};
+
+static const struct ili9881c_instr t101p136cq_init[] = {
+ //ILI9881C PAGE3
+ ILI9881C_SWITCH_PAGE_INSTR(3),
+ //GIP_1
+ ILI9881C_COMMAND_INSTR(0x01, 0x00), //added
+ ILI9881C_COMMAND_INSTR(0x02, 0x00),
+ ILI9881C_COMMAND_INSTR(0x03, 0x53),
+ ILI9881C_COMMAND_INSTR(0x04, 0x53),
+ ILI9881C_COMMAND_INSTR(0x05, 0x13),
+ ILI9881C_COMMAND_INSTR(0x06, 0x04),
+ ILI9881C_COMMAND_INSTR(0x07, 0x02),
+ ILI9881C_COMMAND_INSTR(0x08, 0x02),
+ ILI9881C_COMMAND_INSTR(0x09, 0x00),
+ ILI9881C_COMMAND_INSTR(0x0A, 0x00),
+ ILI9881C_COMMAND_INSTR(0x0B, 0x00),
+ ILI9881C_COMMAND_INSTR(0x0C, 0x00),
+ ILI9881C_COMMAND_INSTR(0x0D, 0x00),
+ ILI9881C_COMMAND_INSTR(0x0E, 0x00),
+ ILI9881C_COMMAND_INSTR(0x0F, 0x00),
+ ILI9881C_COMMAND_INSTR(0x10, 0x00),
+ ILI9881C_COMMAND_INSTR(0x11, 0x00),
+ ILI9881C_COMMAND_INSTR(0x12, 0x00),
+ ILI9881C_COMMAND_INSTR(0x13, 0x00),
+ ILI9881C_COMMAND_INSTR(0x14, 0x00),
+ ILI9881C_COMMAND_INSTR(0x15, 0x05),
+ ILI9881C_COMMAND_INSTR(0x16, 0x05),
+ ILI9881C_COMMAND_INSTR(0x17, 0x03),
+ ILI9881C_COMMAND_INSTR(0x18, 0x03),
+ ILI9881C_COMMAND_INSTR(0x19, 0x00),
+ ILI9881C_COMMAND_INSTR(0x1A, 0x00),
+ ILI9881C_COMMAND_INSTR(0x1B, 0x00),
+ ILI9881C_COMMAND_INSTR(0x1C, 0x00),
+ ILI9881C_COMMAND_INSTR(0x1D, 0x00),
+ ILI9881C_COMMAND_INSTR(0x1E, 0xC0),
+ ILI9881C_COMMAND_INSTR(0x1F, 0x80),
+ ILI9881C_COMMAND_INSTR(0x20, 0x02),
+ ILI9881C_COMMAND_INSTR(0x21, 0x09),
+ ILI9881C_COMMAND_INSTR(0x22, 0x00),
+ ILI9881C_COMMAND_INSTR(0x23, 0x00),
+ ILI9881C_COMMAND_INSTR(0x24, 0x00),
+ ILI9881C_COMMAND_INSTR(0x25, 0x00),
+ ILI9881C_COMMAND_INSTR(0x26, 0x00),
+ ILI9881C_COMMAND_INSTR(0x27, 0x00),
+ ILI9881C_COMMAND_INSTR(0x28, 0x55),
+ ILI9881C_COMMAND_INSTR(0x29, 0x03),
+ ILI9881C_COMMAND_INSTR(0x2A, 0x00),
+ ILI9881C_COMMAND_INSTR(0x2B, 0x00),
+ ILI9881C_COMMAND_INSTR(0x2C, 0x00),
+ ILI9881C_COMMAND_INSTR(0x2D, 0x00),
+ ILI9881C_COMMAND_INSTR(0x2E, 0x00),
+ ILI9881C_COMMAND_INSTR(0x2F, 0x00),
+ ILI9881C_COMMAND_INSTR(0x30, 0x00),
+ ILI9881C_COMMAND_INSTR(0x31, 0x00),
+ ILI9881C_COMMAND_INSTR(0x32, 0x00),
+ ILI9881C_COMMAND_INSTR(0x33, 0x00),
+ ILI9881C_COMMAND_INSTR(0x34, 0x00),
+ ILI9881C_COMMAND_INSTR(0x35, 0x00),
+ ILI9881C_COMMAND_INSTR(0x36, 0x00),
+ ILI9881C_COMMAND_INSTR(0x37, 0x00),
+ ILI9881C_COMMAND_INSTR(0x38, 0x3C),
+ ILI9881C_COMMAND_INSTR(0x39, 0x00),
+ ILI9881C_COMMAND_INSTR(0x3A, 0x00),
+ ILI9881C_COMMAND_INSTR(0x3B, 0x00),
+ ILI9881C_COMMAND_INSTR(0x3C, 0x00),
+ ILI9881C_COMMAND_INSTR(0x3D, 0x00),
+ ILI9881C_COMMAND_INSTR(0x3E, 0x00),
+ ILI9881C_COMMAND_INSTR(0x3F, 0x00),
+ ILI9881C_COMMAND_INSTR(0x40, 0x00),
+ ILI9881C_COMMAND_INSTR(0x41, 0x00),
+ ILI9881C_COMMAND_INSTR(0x42, 0x00),
+ ILI9881C_COMMAND_INSTR(0x43, 0x00),
+ ILI9881C_COMMAND_INSTR(0x44, 0x00),
+
+ //GIP_2
+ ILI9881C_COMMAND_INSTR(0x50, 0x01),
+ ILI9881C_COMMAND_INSTR(0x51, 0x23),
+ ILI9881C_COMMAND_INSTR(0x52, 0x45),
+ ILI9881C_COMMAND_INSTR(0x53, 0x67),
+ ILI9881C_COMMAND_INSTR(0x54, 0x89),
+ ILI9881C_COMMAND_INSTR(0x55, 0xAB),
+ ILI9881C_COMMAND_INSTR(0x56, 0x01),
+ ILI9881C_COMMAND_INSTR(0x57, 0x23),
+ ILI9881C_COMMAND_INSTR(0x58, 0x45),
+ ILI9881C_COMMAND_INSTR(0x59, 0x67),
+ ILI9881C_COMMAND_INSTR(0x5A, 0x89),
+ ILI9881C_COMMAND_INSTR(0x5B, 0xAB),
+ ILI9881C_COMMAND_INSTR(0x5C, 0xCD),
+ ILI9881C_COMMAND_INSTR(0x5D, 0xEF),
+ //GIP_3
+ ILI9881C_COMMAND_INSTR(0x5E, 0x01),
+ ILI9881C_COMMAND_INSTR(0x5F, 0x0A),
+ ILI9881C_COMMAND_INSTR(0x60, 0x02),
+ ILI9881C_COMMAND_INSTR(0x61, 0x02),
+ ILI9881C_COMMAND_INSTR(0x62, 0x08),
+ ILI9881C_COMMAND_INSTR(0x63, 0x15),
+ ILI9881C_COMMAND_INSTR(0x64, 0x14),
+ ILI9881C_COMMAND_INSTR(0x65, 0x02),
+ ILI9881C_COMMAND_INSTR(0x66, 0x11),
+ ILI9881C_COMMAND_INSTR(0x67, 0x10),
+ ILI9881C_COMMAND_INSTR(0x68, 0x02),
+ ILI9881C_COMMAND_INSTR(0x69, 0x0F),
+ ILI9881C_COMMAND_INSTR(0x6A, 0x0E),
+ ILI9881C_COMMAND_INSTR(0x6B, 0x02),
+ ILI9881C_COMMAND_INSTR(0x6C, 0x0D),
+ ILI9881C_COMMAND_INSTR(0x6D, 0x0C),
+ ILI9881C_COMMAND_INSTR(0x6E, 0x06),
+ ILI9881C_COMMAND_INSTR(0x6F, 0x02),
+ ILI9881C_COMMAND_INSTR(0x70, 0x02),
+ ILI9881C_COMMAND_INSTR(0x71, 0x02),
+ ILI9881C_COMMAND_INSTR(0x72, 0x02),
+ ILI9881C_COMMAND_INSTR(0x73, 0x02),
+ ILI9881C_COMMAND_INSTR(0x74, 0x02),
+ ILI9881C_COMMAND_INSTR(0x75, 0x0A),
+ ILI9881C_COMMAND_INSTR(0x76, 0x02),
+ ILI9881C_COMMAND_INSTR(0x77, 0x02),
+ ILI9881C_COMMAND_INSTR(0x78, 0x06),
+ ILI9881C_COMMAND_INSTR(0x79, 0x15),
+ ILI9881C_COMMAND_INSTR(0x7A, 0x14),
+ ILI9881C_COMMAND_INSTR(0x7B, 0x02),
+ ILI9881C_COMMAND_INSTR(0x7C, 0x10),
+ ILI9881C_COMMAND_INSTR(0x7D, 0x11),
+ ILI9881C_COMMAND_INSTR(0x7E, 0x02),
+ ILI9881C_COMMAND_INSTR(0x7F, 0x0C),
+ ILI9881C_COMMAND_INSTR(0x80, 0x0D),
+ ILI9881C_COMMAND_INSTR(0x81, 0x02),
+ ILI9881C_COMMAND_INSTR(0x82, 0x0E),
+ ILI9881C_COMMAND_INSTR(0x83, 0x0F),
+ ILI9881C_COMMAND_INSTR(0x84, 0x08),
+ ILI9881C_COMMAND_INSTR(0x85, 0x02),
+ ILI9881C_COMMAND_INSTR(0x86, 0x02),
+ ILI9881C_COMMAND_INSTR(0x87, 0x02),
+ ILI9881C_COMMAND_INSTR(0x88, 0x02),
+ ILI9881C_COMMAND_INSTR(0x89, 0x02),
+ ILI9881C_COMMAND_INSTR(0x8A, 0x02),
+ //ILI9881C PAGE4
+ ILI9881C_SWITCH_PAGE_INSTR(4),
+ ILI9881C_COMMAND_INSTR(0x3B, 0x98),
+ ILI9881C_COMMAND_INSTR(0x6C, 0x15),
+ ILI9881C_COMMAND_INSTR(0x6E, 0x30),
+ // VGH & VGL OUTPUT
+ ILI9881C_COMMAND_INSTR(0x6F, 0x45),
+ ILI9881C_COMMAND_INSTR(0x8D, 0x1F),
+ ILI9881C_COMMAND_INSTR(0x87, 0xBA),
+ ILI9881C_COMMAND_INSTR(0x26, 0x76),
+ //Reload Gamma setting
+ ILI9881C_COMMAND_INSTR(0xB2, 0xD1),
+ ILI9881C_COMMAND_INSTR(0x88, 0x0B),
+ ILI9881C_COMMAND_INSTR(0x21, 0xB0),
+ ILI9881C_COMMAND_INSTR(0x35, 0x17),
+ ILI9881C_COMMAND_INSTR(0x30, 0x01),
+ ILI9881C_COMMAND_INSTR(0x31, 0x75),
+ ILI9881C_COMMAND_INSTR(0xB5, 0x07),
+ ILI9881C_COMMAND_INSTR(0x8A, 0xD8),
+ ILI9881C_COMMAND_INSTR(0x3A, 0x8A),
+
+ //ILI9881C PAGE1
+ ILI9881C_SWITCH_PAGE_INSTR(1),
+ ILI9881C_COMMAND_INSTR(0x22, 0x0A),
+ //Column inversion
+ ILI9881C_COMMAND_INSTR(0x31, 0x09),
+ ILI9881C_COMMAND_INSTR(0x40, 0x33),
+ ILI9881C_COMMAND_INSTR(0x42, 0x44),
+ ILI9881C_COMMAND_INSTR(0x53, 0x3E),
+ ILI9881C_COMMAND_INSTR(0x55, 0x45),
+ ILI9881C_COMMAND_INSTR(0x56, 0x00),
+ ILI9881C_COMMAND_INSTR(0x50, 0x95),
+ ILI9881C_COMMAND_INSTR(0x51, 0x95),
+ ILI9881C_COMMAND_INSTR(0x60, 0x09),
+ ILI9881C_COMMAND_INSTR(0x2E, 0xC8),
+ ILI9881C_COMMAND_INSTR(0x35, 0x07),
+ ILI9881C_COMMAND_INSTR(0x63, 0x00),
+ //---P-GAMMA START---
+ ILI9881C_COMMAND_INSTR(0xA0, 0x00),
+ ILI9881C_COMMAND_INSTR(0xA1, 0x14),
+ ILI9881C_COMMAND_INSTR(0xA2, 0x24),
+ ILI9881C_COMMAND_INSTR(0xA3, 0x17),
+ ILI9881C_COMMAND_INSTR(0xA4, 0x1A),
+ ILI9881C_COMMAND_INSTR(0xA5, 0x2C),
+ ILI9881C_COMMAND_INSTR(0xA6, 0x20),
+ ILI9881C_COMMAND_INSTR(0xA7, 0x1F),
+ ILI9881C_COMMAND_INSTR(0xA8, 0x81),
+ ILI9881C_COMMAND_INSTR(0xA9, 0x1E),
+ ILI9881C_COMMAND_INSTR(0xAA, 0x2A),
+ ILI9881C_COMMAND_INSTR(0xAB, 0x71),
+ ILI9881C_COMMAND_INSTR(0xAC, 0x19),
+ ILI9881C_COMMAND_INSTR(0xAD, 0x17),
+ ILI9881C_COMMAND_INSTR(0xAE, 0x4C),
+ ILI9881C_COMMAND_INSTR(0xAF, 0x1F),
+ ILI9881C_COMMAND_INSTR(0xB0, 0x26),
+ ILI9881C_COMMAND_INSTR(0xB1, 0x4D),
+ ILI9881C_COMMAND_INSTR(0xB2, 0x5D),
+ ILI9881C_COMMAND_INSTR(0xB3, 0x3F),
+
+ //--- N-GAMMA START---
+ ILI9881C_COMMAND_INSTR(0xC0, 0x00),
+ ILI9881C_COMMAND_INSTR(0xC1, 0x18),
+ ILI9881C_COMMAND_INSTR(0xC2, 0x24),
+ ILI9881C_COMMAND_INSTR(0xC3, 0x0E),
+ ILI9881C_COMMAND_INSTR(0xC4, 0x11),
+ ILI9881C_COMMAND_INSTR(0xC5, 0x24),
+ ILI9881C_COMMAND_INSTR(0xC6, 0x1A),
+ ILI9881C_COMMAND_INSTR(0xC7, 0x1E),
+ ILI9881C_COMMAND_INSTR(0xC8, 0x76),
+ ILI9881C_COMMAND_INSTR(0xC9, 0x1B),
+ ILI9881C_COMMAND_INSTR(0xCA, 0x27),
+ ILI9881C_COMMAND_INSTR(0xCB, 0x64),
+ ILI9881C_COMMAND_INSTR(0xCC, 0x19),
+ ILI9881C_COMMAND_INSTR(0xCD, 0x18),
+ ILI9881C_COMMAND_INSTR(0xCE, 0x4A),
+ ILI9881C_COMMAND_INSTR(0xCF, 0x20),
+ ILI9881C_COMMAND_INSTR(0xD0, 0x28),
+ ILI9881C_COMMAND_INSTR(0xD1, 0x4A),
+ ILI9881C_COMMAND_INSTR(0xD2, 0x5C),
+ ILI9881C_COMMAND_INSTR(0xD3, 0x3F),
+};
+
+static const struct ili9881c_instr t101p136cq_2lane_init[] = {
+ //ILI9881C PAGE3
+ ILI9881C_SWITCH_PAGE_INSTR(3),
+ //GIP_1
+ ILI9881C_COMMAND_INSTR(0x01, 0x00), //added
+ ILI9881C_COMMAND_INSTR(0x02, 0x00),
+ ILI9881C_COMMAND_INSTR(0x03, 0x53),
+ ILI9881C_COMMAND_INSTR(0x04, 0x53),
+ ILI9881C_COMMAND_INSTR(0x05, 0x13),
+ ILI9881C_COMMAND_INSTR(0x06, 0x04),
+ ILI9881C_COMMAND_INSTR(0x07, 0x02),
+ ILI9881C_COMMAND_INSTR(0x08, 0x02),
+ ILI9881C_COMMAND_INSTR(0x09, 0x00),
+ ILI9881C_COMMAND_INSTR(0x0A, 0x00),
+ ILI9881C_COMMAND_INSTR(0x0B, 0x00),
+ ILI9881C_COMMAND_INSTR(0x0C, 0x00),
+ ILI9881C_COMMAND_INSTR(0x0D, 0x00),
+ ILI9881C_COMMAND_INSTR(0x0E, 0x00),
+ ILI9881C_COMMAND_INSTR(0x0F, 0x00),
+ ILI9881C_COMMAND_INSTR(0x10, 0x00),
+ ILI9881C_COMMAND_INSTR(0x11, 0x00),
+ ILI9881C_COMMAND_INSTR(0x12, 0x00),
+ ILI9881C_COMMAND_INSTR(0x13, 0x00),
+ ILI9881C_COMMAND_INSTR(0x14, 0x00),
+ ILI9881C_COMMAND_INSTR(0x15, 0x05),
+ ILI9881C_COMMAND_INSTR(0x16, 0x05),
+ ILI9881C_COMMAND_INSTR(0x17, 0x03),
+ ILI9881C_COMMAND_INSTR(0x18, 0x03),
+ ILI9881C_COMMAND_INSTR(0x19, 0x00),
+ ILI9881C_COMMAND_INSTR(0x1A, 0x00),
+ ILI9881C_COMMAND_INSTR(0x1B, 0x00),
+ ILI9881C_COMMAND_INSTR(0x1C, 0x00),
+ ILI9881C_COMMAND_INSTR(0x1D, 0x00),
+ ILI9881C_COMMAND_INSTR(0x1E, 0xC0),
+ ILI9881C_COMMAND_INSTR(0x1F, 0x80),
+ ILI9881C_COMMAND_INSTR(0x20, 0x02),
+ ILI9881C_COMMAND_INSTR(0x21, 0x09),
+ ILI9881C_COMMAND_INSTR(0x22, 0x00),
+ ILI9881C_COMMAND_INSTR(0x23, 0x00),
+ ILI9881C_COMMAND_INSTR(0x24, 0x00),
+ ILI9881C_COMMAND_INSTR(0x25, 0x00),
+ ILI9881C_COMMAND_INSTR(0x26, 0x00),
+ ILI9881C_COMMAND_INSTR(0x27, 0x00),
+ ILI9881C_COMMAND_INSTR(0x28, 0x55),
+ ILI9881C_COMMAND_INSTR(0x29, 0x03),
+ ILI9881C_COMMAND_INSTR(0x2A, 0x00),
+ ILI9881C_COMMAND_INSTR(0x2B, 0x00),
+ ILI9881C_COMMAND_INSTR(0x2C, 0x00),
+ ILI9881C_COMMAND_INSTR(0x2D, 0x00),
+ ILI9881C_COMMAND_INSTR(0x2E, 0x00),
+ ILI9881C_COMMAND_INSTR(0x2F, 0x00),
+ ILI9881C_COMMAND_INSTR(0x30, 0x00),
+ ILI9881C_COMMAND_INSTR(0x31, 0x00),
+ ILI9881C_COMMAND_INSTR(0x32, 0x00),
+ ILI9881C_COMMAND_INSTR(0x33, 0x00),
+ ILI9881C_COMMAND_INSTR(0x34, 0x00),
+ ILI9881C_COMMAND_INSTR(0x35, 0x00),
+ ILI9881C_COMMAND_INSTR(0x36, 0x00),
+ ILI9881C_COMMAND_INSTR(0x37, 0x00),
+ ILI9881C_COMMAND_INSTR(0x38, 0x3C),
+ ILI9881C_COMMAND_INSTR(0x39, 0x00),
+ ILI9881C_COMMAND_INSTR(0x3A, 0x00),
+ ILI9881C_COMMAND_INSTR(0x3B, 0x00),
+ ILI9881C_COMMAND_INSTR(0x3C, 0x00),
+ ILI9881C_COMMAND_INSTR(0x3D, 0x00),
+ ILI9881C_COMMAND_INSTR(0x3E, 0x00),
+ ILI9881C_COMMAND_INSTR(0x3F, 0x00),
+ ILI9881C_COMMAND_INSTR(0x40, 0x00),
+ ILI9881C_COMMAND_INSTR(0x41, 0x00),
+ ILI9881C_COMMAND_INSTR(0x42, 0x00),
+ ILI9881C_COMMAND_INSTR(0x43, 0x00),
+ ILI9881C_COMMAND_INSTR(0x44, 0x00),
+
+ //GIP_2
+ ILI9881C_COMMAND_INSTR(0x50, 0x01),
+ ILI9881C_COMMAND_INSTR(0x51, 0x23),
+ ILI9881C_COMMAND_INSTR(0x52, 0x45),
+ ILI9881C_COMMAND_INSTR(0x53, 0x67),
+ ILI9881C_COMMAND_INSTR(0x54, 0x89),
+ ILI9881C_COMMAND_INSTR(0x55, 0xAB),
+ ILI9881C_COMMAND_INSTR(0x56, 0x01),
+ ILI9881C_COMMAND_INSTR(0x57, 0x23),
+ ILI9881C_COMMAND_INSTR(0x58, 0x45),
+ ILI9881C_COMMAND_INSTR(0x59, 0x67),
+ ILI9881C_COMMAND_INSTR(0x5A, 0x89),
+ ILI9881C_COMMAND_INSTR(0x5B, 0xAB),
+ ILI9881C_COMMAND_INSTR(0x5C, 0xCD),
+ ILI9881C_COMMAND_INSTR(0x5D, 0xEF),
+ //GIP_3
+ ILI9881C_COMMAND_INSTR(0x5E, 0x01),
+ ILI9881C_COMMAND_INSTR(0x5F, 0x0A),
+ ILI9881C_COMMAND_INSTR(0x60, 0x02),
+ ILI9881C_COMMAND_INSTR(0x61, 0x02),
+ ILI9881C_COMMAND_INSTR(0x62, 0x08),
+ ILI9881C_COMMAND_INSTR(0x63, 0x15),
+ ILI9881C_COMMAND_INSTR(0x64, 0x14),
+ ILI9881C_COMMAND_INSTR(0x65, 0x02),
+ ILI9881C_COMMAND_INSTR(0x66, 0x11),
+ ILI9881C_COMMAND_INSTR(0x67, 0x10),
+ ILI9881C_COMMAND_INSTR(0x68, 0x02),
+ ILI9881C_COMMAND_INSTR(0x69, 0x0F),
+ ILI9881C_COMMAND_INSTR(0x6A, 0x0E),
+ ILI9881C_COMMAND_INSTR(0x6B, 0x02),
+ ILI9881C_COMMAND_INSTR(0x6C, 0x0D),
+ ILI9881C_COMMAND_INSTR(0x6D, 0x0C),
+ ILI9881C_COMMAND_INSTR(0x6E, 0x06),
+ ILI9881C_COMMAND_INSTR(0x6F, 0x02),
+ ILI9881C_COMMAND_INSTR(0x70, 0x02),
+ ILI9881C_COMMAND_INSTR(0x71, 0x02),
+ ILI9881C_COMMAND_INSTR(0x72, 0x02),
+ ILI9881C_COMMAND_INSTR(0x73, 0x02),
+ ILI9881C_COMMAND_INSTR(0x74, 0x02),
+ ILI9881C_COMMAND_INSTR(0x75, 0x0A),
+ ILI9881C_COMMAND_INSTR(0x76, 0x02),
+ ILI9881C_COMMAND_INSTR(0x77, 0x02),
+ ILI9881C_COMMAND_INSTR(0x78, 0x06),
+ ILI9881C_COMMAND_INSTR(0x79, 0x15),
+ ILI9881C_COMMAND_INSTR(0x7A, 0x14),
+ ILI9881C_COMMAND_INSTR(0x7B, 0x02),
+ ILI9881C_COMMAND_INSTR(0x7C, 0x10),
+ ILI9881C_COMMAND_INSTR(0x7D, 0x11),
+ ILI9881C_COMMAND_INSTR(0x7E, 0x02),
+ ILI9881C_COMMAND_INSTR(0x7F, 0x0C),
+ ILI9881C_COMMAND_INSTR(0x80, 0x0D),
+ ILI9881C_COMMAND_INSTR(0x81, 0x02),
+ ILI9881C_COMMAND_INSTR(0x82, 0x0E),
+ ILI9881C_COMMAND_INSTR(0x83, 0x0F),
+ ILI9881C_COMMAND_INSTR(0x84, 0x08),
+ ILI9881C_COMMAND_INSTR(0x85, 0x02),
+ ILI9881C_COMMAND_INSTR(0x86, 0x02),
+ ILI9881C_COMMAND_INSTR(0x87, 0x02),
+ ILI9881C_COMMAND_INSTR(0x88, 0x02),
+ ILI9881C_COMMAND_INSTR(0x89, 0x02),
+ ILI9881C_COMMAND_INSTR(0x8A, 0x02),
+ //ILI9881C PAGE4
+ ILI9881C_SWITCH_PAGE_INSTR(4),
+ ILI9881C_COMMAND_INSTR(0x3B, 0x98),
+ ILI9881C_COMMAND_INSTR(0x6C, 0x15),
+ ILI9881C_COMMAND_INSTR(0x6E, 0x30),
+ // VGH & VGL OUTPUT
+ ILI9881C_COMMAND_INSTR(0x6F, 0x45),
+ ILI9881C_COMMAND_INSTR(0x8D, 0x1F),
+ ILI9881C_COMMAND_INSTR(0x87, 0xBA),
+ ILI9881C_COMMAND_INSTR(0x26, 0x76),
+ //Reload Gamma setting
+ ILI9881C_COMMAND_INSTR(0xB2, 0xD1),
+ ILI9881C_COMMAND_INSTR(0x88, 0x0B),
+ ILI9881C_COMMAND_INSTR(0x21, 0xB0),
+ ILI9881C_COMMAND_INSTR(0x35, 0x17),
+ ILI9881C_COMMAND_INSTR(0x30, 0x01),
+ ILI9881C_COMMAND_INSTR(0x31, 0x75),
+ ILI9881C_COMMAND_INSTR(0xB5, 0x07),
+ ILI9881C_COMMAND_INSTR(0x8A, 0xD8),
+ ILI9881C_COMMAND_INSTR(0x3A, 0x8A),
+
+//#if 0 //BIST Mode
+// ILI9881C_COMMAND_INSTR(0x2F, 0x01),
+//#endif
+
+ //ILI9881C PAGE1
+ ILI9881C_SWITCH_PAGE_INSTR(1),
+ ILI9881C_COMMAND_INSTR(0x22, 0x0A),
+ //Column inversion
+ ILI9881C_COMMAND_INSTR(0x31, 0x09),
+ ILI9881C_COMMAND_INSTR(0x40, 0x33),
+ ILI9881C_COMMAND_INSTR(0x42, 0x44),
+ ILI9881C_COMMAND_INSTR(0x53, 0x3E),
+ ILI9881C_COMMAND_INSTR(0x55, 0x45),
+ ILI9881C_COMMAND_INSTR(0x56, 0x00),
+ ILI9881C_COMMAND_INSTR(0x50, 0x95),
+ ILI9881C_COMMAND_INSTR(0x51, 0x95),
+ ILI9881C_COMMAND_INSTR(0x60, 0x09),
+ ILI9881C_COMMAND_INSTR(0x2E, 0xC8),
+ ILI9881C_COMMAND_INSTR(0x35, 0x07),
+ ILI9881C_COMMAND_INSTR(0x63, 0x00),
+ //---P-GAMMA START---
+ ILI9881C_COMMAND_INSTR(0xA0, 0x00),
+ ILI9881C_COMMAND_INSTR(0xA1, 0x14),
+ ILI9881C_COMMAND_INSTR(0xA2, 0x24),
+ ILI9881C_COMMAND_INSTR(0xA3, 0x17),
+ ILI9881C_COMMAND_INSTR(0xA4, 0x1A),
+ ILI9881C_COMMAND_INSTR(0xA5, 0x2C),
+ ILI9881C_COMMAND_INSTR(0xA6, 0x20),
+ ILI9881C_COMMAND_INSTR(0xA7, 0x1F),
+ ILI9881C_COMMAND_INSTR(0xA8, 0x81),
+ ILI9881C_COMMAND_INSTR(0xA9, 0x1E),
+ ILI9881C_COMMAND_INSTR(0xAA, 0x2A),
+ ILI9881C_COMMAND_INSTR(0xAB, 0x71),
+ ILI9881C_COMMAND_INSTR(0xAC, 0x19),
+ ILI9881C_COMMAND_INSTR(0xAD, 0x17),
+ ILI9881C_COMMAND_INSTR(0xAE, 0x4C),
+ ILI9881C_COMMAND_INSTR(0xAF, 0x1F),
+ ILI9881C_COMMAND_INSTR(0xB0, 0x26),
+ ILI9881C_COMMAND_INSTR(0xB1, 0x4D),
+ ILI9881C_COMMAND_INSTR(0xB2, 0x5D),
+ ILI9881C_COMMAND_INSTR(0xB3, 0x3F),
+
+ ILI9881C_COMMAND_INSTR(0xB7, 0x03),
+ //--- N-GAMMA START---
+ ILI9881C_COMMAND_INSTR(0xC0, 0x00),
+ ILI9881C_COMMAND_INSTR(0xC1, 0x18),
+ ILI9881C_COMMAND_INSTR(0xC2, 0x24),
+ ILI9881C_COMMAND_INSTR(0xC3, 0x0E),
+ ILI9881C_COMMAND_INSTR(0xC4, 0x11),
+ ILI9881C_COMMAND_INSTR(0xC5, 0x24),
+ ILI9881C_COMMAND_INSTR(0xC6, 0x1A),
+ ILI9881C_COMMAND_INSTR(0xC7, 0x1E),
+ ILI9881C_COMMAND_INSTR(0xC8, 0x76),
+ ILI9881C_COMMAND_INSTR(0xC9, 0x1B),
+ ILI9881C_COMMAND_INSTR(0xCA, 0x27),
+ ILI9881C_COMMAND_INSTR(0xCB, 0x64),
+ ILI9881C_COMMAND_INSTR(0xCC, 0x19),
+ ILI9881C_COMMAND_INSTR(0xCD, 0x18),
+ ILI9881C_COMMAND_INSTR(0xCE, 0x4A),
+ ILI9881C_COMMAND_INSTR(0xCF, 0x20),
+ ILI9881C_COMMAND_INSTR(0xD0, 0x28),
+ ILI9881C_COMMAND_INSTR(0xD1, 0x4A),
+ ILI9881C_COMMAND_INSTR(0xD2, 0x5C),
+ ILI9881C_COMMAND_INSTR(0xD3, 0x3F),
+};
+
static inline struct ili9881c *panel_to_ili9881c(struct drm_panel *panel)
{
return container_of(panel, struct ili9881c, panel);
@@ -2511,6 +2949,40 @@ static const struct drm_display_mode bsd1218_a101kl68_default_mode = {
.height_mm = 170,
};
+static const struct drm_display_mode t101p136cq_default_mode = {
+ .clock = 78086, //60Hz
+
+ .hdisplay = 800,
+ .hsync_start = 800 + 120,
+ .hsync_end = 800 + 120 + 20,
+ .htotal = 800 + 120 + 20 + 40,
+
+ .vdisplay = 1280,
+ .vsync_start = 1280 + 16,
+ .vsync_end = 1280 + 16 + 8,
+ .vtotal = 1280 + 16 + 8 + 24,
+
+ .width_mm = 135,
+ .height_mm = 216,
+};
+
+static const struct drm_display_mode t101p136cq_rpi4_rpi5_2lane_mode = {
+ .clock = 78086, //60Hz
+
+ .hdisplay = 800,
+ .hsync_start = 800 + 80,
+ .hsync_end = 800 + 80 + 20,
+ .htotal = 800 + 80 + 20 + 80,
+
+ .vdisplay = 1280,
+ .vsync_start = 1280 + 16,
+ .vsync_end = 1280 + 16 + 8,
+ .vtotal = 1280 + 16 + 8 + 24,
+
+ .width_mm = 135,
+ .height_mm = 216,
+};
+
static int ili9881c_get_modes(struct drm_panel *panel,
struct drm_connector *connector)
{
@@ -2719,6 +3191,23 @@ static const struct ili9881c_desc bsd1218_a101kl68_desc = {
.lanes = 4,
};
+static const struct ili9881c_desc t101p136cq_4lane_desc = {
+ .init = t101p136cq_init,
+ .init_length = ARRAY_SIZE(t101p136cq_init),
+ .mode = &t101p136cq_default_mode,
+ .mode_flags = MIPI_DSI_MODE_VIDEO_SYNC_PULSE | MIPI_DSI_MODE_VIDEO |
+ MIPI_DSI_CLOCK_NON_CONTINUOUS | MIPI_DSI_MODE_LPM,
+ .lanes = 4,
+};
+
+static const struct ili9881c_desc t101p136cq_2lane_desc = {
+ .init = t101p136cq_2lane_init,
+ .init_length = ARRAY_SIZE(t101p136cq_2lane_init),
+ .mode = &t101p136cq_rpi4_rpi5_2lane_mode,
+ .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | MIPI_DSI_MODE_LPM,
+ .lanes = 2,
+};
+
static const struct of_device_id ili9881c_of_match[] = {
{ .compatible = "bananapi,lhr050h41", .data = &lhr050h41_desc },
{ .compatible = "bestar,bsd1218-a101kl68", .data = &bsd1218_a101kl68_desc },
@@ -2731,6 +3220,8 @@ static const struct of_device_id ili9881c_of_match[] = {
{ .compatible = "nwe,nwe080", .data = &nwe080_desc },
{ .compatible = "raspberrypi,dsi-5inch", &rpi_5inch_desc },
{ .compatible = "raspberrypi,dsi-7inch", &rpi_7inch_desc },
+ { .compatible = "rzw,t101p136cq-4lane", .data = &t101p136cq_4lane_desc },
+ { .compatible = "rzw,t101p136cq-2lane", .data = &t101p136cq_2lane_desc },
{ }
};
MODULE_DEVICE_TABLE(of, ili9881c_of_match);
diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c
index 6e9f437c852b51..ac45dae3f04331 100644
--- a/drivers/gpu/drm/panel/panel-simple.c
+++ b/drivers/gpu/drm/panel/panel-simple.c
@@ -469,6 +469,90 @@ static struct panel_desc *panel_dpi_probe(struct device *dev)
return desc;
}
+static struct panel_desc *panel_dsi_probe(struct device *dev)
+{
+ const struct device_node *np = dev->of_node;
+ struct panel_desc_dsi *desc_dsi;
+ struct panel_desc *desc;
+ const char *dsi_color_format;
+ const char *dsi_mode_flags;
+ struct property *prop;
+ int dsi_lanes;
+
+ desc = panel_dpi_probe(dev);
+ if (IS_ERR(desc)) {
+ pr_err("Failed panel_dpi_probe\n");
+ return desc;
+ }
+
+ desc->connector_type = DRM_MODE_CONNECTOR_DSI;
+
+ desc_dsi = devm_kzalloc(dev, sizeof(*desc_dsi), GFP_KERNEL);
+ if (!desc_dsi)
+ return ERR_PTR(-ENOMEM);
+
+ desc_dsi->desc = *desc;
+ devm_kfree(dev, desc);
+
+ desc = &desc_dsi->desc;
+
+ dsi_lanes = drm_of_get_data_lanes_count_ep(np, 0, 0, 1, 4);
+
+ if (dsi_lanes < 0) {
+ dev_err(dev, "%pOF: no or too many data-lanes defined", np);
+ return ERR_PTR(dsi_lanes);
+ }
+
+ desc_dsi->lanes = dsi_lanes;
+
+ of_property_read_string(np, "dsi-color-format", &dsi_color_format);
+ if (!strcmp(dsi_color_format, "RGB888")) {
+ desc_dsi->format = MIPI_DSI_FMT_RGB888;
+ desc_dsi->desc.bpc = 8;
+ } else if (!strcmp(dsi_color_format, "RGB565")) {
+ desc_dsi->format = MIPI_DSI_FMT_RGB565;
+ desc_dsi->desc.bpc = 6;
+ } else if (!strcmp(dsi_color_format, "RGB666")) {
+ desc_dsi->format = MIPI_DSI_FMT_RGB666;
+ desc_dsi->desc.bpc = 6;
+ } else if (!strcmp(dsi_color_format, "RGB666_PACKED")) {
+ desc_dsi->format = MIPI_DSI_FMT_RGB666_PACKED;
+ desc_dsi->desc.bpc = 6;
+ } else {
+ dev_err(dev, "%pOF: no valid dsi-color-format defined", np);
+ return ERR_PTR(-EINVAL);
+ }
+
+ of_property_for_each_string(np, "mode", prop, dsi_mode_flags) {
+ if (!strcmp(dsi_mode_flags, "MODE_VIDEO"))
+ desc_dsi->flags |= MIPI_DSI_MODE_VIDEO;
+ else if (!strcmp(dsi_mode_flags, "MODE_VIDEO_BURST"))
+ desc_dsi->flags |= MIPI_DSI_MODE_VIDEO_BURST;
+ else if (!strcmp(dsi_mode_flags, "MODE_VIDEO_SYNC_PULSE"))
+ desc_dsi->flags |= MIPI_DSI_MODE_VIDEO_SYNC_PULSE;
+ else if (!strcmp(dsi_mode_flags, "MODE_VIDEO_AUTO_VERT"))
+ desc_dsi->flags |= MIPI_DSI_MODE_VIDEO_AUTO_VERT;
+ else if (!strcmp(dsi_mode_flags, "MODE_VIDEO_HSE"))
+ desc_dsi->flags |= MIPI_DSI_MODE_VIDEO_HSE;
+ else if (!strcmp(dsi_mode_flags, "MODE_VIDEO_NO_HFP"))
+ desc_dsi->flags |= MIPI_DSI_MODE_VIDEO_NO_HFP;
+ else if (!strcmp(dsi_mode_flags, "MODE_VIDEO_NO_HBP"))
+ desc_dsi->flags |= MIPI_DSI_MODE_VIDEO_NO_HBP;
+ else if (!strcmp(dsi_mode_flags, "MODE_VIDEO_NO_HSA"))
+ desc_dsi->flags |= MIPI_DSI_MODE_VIDEO_NO_HSA;
+ else if (!strcmp(dsi_mode_flags, "MODE_NO_EOT_PACKET"))
+ desc_dsi->flags |= MIPI_DSI_MODE_NO_EOT_PACKET;
+ else if (!strcmp(dsi_mode_flags, "CLOCK_NON_CONTINUOUS"))
+ desc_dsi->flags |= MIPI_DSI_CLOCK_NON_CONTINUOUS;
+ else if (!strcmp(dsi_mode_flags, "MODE_LPM"))
+ desc_dsi->flags |= MIPI_DSI_MODE_LPM;
+ else if (!strcmp(dsi_mode_flags, "HS_PKT_END_ALIGNED"))
+ desc_dsi->flags |= MIPI_DSI_HS_PKT_END_ALIGNED;
+ }
+
+ return &desc_dsi->desc;
+}
+
#define PANEL_SIMPLE_BOUNDS_CHECK(to_check, bounds, field) \
(to_check->field.typ >= bounds->field.min && \
to_check->field.typ <= bounds->field.max)
@@ -568,8 +652,17 @@ static const struct panel_desc *panel_simple_get_desc(struct device *dev)
const struct panel_desc_dsi *dsi_desc;
dsi_desc = of_device_get_match_data(dev);
- if (!dsi_desc)
- return ERR_PTR(-ENODEV);
+ if (!dsi_desc) {
+ /*
+ * panel-dsi probes without a descriptor and
+ * panel_dsi_probe() will initialize one for us
+ * based on the device tree.
+ */
+ if (of_device_is_compatible(dev->of_node, "panel-dsi"))
+ return panel_dsi_probe(dev);
+ else
+ return ERR_PTR(-ENODEV);
+ }
return &dsi_desc->desc;
}
@@ -689,7 +782,8 @@ static struct panel_simple *panel_simple_probe(struct device *dev)
return ERR_PTR(-EPROBE_DEFER);
}
- if (!of_device_is_compatible(dev->of_node, "panel-dpi") &&
+ if (!(of_device_is_compatible(dev->of_node, "panel-dpi") ||
+ of_device_is_compatible(dev->of_node, "panel-dsi")) &&
!of_get_display_timing(dev->of_node, "panel-timing", &dt))
panel_simple_parse_panel_timing_node(dev, panel, &dt);
@@ -5782,9 +5876,6 @@ static const struct panel_desc_dsi osd101t2045_53ts = {
.lanes = 4,
};
-// for panels using generic panel-dsi binding
-static struct panel_desc_dsi panel_dsi;
-
static const struct of_device_id dsi_of_match[] = {
{
.compatible = "auo,b080uan01",
@@ -5810,113 +5901,15 @@ static const struct of_device_id dsi_of_match[] = {
}, {
/* Must be the last entry */
.compatible = "panel-dsi",
- .data = &panel_dsi,
}, {
/* sentinel */
}
};
MODULE_DEVICE_TABLE(of, dsi_of_match);
-
-/* Checks for DSI panel definition in device-tree, analog to panel_dpi */
-static int panel_dsi_dt_probe(struct device *dev,
- struct panel_desc_dsi *desc_dsi)
-{
- struct panel_desc *desc;
- struct display_timing *timing;
- const struct device_node *np;
- const char *dsi_color_format;
- const char *dsi_mode_flags;
- struct property *prop;
- int dsi_lanes, ret;
-
- np = dev->of_node;
-
- desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL);
- if (!desc)
- return -ENOMEM;
-
- timing = devm_kzalloc(dev, sizeof(*timing), GFP_KERNEL);
- if (!timing)
- return -ENOMEM;
-
- ret = of_get_display_timing(np, "panel-timing", timing);
- if (ret < 0) {
- dev_err(dev, "%pOF: no panel-timing node found for \"panel-dsi\" binding\n",
- np);
- return ret;
- }
-
- desc->timings = timing;
- desc->num_timings = 1;
-
- of_property_read_u32(np, "width-mm", &desc->size.width);
- of_property_read_u32(np, "height-mm", &desc->size.height);
-
- dsi_lanes = drm_of_get_data_lanes_count_ep(np, 0, 0, 1, 4);
-
- if (dsi_lanes < 0) {
- dev_err(dev, "%pOF: no or too many data-lanes defined", np);
- return dsi_lanes;
- }
-
- desc_dsi->lanes = dsi_lanes;
-
- of_property_read_string(np, "dsi-color-format", &dsi_color_format);
- if (!strcmp(dsi_color_format, "RGB888")) {
- desc_dsi->format = MIPI_DSI_FMT_RGB888;
- desc->bpc = 8;
- } else if (!strcmp(dsi_color_format, "RGB565")) {
- desc_dsi->format = MIPI_DSI_FMT_RGB565;
- desc->bpc = 6;
- } else if (!strcmp(dsi_color_format, "RGB666")) {
- desc_dsi->format = MIPI_DSI_FMT_RGB666;
- desc->bpc = 6;
- } else if (!strcmp(dsi_color_format, "RGB666_PACKED")) {
- desc_dsi->format = MIPI_DSI_FMT_RGB666_PACKED;
- desc->bpc = 6;
- } else {
- dev_err(dev, "%pOF: no valid dsi-color-format defined", np);
- return -EINVAL;
- }
-
-
- of_property_for_each_string(np, "mode", prop, dsi_mode_flags) {
- if (!strcmp(dsi_mode_flags, "MODE_VIDEO"))
- desc_dsi->flags |= MIPI_DSI_MODE_VIDEO;
- else if (!strcmp(dsi_mode_flags, "MODE_VIDEO_BURST"))
- desc_dsi->flags |= MIPI_DSI_MODE_VIDEO_BURST;
- else if (!strcmp(dsi_mode_flags, "MODE_VIDEO_SYNC_PULSE"))
- desc_dsi->flags |= MIPI_DSI_MODE_VIDEO_SYNC_PULSE;
- else if (!strcmp(dsi_mode_flags, "MODE_VIDEO_AUTO_VERT"))
- desc_dsi->flags |= MIPI_DSI_MODE_VIDEO_AUTO_VERT;
- else if (!strcmp(dsi_mode_flags, "MODE_VIDEO_HSE"))
- desc_dsi->flags |= MIPI_DSI_MODE_VIDEO_HSE;
- else if (!strcmp(dsi_mode_flags, "MODE_VIDEO_NO_HFP"))
- desc_dsi->flags |= MIPI_DSI_MODE_VIDEO_NO_HFP;
- else if (!strcmp(dsi_mode_flags, "MODE_VIDEO_NO_HBP"))
- desc_dsi->flags |= MIPI_DSI_MODE_VIDEO_NO_HBP;
- else if (!strcmp(dsi_mode_flags, "MODE_VIDEO_NO_HSA"))
- desc_dsi->flags |= MIPI_DSI_MODE_VIDEO_NO_HSA;
- else if (!strcmp(dsi_mode_flags, "MODE_NO_EOT_PACKET"))
- desc_dsi->flags |= MIPI_DSI_MODE_NO_EOT_PACKET;
- else if (!strcmp(dsi_mode_flags, "CLOCK_NON_CONTINUOUS"))
- desc_dsi->flags |= MIPI_DSI_CLOCK_NON_CONTINUOUS;
- else if (!strcmp(dsi_mode_flags, "MODE_LPM"))
- desc_dsi->flags |= MIPI_DSI_MODE_LPM;
- else if (!strcmp(dsi_mode_flags, "HS_PKT_END_ALIGNED"))
- desc_dsi->flags |= MIPI_DSI_HS_PKT_END_ALIGNED;
- }
-
- desc->connector_type = DRM_MODE_CONNECTOR_DSI;
- desc_dsi->desc = *desc;
-
- return 0;
-}
-
static int panel_simple_dsi_probe(struct mipi_dsi_device *dsi)
{
- const struct panel_desc_dsi *desc;
+ const struct panel_desc_dsi *dsi_desc;
struct panel_simple *panel;
int err;
@@ -5924,25 +5917,11 @@ static int panel_simple_dsi_probe(struct mipi_dsi_device *dsi)
if (IS_ERR(panel))
return PTR_ERR(panel);
- desc = container_of(panel->desc, struct panel_desc_dsi, desc);
-
- if (desc == &panel_dsi) {
- /* Handle the generic panel-dsi binding */
- struct panel_desc_dsi *dt_desc;
- dt_desc = devm_kzalloc(&dsi->dev, sizeof(*dt_desc), GFP_KERNEL);
- if (!dt_desc)
- return -ENOMEM;
-
- err = panel_dsi_dt_probe(&dsi->dev, dt_desc);
- if (err < 0)
- return err;
-
- desc = dt_desc;
- }
+ dsi_desc = container_of(panel->desc, struct panel_desc_dsi, desc);
- dsi->mode_flags = desc->flags;
- dsi->format = desc->format;
- dsi->lanes = desc->lanes;
+ dsi->mode_flags = dsi_desc->flags;
+ dsi->format = dsi_desc->format;
+ dsi->lanes = dsi_desc->lanes;
err = mipi_dsi_attach(dsi);
if (err) {
diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig
index b6ffd0d6ede856..1d9a34fc6ae945 100644
--- a/drivers/regulator/Kconfig
+++ b/drivers/regulator/Kconfig
@@ -1828,4 +1828,21 @@ config REGULATOR_QCOM_LABIBB
boost regulator and IBB can be used as a negative boost regulator
for LCD display panel.
+config REGULATOR_EDATEC_10INCH
+ tristate "EDATEC 10INCH regulator support"
+ depends on BACKLIGHT_CLASS_DEVICE
+ depends on I2C
+ select REGMAP_I2C
+ help
+ This driver provides support for controlling the panel's power supply,
+ including the necessary voltage and current regulation for proper
+ backlight and LCD operation.
+
+ The driver communicates with the regulator hardware via the I2C bus.
+ Configuration is done through the Device Tree. You will need to enable
+ the appropriate Device Tree overlay or add the necessary node to your
+ Device Tree source file to make use of this driver.
+
+ Say Y or M here if your system uses an EDATEC 10-inch display panel.
+ Otherwise, say N.
endif
diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile
index b0b8fd27799269..910e15a1b9d426 100644
--- a/drivers/regulator/Makefile
+++ b/drivers/regulator/Makefile
@@ -211,5 +211,6 @@ obj-$(CONFIG_REGULATOR_WM831X) += wm831x-ldo.o
obj-$(CONFIG_REGULATOR_WM8350) += wm8350-regulator.o
obj-$(CONFIG_REGULATOR_WM8400) += wm8400-regulator.o
obj-$(CONFIG_REGULATOR_WM8994) += wm8994-regulator.o
+obj-$(CONFIG_REGULATOR_EDATEC_10INCH) += edatec-panel-regulator.o
ccflags-$(CONFIG_REGULATOR_DEBUG) += -DDEBUG
diff --git a/drivers/regulator/edatec-panel-regulator.c b/drivers/regulator/edatec-panel-regulator.c
new file mode 100644
index 00000000000000..69338d430853b3
--- /dev/null
+++ b/drivers/regulator/edatec-panel-regulator.c
@@ -0,0 +1,188 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2026 Edatec
+ *
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#define REG_PWM 0x01
+#define REG_IODIR 0x02
+#define REG_PWR 0x03
+#define REG_OUTPUT 0x0A
+
+#define CMD_BRIDGE_INIT 0x11
+#define CMD_BACKLIGHT_EN 0x12
+#define CMD_FW_VERSION 0xE1
+
+#define PIN_LCD_BL_EN BIT(0)
+#define PIN_LCD_BL_PWM BIT(1)
+#define PIN_LCD_RST BIT(2)
+#define PIN_TP_RST BIT(3)
+#define PIN_LCD_VDD_EN BIT(4)
+
+#define NUM_GPIO 5
+
+struct ed_lcd {
+ struct regmap *regmap;
+};
+
+static const struct regmap_config ed_regmap_config = {
+ .reg_bits = 8,
+ .val_bits = 8,
+ .disable_locking = 1,
+ .max_register = REG_OUTPUT,
+ .cache_type = REGCACHE_RBTREE,
+};
+
+static int ed_update_status(struct backlight_device *bl)
+{
+ struct ed_lcd *state = bl_get_data(bl);
+ struct regmap *regmap = state->regmap;
+ int brightness = backlight_get_brightness(bl);
+ int ret;
+
+ ret = regmap_write(regmap, REG_PWR, brightness ? 0 : 4);
+
+ if (!ret)
+ ret = regmap_write(regmap, REG_PWM, brightness);
+
+ return ret;
+}
+
+static const struct backlight_ops ed_bl = {
+ .update_status = ed_update_status,
+};
+
+static int ed_firmware_version(struct i2c_client *i2c)
+{
+ struct i2c_msg msgs[1];
+ u8 addr_buf[1] = { CMD_FW_VERSION };
+ u8 data_buf[16] = { 0 };
+ int ret;
+
+ /* Write register address */
+ msgs[0].addr = i2c->addr;
+ msgs[0].flags = 0;
+ msgs[0].len = 1;
+ msgs[0].buf = addr_buf;
+
+ ret = i2c_transfer(i2c->adapter, msgs, ARRAY_SIZE(msgs));
+ if (ret != ARRAY_SIZE(msgs))
+ return -EIO;
+
+ usleep_range(200, 300);
+
+ /* Read data from register */
+ msgs[0].addr = i2c->addr;
+ msgs[0].flags = I2C_M_RD;
+ msgs[0].len = 16;
+ msgs[0].buf = data_buf;
+
+ ret = i2c_transfer(i2c->adapter, msgs, ARRAY_SIZE(msgs));
+ if (ret != ARRAY_SIZE(msgs))
+ return -EIO;
+
+ dev_info(&i2c->dev, "Firmware version: %s\n", data_buf);
+
+ return 0;
+}
+
+/*
+ * I2C driver interface functions
+ */
+static int ed_i2c_probe(struct i2c_client *i2c)
+{
+ struct gpio_regmap_config gconfig = {
+ .ngpio = NUM_GPIO,
+ .ngpio_per_reg = NUM_GPIO,
+ .parent = &i2c->dev,
+ .reg_set_base = REG_OUTPUT,
+ };
+ struct backlight_properties props = { };
+ struct backlight_device *bl;
+ struct ed_lcd *state;
+ struct regmap *regmap;
+ int ret;
+
+ state = devm_kzalloc(&i2c->dev, sizeof(*state), GFP_KERNEL);
+ if (!state)
+ return -ENOMEM;
+
+ ed_firmware_version(i2c);
+
+ i2c_set_clientdata(i2c, state);
+
+ regmap = devm_regmap_init_i2c(i2c, &ed_regmap_config);
+ if (IS_ERR(regmap)) {
+ ret = PTR_ERR(regmap);
+ dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
+ ret);
+ return ret;
+ }
+
+ regmap_write(regmap, CMD_BRIDGE_INIT, 0x02);
+
+ regmap_write(regmap, CMD_BACKLIGHT_EN, 1);
+
+ props.type = BACKLIGHT_RAW;
+ props.max_brightness = 0xff;
+ props.brightness = 0xff;
+
+ state->regmap = regmap;
+ bl = devm_backlight_device_register(&i2c->dev, dev_name(&i2c->dev),
+ &i2c->dev, state, &ed_bl, &props);
+ if (IS_ERR(bl))
+ return PTR_ERR(bl);
+
+ bl->props.brightness = 0xff;
+
+ gconfig.regmap = regmap;
+ ret = PTR_ERR_OR_ZERO(devm_gpio_regmap_register(&i2c->dev, &gconfig));
+ if (ret)
+ return dev_err_probe(&i2c->dev, ret, "Failed to create gpiochip\n");
+
+ return 0;
+}
+
+static void ed_i2c_shutdown(struct i2c_client *client)
+{
+ struct ed_lcd *state = i2c_get_clientdata(client);
+
+ regmap_write(state->regmap, CMD_BACKLIGHT_EN, 0);
+ regmap_write(state->regmap, REG_OUTPUT, 0);
+}
+
+static const struct of_device_id ed_dt_ids[] = {
+ { .compatible = "edatec,disp-regulator" },
+ {},
+};
+MODULE_DEVICE_TABLE(of, ed_dt_ids);
+
+static struct i2c_driver ed_regulator_driver = {
+ .driver = {
+ .name = "edatec_disp_101c",
+ .of_match_table = of_match_ptr(ed_dt_ids),
+ },
+ .probe = ed_i2c_probe,
+ .shutdown = ed_i2c_shutdown,
+};
+
+module_i2c_driver(ed_regulator_driver);
+
+MODULE_AUTHOR("EDATEC ");
+MODULE_DESCRIPTION("EDATEC TFT LCD panel regulator driver");
+MODULE_LICENSE("GPL v2");