From nobody Fri Sep 25 03:20:39 2026 Received: from mail-ej2-f12.google.com (mail-ej2-f12.google.com [74.125.228.140]) (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 BE1ED41DDF1 for ; Thu, 17 Sep 2026 08:25:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.228.140 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789633544; cv=none; b=dNqNIM2g+0XJ+CkW2LfwpMHeUUr553lGgT/En/ELolAw0Sa3znaGq9YLSXWGnfW6BG+fERCXJHNkPEViy7PBARsEVVk9ahKoUZMM2HoEgJvAvA0p10K6ZSm/MsRkKvpCuT5Ba+jWJbUGCLPBJYMzwIFg3Kgc/p/FGji7VscvKX4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789633544; c=relaxed/simple; bh=0M4sE/hfoJQ3CKEy3NN7fLe6+z2efpSPXuBLPdijfOE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=bKXf2J/dY0Xkh2mdYmDiy9dHqpvRoxeemFq89+wZT6TuPq0uhDbrRfhQYMeT/3pg0lt/fLfHsQEGZbzAuvqlepABCrv5d6ASCFuX1gds/TqH/mQWiyUl5k4dq42cqAGOpRqk0v1joN9sLIPnvbSD1o1I53HZkjBK2fFNhsyMyOY= 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=EH1U8rNV; arc=none smtp.client-ip=74.125.228.140 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="EH1U8rNV" Received: by mail-ej2-f12.google.com with SMTP id a640c23a62f3a-c254f6c7a56so79548666b.1 for ; Thu, 17 Sep 2026 01:25:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fairphone.com; s=fair; t=1789633527; x=1790238327; 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=EH1U8rNVmy+OssuI2v6iA38ey0v7C2k+YMkHBYnCiLT33JTSoXrsNCSB56xHnrDO3/ +Nvuh2Y3IwE5jb0uBVNjuf1rN7FeMPsH2cn4dS4DpK+sywmJTTDR/rupzgEu9WWoyneX vl6N5eBmflcBheSKrvbZ0WtFYMBs69Lx+Lqveg9REM5oovmEpSvkNdtno6EXV3PmI4JW XLGUrqOq5aWtnvyazNbk9p4zoEFFBL9WU3/VFhX5X4AXp2qD/Duint+F8lL59n60+riv fXc2KZ1pou2JOHV2eFd7SODs8sWgW7HUvHAfd+8lfIZOMVd/KNy5pqy12kkoW/xDJr5q GNTQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789633527; x=1790238327; 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=hDmqmFr40gdaJ8kZ1uskDn38GIEL482L6yTv0pYLn3gbm9aRbBsT5j68tpfM5xQDcz 8VBN97bjfyqEvnQvwGLJ1Hrj26zjWyrq+vZzChoGjlhbt4q++DIwKMrKLyQvgbYyLkwG qFH96f+tGACv5bkMSBVwXkyq6PGXlhP+1VCzC2N/telvINCpaY2SZtHJFL4rxBJO+K3e GdpjWhpjzClt+u/5FMBVE7K/oY0FTRZ8LVDJw5gC5koLA030l7mmalKIz6P1KxJfLY4q Wd2vNU2xRiVBLo+CsLzH/JIBqKgHWjABIDvAueBKeLoHv6GEq14TKECgLJG8MQLSlcpv KzMA== X-Forwarded-Encrypted: i=1; AKwUvBxIgXadlKEm9VkbrImcTTlIoEeE+NasUS+hjAFFaNlXp4O5g1QfLCv/UpuuneeYQqcMK0ArCVJje+SQodI=@vger.kernel.org X-Gm-Message-State: AFuF++nneooExG7c4KDjP4xouk1K3GlXedEyl7PeaXokN77/s0mF2/pn HAEHqaOiRrF9FNWzM2F5CJuAPnzp0VXuXqXdeefJ9GnBNdXo5q7G0T0zkkhSGbXICvQ= X-Gm-Gg: AYBFou2xLrNfPeA9vYzfhWYEcbELHG63SRFhHLELEhYdHqtbrxuEP/yFNdceJK0Tpzf HK2lzU2T7U3O/eoMLCnJYUCrVkVursu5QB02niysbhAvyppA9C+tcRNVBt5sy1wL20CIuY5xuew GAvHWR0uKi6SVboJUmsEbFk0L58yZjXkoWbf4H4oykGv+VCbcEWguWbEBSo8gIvwUKbc8J/hAP/ TZ32/TljnGZE/v8d4+yjHhWNOq9gHqjj3djbOonBiQBPP8N30GNi2UuDqhBmXQrrtmOIC301suO 1ZZOLJN4WRjUrMKNiGwEA7nGSOWnDrUKcLzHGTKgMgNdpoaUee0jDGgRFpmn7LgZVQ0PRUF06OA IdHrP1JADTdsRWMrENXHRWH24ZgCQIDZg5mUIBPFJtcWtZWICQczgyzjXTUGHhNqlj9PXsOJSe7 8sWbT/dEuIeP7VPFYCjjwxJEG4DXg+0aa21Bspwb7V16JKGsQXjXzyWNVLldHna2W5NdBTeSc1/ 2IJLIHH3hf3hBLun+Zur1l7Uo0f5lejTZsYNox7PRUj6k0Nfjqn X-Received: by 2002:a17:907:3d05:b0:c29:6cb1:bc56 with SMTP id a640c23a62f3a-c29e532bea8mr428959166b.46.1789633527061; Thu, 17 Sep 2026 01:25:27 -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-c29de0851ebsm242943966b.4.2026.09.17.01.25.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 17 Sep 2026 01:25:26 -0700 (PDT) From: Luca Weiss Date: Thu, 17 Sep 2026 10:25:23 +0200 Subject: [PATCH v2 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: <20260917-eswin-eph8621-v2-1-f534080a6338@fairphone.com> References: <20260917-eswin-eph8621-v2-0-f534080a6338@fairphone.com> In-Reply-To: <20260917-eswin-eph8621-v2-0-f534080a6338@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=1789633524; l=2581; i=luca.weiss@fairphone.com; s=20250611; h=from:subject:message-id; bh=0M4sE/hfoJQ3CKEy3NN7fLe6+z2efpSPXuBLPdijfOE=; b=LXWHrieBinkzfsTRaq07FaLKCin0Eu5cmjS6OAWA/r1KViaF57s4hblQsYFmgEQcnOHr2Cul6 hY0762LRPc6AKstqWT1UE5YLKBty/MiBTvGODlIV2RMM1xsh+00KP8M 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 03:20:39 2026 Received: from mail-ej2-f12.google.com (mail-ej2-f12.google.com [74.125.228.140]) (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 7BEFD432BF4 for ; Thu, 17 Sep 2026 08:25:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.228.140 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789633538; cv=none; b=mVNlbgRX0+QcU4l0rVl26IuuakVnR0R06jFAYyBgwCBFjjjC4EVqZYjrjtLG6K7qxlIJs8y/AfnQH8vybXIwrB5HypVFe0TYfr8/z+xCBKICrVincLFKZz5rzzpnLXUag1Ac4qv3HjSlCV2EuuRm7hZXpMzhPF0Qm/XhqplV0oQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789633538; c=relaxed/simple; bh=TdVY/83MraaxJ7fAhtV+rF02u2R1xhzNiw62qZDXq1w=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=fP1sM9nEFOz8LzoI20i/PR7np3wbFfiDU+LlQDsXec4FbnK9FAoq5eC5ziMB85Gc/rQMXlVMpBtBBRNT1e+DnWpGR/Ho2qAO4l//fUrXgMnx7uCmrg+0d3IjWt/RuUuGx+87IHHzihpW4oWnMaTn83WUxaztMeFu8Wvv5o107+8= 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=gprsJ9j2; arc=none smtp.client-ip=74.125.228.140 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="gprsJ9j2" Received: by mail-ej2-f12.google.com with SMTP id a640c23a62f3a-c254f55efe5so91589866b.2 for ; Thu, 17 Sep 2026 01:25:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fairphone.com; s=fair; t=1789633528; x=1790238328; 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=qDd2rqEWIMnT2Qq4JLPJqf7hZzHmYiYKDQFOGmsjm5U=; b=gprsJ9j2EGxzO8xslJKG4+WH6SzlD5OQ+PeCKjabV0ZSIPNTMagR4Tc6Y5RxfGAYbg 1NzRO3pUAcbxNOTN0PoDpHNz1U5HOrXTtsFicBi1cNSa0q+0VD37jxIA0gLa5J4KSlVK +c6idgb2qcHDumV/Fu9iW63T6NuI/yjInTVXNXJbAl8Mn0Fd56v858U/iyMt4Giya5lB ngy2IVrOSYr6/l4/0i7soneLCJX9spAcFprbkW7xSWOJaI+WH9JOghJNG8oMEv96YF4K jibAbCJwleECy/4rjXDmROJlyIR8fmgA/dLNaYlpiC50nPQRV0iAk7tc/y94hr2Qhhgr e/PQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789633528; x=1790238328; 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=qDd2rqEWIMnT2Qq4JLPJqf7hZzHmYiYKDQFOGmsjm5U=; b=zF91uhEP8q7uhhCautIk45jDPBKzcQIpTahtltX1+MW9KnVIfcK5OpPe/G9Loj/sjL N+dmtPj48Bhr8QVnLD1UW/TgP/nD/A1BdmUxWRxZkGd6jDMBT0mkAxdMQDcoSh5KZLy7 hf4l6n1siq6vHqzaWuaHGo2rZWD4E2GGlOXjEyQ9kr4POr+qj7ON5BED2UJY+GLtpk0b ojm+oASYgjjdnwbp+0t5tFKQ7IM7FsJJhUM3Xzarmkk6Z/Syk5ZFTK7D9u/mBzMyVkTt f9GG1he72kTuRPZEjMtrRG2xSP/w70Tn9tahy9uGovmO/3h5nxdWmkMn0+cT4blJ57MM imiA== X-Forwarded-Encrypted: i=1; AKwUvBwVHkIRbo4i4L21Ji6SWX2QVVsuDMBxp4mjOzfaiMsCUghOpNVbxsBsFNUbeZFoMgU8oFjnZVrblh4r/A8=@vger.kernel.org X-Gm-Message-State: AFuF++mD9tCtj0lul+qlmEgJZBC3yPZqTZI7+SPxbSDMRrop0zh1CCbT 65Lc5axtS53SfOWJm94MqRtn9v6F002aAU4Apx0Xd+v5jy7VSu5+W3LLlGElis6flfE= X-Gm-Gg: AYBFou1H/05KZaV/NEYOKIbccyH56SFze5LJxexdWVIXLhFu0JEsDodC7U7wz8z43gS 7CI211kTXFWTZALvm/ggYXUDVLiSG4IIrUV/CcJhBnjMDsOKVBrVNo1fCTDJ2AyM9f2nt7eww9d n7/THxsNI0ymVNpgFteLwb9q/t0koDy4Uq43rp4ecEo/6a8ByJAvSZrNAmtrVoyi9Z8rRO/vvM8 xZF/avKsAev7QOzjcZWvDdMVuAuOsPUv0KrR3ejzgu8fsc6lTyywM0YgIBfBoz3pK8yDN55f5Ji iQReTW/8i+s/sUoD/gOMLrVFKrGuM2eH3b6XDZbl7fR6AOs4tnRMOrKaV0ooCdDwvE9XI8z/72Y R/vAovdaquHLy8Oh3sXKSJ82xGW5zn+VGXKMxJiI783uZYeYCSFjBkECizTTszAVkt2Snq43dnz b67zNmS7X9Wk2qjiBughtzbvQJTrws23aEIdnzcz48AeYalZUG5p1nvOZKpnKDI8uQdnSNith6o Aj6TDBm6cjG+oiRO0yHh9iOKU8c4539gO4AnVYsGYzeVBKdlU33 X-Received: by 2002:a17:907:d89:b0:c26:3424:f7df with SMTP id a640c23a62f3a-c29e52b4118mr392025966b.30.1789633528080; Thu, 17 Sep 2026 01:25:28 -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-c29de0851ebsm242943966b.4.2026.09.17.01.25.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 17 Sep 2026 01:25:27 -0700 (PDT) From: Luca Weiss Date: Thu, 17 Sep 2026 10:25:24 +0200 Subject: [PATCH v2 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: <20260917-eswin-eph8621-v2-2-f534080a6338@fairphone.com> References: <20260917-eswin-eph8621-v2-0-f534080a6338@fairphone.com> In-Reply-To: <20260917-eswin-eph8621-v2-0-f534080a6338@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=1789633524; l=11037; i=luca.weiss@fairphone.com; s=20250611; h=from:subject:message-id; bh=TdVY/83MraaxJ7fAhtV+rF02u2R1xhzNiw62qZDXq1w=; b=2UOJIZ+laWpe3z69dv4+0glRVKsMCHlTwvmgqiM0k6K1BUnzT59ZDERYvBg3XINscJ8/8PU4d NrvifQDByOmDRIYX8IFv+aL9tt8CTkcB+9Rj6IAI6LdT+oEnhglTRSs 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 | 333 ++++++++++++++++++++++++++= ++++ 3 files changed, 346 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..866cdc7e9334 --- /dev/null +++ b/drivers/input/touchscreen/eswin_eph8621.c @@ -0,0 +1,333 @@ +// 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 th= e 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 > 0) + 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"); + + 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 03:20:39 2026 Received: from mail-ej2-f12.google.com (mail-ej2-f12.google.com [74.125.228.140]) (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 8D71A415F39 for ; Thu, 17 Sep 2026 08:25:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.228.140 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789633550; cv=none; b=XpRvFl2S/TBrS0Nh3qDvh1q/5lRu7SWptYtEwEVi6kTpUmM+YFWQebeA7dvlZe2GmD/22jrIBZi9oo0KC/FHrNkpv8SSlfN82dh+NMzPnNtXPImScEGabavZRWtqIy1RuTFjeCie50OIBfiYJ+3988CZvyIpb6jIhON/f5TYwHk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789633550; c=relaxed/simple; bh=tKqz8WaA5fCf8zqxAuhb+KSHy9L2ioB7dBm28PChNnM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=hu7U+UyW79MRLJmCPVl4ZFaIwrA2Fq0OQYMNnbs7EoSKUzGZtaUm3mZGy0MUWV1qnJFyZOW15CwfZQnaqf482kra6qfRq4gVqYvOFdl0LACb3kjeGSbCkmQgePEWbgssN0uXgvXWJ9vEUVrckI42EU9inoRJWLm7LCqvePnCdu0= 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=IDVJg5Aq; arc=none smtp.client-ip=74.125.228.140 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="IDVJg5Aq" Received: by mail-ej2-f12.google.com with SMTP id a640c23a62f3a-c293c683202so87392466b.3 for ; Thu, 17 Sep 2026 01:25:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fairphone.com; s=fair; t=1789633529; x=1790238329; 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=IDVJg5AqZ5Y8c7H7zSYinlG5tIi5AwD653xe1nqKmyj7tZsrPP9eDHFCoxu5+v78XZ z7r//+jXaK1ItG7a4lVzO7wNdC8OvvPBW9rwzaghfbZRGCpL9OTTXT+bcu6z5nLUYjdJ yCOwUOpys8DQEkxk8s5PQcVfCbou9UeEz85BbUOsCx864wVz6ta7gT4ZNFL96mTKSDUi eRchZgctIDCvFsKTcHyJZdQSHo4jymsw3XwHlA5L29oFrH6slArNj5p73/AN3O3I+QYI 1HhU7ixTJPSeHDAq8b2G57TiwRcAe+fmO95w8JTMSxTzivHi8kmnrlTAYQHLZU/jDnAy dzqQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789633529; x=1790238329; 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=xC+eSNyHdKJQCY/WxVqXisJGmt20ko7uGCzLnSoSQiOMPOhu+oJgIPVOfkM715RFfD zrGjj6wJnaVzr72vfOhhsJU5lrbLDbH5V1ovZxuBHfb3WqxCJtO94tdvktB2Qqsv5jA/ 85Muq8OqgH5Z0VU52AZbedONfRd6A8SalRKCZJA/Ksf7m4h70P5+f/asF1b5NY0mVKuU cZ2FvXJym4ZicQYkUfmneX9s9L+blopEfsyJJYujvawAjsx9l0Wat/bHNlrThxP19sbT 8j0WwIThP29By3xeiiEWduR0Yl9tQLpbBn3KyRUHeXUj6LGZvqiFBUb6OuqrZutnaINA Necw== X-Forwarded-Encrypted: i=1; AKwUvBzoz6wKF9Z3jGbaiLkoOXS8mI4V/PFKfFR1bXMX66wAqycI9wtC/D02aQ5CRmO/7L8M9hivRmKASVz303o=@vger.kernel.org X-Gm-Message-State: AFuF++nJYd4JqJQHVS+dbepvgkJs8st/oObmZVoV1g99UBFdAdG1pdk+ wewMklGCHiHAcLZGIYdCa+uySaEQsGi0M/vZvlDw7XBWpRoBuYE05N9Iz+t+Kt5KRFk= X-Gm-Gg: AYBFou3d7xpvSQZy8/n/jYEucEBUNbbuyowBe2PpzNuN14A0cvaQmJUD6CVszWomTdw gc0y6enb3s6Lhw4MaY/vID5bARcOQiAy6Y4butxqLPMaS39s3CwyycwGi0asDrkeQrtOs/wKtz9 Cp2jcWnRqCtWZREkJLnS6V1Q+HtceAQeHvweNSQ8dUr2ElF+97t/rDGUXuHyDfIlhIdo/dGtORR DDNii4phNwy2h0AKDnrkVr+o/l7X+GkRcQhnxb8YGLseqUVzKdELtkxGG4CF3Oy7KmHVZ2yWAgo 6ZVMHwkxPCYLKIiDMA4zkV3uJq8afG/wmzvDdL5KtryOIm8ibBqwUGfGmo+QNT36g2QfpMHtcX9 fOpPdIWkCDwkcCp0C95M7tcn7adi1A1K4/FHfAAT0OOsI4uJSuqFWnx95+adjD/sfsPA9/+ZMxQ fV4PqlXnOz0JlWUNKHXBXTevorjiMdp+Bmkn/1Jm03Gg2/fuap0U6p6n72RmiXKDD6AqL2MLvwe 0kTrPr1fyjVVa3K3QoN97S4MCFwWu9jIsR+iYLzFZ7lR1TT2PLN4cqMOvbK7E8= X-Received: by 2002:a17:907:7205:b0:c29:59ea:5bf9 with SMTP id a640c23a62f3a-c29e52085bamr405665266b.14.1789633529521; Thu, 17 Sep 2026 01:25:29 -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-c29de0851ebsm242943966b.4.2026.09.17.01.25.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 17 Sep 2026 01:25:29 -0700 (PDT) From: Luca Weiss Date: Thu, 17 Sep 2026 10:25:25 +0200 Subject: [PATCH v2 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: <20260917-eswin-eph8621-v2-3-f534080a6338@fairphone.com> References: <20260917-eswin-eph8621-v2-0-f534080a6338@fairphone.com> In-Reply-To: <20260917-eswin-eph8621-v2-0-f534080a6338@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=1789633524; l=1602; i=luca.weiss@fairphone.com; s=20250611; h=from:subject:message-id; bh=tKqz8WaA5fCf8zqxAuhb+KSHy9L2ioB7dBm28PChNnM=; b=UXnL3U0l+wxPa6dEX/B0T61AEQAmzOv/3SA2eDzB+9GPdURRWB1b9TGmZdmBpcE0PZyPxTwsc j0/hz+WM++LBcUzDuhnIkvW3795KB3LK3CwcFy3Zl97BxeSBbPLw6ph 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 --- 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