From nobody Fri Sep 25 01:22:32 2026 Received: from mail-ed2-f12.google.com (mail-ed2-f12.google.com [74.125.228.76]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 94E5839DBD7 for ; Fri, 18 Sep 2026 07:29:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.228.76 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789716601; cv=none; b=BQsXsm8NgiRlgm61Ebnj4TEe/7+RinN/ugoyCySVbMNUFudkXhX9pQYDVHmLm7oRP6HqarK5i2rpZ0ajnDd0GAUSlArHqisIaEKu5x8qri3kjOR6czUlbexRfBV6se+fpPYy14z25EK496Bogo8ye+Zm8ck/ry+7+YthhCaB+3w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789716601; c=relaxed/simple; bh=0M4sE/hfoJQ3CKEy3NN7fLe6+z2efpSPXuBLPdijfOE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=KFBS/Lg7cSxaX8lkfUp08ADzu2QwFWLGswveVGC+MeHQTksjAL8h/UIzpevg3zhLMtlMZAwMPtx/0IVNJ6aaHBPw7b14DDBgpuPLWyDh61UmMh6/AqNQKsiq91Smml37Y1L4CW+L8Qc2IS57pzwELuQgQ3jOPLn6YDmLM2DXeOc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=fairphone.com; spf=pass smtp.mailfrom=fairphone.com; dkim=pass (2048-bit key) header.d=fairphone.com header.i=@fairphone.com header.b=wunI3ilQ; arc=none smtp.client-ip=74.125.228.76 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=fairphone.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=fairphone.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=fairphone.com header.i=@fairphone.com header.b="wunI3ilQ" Received: by mail-ed2-f12.google.com with SMTP id 4fb4d7f45d1cf-6a60591ae54so575907a12.3 for ; Fri, 18 Sep 2026 00:29:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fairphone.com; s=fair; t=1789716596; x=1790321396; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=H2L0ZhsQmTrZuxVtkeygootsPfgjhBA7S6bYd0vwJVs=; b=wunI3ilQ+BjPIe+/1nmGaG/AAdHlCJk+pxGcQj1xeOgt0b5TYyKQRPNMaz8r5FCtFm GUdofwtEAMm8iC4vzTG2R2e5MdKtwA5fBWiJ6sCAsw1FsfGL2K+G9D3QizuLt2meUc3h cgydjonDfOiX/T4GJyUrUU/DCseC3Ljp0qcRjiSQWe6wpsqy7GOecjyYi4S6v/FmRG1d fdJy4GYLLGP0OzbtcxNjdApwXv8YiFStj0h8nTV501Gi0PyK6ehtD/e6SvisSBw9ZDHR NU+jUwOVklpO7sOG4/UMIlfIjsCqidTnGfVCmU0exgrsKdCIiI9OeuTv5VfgjtFNUaTw woZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789716596; x=1790321396; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=H2L0ZhsQmTrZuxVtkeygootsPfgjhBA7S6bYd0vwJVs=; b=KqafA7e/NwEneayUcBGXo7gxPwLZEYH+9N2zrKIXMRridRxPlvV3AJ7rRnlRiWAlPj 6KQolrLYGKAts0wWKOV1KJNDGLDqSbtL/zW7VJWiSdLWnQzN9no/uGOlPljGlQFTwXpT sh9YBdYznJ/vYkHcVxR2A2lOxKSViEmNHaY2AUv5EjVdZb2u5TGCVa5yosmgjl5JvfMm ahQbGiQzpzJLuPmjqG32KoSAdJ63RDmhvTFdnT1RpdppD6oBfdbwp4MspXGGMkVQB2gR o9I3ApWkxN03kGAvp6Vy0MV1DoOEGnvsrex9N5lwzPBy0iiJVlYw9leI8FcMs2Jbn05M sjMg== X-Forwarded-Encrypted: i=1; AKwUvBwnN8W5Tcf6YEViO4iMj6UEPzBXUwGoZQGobX8/Ls6L9k5fEmnMkhb0pY6mz+rdoDp7CjoqsD5RgIqDzN8=@vger.kernel.org X-Gm-Message-State: AFuF++kfY/IFd0n/vFXH67Yg7Dn2i7EteUiv8V8C1ip0YMzThvmN5hb1 ZGd2Rdxh4sMqqEqTBDUxvk0l/7baywdM7S9ZCMmVTBnwDQqeDHhs7F76CdYYlmwH8hQ= X-Gm-Gg: AYBFou3/Ee/ybKfdjyc+elQB64RdQkqPlumeQCw09ilfJoO5kRp2AFAv5uMiFxajNmE KElHwQgu9jA+VQu4gW8bjbcCWuWSujvmJuEFuaApKRL+QUQoLGaZJiTszf97zQ5BIHJxlOzc4/v dNCv6viBvEjh8qFCn1L8wwt9t8557IJi/7/BUvF/bJMcxNB08ty4plujflk+coSXh51GZEVW5p0 uic13ZgYS7egTXvXEviaLjz3Po1UoQ4FRO2w6mKYUOQkTE0ERdMUWsBABWqXkE/mlH3Xw9EnVvk J2y88l+kSCZZWEZvPRzM3wklV2o/3Eqjxo+dy1ZBJbXKSPpZ0RBtvCcTOxacIXKP7a8dA0z9MQZ PqP8cqL3mng9Hifr8PS0f9UCZp698CJg3Zm824INeq6tqwKGf0ZZFUW31YViw5r6OS+h/pPIlVo 3PnElBqR0Br7FlLl8+5MoLyBE50BlL7nt+saBCvMj5a3Jsnstbf5+lRUHIfugMVg9lbgWEuiTxM 0A3ch8eWxNwwckdctcCOckJHhH/1xuuxWK0Bqn0Mdak+zC2e+Kc X-Received: by 2002:a05:6402:23c3:b0:6a6:8dd:c76b with SMTP id 4fb4d7f45d1cf-6aa52651434mr1297095a12.1.1789716596447; Fri, 18 Sep 2026 00:29:56 -0700 (PDT) Received: from [172.16.220.101] (144-178-202-138.static.ef-service.nl. [144.178.202.138]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-6aa58d55cd3sm462048a12.2.2026.09.18.00.29.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Sep 2026 00:29:56 -0700 (PDT) From: Luca Weiss Date: Fri, 18 Sep 2026 09:29:52 +0200 Subject: [PATCH v3 1/3] dt-bindings: input: touchscreen: document ESWIN EPH8621 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: <20260918-eswin-eph8621-v3-1-514eb1f622c0@fairphone.com> References: <20260918-eswin-eph8621-v3-0-514eb1f622c0@fairphone.com> In-Reply-To: <20260918-eswin-eph8621-v3-0-514eb1f622c0@fairphone.com> To: Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Henrik Rydberg , Bjorn Andersson , Konrad Dybcio Cc: ~postmarketos/upstreaming@lists.sr.ht, phone-devel@vger.kernel.org, linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, Luca Weiss , Krzysztof Kozlowski X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789716594; l=2581; i=luca.weiss@fairphone.com; s=20250611; h=from:subject:message-id; bh=0M4sE/hfoJQ3CKEy3NN7fLe6+z2efpSPXuBLPdijfOE=; b=WX8+0kdxCyJLrxBulrnhen64IYl3I2ETVzSl6fJ6URl4i9x9gCqENtZlDBaSJDGq9KicJIqr/ B9m//xHKyL2CWb+jxJ3+hRP1TgoxEjSYeCr96OAKKwmoPpUOYn1Pv6i X-Developer-Key: i=luca.weiss@fairphone.com; a=ed25519; pk=O1aw+AAust5lEmgrNJ1Bs7PTY0fEsJm+mdkjExA69q8= Document the ESWIN EPH8621 touchscreen controller, which can operate in SPI mode. Other touchscreen controllers from the EPH861X family (and potentially also EPH8621) can also operate in I2C mode, this was not added yet. Reviewed-by: Krzysztof Kozlowski Signed-off-by: Luca Weiss --- .../bindings/input/touchscreen/eswin,eph8621.yaml | 79 ++++++++++++++++++= ++++ 1 file changed, 79 insertions(+) diff --git a/Documentation/devicetree/bindings/input/touchscreen/eswin,eph8= 621.yaml b/Documentation/devicetree/bindings/input/touchscreen/eswin,eph862= 1.yaml new file mode 100644 index 000000000000..ac7fa58644ba --- /dev/null +++ b/Documentation/devicetree/bindings/input/touchscreen/eswin,eph8621.yaml @@ -0,0 +1,79 @@ +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/input/touchscreen/eswin,eph8621.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: ESWIN EPH8621 touchscreen controller + +maintainers: + - Luca Weiss + +allOf: + - $ref: touchscreen.yaml# + - $ref: /schemas/spi/spi-peripheral-props.yaml# + +properties: + compatible: + enum: + - eswin,eph8621 + + reg: + maxItems: 1 + + interrupts: + maxItems: 1 + + reset-gpios: + maxItems: 1 + + avdd-supply: + description: Power supply regulator on AVDD pin + + vddio-supply: + description: Power supply regulator on VDDIO pin + + spi-max-frequency: true + touchscreen-inverted-x: true + touchscreen-inverted-y: true + touchscreen-size-x: true + touchscreen-size-y: true + touchscreen-swapped-x-y: true + +required: + - compatible + - reg + - interrupts + - avdd-supply + - vddio-supply + - touchscreen-size-x + - touchscreen-size-y + +additionalProperties: false + +examples: + - | + #include + #include + spi { + #address-cells =3D <1>; + #size-cells =3D <0>; + touchscreen@0 { + compatible =3D "eswin,eph8621"; + reg =3D <0>; + + avdd-supply =3D <&vreg_l22b>; + vddio-supply =3D <&vreg_l9b>; + + interrupts-extended =3D <&tlmm 19 IRQ_TYPE_LEVEL_LOW>; + reset-gpios =3D <&tlmm 20 GPIO_ACTIVE_LOW>; + + spi-max-frequency =3D <2000000>; + + touchscreen-size-x =3D <1116>; + touchscreen-size-y =3D <2484>; + touchscreen-inverted-x; + }; + }; + +... --=20 2.55.0 From nobody Fri Sep 25 01:22:32 2026 Received: from mail-ed2-f12.google.com (mail-ed2-f12.google.com [74.125.228.76]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9B1CF31A555 for ; Fri, 18 Sep 2026 07:29:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.228.76 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789716603; cv=none; b=eCkGq1MWbUHNuYKySbUfnpBa/QbGUvJ18aDOORlESuianPr36W372A4MDcUI53Vwpa9EOKRhtOGQq19YcKhbst8YWxrHolsH5AeVw0blVIUTPKmFPGRxXAoM231q4ith4B9A6LuzTPjTsSRIJn6c3H1tJAemJnSqDnOJErgau9w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789716603; c=relaxed/simple; bh=WTOS0501xw7R4F1/56S9HVuGI437IodOzXbR25bc4Bc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=tycI5lyMKxeyzSMrsV/id/1MARc+apBo8LBydGPB6QPwcLLJueAuC3GCHT3rfGZArxOItXZzpazm0ohoRZyld06rQFjDs5DpSW1nVbvlhIRyst7iIoMP/xzMZsr+ZIQSTW3FrEgc4C7PxX23mSQrAzkW9wRHo8nOPM//LyY6IeE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=fairphone.com; spf=pass smtp.mailfrom=fairphone.com; dkim=pass (2048-bit key) header.d=fairphone.com header.i=@fairphone.com header.b=S959Gec+; arc=none smtp.client-ip=74.125.228.76 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=fairphone.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=fairphone.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=fairphone.com header.i=@fairphone.com header.b="S959Gec+" Received: by mail-ed2-f12.google.com with SMTP id 4fb4d7f45d1cf-6a60590a85cso803451a12.0 for ; Fri, 18 Sep 2026 00:29:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fairphone.com; s=fair; t=1789716597; x=1790321397; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=VNhOhxDv6l7qQIiwUJFCxoua0fOUkFDZ4eu39jcgGiQ=; b=S959Gec+ZIMdSJBl4gdnTWnwO0sCHu4VB6psIczCASf+N/xKYypzH2XdD+fjo/ymAx ZfylUzQAq1mLGYDFh7k0v96+eTcGhZfK0jKQl0Xf6PgTo9RBGtmJ4RBOs5Iu8KXl+WqA 4lHvZdgPFzY32HoTAAAlp4J59p912ThiU++nVMObjlpcc8Hj6yx4HIg6K9e+BTdFUs9g pUOQKUKpMAVNaooZt//S202rcAhMZ/dzRcnoUKe/2zc68Q91DrDrZ7PIQA5z0ME5JTpS 0tpWKeS/sNPBOBJifVp3AGeY1nTvq+ZHTW8PqsrzavfIkjRvnkqWch3d1WKV3x4urFKf 4tFA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789716597; x=1790321397; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=VNhOhxDv6l7qQIiwUJFCxoua0fOUkFDZ4eu39jcgGiQ=; b=KDM4p8sRk8g0KsM9erSX9kG6Wjo26PgyrJ5AdE1D37Jq7w7syWg/piL5mE1tXMCyLt pDqGENr594tnaRlBr5aCaw0CEieT06I7MPJPShvkHvRBuyAPccpuGpffHk8MTb5JTt8c F+LkLvWiC3vpKniw4UI7tVGJvFQRF/PP5YRegpzOOAGBpQb7QKl62fGhxWpeOjDy289y +qxvEkyWhQA2yir/HgbgWZUVAR4e+lcKlNxu+YJkZ8QbfnSfy6cuAytiPZ7UU1UFWTKJ RVgYCDkgM3DQ7Rg9nHmryrelLATPgQLmZ3EXevDkJW6iDGD8K6gTBFEzdXW6nkeJ8zm3 W3RA== X-Forwarded-Encrypted: i=1; AKwUvBwoBqqVGsdqSiDRul94uoj9I5GNJ47b8gRonajztxvX2yGPqfpMrBW2H+/dKZs6BY4UTP5m/6tHCmBv+fs=@vger.kernel.org X-Gm-Message-State: AFuF++lSGYoXSiMJVhafD7JJiNO8M32dxJcnY2YZamlWkZOtzzyTae4J eJg1LVQRO1BE3IvMvmbVk5+5goTohnzoPXViu+L5JpRe7G9V6Vy2eX7LJhqCqQL/UPA= X-Gm-Gg: AYBFou1AI+ev9zJkKPhFjBFNmfTy9kxvcBe4K/x3bvnodngOIDCFVJXW9OSsS571c6d ndwOn/ykXOGL/1ufEjpz0YaJLlCjWxBv97aNXtGixU4R5RdbV6jg4wCaV0sk9aelV4JMMzHoVOC oJ+TEY+abIaCRsDJwPI2OLMwd80gJSHcW4lJeCFM4uZ+R4HYwPjdlEM97V4pLTIXt34rCjHmu2Z 6kC1UavyXut9dsSVdLNrzyehJC8rEoPMf1Obbhp35DsHyx0cKtLAEcIF8ZvGyIorKNvco9KLnDE uBrFaksaclGYBz82Rw1ANAK+YGnjuFvcggvvOx4sOx8XVlYO01pfjfNgRCbzluQ+aKs8FVxOHRr bYBXdowScr0uxhoLWekdSAK5w0icZWIO8ZmuBr9FJkP5TqgW4WrIXJ8dPFjZllWreFtEwFKOFax wqkJexD8eOgrSlEgDGNt7XbunlFaRTqdR9GN3Z4V6TPeJ2PGyAyu87CV91K6yjtuM/i1Q1NzLz/ osSBgSp0vj8an9If93vdju+5JIOznTDw+5h7ZFE1U893FWq3AHU X-Received: by 2002:a05:6402:42c9:b0:6aa:129a:1f73 with SMTP id 4fb4d7f45d1cf-6aa579b6005mr540216a12.42.1789716597508; Fri, 18 Sep 2026 00:29:57 -0700 (PDT) Received: from [172.16.220.101] (144-178-202-138.static.ef-service.nl. [144.178.202.138]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-6aa58d55cd3sm462048a12.2.2026.09.18.00.29.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Sep 2026 00:29:57 -0700 (PDT) From: Luca Weiss Date: Fri, 18 Sep 2026 09:29:53 +0200 Subject: [PATCH v3 2/3] Input: Add driver for ESWIN EPH8621 touchscreen IC 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: <20260918-eswin-eph8621-v3-2-514eb1f622c0@fairphone.com> References: <20260918-eswin-eph8621-v3-0-514eb1f622c0@fairphone.com> In-Reply-To: <20260918-eswin-eph8621-v3-0-514eb1f622c0@fairphone.com> To: Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Henrik Rydberg , Bjorn Andersson , Konrad Dybcio Cc: ~postmarketos/upstreaming@lists.sr.ht, phone-devel@vger.kernel.org, linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, Luca Weiss X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789716594; l=11218; i=luca.weiss@fairphone.com; s=20250611; h=from:subject:message-id; bh=WTOS0501xw7R4F1/56S9HVuGI437IodOzXbR25bc4Bc=; b=l+dOF9MCX5qdd+8tTphDqbCPYA3QnxAT8UvZaUqb9XgfewaDIEjL8C7O3gpbk/fQMnMXCceJ9 LIL0SpxH0KeCCNYtXctvCxXdk2wtucB2ypGNeoZbOuNuWg897nWPiTQ X-Developer-Key: i=luca.weiss@fairphone.com; a=ed25519; pk=O1aw+AAust5lEmgrNJ1Bs7PTY0fEsJm+mdkjExA69q8= Add a driver for the ESWIN EPH8621 touchscreens, connected via SPI. The driver this is based on - EPH861X - also supports I2C but this is not added the Fairphone (Gen. 6) has the touchscreen connected via SPI. Assisted-by: Gemini:gemini-3.1-pro Signed-off-by: Luca Weiss --- drivers/input/touchscreen/Kconfig | 12 ++ drivers/input/touchscreen/Makefile | 1 + drivers/input/touchscreen/eswin_eph8621.c | 344 ++++++++++++++++++++++++++= ++++ 3 files changed, 357 insertions(+) diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/= Kconfig index 9b9ae8ac3f7f..007b589cef8e 100644 --- a/drivers/input/touchscreen/Kconfig +++ b/drivers/input/touchscreen/Kconfig @@ -360,6 +360,18 @@ config TOUCHSCREEN_EGALAX_SERIAL To compile this driver as a module, choose M here: the module will be called egalax_ts_serial. =20 +config TOUCHSCREEN_ESWIN_EPH8621 + tristate "ESWIN EPH8621 touchscreen" + depends on SPI_MASTER + help + Say Y here if you have a ESWIN EPH8621 connected to + your system via SPI. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called eswin_eph8621. + config TOUCHSCREEN_EXC3000 tristate "EETI EXC3000 multi-touch panel support" depends on I2C diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen= /Makefile index bfd9de83389d..4540169d9b54 100644 --- a/drivers/input/touchscreen/Makefile +++ b/drivers/input/touchscreen/Makefile @@ -42,6 +42,7 @@ obj-$(CONFIG_TOUCHSCREEN_ELAN) +=3D elants_i2c.o obj-$(CONFIG_TOUCHSCREEN_ELO) +=3D elo.o obj-$(CONFIG_TOUCHSCREEN_EGALAX) +=3D egalax_ts.o obj-$(CONFIG_TOUCHSCREEN_EGALAX_SERIAL) +=3D egalax_ts_serial.o +obj-$(CONFIG_TOUCHSCREEN_ESWIN_EPH8621) +=3D eswin_eph8621.o obj-$(CONFIG_TOUCHSCREEN_EXC3000) +=3D exc3000.o obj-$(CONFIG_TOUCHSCREEN_FUJITSU) +=3D fujitsu_ts.o obj-$(CONFIG_TOUCHSCREEN_GOODIX) +=3D goodix_ts.o diff --git a/drivers/input/touchscreen/eswin_eph8621.c b/drivers/input/touc= hscreen/eswin_eph8621.c new file mode 100644 index 000000000000..766b113b3288 --- /dev/null +++ b/drivers/input/touchscreen/eswin_eph8621.c @@ -0,0 +1,344 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * ESWIN EPH8621 series touchscreen driver + * + * Copyright (C) 2026 Luca Weiss + * + * Based on original EPH861X driver by chris.ollerenshaw@eswin.com + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ESWIN_MAX_TOUCHES 10 +#define ESWIN_COMMS_BUF_SIZE 3072 + +/* TLV Protocol Definitions */ +#define TLV_HEADER_SIZE 3 /* 1 byte Type + 2 bytes Length */ +#define TLV_TYPE_FIELD 0 +#define TLV_LENGTH_FIELD 1 + +#define TLV_REPORT_DATA 0x23 +#define EVENT_REPORT_TYPE_OFFSET 4 +#define EVENT_REPORT_TYPE_MASK 0xF0 +#define EVENT_REPORT_LENGTH_MASK 0x0F + +/* Event Types */ +#define CONTACT_TYPE 1 +#define RELEASE_TYPE 2 + +struct eswin_touch { + struct device *dev; + struct input_dev *input; + + struct gpio_desc *reset_gpio; + struct regulator_bulk_data supplies[2]; + + struct touchscreen_properties prop; + + u8 *rx_buf; + u8 *tx_buf; +}; + +static int eswin_spi_read(struct eswin_touch *ts, u16 len, u8 *buf) +{ + struct spi_device *spi =3D to_spi_device(ts->dev); + struct spi_transfer xfer =3D { + .tx_buf =3D ts->tx_buf, + .rx_buf =3D ts->rx_buf, + .len =3D len, + }; + int error; + + if (len > ESWIN_COMMS_BUF_SIZE) + return -EINVAL; + + /* ESWIN requires 0xFF dummy bytes clocked out to read data */ + memset(ts->tx_buf, 0xFF, len); + error =3D spi_sync_transfer(spi, &xfer, 1); + if (error) + return error; + + if (buf !=3D ts->rx_buf) + memcpy(buf, ts->rx_buf, len); + + return 0; +} + +/* + * Core Touch Handling + */ +static int eswin_comms_two_stage_read(struct eswin_touch *ts, u8 *buf) +{ + u16 payload_len; + int error; + + /* Stage 1: Read 3-byte header */ + error =3D eswin_spi_read(ts, TLV_HEADER_SIZE, buf); + if (error) + return error; + + payload_len =3D buf[TLV_LENGTH_FIELD] | (buf[TLV_LENGTH_FIELD + 1] << 8); + if (payload_len =3D=3D 0 || payload_len > ESWIN_COMMS_BUF_SIZE - TLV_HEAD= ER_SIZE) + return -EINVAL; + + udelay(50); + + /* Stage 2: Read full packet (Header + Payload) */ + error =3D eswin_spi_read(ts, payload_len + TLV_HEADER_SIZE, buf); + if (error) + return error; + + return payload_len; +} + +static void eswin_report_contact(struct eswin_touch *ts, u8 *payload) +{ + u8 touch_type =3D (payload[0] & EVENT_REPORT_TYPE_MASK) >> EVENT_REPORT_T= YPE_OFFSET; + u8 slot =3D payload[1]; + u16 x =3D payload[2] | (payload[3] << 8); + u16 y =3D payload[4] | (payload[5] << 8); + u8 width =3D payload[6]; + u8 height =3D payload[7]; + bool active =3D false; + + if (slot >=3D ESWIN_MAX_TOUCHES) { + dev_warn_ratelimited(ts->dev, "Invalid slot ID: %d\n", slot); + return; + } + + switch (touch_type) { + case CONTACT_TYPE: + active =3D true; + break; + case RELEASE_TYPE: + active =3D false; + break; + default: + dev_warn_ratelimited(ts->dev, "Unhandled touch type: %d\n", touch_type); + return; + } + + input_mt_slot(ts->input, slot); + input_mt_report_slot_state(ts->input, MT_TOOL_FINGER, active); + + if (active) { + touchscreen_report_pos(ts->input, &ts->prop, x, y, true); + input_report_abs(ts->input, ABS_MT_TOUCH_MAJOR, height); + input_report_abs(ts->input, ABS_MT_TOUCH_MINOR, width); + } +} + +static void eswin_process_report(struct eswin_touch *ts, u8 *buf, unsigned= int payload_len) +{ + u16 total_len =3D payload_len + TLV_HEADER_SIZE; + u16 offset =3D TLV_HEADER_SIZE; + + if (buf[TLV_TYPE_FIELD] !=3D TLV_REPORT_DATA) + return; + + while (offset < total_len) { + u8 ev_len =3D buf[offset] & EVENT_REPORT_LENGTH_MASK; + + /* + * Event length must cover the 8-byte payload (ev_len is + * exclusive of the 1-byte header) + */ + if (ev_len < 7) { + dev_warn_ratelimited(ts->dev, "Malformed event length: %d\n", ev_len); + break; + } + + /* Ensure at least 8 bytes remain for a full contact payload */ + if (total_len - offset < 8) { + dev_warn_ratelimited(ts->dev, "Truncated touch payload\n"); + break; + } + + eswin_report_contact(ts, &buf[offset]); + offset +=3D (ev_len + 1); + } + + input_mt_sync_frame(ts->input); + input_sync(ts->input); +} + +static irqreturn_t eswin_interrupt(int irq, void *dev_id) +{ + struct eswin_touch *ts =3D dev_id; + int payload_len; + + payload_len =3D eswin_comms_two_stage_read(ts, ts->rx_buf); + if (payload_len <=3D 0) { + dev_err_ratelimited(ts->dev, "Failed to read touch data: %d\n", payload_= len); + return IRQ_NONE; + } + + eswin_process_report(ts, ts->rx_buf, payload_len); + + return IRQ_HANDLED; +} + +static int eswin_power_on(struct eswin_touch *ts) +{ + int error; + + error =3D regulator_bulk_enable(ARRAY_SIZE(ts->supplies), ts->supplies); + if (error) + return error; + + msleep(150); + gpiod_set_value_cansleep(ts->reset_gpio, 0); + msleep(100); + + return 0; +} + +static void eswin_power_off(struct eswin_touch *ts) +{ + gpiod_set_value_cansleep(ts->reset_gpio, 1); + regulator_bulk_disable(ARRAY_SIZE(ts->supplies), ts->supplies); +} + +static void eswin_power_off_act(void *data) +{ + struct eswin_touch *ts =3D data; + + eswin_power_off(ts); +} + +static int eswin_probe(struct spi_device *spi) +{ + struct device *dev =3D &spi->dev; + struct eswin_touch *ts; + int error; + + ts =3D devm_kzalloc(dev, sizeof(*ts), GFP_KERNEL); + if (!ts) + return -ENOMEM; + + ts->dev =3D dev; + spi_set_drvdata(spi, ts); + + spi->mode =3D SPI_MODE_3; + spi->bits_per_word =3D 8; + error =3D spi_setup(spi); + if (error) + return dev_err_probe(dev, error, "Failed to setup SPI\n"); + + ts->rx_buf =3D devm_kzalloc(dev, ESWIN_COMMS_BUF_SIZE, GFP_KERNEL); + ts->tx_buf =3D devm_kzalloc(dev, ESWIN_COMMS_BUF_SIZE, GFP_KERNEL); + if (!ts->rx_buf || !ts->tx_buf) + return -ENOMEM; + + ts->supplies[0].supply =3D "vddio"; + ts->supplies[1].supply =3D "avdd"; + error =3D devm_regulator_bulk_get(dev, ARRAY_SIZE(ts->supplies), ts->supp= lies); + if (error) + return dev_err_probe(dev, error, "Failed to get regulators\n"); + + ts->reset_gpio =3D devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH); + if (IS_ERR(ts->reset_gpio)) + return dev_err_probe(dev, PTR_ERR(ts->reset_gpio), + "Failed to request reset GPIO\n"); + + error =3D eswin_power_on(ts); + if (error) + return dev_err_probe(dev, error, "Failed to power on\n"); + + error =3D devm_add_action_or_reset(dev, eswin_power_off_act, ts); + if (error) + return error; + + ts->input =3D devm_input_allocate_device(dev); + if (!ts->input) + return -ENOMEM; + + ts->input->name =3D "ESWIN Touchscreen"; + ts->input->id.bustype =3D BUS_SPI; + + input_set_abs_params(ts->input, ABS_MT_POSITION_X, 0, SZ_64K - 1, 0, 0); + input_set_abs_params(ts->input, ABS_MT_POSITION_Y, 0, SZ_64K - 1, 0, 0); + input_set_abs_params(ts->input, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); + input_set_abs_params(ts->input, ABS_MT_TOUCH_MINOR, 0, 255, 0, 0); + + touchscreen_parse_properties(ts->input, true, &ts->prop); + + error =3D input_mt_init_slots(ts->input, ESWIN_MAX_TOUCHES, INPUT_MT_DIRE= CT); + if (error) + return dev_err_probe(dev, error, "Failed to initialize MT slots\n"); + + error =3D devm_request_threaded_irq(dev, spi->irq, NULL, eswin_interrupt, + IRQF_ONESHOT, dev_name(dev), ts); + if (error) + return dev_err_probe(dev, error, "Failed to request IRQ\n"); + + error =3D input_register_device(ts->input); + if (error) + return error; + + return 0; +} + +static int eswin_suspend(struct device *dev) +{ + struct spi_device *spi =3D to_spi_device(dev); + struct eswin_touch *ts =3D spi_get_drvdata(spi); + + disable_irq(spi->irq); + eswin_power_off(ts); + + return 0; +} + +static int eswin_resume(struct device *dev) +{ + struct spi_device *spi =3D to_spi_device(dev); + struct eswin_touch *ts =3D spi_get_drvdata(spi); + int error; + + error =3D eswin_power_on(ts); + if (error) + return error; + + enable_irq(spi->irq); + + return 0; +} + +static DEFINE_SIMPLE_DEV_PM_OPS(eswin_pm_ops, eswin_suspend, eswin_resume); + +static const struct of_device_id eswin_of_match[] =3D { + { .compatible =3D "eswin,eph8621" }, + { } +}; +MODULE_DEVICE_TABLE(of, eswin_of_match); + +static const struct spi_device_id eswin_spi_id[] =3D { + { .name =3D "eph8621" }, + { } +}; +MODULE_DEVICE_TABLE(spi, eswin_spi_id); + +static struct spi_driver eswin_spi_driver =3D { + .driver =3D { + .name =3D "eswin_eph8621", + .of_match_table =3D eswin_of_match, + .pm =3D pm_sleep_ptr(&eswin_pm_ops), + }, + .probe =3D eswin_probe, + .id_table =3D eswin_spi_id, +}; +module_spi_driver(eswin_spi_driver); + +MODULE_AUTHOR("Luca Weiss "); +MODULE_DESCRIPTION("ESWIN EPH8621 SPI touchscreen driver"); +MODULE_LICENSE("GPL"); --=20 2.55.0 From nobody Fri Sep 25 01:22:32 2026 Received: from mail-ed2-f12.google.com (mail-ed2-f12.google.com [74.125.228.76]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 140DC3D4121 for ; Fri, 18 Sep 2026 07:30:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.228.76 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789716605; cv=none; b=kIyhl8rMfNqcL8q01251SLfYyhx0tRHp8OOE4qd6yAYdEvMiQ5jOlrOCS89DTbYWHm4g/FhBtT7WHSoTGPGmgGJ1kQ0nr0cqHn+OhxQaco1ThXDFwrIOFLiNE29+8VbGjEgYctY8MqN6FraC4NLXUGidsdJ05v6dXn42ydi0dFw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789716605; c=relaxed/simple; bh=tKqz8WaA5fCf8zqxAuhb+KSHy9L2ioB7dBm28PChNnM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=qqFZqwYAOfiTwwX7B1oszf4qcyFCE2aJ9NM3yHRm6sHdkXuu/Vz7DjMokIBwDCKaS+aRkLLZPZ9HCNx7MSexH8q3BJ3mVT8n/DkfCTZltVEasDmfwpVbSfofCLK3JWP1rQMe279tn+UDYtLJlAOZgnb9IvZ8lAdOpqwsqQYZa4E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=fairphone.com; spf=pass smtp.mailfrom=fairphone.com; dkim=pass (2048-bit key) header.d=fairphone.com header.i=@fairphone.com header.b=p7w9+/kk; arc=none smtp.client-ip=74.125.228.76 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=fairphone.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=fairphone.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=fairphone.com header.i=@fairphone.com header.b="p7w9+/kk" Received: by mail-ed2-f12.google.com with SMTP id 4fb4d7f45d1cf-6a605844571so513608a12.3 for ; Fri, 18 Sep 2026 00:30:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fairphone.com; s=fair; t=1789716598; x=1790321398; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=T0+EbfIJEQi9Km2o4RWY1Oe967wA79enaext7ctyUJE=; b=p7w9+/kkhj5DvJ/KbvXEHJ+2s7Zm49sC4kRnUrDGS/7HDkoHK8RLEeIYIT4kMasctp VKXtB7vgwdWoDiwZn0TwMKFvsMujtsKW4IZmwgNUPsa0uqa5PZPiG+tU7mZvDoiERGWS ogxviEKXNdCdl9SzjKkNSI8nPc+DkJBEHhsDYWYropnTwITbtO3CH/S3QhmDgTxSGqkJ 4+02P7zfWOKHFyskO2NTlMdn50EwWqI2DL4vSY5kUSQMCQs/7aM+D+HDeRmEjEi5J6/T JR6U5lvv+yiJZFzd3dYWeNge6MCVzBem8kHyLY35w+alRmR6VaCDWfn2paKVA+MpfcAF Nk4A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789716598; x=1790321398; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=T0+EbfIJEQi9Km2o4RWY1Oe967wA79enaext7ctyUJE=; b=iDP1TqWsq/Nb1c+DpTmqlnhlF7R9NyoA62uNrsjAWQffLqBD8zN2jF0CeMsoPAadFa Yk7mxL1jyqEzroiucrCoz00e3QZMTjhhEOdiTkXOpFnuZ2uDJ1Fjljm+uZcDmPoacKOY LtfBykbgDX/lgbr1BnPTstLMbFka75Wn6AZ1bb/7ktTG0B/0MqExjUapqMAOjEw4+JIO XJxCZxTwOeY7HlOyfzBokjdEUqnVBedaJhJwRA8OScmhc2zPqCP3FQuXsnqQEqgpIk4I NWOBVZ0CZhA53R6h/9WEQ76masmcs6GR/bA11zOtacE/AH5cJoEKifFsu6s6ZSiPH9JV zmEg== X-Forwarded-Encrypted: i=1; AKwUvBw5g7jYdxBHhjELZHk/sxpZe3QrQq3X/1kv6uVgc79b92NwEECs1Dp6nioo9dIuNu/RpIl40lz0LEbmaJ0=@vger.kernel.org X-Gm-Message-State: AFuF++ktd86qB9VMUa2XnzvURh01qOJnn/wHTQ0FYzsIy9ZTFs1pbA/W 7qRjxZ2XvUiB2H5LPL4DX99S68Vevq71XoIlZPdqxJj5v5oh/0x9eCSLJqf7zh/ou3E= X-Gm-Gg: AYBFou0BJ3RoOXLqA+tiptcN+h4tbbq7AMB5G5ZQOrCas2S3YcrnCHtaYlHJahf+b0I doN6qNU3UDfTsChuN0Ln+1T671YmIG1Rr/MMGK0n787k7UqqFR/sOBy9cAx0OaqiEaiB9LodiAl rDDd1ldrTsO476i46wZWGbaMn7mEg47b8UVGsDY7smHaPasHFb9X3KaLMGlJ9+PVJAWJu0/zTX6 9UF8e5Pq5Zz9w9gcVGYtIQmbdF9Qyn/7Co+Ekq8me7EYj+dobU1SB3YjjQx/CmqIlE8vhtrRlij zWqEScNhgkhjpdCrUAqL2x19mJahraAMKjTHLKmr9qFVE7hMHcjuouogbjOkbwQM/urqX9DQMwy CBpWP0FRxJDT7tax0K0Zx71IKNtM0KXzELMl1ni7Gh1x9Pzku2Me1EUj6O1C03ADTIFEkqEFPO7 WH8snRWWgtREXOYKOZIvtocopTc5cCJdwvjptIEDk6CiiGzrypc5UNfjjuO/Qus8WWWZ/OVUv18 I9Dp4VInxVsGCBXb6x7wnmzXAyveEpRvBiXmCYH+ZZ4gvwlwtnWL/gNyuGwxpw= X-Received: by 2002:a05:6402:4406:b0:6a7:f505:ef3a with SMTP id 4fb4d7f45d1cf-6aa548a74c0mr564874a12.35.1789716598550; Fri, 18 Sep 2026 00:29:58 -0700 (PDT) Received: from [172.16.220.101] (144-178-202-138.static.ef-service.nl. [144.178.202.138]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-6aa58d55cd3sm462048a12.2.2026.09.18.00.29.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Sep 2026 00:29:58 -0700 (PDT) From: Luca Weiss Date: Fri, 18 Sep 2026 09:29:54 +0200 Subject: [PATCH v3 3/3] arm64: dts: qcom: milos-fairphone-fp6: Add touchscreen 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: <20260918-eswin-eph8621-v3-3-514eb1f622c0@fairphone.com> References: <20260918-eswin-eph8621-v3-0-514eb1f622c0@fairphone.com> In-Reply-To: <20260918-eswin-eph8621-v3-0-514eb1f622c0@fairphone.com> To: Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Henrik Rydberg , Bjorn Andersson , Konrad Dybcio Cc: ~postmarketos/upstreaming@lists.sr.ht, phone-devel@vger.kernel.org, linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, Luca Weiss , Konrad Dybcio X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789716594; l=1602; i=luca.weiss@fairphone.com; s=20250611; h=from:subject:message-id; bh=tKqz8WaA5fCf8zqxAuhb+KSHy9L2ioB7dBm28PChNnM=; b=FSUkC8Dg+KYzQ1EbVyPSln4RuJEUYkt0GCi4zrHCKl6m1CNeYmsTytFydVGIhLVu7WZEc283N JHQdxsdjJ/SALm7EsjPehZ2veC95aM6/MbRmVii4aLXrmNkQCsjglDK X-Developer-Key: i=luca.weiss@fairphone.com; a=ed25519; pk=O1aw+AAust5lEmgrNJ1Bs7PTY0fEsJm+mdkjExA69q8= Add a node for the ESWIN EPH8621 touchscreen connected via SPI and the pinctrl state for the two GPIOs connected to the touchscreen. Reviewed-by: Konrad Dybcio Signed-off-by: Luca Weiss Reviewed-by: Abel Vesa --- arch/arm64/boot/dts/qcom/milos-fairphone-fp6.dts | 29 ++++++++++++++++++++= +++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/arch/arm64/boot/dts/qcom/milos-fairphone-fp6.dts b/arch/arm64/= boot/dts/qcom/milos-fairphone-fp6.dts index 4b7ae87270ac..498fde3d3d18 100644 --- a/arch/arm64/boot/dts/qcom/milos-fairphone-fp6.dts +++ b/arch/arm64/boot/dts/qcom/milos-fairphone-fp6.dts @@ -983,7 +983,27 @@ &sdhc_2 { }; =20 &spi0 { - /* Eswin EPH8621 touchscreen @ 0 */ + status =3D "okay"; + + touchscreen@0 { + compatible =3D "eswin,eph8621"; + reg =3D <0>; + + avdd-supply =3D <&vreg_l22b>; + vddio-supply =3D <&vreg_l9b>; + + interrupts-extended =3D <&tlmm 19 IRQ_TYPE_LEVEL_LOW>; + reset-gpios =3D <&tlmm 20 GPIO_ACTIVE_LOW>; + + pinctrl-0 =3D <&touchscreen_default>; + pinctrl-names =3D "default"; + + spi-max-frequency =3D <2000000>; + + touchscreen-size-x =3D <1116>; + touchscreen-size-y =3D <2484>; + touchscreen-inverted-x; + }; }; =20 &tlmm { @@ -991,6 +1011,13 @@ &tlmm { <13 1>, /* NC */ <63 2>; /* WLAN UART */ =20 + touchscreen_default: touchscreen-default-state { + pins =3D "gpio19", "gpio20"; + function =3D "gpio"; + drive-strength =3D <2>; + bias-disable; + }; + sdc2_card_det_n: sdc2-card-det-state { pins =3D "gpio65"; function =3D "gpio"; --=20 2.55.0