From patchwork Mon Nov 7 10:56:02 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Job Noorman X-Patchwork-Id: 16366 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:6687:0:0:0:0:0 with SMTP id l7csp1979794wru; Mon, 7 Nov 2022 03:06:14 -0800 (PST) X-Google-Smtp-Source: AMsMyM62M46QUOJI7BessvyFxra1K2bV3ziYQMHAHIAjahSrFiy9yvdEzFnccwedDYKurxTu7Uey X-Received: by 2002:a62:5807:0:b0:56b:9926:a4e7 with SMTP id m7-20020a625807000000b0056b9926a4e7mr49423809pfb.79.1667819174627; Mon, 07 Nov 2022 03:06:14 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1667819174; cv=none; d=google.com; s=arc-20160816; b=UAxNpgtbbYTX8TH28TLZzQ8Asww7kd5I3QW1yUeNRpH2Y/UWEf+8cBdvvgBx02zdnM XZlBzBiMCX3z/bEm5ghXKSDILRDYIfViGs+22OR0SuM/v3HDwgSQglgp4zrtdVUU+uw+ TjKsIe1Wg7MaRgv4C03UtL7lBoMMU0wvM8uIxCCh3d4Xn3nXJ2zWUpEJIvGvISSTzr3z VvsRoeAubbWhERgbK/p5iK/364k6OsnSl7ud2d+Z/bqLjtJZIsdQla0/FBtE7nM4qNdi BOeHd2tzGlx1RJtTs8NwVk7sGa6zUtHHfhpnSFqkD7xGY0RlIyAviG6xoA5u02fwMNIu jBXA== 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=xgG1+/mqCR7NFJDaGitypAnL4fZThzOryVEVRuhQPXg=; b=ejhqMMBXnyO4bj4eb8FxKhMn0gKHx92NXeFgrwBaxaZMbVk872QrzMoZgpL0cy0mRJ tJIa+KQu8OakGk1R5Ebv5AqnoYmXEGL/K9ByAUDqo0oHSTSR+mLmO8N9LlNc6GHgoMdV pIP07HfvF4/+qy7GU4m3xAktOlXzi2HZ65jskGQICrqiHFzoAJnCw7KMmGZtY76aWKfl PT66IDE7MfpfDKX9saLK+ijD5pX8zHlJBG9FXHL8BFViYX7MBxTuFZl61M98+8p9wIfJ yKzRFOdniohyyqvXyKkP1I5NPv0xg8dq3mkmUKN47OA9ptZuwi8rlxH9OLsBpRVtpG5I WxwA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@noorman.info header.s=MBO0001 header.b=s2EoQ75a; 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 f7-20020a170902ce8700b00186a8bd137fsi11535582plg.453.2022.11.07.03.06.00; Mon, 07 Nov 2022 03:06:14 -0800 (PST) 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=s2EoQ75a; 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 S231907AbiKGK4Y (ORCPT + 99 others); Mon, 7 Nov 2022 05:56:24 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54650 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231710AbiKGK4U (ORCPT ); Mon, 7 Nov 2022 05:56:20 -0500 Received: from mout-y-111.mailbox.org (mout-y-111.mailbox.org [91.198.250.236]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3919E1900E; Mon, 7 Nov 2022 02:56:19 -0800 (PST) Received: from smtp202.mailbox.org (smtp202.mailbox.org [IPv6:2001:67c:2050:b231:465::202]) (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-111.mailbox.org (Postfix) with ESMTPS id 4N5Sp769thz9tRf; Mon, 7 Nov 2022 11:56:15 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=noorman.info; s=MBO0001; t=1667818575; 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=xgG1+/mqCR7NFJDaGitypAnL4fZThzOryVEVRuhQPXg=; b=s2EoQ75aH4ZASZilf4Xsz4UxQR0yWSifFmLb1P9BqdSPa8Fh8VRJSJrEey5G+cu5rm8jWa HZjV4RO4CT8WuvgVK1o/BkTnuYO3N8abfZ1FFI8I9hdg6ZYN/wtwpAmuHmzs+OS+/bp9uV +Ee/PnLy0ja3MIyCravsdHaifxIyzJwwqbzDd6EQzYAKNksbPaJ4cP3Kd64qezDewv6FEr rgZmsiyfxUSxyD6yS7hcEFOQ+4jJFm1rZ/wUIzvZEA8bYI6IAn6dX4PIsNPGkBtmJYnlDz rAYPmaJNT1+woG5RiFeeGtZl6C5A0KcqKRuJ1wDU8NWI1rmVA+kY97N3qebROw== From: Job Noorman To: Job Noorman , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Andy Gross , Bjorn Andersson , Henrik Rydberg Cc: Rob Herring , linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, Konrad Dybcio , Luca Weiss Subject: [PATCH RESEND v6 1/3] dt-bindings: touchscreen: add Himax hx83112b bindings Date: Mon, 7 Nov 2022 11:56:02 +0100 Message-Id: <20221107105604.26541-2-job@noorman.info> In-Reply-To: <20221107105604.26541-1-job@noorman.info> References: <20221107105604.26541-1-job@noorman.info> MIME-Version: 1.0 X-Rspamd-Queue-Id: 4N5Sp769thz9tRf 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?1748835159072835653?= X-GMAIL-MSGID: =?utf-8?q?1748835159072835653?= This patch adds device tree bindings for Himax 83112b touchscreen devices. Signed-off-by: Job Noorman Reviewed-by: Rob Herring --- .../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 cf0f18502372..469ab6382906 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -9162,6 +9162,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 Mon Nov 7 10:56:03 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Job Noorman X-Patchwork-Id: 16370 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:6687:0:0:0:0:0 with SMTP id l7csp1980588wru; Mon, 7 Nov 2022 03:07:44 -0800 (PST) X-Google-Smtp-Source: AMsMyM6D9NYgYZWFDwmFXan0+bVFxL2JelbyAw3Pv78mbC32iUwVranrhUTZ2uQWvd8KH0+UHRUn X-Received: by 2002:a05:6a00:1a0f:b0:56e:32a2:abcf with SMTP id g15-20020a056a001a0f00b0056e32a2abcfmr24630035pfv.35.1667819264160; Mon, 07 Nov 2022 03:07:44 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1667819264; cv=none; d=google.com; s=arc-20160816; b=JK0sbtOliCdoDvcabQkSEKr1zSHWpG4+t8uQWjvc4Lnq+wf+qa+r8koQ647ayV2LXE vZVT9MLM55iBw9oKVnt9dkg2/ZvWRm2iWeql7d5CIpQnyq8MZSuR9VpsZPQHv+/Lbljp lI2iLQjPLhTrxWn11//bcV6vWbkF1icSrFj4NvAIUHsGEdg+5J+TknDeUV676yvUwpth lsQGasqxXktJ4tOq4SY41WGDKlVZ53YveJ9sPN+/5cfgPkSOCDwf/ztS0CdDoRZH+oHS OZmJGHtllkOp0xVmnhjEsmSLdFHVBXkvxNGTnINHKTgvLAN7Fd6BFiuDZsv2LiBlqKje htug== 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=lG19b8bVZfycBiA7HG/6xC2f6AKx1JjMt+tWxdZQ6g4=; b=LC4NjiHqvyXus90MYyvvfiUVUyAr/gKlqmposvHkUk8oNDoL+5xhR8RqkwmhMUDBDT aYLV8QjoPGJxVYaKnjj7DbyYWliafntoSgprZMJDE5qBrf4/mxX9YfMSrtdTuwAkBWzy Qmejnut8DuikrsjVvIjvhlHkLQUssT1YAz0oy8wURRJRLGyHVa0u6PPepmoR3+Oxhe1U l7E6b4ggFnXBE03KWg0bUe2ftAgmqe+bBYWoFKKh1Tl/iccDTOnKCg32lTC//iwzoRlH LKo8gXMZNiOGkBTduRWLkic1kSvwHO6DCIKrpX6ykRRnIMqtmQDn593YSj5wkyeQx35b eNaw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@noorman.info header.s=MBO0001 header.b=Hra8eqGe; 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 y17-20020a63e251000000b0043aebb63fc6si10867068pgj.81.2022.11.07.03.07.30; Mon, 07 Nov 2022 03:07:44 -0800 (PST) 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=Hra8eqGe; 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 S231709AbiKGK4d (ORCPT + 99 others); Mon, 7 Nov 2022 05:56:33 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54666 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231237AbiKGK4W (ORCPT ); Mon, 7 Nov 2022 05:56:22 -0500 Received: from mout-y-111.mailbox.org (mout-y-111.mailbox.org [91.198.250.236]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C2252F9; Mon, 7 Nov 2022 02:56:20 -0800 (PST) Received: from smtp202.mailbox.org (smtp202.mailbox.org [IPv6:2001:67c:2050:b231:465::202]) (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-111.mailbox.org (Postfix) with ESMTPS id 4N5Sp950cxz9tVH; Mon, 7 Nov 2022 11:56:17 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=noorman.info; s=MBO0001; t=1667818577; 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=lG19b8bVZfycBiA7HG/6xC2f6AKx1JjMt+tWxdZQ6g4=; b=Hra8eqGeXVbXpRjjE25X6st4uPrJ3kIJd/XpYMgXAiitXn8x9wnHLPYxceLY5EgjiG1nyU xlhVFVfkh560e71C7YvfZy+4UnyqzUoCIeENc8hO2YfvhthbJk0rsoc5foLyFQAbBrcg5g 2a/5RaUj2KhuRizRS7DxrPzChuqONHVLVwLmXMXYopT68IPhaqgfmwQs+9W+QVrvY4tO1K 0DSePnGLCOT+A2S6KtzEod9h5MqXeMe4FcwoUoTqSXZiFOpNGLD5k6xC3qFqorpJMwEXzi broEgwsiN9ytHcT+NDWSkN/C7MKRMQmK46uym4sbty4IXIrM7ryqgHQ6a1ZRuw== From: Job Noorman To: Job Noorman , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Andy Gross , Bjorn Andersson , Henrik Rydberg Cc: Jeff LaBundy , linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, Konrad Dybcio , Luca Weiss Subject: [PATCH RESEND v6 2/3] Input: add driver for Himax hx83112b touchscreen devices Date: Mon, 7 Nov 2022 11:56:03 +0100 Message-Id: <20221107105604.26541-3-job@noorman.info> In-Reply-To: <20221107105604.26541-1-job@noorman.info> References: <20221107105604.26541-1-job@noorman.info> MIME-Version: 1.0 X-Rspamd-Queue-Id: 4N5Sp950cxz9tVH 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?1748835252702769094?= X-GMAIL-MSGID: =?utf-8?q?1748835252702769094?= 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 Reviewed-by: Jeff LaBundy --- MAINTAINERS | 1 + drivers/input/touchscreen/Kconfig | 12 + drivers/input/touchscreen/Makefile | 1 + drivers/input/touchscreen/himax_hx83112b.c | 361 +++++++++++++++++++++ 4 files changed, 375 insertions(+) create mode 100644 drivers/input/touchscreen/himax_hx83112b.c diff --git a/MAINTAINERS b/MAINTAINERS index 469ab6382906..8d9fe0ac632c 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -9167,6 +9167,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 317250b62e08..3f68eee71a4e 100644 --- a/drivers/input/touchscreen/Kconfig +++ b/drivers/input/touchscreen/Kconfig @@ -1407,4 +1407,16 @@ 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 I2C + select 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 03ad13f3fcce..4968c370479a 100644 --- a/drivers/input/touchscreen/Makefile +++ b/drivers/input/touchscreen/Makefile @@ -118,3 +118,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..ed550cd33eb7 --- /dev/null +++ b/drivers/input/touchscreen/himax_hx83112b.c @@ -0,0 +1,361 @@ +// 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; + + 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; + + error = regmap_read(ts->regmap, HIMAX_REG_CFG_READ_VALUE, dst); + if (error) + return error; + + return 0; +} + +static void himax_reset(struct himax_ts_data *ts) +{ + gpiod_set_value_cansleep(ts->gpiod_rst, 1); + + /* Delay copied from downstream driver */ + msleep(20); + gpiod_set_value_cansleep(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; + + 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_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_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 (x == HIMAX_INVALID_COORD || y == HIMAX_INVALID_COORD) + 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 = regmap_raw_read(ts->regmap, HIMAX_REG_READ_EVENT, &event, + sizeof(event)); + if (error) { + dev_err(&ts->client->dev, "Failed to read input event: %d\n", + error); + return error; + } + + /* + * Only process the current event when it has a valid checksum but + * don't consider it a fatal error when it doesn't. + */ + if (himax_verify_checksum(ts, &event)) + himax_process_event(ts, &event); + + return 0; +} + +static irqreturn_t himax_irq_handler(int irq, void *dev_id) +{ + int error; + struct himax_ts_data *ts = dev_id; + + 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); + error = PTR_ERR_OR_ZERO(ts->regmap); + if (error) { + dev_err(dev, "Failed to initialize regmap: %d\n", error); + return error; + } + + ts->gpiod_rst = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH); + error = PTR_ERR_OR_ZERO(ts->gpiod_rst); + if (error) { + dev_err(dev, "Failed to get reset GPIO: %d\n", 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(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 DEFINE_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 = pm_sleep_ptr(&himax_pm_ops), + }, +}; +module_i2c_driver(himax_ts_driver); + +MODULE_AUTHOR("Job Noorman "); +MODULE_DESCRIPTION("Himax hx83112b touchscreen driver"); +MODULE_LICENSE("GPL"); From patchwork Mon Nov 7 10:56:04 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Job Noorman X-Patchwork-Id: 16367 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:6687:0:0:0:0:0 with SMTP id l7csp1979989wru; Mon, 7 Nov 2022 03:06:36 -0800 (PST) X-Google-Smtp-Source: AMsMyM5k6db2n7AO5Qtrs+k6Xwo5J43KykrNHMobA+kcwJ5HcysaRzmvkwwppx4+kYymTqaadXiH X-Received: by 2002:a17:902:e54f:b0:187:2e45:e191 with SMTP id n15-20020a170902e54f00b001872e45e191mr37229247plf.91.1667819196524; Mon, 07 Nov 2022 03:06:36 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1667819196; cv=none; d=google.com; s=arc-20160816; b=bAWMP8jE6wH6VkphjcKvxXXbO7rjgZ2UKXsxtBj0+LOfWKTW0Dqv78St6GxhWj0bRm MTfz2t1ITDa91xpkqXsvhxC3GLp9o+I3DV6vFyRc5WcIJv+C8ag/FsNaWNg7caZ0CJze J+a9jqGr/tARoHgRgB75sPSMvj9rnK9HDdNOst+cYB9gY/bB0T1xgUG3dOEZqg5uRwtY /TOW3qLngyXG2Xv/B3AbAgUJgbyMWrRs1JE8igWDAoC+Ucj2diOjVa8C0jfIRgGB2nAS HwPwmSMGA+r+jpTVccgpEgkEHsylbw0CIcBPR71l09D/4fE0hfB6EEUTB5rSon0qPfoi jgdQ== 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=jwBbiiF+pKf0bcTgRsblZnn0hi/Wak5zHyTIoUTbsXg=; b=jXlM/riiRjvLTh3hjtY4YIdvGwuDuflVZEVtSWls6oshryoMoucNLRV6UuPlhsaIGK tymehj98hP/J51UM/yRNtn5Auw1jxRhYNWDPArjkFUrw/50x3kc1qYCkiuV6nIY6gWGL bNdzyE2V50zKWYT3Rn/ZveJDzQPHdL0YPZpOfEgJLFSOSyxwBbajKhN3uIn627+UdJXO F7NNUVRdL2oCyTF9cCDrD1AAcLz/PNlsNjuSqTC2KqZ1k9O0LvmjTTiVtP19ABsRjZiO 0CRmIusvKyUFhpvb1Z3RqU1uoX6DJArClfd1u6m5JowTAkIHdAa2cBxa5fxZX6PJhYzr oE/w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@noorman.info header.s=MBO0001 header.b=ECBpJHID; 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 mn1-20020a17090b188100b00213193da68csi13025545pjb.139.2022.11.07.03.06.23; Mon, 07 Nov 2022 03:06:36 -0800 (PST) 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=ECBpJHID; 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 S231874AbiKGK4g (ORCPT + 99 others); Mon, 7 Nov 2022 05:56:36 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54718 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231898AbiKGK4Y (ORCPT ); Mon, 7 Nov 2022 05:56:24 -0500 Received: from mout-y-209.mailbox.org (mout-y-209.mailbox.org [91.198.250.237]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B00DD193D7; Mon, 7 Nov 2022 02:56:22 -0800 (PST) Received: from smtp202.mailbox.org (unknown [91.198.250.118]) (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 4N5SpC2YDYz9t0s; Mon, 7 Nov 2022 11:56:19 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=noorman.info; s=MBO0001; t=1667818579; 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=jwBbiiF+pKf0bcTgRsblZnn0hi/Wak5zHyTIoUTbsXg=; b=ECBpJHIDrHCy5IPgt0z2M9lc3msvjKZOFXvQZniblR/G+hL77pgc4swcYdA5v0kqcFbOKz oNb4NOvPk796Ll16ZHvZPXDqoUSd/Zl30QtONoev04jhZCfz6W1fVcZF5G4XISkubYpa0R f4/AA1uusLnGrHFU3T5V2Fhl6YcbqI7RcGxdoIXar9lCR9q8wq70DChDgTYNy9rJN2BqPK sDFvi6OMvBHWAA9LNPaQkqoRNGYscV3JYyK1xNPZ+YuUilwjSV36DTIVzQSgs8zOWLRkf/ 4XfsmAmo2JT6ocbWFFpbb1bxXTqTAWDrFq9mqd1Cdyx8G2GYLx5YqQYAdpBxdw== From: Job Noorman To: Job Noorman , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Andy Gross , Bjorn Andersson , Henrik Rydberg Cc: Krzysztof Kozlowski , linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, Konrad Dybcio , Luca Weiss Subject: [PATCH RESEND v6 3/3] arm64: dts: qcom: sdm632: fairphone-fp3: add touchscreen Date: Mon, 7 Nov 2022 11:56:04 +0100 Message-Id: <20221107105604.26541-4-job@noorman.info> In-Reply-To: <20221107105604.26541-1-job@noorman.info> References: <20221107105604.26541-1-job@noorman.info> MIME-Version: 1.0 X-Rspamd-Queue-Id: 4N5SpC2YDYz9t0s 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?1748835181857999876?= X-GMAIL-MSGID: =?utf-8?q?1748835181857999876?= Add Himax hx83112b touchscreen to the FP3 DT. Signed-off-by: Job Noorman Reviewed-by: Krzysztof Kozlowski --- 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 = ;