From nobody Fri Sep 25 13:55:15 2026 Received: from mail-ej1-f41.google.com (mail-ej1-f41.google.com [209.85.218.41]) (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 258F834752E for ; Fri, 11 Sep 2026 15:16:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789139779; cv=none; b=Khx24af9ooNpNGhEZJ8e+WoFy4DUJmLdaN6BNGgn1T0ftzri027fK40dV5lPvYgOVCreUy3yKH4Dtzag/buUBVhhfJLNGVzzn8IRfHpjqa6siSlBKG8SyRZtJRCLfCt9Fn6YOoa2RmM3C1lX9EwrQpekg5o36+L5BSrPk5FfhiQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789139779; c=relaxed/simple; bh=8AhNBKZpnaYUD2pQxjChPO5qgquyOMhWXmxX3P9/qnM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Lxq6tdytksNiyyoxvnZ9HOn1XgNvM+n4prEAL1R7lL+2oQWvGp/DIN/XKMK3ntT+2mgLau7mWJqDQH9zD3xn3S50sapWuHgSieAUYqmHkDuC0zbucuuCcdBOGpanTk/9krgaJObO/6StiXcjfIY2wPqTgiKSaN9pm29eumjjqt0= 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=H6mxH4D4; arc=none smtp.client-ip=209.85.218.41 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="H6mxH4D4" Received: by mail-ej1-f41.google.com with SMTP id a640c23a62f3a-c262204cc80so150194766b.3 for ; Fri, 11 Sep 2026 08:16:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fairphone.com; s=fair; t=1789139775; x=1789744575; 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=QuBzPHoSnBjRL86Zizr+XKaGzMxevhAgb2XWxWkSVN8=; b=H6mxH4D4VnGGfHmT0ag9DjctgtlupAtfzOAbpqHc+0+Y4krVg52rRNWmeTeM9yWdYU P3IBSloqqNkx0n9xCzcsW2AfeElvPyyg2ZdZKYLOZJD9ALJxuRUKzbSZ1mai7JctKyF9 +SlmrE4NLlzFGY4sF17j5vqylen+JWu/+mkzC/TCcuf9A9LmtZ2iZUbzGAIR6kzMcUM8 B0fqdjUxnnnI/Nr3IU10O/+slWjmfKuCoEmWR9+3XyRTwcc4eOjJGg2IKBm+HgBhfPrf y1tdx+2qsY77+V2JCTe76pp5hYyjzNkNYHmeQBSyiFg/66F1W+TB7mrfrwfHFmwNAHIi ob6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789139775; x=1789744575; 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=QuBzPHoSnBjRL86Zizr+XKaGzMxevhAgb2XWxWkSVN8=; b=gQkUVmLX/KXICZx9j8IZkYAGHMKCzfNI6jxvox1FeRyv/CyJO0jPOwS7FdJkDSxkWI Rxx8HVqBWJpwr/8qwkPYZif/9s2YLeDtdqVKfKw9OvAqKvyvpVj+QY6ObqMnMwSEdlAF +YkUpGOKO2GimPfCPjRH5j2M79IcOL8XkAxYyqSag4+47a5dYoTf3JPvWi9iC2Ta1A8x sxnzAldN2rKasMbNHeQT5fg5VrEblU4/BhD5unWLF3ibhOWX5DT1zNgc9Gm46xwAWrIV BpYrZn0OAqwlGTuZDcNUxNp991HlotOzBz5wzX2WvAe1vSBEh69S4Y360UL+jZLz90B3 z5/Q== X-Forwarded-Encrypted: i=1; AKwUvBzU6H9V3zhiyA40O+yOca6wGEtDIbPe580KomUkw/6tgqBvCnkS1VnAPcgTlD350zu0GYhKE0hbtiy2eoo=@vger.kernel.org X-Gm-Message-State: AFuF++lqHwZumH6q5f4Lh/IeGm8kTeUJcMmIefpUF1Fd/D8KRjDdI5VO 6mlIYaCWq7a+zhcd1v7Lmn6fYd77xz0gR1qfjFOMWlxFPsurRcU0vhw+lcaDJL0IF1U= X-Gm-Gg: AYBFou00pQQghdn5XGvPeWN6QmWrgEUQRgH/wloZ3+M9ihl0H3aAp3AOXPscWso1p+t kKkdmHg6at06GMLvB0HpIlzwOXX4L48ktL3O1LbW3i7I2HMSc9OS8TXtVyVU+/0Fgdp0fgZZsCR J9T+xJAYHX4KapN7umoUzi3/xsJQOHa7QK2nl62nlAJofIY1J79Tkw1ZW3jOL+dTPptNfD3laGq A9+pvBtC9henC93BIsxqDKMGDHXQiu7Hp/edGxjXRRJSn7jCWgJ+BInSU+VsPJgo2ZmbPAIqIfY SSJE60MeFV8NLwLc7xNOqhqg8/ue2lXXMWIb0SvDgZ3wa2Suc4QC2gycTprFZRe5jC/iJzBqtbj NQSZD7G+L2NUmlSHZOZUiJpTOIXcFBRjTOPoVi87PlV3XKDxUodYLDukNbXoHd7Q3MkGlzlixfY v4UWE7/yrbLQAvwOgqEqaTOvT+9EectXX5+sYexWZzMEus5gnkni0gjsmG0cUnmDtdJfXZ50QEw cmjqvhvRIqaORuMGE09v16r7+/xQC1wjj1+/av9/RW28ve55g9doQ== X-Received: by 2002:a17:906:6290:b0:c29:6400:ef8e with SMTP id a640c23a62f3a-c296671348bmr202563666b.42.1789139775315; Fri, 11 Sep 2026 08:16:15 -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 a640c23a62f3a-c29660ba623sm94656766b.45.2026.09.11.08.16.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 11 Sep 2026 08:16:14 -0700 (PDT) From: Luca Weiss Date: Fri, 11 Sep 2026 17:16:09 +0200 Subject: [PATCH 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: <20260911-eswin-eph8621-v1-1-db447ff9e445@fairphone.com> References: <20260911-eswin-eph8621-v1-0-db447ff9e445@fairphone.com> In-Reply-To: <20260911-eswin-eph8621-v1-0-db447ff9e445@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=1789139772; l=2508; i=luca.weiss@fairphone.com; s=20250611; h=from:subject:message-id; bh=8AhNBKZpnaYUD2pQxjChPO5qgquyOMhWXmxX3P9/qnM=; b=klm5WaCMDKqec15ANu9XtYr2/JmBMK+XJPgebCb8nmQlHNdiQ6PGH2kPZYx1us0RzXLSKLfl8 5FNQAJ9XfH7C1PKqsY0VAh3Ov1W/+d4FyTZ6HK7k8FY5F5hY90iGJ/+ 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. Signed-off-by: Luca Weiss Reviewed-by: Krzysztof Kozlowski --- .../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..03f981ba19e4 --- /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 + +additionalProperties: false + +required: + - compatible + - reg + - interrupts + - avdd-supply + - vddio-supply + - touchscreen-size-x + - touchscreen-size-y + +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 13:55:15 2026 Received: from mail-ej1-f53.google.com (mail-ej1-f53.google.com [209.85.218.53]) (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 3FF04374A19 for ; Fri, 11 Sep 2026 15:16:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789139780; cv=none; b=qfGsXkD5ySrWa4nSxCfFSWlCscA3nh0cFhtgw//04XbFUJwWm5wBnONcf6pE3dSIQijxEx6LenbasGm+TjLLt6zCJvAjwDJ6scKbUsItooH1qjososkUGc0i0iGVG1pcM0oKxhZnFtk9ViUHeKg7sujNzfk8YukDALJi1Zy1x1w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789139780; c=relaxed/simple; bh=dftZvX/KHdVX0CR6WV563b/JJ4fcKbV2x218LJ0LRfc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=SNdChkApujNIYyFrKIILueIFE+lY6ecfsC+Z2XuBLiVNBg7HZrTLfDVxhHcwOEv30a6F0hEzV0a9cK3pOviF4R9obQy6Dvo/KeSA7eo6W59a8mlvESGyQKjMGxra7XXOdiPcgU7/VPEAERUdDa+dis/O0Qkv55NTlH23y1FVwAU= 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=WieSbMec; arc=none smtp.client-ip=209.85.218.53 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="WieSbMec" Received: by mail-ej1-f53.google.com with SMTP id a640c23a62f3a-c2949ed8cc3so188682166b.2 for ; Fri, 11 Sep 2026 08:16:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fairphone.com; s=fair; t=1789139776; x=1789744576; 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=S9ABN5lNyogJGbxMYHZpdC+mEyYAf+m8sMuYe7vU9MQ=; b=WieSbMecCsiMZFk+Ok0CPNkUeHilvc5feb5uWkf7b13bB8sfsGCe+8EQnStBGy7kIE zQ6H1XnQLSkFPbp4KLLmA3e+85U49ToKbu43klbcgrGOZ1vGHN1RHcuwd0YMbQd+QH9p be9A4lY58cVnk9WEte3CwqxjgG2ksxIz4WcJyx39axN0KqvCi4qH0Qdei6IO+U0q2uVv LDicuONpMpv+6mlp1jIZmAQebehEdgDvngPxlYc58O4NzPBeueDEVyITvn7WK1qjQT5F EZbRLhhzwjF6GuVplGEDQ8OnDLXnIKkIBSOM6wez2Om0FIdAJNajUT/FMdmIvsCDDu6R bOUQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789139776; x=1789744576; 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=S9ABN5lNyogJGbxMYHZpdC+mEyYAf+m8sMuYe7vU9MQ=; b=eCRMZRXN4tzKOC8ULLDSy6i9YYanbITAKVzdmQ8iz1Vutcm0xNMz4weCdUb2OdpdtB FvrXaZG6vCiFsAufW8OTMbrGkXGY/UB/mHf9CarGzRc6m1H3+xmiQr6OboIE86FPNF6O 5JvAkdBuz+HYCJ7GHu6qFDQWPqpEVMgZuRTyMaHQbMbLQByUNbfE3fuwDhnFS2cI7atI n7A6ALFBHgbm8RKlplOWa+ru97J5kzwlg3meRO5Ff6Gi6qWuzLwOhhNUHHGzyIBGkRGx lwfcC3JIYur2L2shAf4nrhgPSC87oHkAdsSKrxEsOcG4/usGgj7KNnfKLiuMXGSsYkJV AzXw== X-Forwarded-Encrypted: i=1; AKwUvBxEAYQw60FuljJhcmk0tWvABvjgSqINMlUIPDFnZ5hgtA0G/Lu+d6iUQ3ipttzZlGzQxcyxcwrM60TaBLU=@vger.kernel.org X-Gm-Message-State: AFuF++lmEpRHnDcKLTQd4zhe/aJvHg1w37o/BsE2FjwgEGr6Ixz2mIaM XnVbUEl5kbXyNpq7sbUm44vr7nqUuRYBZrOLpU76LgZG7xNcjDUrnjE/NHI+HWyD4zo= X-Gm-Gg: AYBFou0id6xOzhn8PcHkfqZx71zWyD8sw5WhtomII2fg2Xu2m5oY/PVo9CWQTwi7ptG NzS/yfl30QzUHoPN2oaUrmADtuzbLfbSjR1YFp9cBEJf1YFVHitWzYoZ6bOua6nTN49s/bBwJhi Km3rI2igrNRg3efkvTo9gajqXBq8WlZja0OZfjfp4RfPnnUXFzczMUgtz6kxNyZDDHG8VY9V2Xt 8MMQwDy4i6bRIXYimHVJaBmU5QNN5JLU0/MZW3vP8aa7rAImf1011Ad++YQrxaUfpXkONwcmPQl j/HG1OTbKbS/oPpym/1h14JqKxH7tGat7ecm31P7FbN2hbIfaaRIBpOlovuhBMjjk6HpsN7bVnV YjGwV7UBcIW6sUbYvAOUbksmIr3rGOaotwb3jNBTNXkoR1NXMiPE14kgkbE5UDCIurSJhvLZYrT G9t9bAvfRM0KzPzhwzB6cbTR27WPl27HzE0V+wG5kWI0C5WYtVwLHt0R7vEiRVjk9BOA7AwSMg0 TH5h3rQ6azD0BKmDXa71ZzJSZ6hc/YmuxLahDv8u1Zg5BDxemwHgw== X-Received: by 2002:a17:907:3f98:b0:c29:45f6:6a0b with SMTP id a640c23a62f3a-c29667069b1mr225027066b.34.1789139776366; Fri, 11 Sep 2026 08:16:16 -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 a640c23a62f3a-c29660ba623sm94656766b.45.2026.09.11.08.16.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 11 Sep 2026 08:16:15 -0700 (PDT) From: Luca Weiss Date: Fri, 11 Sep 2026 17:16:10 +0200 Subject: [PATCH 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: <20260911-eswin-eph8621-v1-2-db447ff9e445@fairphone.com> References: <20260911-eswin-eph8621-v1-0-db447ff9e445@fairphone.com> In-Reply-To: <20260911-eswin-eph8621-v1-0-db447ff9e445@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=1789139772; l=10408; i=luca.weiss@fairphone.com; s=20250611; h=from:subject:message-id; bh=dftZvX/KHdVX0CR6WV563b/JJ4fcKbV2x218LJ0LRfc=; b=pBwASyFjhf+tD8f0FuO1U32IvharcJENhWsGi6Lu+asdmlIvTSoWOWMFbpgtqV4buscsNP0TT M395hvCa9PkCZMpqKXhBXFQC9uKme2A+2NGBWKnpsbItlieGjye69C+ 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 | 310 ++++++++++++++++++++++++++= ++++ 3 files changed, 323 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..12b90cc89052 --- /dev/null +++ b/drivers/input/touchscreen/eswin_eph8621.c @@ -0,0 +1,310 @@ +// 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; + + 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) */ + return eswin_spi_read(ts, payload_len + TLV_HEADER_SIZE, buf); +} + +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; + + 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) +{ + u16 total_len =3D buf[TLV_LENGTH_FIELD] | (buf[TLV_LENGTH_FIELD + 1] << 8= ); + u16 offset =3D TLV_HEADER_SIZE; + + if (buf[TLV_TYPE_FIELD] !=3D TLV_REPORT_DATA) + return; + + while (offset < total_len + TLV_HEADER_SIZE) { + u8 ev_len =3D buf[offset] & EVENT_REPORT_LENGTH_MASK; + + 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 error; + + error =3D eswin_comms_two_stage_read(ts, ts->rx_buf); + if (!error) + eswin_process_report(ts, ts->rx_buf); + + 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"); + + return input_register_device(ts->input); +} + +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 13:55:15 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 3E2BF374E64 for ; Fri, 11 Sep 2026 15:16:19 +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=1789139781; cv=none; b=bjQD4inX+PZRPh5gZMI+UWO8e9H+PRC9rw0NzTa/d1nvkRLLovI0jh0VUJFSQJTfMxsX73Og3r2nel0iMDMFPA+U0qKdpFAo4SBzMNgURtv5lvoL8AcP30wGNIQf8xyahBmeQ3/BM0A1m7XO2oN1dO2lLQy7qUCEU1sUGArzP5M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789139781; c=relaxed/simple; bh=rFAIgZEb7/X6mAN0fuGGvUE8kDpeKo4I7MnEkQNfJDE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=t/1PyXVTHgIxi34vWI5ZWZZNzs1y6/gCS1wpoTqXEP0GO5uRZLLjiGBt3o2vIyYiZajqjDIIQNEKC6UHZSYbrqvqhTfuXRLsz+NcyDDTqZF7lzrM7GOoNpglBO6xiBZD5DxqeQ48LxV7GuB6NSRVdJ0ajW7YqYHALBJkSLMP+WM= 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=SS7NeoKO; 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="SS7NeoKO" Received: by mail-ed2-f12.google.com with SMTP id 4fb4d7f45d1cf-6a9984f9adcso139784a12.0 for ; Fri, 11 Sep 2026 08:16:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fairphone.com; s=fair; t=1789139777; x=1789744577; 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=TjxKNhrtXJ5EeGCSEB7g5l+FtJDfp2TwHE+FqxTaARY=; b=SS7NeoKOYVCsoXl7Wv6mCMwwudL3DJ4roDUA82GGnjaRMXAVSSKPLiT2CBQrW30xpS nPjePbXO1+6LhxK2gjV1CKQoKGH5x7m+uwbaQ9Hjqeumg6G9naSi5ccR0arbjHbMLgMY M83D8RPfXX/s8rIKfHtbESR2Kn94LE8eqdSiLL0lRvPUHdvb8iBKnHjOViZrWzPtRAew xck4bzo3bF3ORuBS0hVwfEkhCp0mn4zEVXhW+ufQ7Zd0WvjRtYI5JtnCK2q8Y6gTwQey KFWTOBsOlmrWtgP2JFt2wrjdz9YDw260zmvcpVSESAlCUhE5GjS6pz9qf8sXpN0MVEnH hLHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789139777; x=1789744577; 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=TjxKNhrtXJ5EeGCSEB7g5l+FtJDfp2TwHE+FqxTaARY=; b=GsJScXxKyxka2UZl2w0RKLJ60wCE2mO3ME4xwJyFgGm9hUpsFCfUQ4P1nBNjaTofJ4 AQ23kiN3wnMF/ikEiA37Kt19YG99gItWFX1dJweF6yliyQ/hLMQtAGIqrb85MJvq0sMZ RHxC4pdje1kRz30RHmJzAQIqR/4MPvtIAPDcaCHl5fiIKBjf7upGX9sXiy+C2N33Oi8U 33eEVF3K5FWzEj6R6VJMX70k2rybpllDrlpXQ7OtMQdr4wtOsAlwC3yU0S5Ml3xJZcx2 HR5j1wOs3YHcvJ1Prtu8X290CN7hrUSrqFwJM4VFHZ5y5hYJVVNg32Emc9IZGYOErkb5 e/2A== X-Forwarded-Encrypted: i=1; AKwUvBwBn2VV656GTaTfUZgpmDTMt3fDFVsOEOKI4+MYFdjkAK073VZaiN5hGjxqfN4crtLcGsEH3WGxJBZ7G1w=@vger.kernel.org X-Gm-Message-State: AFuF++lAXjJtEBd+CihYmS2RTnLjk69jkEcd5nebw4P+mUrD32ZuvGZp B6OqZO5PihPDPRSxQOE0hbdwnBAlk7A/H2pG9efptku/6c8LL6+fd9lDq4PfeUW7bZY= X-Gm-Gg: AYBFou0lianUM/qSjlrwQuqNEvMYSQKFKNIdVIiS6eeJZyCp511GsjNwGEEAkDNVmjZ 7+W79faT6Att8/PalHACIo5VYGlSqKycwphhdGta+ioZ/GgigEnZBZ2BM6xxmJi1C0PfBRZndB0 spuvOlxi1v4imheC+vRLdFq2JS6bVB0WCpKdIiRipcYMyfO3RS4qsofnho5/bbzGhm/w1xXQXth ieG8ldDcY07jExXzbVGMGfSRLiXZJHT7zC34P+OTul0r6w+e2HIl35mUqk86yWf9QwF8eI48Pdn I2VQPz+fl5L9ETC1qKYbmNakpxkUJExVsiMi++ci1sXx78vnLfPBIAOeBfRw8UQG569tuRTPl6P lWMkkdaUlZwU5A5CCwg9KnjQaBkyTYqGDF47EdqL2FD4g9GkCISCK+VNGKDGsaLBvjI6+OjgHGU q+zbghyLCXaimnA/ogz3QtCDJoNNgbARUwxVcXLi8OAHPATbcu/7CLfngYXPWmH/N3Zu3PWYwuY NsrfwR7Ar9zwbFXZau93TWMG37iFuMuYOT5wQ2vsgg5ytERlTSeTJs= X-Received: by 2002:a17:906:100d:20b0:c29:72c7:c3bc with SMTP id a640c23a62f3a-c2972c7c6c1mr89016366b.9.1789139777485; Fri, 11 Sep 2026 08:16:17 -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 a640c23a62f3a-c29660ba623sm94656766b.45.2026.09.11.08.16.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 11 Sep 2026 08:16:16 -0700 (PDT) From: Luca Weiss Date: Fri, 11 Sep 2026 17:16:11 +0200 Subject: [PATCH 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: <20260911-eswin-eph8621-v1-3-db447ff9e445@fairphone.com> References: <20260911-eswin-eph8621-v1-0-db447ff9e445@fairphone.com> In-Reply-To: <20260911-eswin-eph8621-v1-0-db447ff9e445@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=1789139772; l=1541; i=luca.weiss@fairphone.com; s=20250611; h=from:subject:message-id; bh=rFAIgZEb7/X6mAN0fuGGvUE8kDpeKo4I7MnEkQNfJDE=; b=LCwm/TDK527AQHndrydQY3/jyrwYXRgoGogGegiCXJ9yDBVpchTj4EAC4B3mODItePcj8TAcA TXm5hyi8HI8CszR8Z7j7AW/GRfEdTV6CL70q+C+8F9gcGjrfd4hBdxx 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. Signed-off-by: Luca Weiss Reviewed-by: Konrad Dybcio --- 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