From nobody Fri Sep 25 07:59:37 2026 Received: from ironport.ite.com.tw (itemail.ite.com.tw [60.251.196.230]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EF175468C15; Tue, 15 Sep 2026 07:27:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=60.251.196.230 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789457243; cv=none; b=S0iYFTj5V/IWA+LkSn0N25H/+KAlS1JF1t9O5tl7RIrUqDiLOkNKLC8FL5db2AvP7JhAbbiwUSG9fgdLlvuU89R5T9z/tjHHK7JYyO6tQhJtQsYkI4aoVUTqvMFp9/ftpqVUV8wFEGM0JUv9KRAQXsNfiGOnoHwniSUu+SuHQ7w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789457243; c=relaxed/simple; bh=tlP1iJ85UQy5tBsvpGCCKZ3NqJo96uZlobIIxZUIMS0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=qrND5434gfozeamoipzdO9BWJtR5zXfS3TZxwph1l1bPxKKlI1/AWG6iMZieh8HbVIFavvmchN+RMGy/UXXZVF9KR5JI6arcdKkYnmlIpyGwVqw23NfE1kg3npGzmQqQEJdXl24yNOzn79tzBePANaTLr0XSMSZkDErt6G6CFxo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ite.com.tw; spf=pass smtp.mailfrom=ite.com.tw; dkim=pass (2048-bit key) header.d=ite.com.tw header.i=@ite.com.tw header.b=qs4l0y74; arc=none smtp.client-ip=60.251.196.230 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ite.com.tw Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ite.com.tw Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ite.com.tw header.i=@ite.com.tw header.b="qs4l0y74" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ite.com.tw; s=dkim; h=from:date:subject:mime-version:content-transfer-encoding: message-id:references:in-reply-to:to:cc; bh=BcH1NykmoVX/ILfQGa0dzRnEacmBWjFL+KKNCDWQNsY=; b=qs4l0y74ZR6joqvo/1GT8P8kX0Dfh4cGbLjtSpcLXoYXUp03hmGsuVlT 0gzSiDIJEjCnCdl5n70KvrhzptY7T5BwOvbRg31zB9ckDws2VbRFIMl9E +KmQNBmcP+FffKSYQ6a4fkwQAbVS/sm/4p58S8HickhidsOxZ0LJ3zt3I ybghp0OXFDk1vyiltc941bxWJmySxJSh0A3JMasatjKCRdBfo7eq0gNBC pqVN0gbNsGWPofGaV1l0amrUacLGrmmvsMT+qwHU8gCPZA9vAabP50xue ROFNOLQF2dCWzG4YzQwmUGsBRIdFKkxnEd/ljuZVCNweUj6mA0c4Fx1RX A==; X-CSE-ConnectionGUID: Hhs19nw5QsqGbtS+PtHYzA== X-CSE-MsgGUID: deZWQAVrTHmwyZZKsti9Xg== Received: from unknown (HELO mse.ite.com.tw) ([192.168.35.30]) by ironport.ite.com.tw with ESMTP; 15 Sep 2026 15:27:06 +0800 Received: from CSBMAIL1.internal.ite.com.tw (CSBMAIL1.internal.ite.com.tw [192.168.65.58]) by mse.ite.com.tw with ESMTP id 68F7R0Mk029947; Tue, 15 Sep 2026 15:27:00 +0800 (+08) (envelope-from Pet.Weng@ite.com.tw) Received: from [127.0.1.1] (192.168.72.40) by CSBMAIL1.internal.ite.com.tw (192.168.65.58) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Tue, 15 Sep 2026 15:26:59 +0800 From: Pet Weng Date: Tue, 15 Sep 2026 15:26:29 +0800 Subject: [PATCH v10 1/2] dt-bindings: display: Add ITE IT61620 MIPI DSI to HDMI bridge Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-ID: <20260915-it61620-0714-v10-1-738e2a662c06@ite.com.tw> References: <20260915-it61620-0714-v10-0-738e2a662c06@ite.com.tw> In-Reply-To: <20260915-it61620-0714-v10-0-738e2a662c06@ite.com.tw> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Luca Ceresoli , Dmitry Baryshkov CC: , , , Hermes Wu , Kenneth Hung , Pet Weng , Jau-chih Tseng , Pin-yen Lin , Krzysztof Kozlowski X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789457258; l=5468; i=pet.weng@ite.com.tw; s=20250702; h=from:subject:message-id; bh=tlP1iJ85UQy5tBsvpGCCKZ3NqJo96uZlobIIxZUIMS0=; b=j4mP8jqMjv/HMuWygHwiQQof3C/sz9t8kg6Wz6GAqiOl4ROiS21M0AceCgbsSYIBe9X3YsFvI W0/YAru06FtC+fDQy5xMxm9iyVNVrpRFkrSDxe9LYAMXe/4+XPOy85f X-Developer-Key: i=pet.weng@ite.com.tw; a=ed25519; pk=wd08uBtTLb93x2ixbKVNsxiZPdMh1Ov4z5klodh2bqo= X-ClientProxiedBy: CSBMAIL1.internal.ite.com.tw (192.168.65.58) To CSBMAIL1.internal.ite.com.tw (192.168.65.58) X-TM-SNTS-SMTP: 737AC342BC878933FA1D5F451F525F8EE88D56CB8DB0AB654419F866C97CE8A82002:8 X-MAIL: mse.ite.com.tw 68F7R0Mk029947 This chip receives MIPI DSI input and outputs HDMI, and is commonly connected to SoCs via I2C and DSI. IT61620 is a variant of IT6162. The main differences are listed below - IT61620 supports only a single MIPI DSI input port, while IT6162 supports dual MIPI DSI ports. - IT61620 does not include the internal MCU present in IT6162. Because of these architectural differences, IT61620 uses a separate compatible string even though the external interfaces and bindings are largely similar. Signed-off-by: Pet Weng Reviewed-by: Krzysztof Kozlowski --- Documentation/devicetree/bindings/display/bridge/ite,it61620.yaml | 152 ++= +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) diff --git a/Documentation/devicetree/bindings/display/bridge/ite,it61620.y= aml b/Documentation/devicetree/bindings/display/bridge/ite,it61620.yaml new file mode 100644 index 0000000000000000000000000000000000000000..d4f0edeecd0e22f3fa92c9f8e27= 6ce0806c24790 --- /dev/null +++ b/Documentation/devicetree/bindings/display/bridge/ite,it61620.yaml @@ -0,0 +1,152 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/display/bridge/ite,it61620.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: ITE IT61620 MIPI DSI to HDMI Bridge + +maintainers: + - Pet Weng + +description: | + The ITE IT61620 is a high-performance, low-power HDMI bridge that conver= ts + MIPI DSI input to HDMI 1.4b TMDS output. It supports up to 4 lanes of MI= PI + D-PHY 2.0 input at 2.5Gbps per lane (10Gbps total), compatible with DSI-2 + v2.0. + + The HDMI transmitter side supports up to 4Kx2K@30Hz resolutions, and is + compliant with HDMI 1.4b and HDCP 1.4. + + For audio, the IT61620 supports up to 8-channel LPCM via I2S (multi-line= or + TDM mode), with optional S/PDIF or DSD (for SACD). It supports audio + sampling rates up to 192kHz. + + IT61620 is a variant of IT6162. + The main differences are listed below + - IT61620 supports only a single MIPI DSI input port, while IT6162 suppo= rts + dual MIPI DSI ports. + - IT61620 does not include the internal MCU present in IT6162. + + Because of these architectural differences, IT61620 uses a separate + compatible string even though the external interfaces and bindings are + largely similar. + +allOf: + - $ref: /schemas/sound/dai-common.yaml# + +properties: + compatible: + const: ite,it61620 + + reg: + maxItems: 1 + + interrupts: + maxItems: 1 + + reset-gpios: + maxItems: 1 + + ivdd-supply: + description: core voltage + + ovdd-supply: + description: I/O voltage + + ovdd1833-supply: + description: flexible I/O voltage + + "#sound-dai-cells": + const: 0 + + ports: + $ref: /schemas/graph.yaml#/properties/ports + + properties: + port@0: + $ref: /schemas/graph.yaml#/$defs/port-base + unevaluatedProperties: false + description: Input port for MIPI DSI + + properties: + endpoint: + $ref: /schemas/media/video-interfaces.yaml# + unevaluatedProperties: false + required: + - data-lanes + + port@1: + $ref: /schemas/graph.yaml#/properties/port + description: Output port for HDMI output + + port@2: + $ref: /schemas/graph.yaml#/properties/port + description: Audio input port (I2S) + + required: + - port@0 + - port@1 + +required: + - compatible + - reg + - interrupts + - reset-gpios + - ivdd-supply + - ovdd-supply + - ovdd1833-supply + - ports + +unevaluatedProperties: false + +examples: + - | + #include + #include + + i2c { + #address-cells =3D <1>; + #size-cells =3D <0>; + + bridge@58 { + compatible =3D "ite,it61620"; + reg =3D <0x58>; + #sound-dai-cells =3D <0>; + interrupt-parent =3D <&pio>; + interrupts =3D <128 IRQ_TYPE_LEVEL_LOW>; + pinctrl-names =3D "default"; + pinctrl-0 =3D <&it61620_pins>; + reset-gpios =3D <&pio 127 GPIO_ACTIVE_LOW>; + ivdd-supply =3D <&pp1000_hdmi_x>; + ovdd-supply =3D <&pp3300_vio28_x>; + ovdd1833-supply =3D <&pp1800_vcamio_x>; + + ports { + #address-cells =3D <1>; + #size-cells =3D <0>; + + port@0 { + reg =3D <0>; + it61620_dsi_in: endpoint { + data-lanes =3D <0 1 2 3>; + remote-endpoint =3D <&dsi_out>; + }; + }; + + port@1 { + reg =3D <1>; + it61620_hdmi_out: endpoint { + remote-endpoint =3D <&hdmi_connector_in>; + }; + }; + + port@2 { + reg =3D <2>; + it61620_audio_in: endpoint { + remote-endpoint =3D <&i2s0_out>; + }; + }; + }; + }; + }; --=20 2.34.1 From nobody Fri Sep 25 07:59:37 2026 Received: from ironport.ite.com.tw (itemail.ite.com.tw [60.251.196.230]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 385B445D5E2; Tue, 15 Sep 2026 07:27:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=60.251.196.230 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789457245; cv=none; b=LRMcLQ8/Anf2w/gV6MmAD/tf30XBcL0oXsJEMpylNYF8G4evg4NOzNPKvQ32Zc0pU8AdveJnsbmRRmTLemlVtQJBrmN+CU859Rpc8qnIRuzxcfTyYcGnBiarcUD033HXLNtqXGJjYfA1UnP9uFBsOZLSHPymOqL8vwrKHKq8Ov0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789457245; c=relaxed/simple; bh=RLSuu3H1ZNCGYdlOp+ARPlTUWPsIR5O74b6adCuKToE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=s3Ki4Hc2NMCQ8ZOZ5HWdGN/xI/QIsFpaaRQG8pwUYAfJhaAntGAKR4b6UtG67Bc8dGVaLgR+gK75XfMLBAnSzn3byJ+9E6JIMnBdGU2H9xP4H7BWGxMH/JUexJp147YOEF4mgbkIbEeG8f/W/2zPe1OPgy/Z1NzU/A6X/Llivus= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ite.com.tw; spf=pass smtp.mailfrom=ite.com.tw; dkim=pass (2048-bit key) header.d=ite.com.tw header.i=@ite.com.tw header.b=CDXaa4Te; arc=none smtp.client-ip=60.251.196.230 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ite.com.tw Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ite.com.tw Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ite.com.tw header.i=@ite.com.tw header.b="CDXaa4Te" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ite.com.tw; s=dkim; h=from:date:subject:mime-version:content-transfer-encoding: message-id:references:in-reply-to:to:cc; bh=GQ9YeXRa4WWj/wsBKGBE09UgrakwJXt/X2rYlPAZ+HM=; b=CDXaa4TeCbMVD37O7YNS4dMCAWhzuwPCw1QP+SNACDPUij13gBxHws8I OoImRs/eDfAP3u36dxbpwpJDjrM+rtkgaGIvJCiApTaRlLaIzsDTue56b dOlXTCOwgxQui9aQHRJte4EwJqTDfOaNhzpCpQF5VDv4SYhtns14/c6p5 Sv+QXX7usbkMj6QFMGPRBe1u5zKfkJdk6Fgc83ZnvRjGf+w20LkUZces2 dcrDvwuw7FZ/k/D3dEjw4ayKuMPjYorL5gWnqVXDCwOLZqznoMi79qa2y azs828Dl2jgvB6t7CjzqIwL43MZaBoO0KwzIFVa/DJGGNTfcKwsaNd4D/ A==; X-CSE-ConnectionGUID: drOUuPmPS6KoVKM7nN5WLQ== X-CSE-MsgGUID: KDlHxUYaQmi2+DONMIAbhg== Received: from unknown (HELO mse.ite.com.tw) ([192.168.35.30]) by ironport.ite.com.tw with ESMTP; 15 Sep 2026 15:27:05 +0800 Received: from CSBMAIL1.internal.ite.com.tw (CSBMAIL1.internal.ite.com.tw [192.168.65.58]) by mse.ite.com.tw with ESMTP id 68F7R0eV029946; Tue, 15 Sep 2026 15:27:00 +0800 (+08) (envelope-from Pet.Weng@ite.com.tw) Received: from [127.0.1.1] (192.168.72.40) by CSBMAIL1.internal.ite.com.tw (192.168.65.58) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Tue, 15 Sep 2026 15:26:59 +0800 From: Pet Weng Date: Tue, 15 Sep 2026 15:26:30 +0800 Subject: [PATCH v10 2/2] drm/bridge: Add ITE IT61620 MIPI DSI to HDMI bridge driver Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-ID: <20260915-it61620-0714-v10-2-738e2a662c06@ite.com.tw> References: <20260915-it61620-0714-v10-0-738e2a662c06@ite.com.tw> In-Reply-To: <20260915-it61620-0714-v10-0-738e2a662c06@ite.com.tw> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Luca Ceresoli , Dmitry Baryshkov CC: , , , Hermes Wu , Kenneth Hung , Pet Weng , Jau-chih Tseng , Pin-yen Lin X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789457258; l=89442; i=pet.weng@ite.com.tw; s=20250702; h=from:subject:message-id; bh=RLSuu3H1ZNCGYdlOp+ARPlTUWPsIR5O74b6adCuKToE=; b=wXVynHBVi1bgh9QE3F+Uff4NZ18GO9wwlDKV7kFDVqOGvON1xigYwzuX6S/2KcNMqdb0hwJJK i0JgZFlGLZ0CBPie9pEV0XOZkP0JNZogcVtE98lmCiAqbj2t6Yhh+cR X-Developer-Key: i=pet.weng@ite.com.tw; a=ed25519; pk=wd08uBtTLb93x2ixbKVNsxiZPdMh1Ov4z5klodh2bqo= X-ClientProxiedBy: CSBMAIL1.internal.ite.com.tw (192.168.65.58) To CSBMAIL1.internal.ite.com.tw (192.168.65.58) X-TM-SNTS-SMTP: F8990EFD9A272E9493151C71AD8D43401F658EF9B1D7107AAEC9DB8E7779DC832002:8 X-MAIL: mse.ite.com.tw 68F7R0eV029946 This adds support for the ITE IT61620 bridge chip which converts MIPI DSI input to HDMI output. The driver implements the basic bridge functions and integrates with the DRM bridge and connector frameworks. Supported features include: MIPI DSI input handling HDMI output setup Basic mode configuration I2C-based control and initialization HDCP 1.4 handling HPD handling: If the next bridge already implements OP_HPD / OP_DETECT (typically hdmi-connector with hpd-gpios), leave those ops to it; this driver only receives hpd_notify(). Otherwise this driver owns connector status from the chip HPD pin. That pin also carries HDCP Ri pulses, so chip HPD IRQs are debounced before drm_bridge_hpd_notify(). This driver will be used on platforms embedding the IT61620 for video output via HDMI from SoCs with MIPI DSI output. Add a MAINTAINERS entry for the IT61620 bridge driver. Signed-off-by: Pet Weng --- MAINTAINERS | 7 + drivers/gpu/drm/bridge/Kconfig | 18 ++ drivers/gpu/drm/bridge/Makefile | 1 + drivers/gpu/drm/bridge/ite-it61620.c | 2763 ++++++++++++++++++++++++++++++= +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= +++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 2789 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index 5b5a4e4b35cf44415eaf8079ac0b8b998658ac2b..ce93a66991c0c27d0720cf182be= fae9db9623b8a 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -13953,6 +13953,13 @@ T: git https://gitlab.freedesktop.org/drm/misc/ker= nel.git F: Documentation/devicetree/bindings/display/bridge/ite,it6263.yaml F: drivers/gpu/drm/bridge/ite-it6263.c =20 +ITE IT61620 MIPI DSI TO HDMI BRIDGE DRIVER +M: Pet Weng +L: dri-devel@lists.freedesktop.org +S: Maintained +F: Documentation/devicetree/bindings/display/bridge/ite,it61620.yaml +F: drivers/gpu/drm/bridge/ite-it61620.c + ITE IT66121 HDMI BRIDGE DRIVER M: Phong LE M: Neil Armstrong diff --git a/drivers/gpu/drm/bridge/Kconfig b/drivers/gpu/drm/bridge/Kconfig index 837db36cdf48e4050a2423535470e1da6001614b..b4f9ce8db66706326b10b4201ac= 1d7794d7ce6b1 100644 --- a/drivers/gpu/drm/bridge/Kconfig +++ b/drivers/gpu/drm/bridge/Kconfig @@ -118,6 +118,24 @@ config DRM_ITE_IT6263 help ITE IT6263 LVDS to HDMI bridge chip driver. =20 +config DRM_ITE_IT61620 + tristate "ITE IT61620 DSI/HDMI bridge" + depends on OF + select DRM_DISPLAY_CONNECTOR + select DRM_DISPLAY_HDMI_HELPER + select DRM_DISPLAY_HDCP_HELPER + select DRM_DISPLAY_HELPER + select DRM_MIPI_DSI + select DRM_KMS_HELPER + select DRM_HDMI_HELPER + select CRYPTO_LIB_SHA1 + help + Driver for ITE IT61620 MIPI DSI to HDMI bridge + chip driver. + + It enables display output through HDMI when connected to a MIPI + DSI source. The bridge translates the video signals for HDMI monitors. + config DRM_ITE_IT6505 tristate "ITE IT6505 DisplayPort bridge" depends on OF diff --git a/drivers/gpu/drm/bridge/Makefile b/drivers/gpu/drm/bridge/Makef= ile index 15cc821d85b7ea6f3cdc313f3e521b028de567d7..8ae10cda622216bb2b1d2798d4f= b9056acbe3bfc 100644 --- a/drivers/gpu/drm/bridge/Makefile +++ b/drivers/gpu/drm/bridge/Makefile @@ -12,6 +12,7 @@ obj-$(CONFIG_DRM_I2C_NXP_TDA998X) +=3D tda998x.o =20 obj-$(CONFIG_DRM_INNO_HDMI) +=3D inno-hdmi.o obj-$(CONFIG_DRM_ITE_IT6263) +=3D ite-it6263.o +obj-$(CONFIG_DRM_ITE_IT61620) +=3D ite-it61620.o obj-$(CONFIG_DRM_ITE_IT6505) +=3D ite-it6505.o obj-$(CONFIG_DRM_LONTIUM_LT8912B) +=3D lontium-lt8912b.o obj-$(CONFIG_DRM_LONTIUM_LT9211) +=3D lontium-lt9211.o diff --git a/drivers/gpu/drm/bridge/ite-it61620.c b/drivers/gpu/drm/bridge/= ite-it61620.c new file mode 100644 index 0000000000000000000000000000000000000000..6a3fcf3a545efa5416d62136588= 739f6351d6a6e --- /dev/null +++ b/drivers/gpu/drm/bridge/ite-it61620.c @@ -0,0 +1,2763 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2025 ITE Tech. Inc. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include