From patchwork Sun Oct 16 10:27:53 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Job Noorman X-Patchwork-Id: 3001 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4ac7:0:0:0:0:0 with SMTP id y7csp963500wrs; Sun, 16 Oct 2022 03:41:52 -0700 (PDT) X-Google-Smtp-Source: AMsMyM5TV2qAE/enRQHh2QriCiZdNNrJG6whJggwzpR9MXym6ABavLQcUSRZeEbC2RZYG74+dsn5 X-Received: by 2002:a05:6402:148a:b0:459:2eab:9b0a with SMTP id e10-20020a056402148a00b004592eab9b0amr5682795edv.139.1665916912801; Sun, 16 Oct 2022 03:41:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1665916912; cv=none; d=google.com; s=arc-20160816; b=kiNkVpWfAkZku+JD/46j0ENlYNm71GSJRQUVAxhglS+eG14yzB7ZixClnGekRVaV95 3r70QzAlAp5+rOx1mfvFvVNOfltQ24vF/g/nfs/7HFITXszVnncmM6iFNHaNB7dTScYx Y2E4o3p+S1aEimm1fPzrom4VxMOSDWguC7cdQZvJYnQjC6jpbCRoDWN3nkN/nuzbH1qF l7s45E8vuVM+cnlFZ33ki5FaCKOErOo97wC5LDA4nRZZjRAsmVnPHDeDs2HBuywowzlt dLCoUwDmF1m1C/2ok/I1lo0gYtykdt25l/iknW0ixhO5v+3S+bjicqjjnEdxLPABpC2Q uxoA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=uoRUF8nZ/VGGSla+ak7lM2u3E/gt9381sADOuNB9V6g=; b=qivT1NNkvGtylvHerlrHQfNvpA56wNHkhv/rNV+0+FpUPVU4pcl/TxNtHu4mvj/pgp rjwNGAXUX7pZHcAlnIDJac4sUypPVOx/mYHhbMkFzKkA0qlKqqXmtTq9gpYsAo3V4H0V LoTMbOxMU1UaRkfFLoC6hL8eTbHe7z+BRenNAKMd7ZHPnxZ3PJwVLadjdIX1Azwobqce 9NBjSuehPCnCDe0wrqgHzk+2T6ZRf6iEOXnvFCZ8D6HAur5SafpuaQX8SVM0B4uJpa1A GKcM2EtJv4syq5EkVvlnL7eK2K8hQMxPlLo5iY/sM5fj5gFM0zvRkpcPRUeJi4cTElCf //iA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@noorman.info header.s=MBO0001 header.b=E6uUPe0I; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=noorman.info Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id s14-20020a056402520e00b0045d131b8db8si7418759edd.559.2022.10.16.03.41.27; Sun, 16 Oct 2022 03:41:52 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@noorman.info header.s=MBO0001 header.b=E6uUPe0I; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=noorman.info Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229744AbiJPKg3 (ORCPT + 99 others); Sun, 16 Oct 2022 06:36:29 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36258 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229693AbiJPKf7 (ORCPT ); Sun, 16 Oct 2022 06:35:59 -0400 X-Greylist: delayed 443 seconds by postgrey-1.37 at lindbergh.monkeyblade.net; Sun, 16 Oct 2022 03:35:55 PDT Received: from mout-y-209.mailbox.org (mout-y-209.mailbox.org [91.198.250.237]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5ABA13A16A; Sun, 16 Oct 2022 03:35:54 -0700 (PDT) Received: from smtp102.mailbox.org (smtp102.mailbox.org [IPv6:2001:67c:2050:b231:465::102]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-384) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mout-y-209.mailbox.org (Postfix) with ESMTPS id 4MqxDF6vDGz9td9; Sun, 16 Oct 2022 12:28:29 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=noorman.info; s=MBO0001; t=1665916109; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=uoRUF8nZ/VGGSla+ak7lM2u3E/gt9381sADOuNB9V6g=; b=E6uUPe0IR0tVNA4cb8bpDwqdfA5YM2scPH66L9ACE8OoHGfrUgMQYNjX3VrTQclsaBqjcs Uwi63dpl1GfD2rEUdsQKG30E+ClfaCxC+K7+M4zEWaQ5D4WYb+il66WVV02FsaXzI16yJD HBjdHfzS2bSSPzLbX6gUQzpr3c3SfB+zJzLqfS9S3prerAMzI4bL+EIZQkvYy3fCM2crWV 5cSsHyFwXvdyvNCykt3E2MKnZE309sciHVWXxAzen9MoVBLi96dxi6vOWKFFg0/71uAqdR imX2/mfhOZR5MXU4J1IL682Vi1RO3rC0MP7IGmN/HyWTbVmhVvyYYBdrar2GFg== From: Job Noorman To: Job Noorman , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski Cc: Luca Weiss , linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 1/3] dt-bindings: touchscreen: add Himax hx83112b bindings Date: Sun, 16 Oct 2022 12:27:53 +0200 Message-Id: <20221016102756.40345-2-job@noorman.info> In-Reply-To: <20221016102756.40345-1-job@noorman.info> References: <20221016102756.40345-1-job@noorman.info> MIME-Version: 1.0 X-Rspamd-Queue-Id: 4MqxDF6vDGz9td9 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1746840492662642760?= X-GMAIL-MSGID: =?utf-8?q?1746840492662642760?= This patch adds device tree bindings for Himax 83112b touchscreen devices. Signed-off-by: Job Noorman --- .../input/touchscreen/himax,hx83112b.yaml | 63 +++++++++++++++++++ MAINTAINERS | 6 ++ 2 files changed, 69 insertions(+) create mode 100644 Documentation/devicetree/bindings/input/touchscreen/himax,hx83112b.yaml diff --git a/Documentation/devicetree/bindings/input/touchscreen/himax,hx83112b.yaml b/Documentation/devicetree/bindings/input/touchscreen/himax,hx83112b.yaml new file mode 100644 index 000000000000..be2ba185c086 --- /dev/null +++ b/Documentation/devicetree/bindings/input/touchscreen/himax,hx83112b.yaml @@ -0,0 +1,63 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/input/touchscreen/himax,hx83112b.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Himax hx83112b touchscreen controller bindings + +maintainers: + - Job Noorman + +allOf: + - $ref: touchscreen.yaml# + +properties: + compatible: + enum: + - himax,hx83112b + + reg: + maxItems: 1 + + interrupts: + maxItems: 1 + + reset-gpios: + maxItems: 1 + + 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 + - reset-gpios + - touchscreen-size-x + - touchscreen-size-y + +examples: + - | + #include + #include + i2c { + #address-cells = <1>; + #size-cells = <0>; + touchscreen@48 { + compatible = "himax,hx83112b"; + reg = <0x48>; + interrupt-parent = <&tlmm>; + interrupts = <65 IRQ_TYPE_LEVEL_LOW>; + touchscreen-size-x = <1080>; + touchscreen-size-y = <2160>; + reset-gpios = <&tlmm 64 GPIO_ACTIVE_LOW>; + }; + }; + +... diff --git a/MAINTAINERS b/MAINTAINERS index 9ddcc242081c..2418bffe9187 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -9094,6 +9094,12 @@ W: http://www.highpoint-tech.com F: Documentation/scsi/hptiop.rst F: drivers/scsi/hptiop.c +HIMAX HX83112B TOUCHSCREEN SUPPORT +M: Job Noorman +L: linux-input@vger.kernel.org +S: Maintained +F: Documentation/devicetree/bindings/input/touchscreen/himax,hx83112b.yaml + HIPPI M: Jes Sorensen L: linux-hippi@sunsite.dk From patchwork Sun Oct 16 10:27:54 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Job Noorman X-Patchwork-Id: 3002 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4ac7:0:0:0:0:0 with SMTP id y7csp963584wrs; Sun, 16 Oct 2022 03:42:19 -0700 (PDT) X-Google-Smtp-Source: AMsMyM6MHLe0hcJ+fqfWBRoFWcH0R60t5xGgOqPeDlENeCYm+Ph0akyC3Aa1MmzrzO/N7LlwkwC1 X-Received: by 2002:a05:6402:5483:b0:45c:1336:6d9b with SMTP id fg3-20020a056402548300b0045c13366d9bmr5769264edb.100.1665916938815; Sun, 16 Oct 2022 03:42:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1665916938; cv=none; d=google.com; s=arc-20160816; b=q7N7wDPArHlSvyL6KHDsQZ0Q5kDOf0aBgQ2obDTatq6WnN7h1l7KmoVVYTHdeStLZF Y0sLlgldustdLkwKDRDSwED8YwOJv7YtmE0a5Pp1quHYRCwVYWhgf5+Yqn4KxijsEeOK d6au614I1+EdckXn8WVSHcwN04oDUNlFSnI+Zli2WPxJlZ5aHLjIJWHLrEz0eJsSFCiJ GTweohpX0WNaOVPo+9XDcLvNBFMW+RvKnIkV9f4gavsX2+F3n2lRimOypY8HHL6Jmfom J4JlZa486uEUWtHpdLKrDMfBm8Qkzk40BXC52MYW1axjEGj8zGsMIPAUawDIhVjIcIup Yzwg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=yAsOR3JRA5hnLfZZmuVhzhvD5qD/U4szgE1DtBwrUe0=; b=IA+ntwJ9m7EMBohNCfwmMrq0XgS3sgWDOU2Nww8ZHv3x+gZGtw+6dSgZ6o1IqywC9b P/aHTSr+O7L1BB+QZ+2FkoyFAdCcM2PvAMxnhT0xWdVKGZJO6232vk4qSlka5S7ZS625 YsERxWkxLwBqmD5Oc6UM8+a0A7xDoaLznGfuBi9+5Bei8AdywiiKydwinv/nrvPK1gWL qcJe3TEFurE1eNrIS7EzcDzJD9LU+8f/WQc8mfluuEPgZ7oUVXpsSsHfSg4TTYY7I44B 0DFsbdbQh+V03VjrnwSzNJf/jWflK/rk6F+MABpOXEVlQHB1VANE00p/bCsHZoDNoqcn MVeg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@noorman.info header.s=MBO0001 header.b="Zxs/hFUQ"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=noorman.info Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id s23-20020a508d17000000b0045a26e1b61csi6008305eds.305.2022.10.16.03.41.53; Sun, 16 Oct 2022 03:42:18 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@noorman.info header.s=MBO0001 header.b="Zxs/hFUQ"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=noorman.info Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229737AbiJPKgY (ORCPT + 99 others); Sun, 16 Oct 2022 06:36:24 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36262 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229691AbiJPKf7 (ORCPT ); Sun, 16 Oct 2022 06:35:59 -0400 X-Greylist: delayed 440 seconds by postgrey-1.37 at lindbergh.monkeyblade.net; Sun, 16 Oct 2022 03:35:55 PDT Received: from mout-y-209.mailbox.org (mout-y-209.mailbox.org [IPv6:2001:67c:2050:103:465::209]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5A9A63A165; Sun, 16 Oct 2022 03:35:54 -0700 (PDT) Received: from smtp102.mailbox.org (smtp102.mailbox.org [IPv6:2001:67c:2050:b231:465::102]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-384) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mout-y-209.mailbox.org (Postfix) with ESMTPS id 4MqxDH369jz9tdG; Sun, 16 Oct 2022 12:28:31 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=noorman.info; s=MBO0001; t=1665916111; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=yAsOR3JRA5hnLfZZmuVhzhvD5qD/U4szgE1DtBwrUe0=; b=Zxs/hFUQwOhX3D8lPZ3bOvpNQmmH2hbLVkiYkme0Yd47EpjcG7rSCWtkwPgk90T5qHmXbc s6BXpaqkByG1wkU5ib51TmAiNT2ADi8HBr7yjHTjAq5X132AViINmM+auqxnIDycw7O9Zp QCtNE5HXXHCMs8bGYZoVSFP4QjrU5wohFTrrZS/5sL1PbuR/b9BUVLbiu+CMrQas2F8y7s N9DH/eQEApnXFReaHVIu7Wk5xhHY7Ij12xD7fn9VIKMV0M2KhrXHMju2tareczmjkFTXr5 dlCyUs38P20Jj+RVnxtXL/NnbL8C0LvCV09rxo0gtBIanZulw2rBqWVSxuW5OQ== From: Job Noorman To: Dmitry Torokhov , Job Noorman , Henrik Rydberg Cc: Luca Weiss , linux-kernel@vger.kernel.org, linux-input@vger.kernel.org Subject: [PATCH v3 2/3] Input: add driver for Himax hx83112b touchscreen devices Date: Sun, 16 Oct 2022 12:27:54 +0200 Message-Id: <20221016102756.40345-3-job@noorman.info> In-Reply-To: <20221016102756.40345-1-job@noorman.info> References: <20221016102756.40345-1-job@noorman.info> MIME-Version: 1.0 X-Rspamd-Queue-Id: 4MqxDH369jz9tdG X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1746840520354694272?= X-GMAIL-MSGID: =?utf-8?q?1746840520354694272?= This patch adds support for Himax hx83112b touchscreen devices. As there are no publicly available data sheets for these devices, the implementation is based on the driver of the downstream Android kernel used in the Fairphone 3. This patch is a complete rewrite, though, and the code bears no resemblence to the original implementation. The driver has been tested on the aforementioned phone. Signed-off-by: Job Noorman --- MAINTAINERS | 1 + drivers/input/touchscreen/Kconfig | 11 + drivers/input/touchscreen/Makefile | 1 + drivers/input/touchscreen/himax_hx83112b.c | 382 +++++++++++++++++++++ 4 files changed, 395 insertions(+) create mode 100644 drivers/input/touchscreen/himax_hx83112b.c diff --git a/MAINTAINERS b/MAINTAINERS index 2418bffe9187..51a03f9586f1 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -9099,6 +9099,7 @@ M: Job Noorman L: linux-input@vger.kernel.org S: Maintained F: Documentation/devicetree/bindings/input/touchscreen/himax,hx83112b.yaml +F: drivers/input/touchscreen/himax_hx83112b.c HIPPI M: Jes Sorensen diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig index dc90a3ea51ee..113b7dd7da2f 100644 --- a/drivers/input/touchscreen/Kconfig +++ b/drivers/input/touchscreen/Kconfig @@ -1379,4 +1379,15 @@ config TOUCHSCREEN_ZINITIX To compile this driver as a module, choose M here: the module will be called zinitix. +config TOUCHSCREEN_HIMAX_HX83112B + tristate "Himax hx83112b touchscreen driver" + depends on REGMAP_I2C + help + Say Y here to enable support for Himax hx83112b touchscreens. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called himax_hx83112b. + endif diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile index 557f84fd2075..0f8bf79e01fe 100644 --- a/drivers/input/touchscreen/Makefile +++ b/drivers/input/touchscreen/Makefile @@ -116,3 +116,4 @@ obj-$(CONFIG_TOUCHSCREEN_ROHM_BU21023) += rohm_bu21023.o obj-$(CONFIG_TOUCHSCREEN_RASPBERRYPI_FW) += raspberrypi-ts.o obj-$(CONFIG_TOUCHSCREEN_IQS5XX) += iqs5xx.o obj-$(CONFIG_TOUCHSCREEN_ZINITIX) += zinitix.o +obj-$(CONFIG_TOUCHSCREEN_HIMAX_HX83112B) += himax_hx83112b.o diff --git a/drivers/input/touchscreen/himax_hx83112b.c b/drivers/input/touchscreen/himax_hx83112b.c new file mode 100644 index 000000000000..d653e980fdaf --- /dev/null +++ b/drivers/input/touchscreen/himax_hx83112b.c @@ -0,0 +1,382 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Driver for Himax hx83112b touchscreens + * + * Copyright (C) 2022 Job Noorman + * + * This code is based on "Himax Android Driver Sample Code for QCT platform": + * + * Copyright (C) 2017 Himax Corporation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define HIMAX_ID_83112B 0x83112b + +#define HIMAX_MAX_POINTS 10 + + +#define HIMAX_REG_CFG_SET_ADDR 0x00 +#define HIMAX_REG_CFG_INIT_READ 0x0c +#define HIMAX_REG_CFG_READ_VALUE 0x08 +#define HIMAX_REG_READ_EVENT 0x30 + +#define HIMAX_CFG_PRODUCT_ID 0x900000d0 + +#define HIMAX_INVALID_COORD 0xffff + +struct himax_event_point { + __be16 x; + __be16 y; +} __packed; + +struct himax_event { + struct himax_event_point points[HIMAX_MAX_POINTS]; + u8 majors[HIMAX_MAX_POINTS]; + u8 pad0[2]; + u8 num_points; + u8 pad1[2]; + u8 checksum_fix; +} __packed; + +static_assert(sizeof(struct himax_event) == 56); + +struct himax_ts_data { + struct gpio_desc *gpiod_rst; + struct input_dev *input_dev; + struct i2c_client *client; + struct regmap *regmap; + struct touchscreen_properties props; +}; + +static const struct regmap_config himax_regmap_config = { + .reg_bits = 8, + .val_bits = 32, + .val_format_endian = REGMAP_ENDIAN_LITTLE, +}; + +static int himax_read_config(struct himax_ts_data *ts, u32 address, u32 *dst) +{ + int error = 0; + + error = regmap_write(ts->regmap, HIMAX_REG_CFG_SET_ADDR, address); + if (error) + return error; + + error = regmap_write(ts->regmap, HIMAX_REG_CFG_INIT_READ, 0x0); + if (error) + return error; + + return regmap_read(ts->regmap, HIMAX_REG_CFG_READ_VALUE, dst); +} + +static int himax_read_input_event(struct himax_ts_data *ts, + struct himax_event *event) +{ + return regmap_raw_read(ts->regmap, HIMAX_REG_READ_EVENT, event, + sizeof(*event)); +} + +static void himax_reset(struct himax_ts_data *ts) +{ + gpiod_set_value(ts->gpiod_rst, 1); + + // Delay copied from downstream driver + msleep(20); + gpiod_set_value(ts->gpiod_rst, 0); + + // The downstream driver doesn't contain this delay but is seems safer + // to include it. The range is just a guess that seems to work well. + usleep_range(1000, 1100); +} + +static int himax_read_product_id(struct himax_ts_data *ts, u32 *product_id) +{ + int error = himax_read_config(ts, HIMAX_CFG_PRODUCT_ID, product_id); + + if (error) + return error; + + *product_id >>= 8; + return 0; +} + +static int himax_check_product_id(struct himax_ts_data *ts) +{ + int error; + u32 product_id; + + error = himax_read_product_id(ts, &product_id); + if (error) + return error; + + dev_dbg(&ts->client->dev, "Product id: %x\n", product_id); + + switch (product_id) { + case HIMAX_ID_83112B: + return 0; + + default: + dev_err(&ts->client->dev, + "Unknown product id: %x\n", product_id); + return -EINVAL; + } +} + +static int himax_setup_gpio(struct himax_ts_data *ts) +{ + int error; + + ts->gpiod_rst = devm_gpiod_get(&ts->client->dev, "reset", + GPIOD_OUT_HIGH); + + if (IS_ERR(ts->gpiod_rst)) { + error = PTR_ERR(ts->gpiod_rst); + if (error != -EPROBE_DEFER) + dev_err(&ts->client->dev, + "Failed to get reset GPIO: %d\n", error); + return error; + } + + return 0; +} + +static int himax_input_register(struct himax_ts_data *ts) +{ + int error; + + ts->input_dev = devm_input_allocate_device(&ts->client->dev); + if (!ts->input_dev) { + dev_err(&ts->client->dev, "Failed to allocate input device\n"); + return -ENOMEM; + } + + ts->input_dev->name = "Himax Touchscreen"; + + input_set_capability(ts->input_dev, EV_ABS, ABS_MT_POSITION_X); + input_set_capability(ts->input_dev, EV_ABS, ABS_MT_POSITION_Y); + input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0, 200, 0, 0); + input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 200, 0, 0); + + touchscreen_parse_properties(ts->input_dev, true, &ts->props); + + error = input_mt_init_slots(ts->input_dev, HIMAX_MAX_POINTS, + INPUT_MT_DIRECT | INPUT_MT_DROP_UNUSED); + if (error) { + dev_err(&ts->client->dev, + "Failed to initialize MT slots: %d\n", error); + return error; + } + + error = input_register_device(ts->input_dev); + if (error) { + dev_err(&ts->client->dev, + "Failed to register input device: %d\n", error); + return error; + } + + return 0; +} + +static u8 himax_event_get_num_points(const struct himax_event *event) +{ + if (event->num_points == 0xff) + return 0; + else + return event->num_points & 0x0f; +} + +static bool himax_event_point_is_valid(const struct himax_event_point *point) +{ + return be16_to_cpu(point->x) != HIMAX_INVALID_COORD && + be16_to_cpu(point->y) != HIMAX_INVALID_COORD; +} + +static bool himax_process_event_point(struct himax_ts_data *ts, + const struct himax_event *event, + int point_index) +{ + const struct himax_event_point *point = &event->points[point_index]; + u16 x = be16_to_cpu(point->x); + u16 y = be16_to_cpu(point->y); + u8 w = event->majors[point_index]; + + if (!himax_event_point_is_valid(point)) + return false; + + input_mt_slot(ts->input_dev, point_index); + input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, true); + touchscreen_report_pos(ts->input_dev, &ts->props, x, y, true); + input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, w); + input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, w); + return true; +} + +static void himax_process_event(struct himax_ts_data *ts, + const struct himax_event *event) +{ + int i; + int num_points_left = himax_event_get_num_points(event); + + for (i = 0; i < HIMAX_MAX_POINTS && num_points_left > 0; i++) { + if (himax_process_event_point(ts, event, i)) + num_points_left--; + } + + input_mt_sync_frame(ts->input_dev); + input_sync(ts->input_dev); +} + +static bool himax_verify_checksum(struct himax_ts_data *ts, + const struct himax_event *event) +{ + u8 *data = (u8 *)event; + int i; + u16 checksum = 0; + + for (i = 0; i < sizeof(*event); i++) + checksum += data[i]; + + if ((checksum & 0x00ff) != 0) { + dev_err(&ts->client->dev, "Wrong event checksum: %04x\n", + checksum); + return false; + } + + return true; +} + +static int himax_handle_input(struct himax_ts_data *ts) +{ + int error; + struct himax_event event; + + error = himax_read_input_event(ts, &event); + if (error) { + dev_err(&ts->client->dev, "Failed to read input event: %d\n", + error); + return error; + } + + if (!himax_verify_checksum(ts, &event)) { + // We cannot process the current event when it has an invalid + // checksum but we don't consider this a fatal error. + return 0; + } + + himax_process_event(ts, &event); + return 0; +} + +static irqreturn_t himax_irq_handler(int irq, void *dev_id) +{ + struct himax_ts_data *ts = dev_id; + int error = himax_handle_input(ts); + + if (error) + return IRQ_NONE; + + return IRQ_HANDLED; +} + +static int himax_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + int error; + struct device *dev = &client->dev; + struct himax_ts_data *ts; + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + dev_err(dev, "I2C check functionality failed\n"); + return -ENXIO; + } + + ts = devm_kzalloc(dev, sizeof(*ts), GFP_KERNEL); + if (!ts) + return -ENOMEM; + + i2c_set_clientdata(client, ts); + ts->client = client; + + ts->regmap = devm_regmap_init_i2c(client, &himax_regmap_config); + if (IS_ERR(ts->regmap)) { + error = PTR_ERR(ts->regmap); + dev_err(&client->dev, + "Failed to initialize regmap: %d\n", error); + return error; + } + + error = himax_setup_gpio(ts); + if (error) + return error; + + himax_reset(ts); + + error = himax_check_product_id(ts); + if (error) + return error; + + error = himax_input_register(ts); + if (error) + return error; + + return devm_request_threaded_irq(&client->dev, client->irq, NULL, + himax_irq_handler, IRQF_ONESHOT, + client->name, ts); +} + +static int himax_suspend(struct device *dev) +{ + struct himax_ts_data *ts = dev_get_drvdata(dev); + + disable_irq(ts->client->irq); + return 0; +} + +static int himax_resume(struct device *dev) +{ + struct himax_ts_data *ts = dev_get_drvdata(dev); + + enable_irq(ts->client->irq); + return 0; +} + +static SIMPLE_DEV_PM_OPS(himax_pm_ops, himax_suspend, himax_resume); + +static const struct i2c_device_id himax_ts_id[] = { + { "hx83112b", 0 }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(i2c, himax_ts_id); + +#ifdef CONFIG_OF +static const struct of_device_id himax_of_match[] = { + { .compatible = "himax,hx83112b" }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, himax_of_match); +#endif + +static struct i2c_driver himax_ts_driver = { + .probe = himax_probe, + .id_table = himax_ts_id, + .driver = { + .name = "Himax-hx83112b-TS", + .of_match_table = of_match_ptr(himax_of_match), + .pm = &himax_pm_ops, + }, +}; +module_i2c_driver(himax_ts_driver); + +MODULE_AUTHOR("Job Noorman "); +MODULE_DESCRIPTION("Himax hx83112b touchscreen driver"); +MODULE_LICENSE("GPL"); From patchwork Sun Oct 16 10:27:55 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Job Noorman X-Patchwork-Id: 3000 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4ac7:0:0:0:0:0 with SMTP id y7csp962303wrs; Sun, 16 Oct 2022 03:37:16 -0700 (PDT) X-Google-Smtp-Source: AMsMyM5XI6D+JnuXZ1Zk1zjwB8zNURcTtb57PBrEGbNDDZ9fdzqI7pCVz0xzfy+0TF3Sx4Dg+Btn X-Received: by 2002:a17:903:1112:b0:179:ce23:dd57 with SMTP id n18-20020a170903111200b00179ce23dd57mr6838882plh.114.1665916636146; Sun, 16 Oct 2022 03:37:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1665916636; cv=none; d=google.com; s=arc-20160816; b=pX8vxwI8JvlXi9ZJJGR75O50mLpSegGd9nRgX4nW7TF6YNZEr43kbYsLBMMHZn7VvA g7BrVA2KuPh6+l6pIO3scch1EpG6iChT63s4Ev8Gx1DXHl7Mzf8dZPMTUSk465wdR2zP LsjWXmi3O+sC+p1i2WOz7aECiY4aq9aG3ZpruonwQ6NtFlX3M2nge6q8c/OktnodR2l7 laFq5te2jr5+oMWgQFKUaoPdjieiILvshqJoGLsDprvxW3+8YNn64VKr9mkNyfNskpm2 bujlbvPCdVeCJsN+z7HE7KXHMRYW7G6tKr5vJozXYBWRviAneYmRhOtmdl7AvzKQOQyA DvZA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=S9dcsqJ0RaWCdCguljfpy7EPjfO3aVZqXfHBh2syRzs=; b=c51swCOnJa70d4yLakiSGJWunaNaB3VIdola/XJj/8DkInwoiVxQnqjOMB/QnXNlFs 5MQeuFukAvVmuitgfkusDjWFFKU26k3aHR6Za9yvvnFrtd6CdW/K8pnZy3EThecooTYq 6bhXQHGWDQJAH+NtUE/lf8Ipo5dAlGjKZThCL01qNKl7GkrWNGJk9ovJAc334tMZ9IJP IcXt2uzgKoeTltntklmPtrRn7jqJE790QvaKjbI4bH//1ii7z5C8WGKi4YvGyMnhmpyM jp8nBtZObD1+Vjm4rMJ92qhBMDkFjOl+AizXNoEf9ALhoK2XOQIfSSQfBj/mHRIigXQX +fww== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@noorman.info header.s=MBO0001 header.b=PW6BcCOV; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=noorman.info Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id m2-20020a656a02000000b00452bad3abcfsi10167628pgu.324.2022.10.16.03.37.03; Sun, 16 Oct 2022 03:37:16 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@noorman.info header.s=MBO0001 header.b=PW6BcCOV; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=noorman.info Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229716AbiJPKgI (ORCPT + 99 others); Sun, 16 Oct 2022 06:36:08 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36222 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229671AbiJPKf7 (ORCPT ); Sun, 16 Oct 2022 06:35:59 -0400 X-Greylist: delayed 442 seconds by postgrey-1.37 at lindbergh.monkeyblade.net; Sun, 16 Oct 2022 03:35:54 PDT Received: from mout-y-209.mailbox.org (mout-y-209.mailbox.org [91.198.250.237]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CE978367B5; Sun, 16 Oct 2022 03:35:54 -0700 (PDT) Received: from smtp102.mailbox.org (unknown [91.198.250.119]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-384) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mout-y-209.mailbox.org (Postfix) with ESMTPS id 4MqxDJ5cTRz9tdL; Sun, 16 Oct 2022 12:28:32 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=noorman.info; s=MBO0001; t=1665916112; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=S9dcsqJ0RaWCdCguljfpy7EPjfO3aVZqXfHBh2syRzs=; b=PW6BcCOVvdRubT2MiVhayL4rxpCCYMisSOpA54cmnYgztUvLOH6cQgZZG1ZI2xNhZs5UMy lbR3NZbovfD61NazppymLDhnSHFElM82aO2+tFKoRLSabj+FgI5L9UoZIlgoEyO6EGTuDE NxFz6QE7OJd8Y/vOyjKEWxbnloHSKXgVsivypAGQaml17Rgm/s8UNIvOkA2OV27a2lWO4x jBmNGb6QgrF0eLP+PknfqCfihAY8u7MmwRNWBERy0UiyeteUc22JQYlOm1semTWxd2fOoe 9GEadMAtBpZyYzvvUvVRZUUnb3LLieOqtKRPQZXzjkzil2TpzlkzB7YfqxJadg== From: Job Noorman To: Andy Gross , Bjorn Andersson , Konrad Dybcio , Rob Herring , Krzysztof Kozlowski Cc: Luca Weiss , Job Noorman , linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 3/3] arm64: dts: qcom: sdm632: fairphone-fp3: add touchscreen Date: Sun, 16 Oct 2022 12:27:55 +0200 Message-Id: <20221016102756.40345-4-job@noorman.info> In-Reply-To: <20221016102756.40345-1-job@noorman.info> References: <20221016102756.40345-1-job@noorman.info> MIME-Version: 1.0 X-Rspamd-Queue-Id: 4MqxDJ5cTRz9tdL X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1746840202380650844?= X-GMAIL-MSGID: =?utf-8?q?1746840202380650844?= Add Himax hx83112b touchscreen to the FP3 DT. Signed-off-by: Job Noorman --- arch/arm64/boot/dts/qcom/sdm632-fairphone-fp3.dts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/arch/arm64/boot/dts/qcom/sdm632-fairphone-fp3.dts b/arch/arm64/boot/dts/qcom/sdm632-fairphone-fp3.dts index 891e314bc782..2920504461d3 100644 --- a/arch/arm64/boot/dts/qcom/sdm632-fairphone-fp3.dts +++ b/arch/arm64/boot/dts/qcom/sdm632-fairphone-fp3.dts @@ -49,6 +49,20 @@ &hsusb_phy { vdda-phy-dpdm-supply = <&pm8953_l13>; }; +&i2c_3 { + status = "okay"; + + touchscreen@48 { + compatible = "himax,hx83112b"; + reg = <0x48>; + interrupt-parent = <&tlmm>; + interrupts = <65 IRQ_TYPE_LEVEL_LOW>; + touchscreen-size-x = <1080>; + touchscreen-size-y = <2160>; + reset-gpios = <&tlmm 64 GPIO_ACTIVE_LOW>; + }; +}; + &pm8953_resin { status = "okay"; linux,code = ;