From patchwork Mon Oct 2 06:54:44 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Neil Armstrong X-Patchwork-Id: 147217 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:612c:2a8e:b0:403:3b70:6f57 with SMTP id in14csp1293426vqb; Mon, 2 Oct 2023 02:08:28 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHg8+2GO1esNxDhvr3BKU1X8o2rwEur5RK0nTTcpQfHFX8V33PRWFtVZfOCWfZ46Yx1NL0Y X-Received: by 2002:a17:903:456:b0:1b2:4852:9a5f with SMTP id iw22-20020a170903045600b001b248529a5fmr8068496plb.54.1696237708058; Mon, 02 Oct 2023 02:08:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1696237708; cv=none; d=google.com; s=arc-20160816; b=AS/UEtJGGxAMpLJf//Baiazm64nM5El4B1AF+BKcsXyKLqcJrK4MBaaY0kq+wFg4r5 Z65o6r6saB4WDkrFqYrSwI1ROzEGkcSW03/hxnuQlbN700e2NUkdKoOduZez6Y4vMu4q 1y46y3rCeBvhrCnb75Dm5wsf9CB6XgKU2iPv8pIFcbC0FV+A/7TVxVl1X5cVUDggTcHK 9EQjAooTsggaMQYFOVnIUoVTgTXSOsmLjIKpBft3WzkoZTHHvtHR1/SvpkKLA2bm5wKl AwfOadJFNplOWqyqGjVF9TpiMN7A6fjkxYQTjvbZ8BGQnhpMLATPzbkqx8c6cbkE9rbK CaQA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:in-reply-to:references:message-id :content-transfer-encoding:mime-version:subject:date:from :dkim-signature; bh=31dDSPmTEwAk2xBEYscYsgGP3NvqtS1pbeFP7C1NdB4=; fh=Tvi2gw4leeqma8jUlfAQj49s8arE1Pxxa6ymILfSPWI=; b=PCkosFYlgQAbrTwEIJfAs71lGuzrm00mNTe3OzawZ7iqDy5yvM+QCu0ApLF6YxzqAy AW5ll6R+PSvOdY1dlU4XGrCdnowpEuWkRUWwRAD73imBWibTFIK3jsxCMNSPa9ItZfOV PXsHgofCvM3y0xkOSG6fkMOim4/PHgOLja6xo1qo0gVJ+691bNS3B4OzhA3q6bDPfCHP jXYZJIAdUYNSEmxk0XWay8jHsQqWQ9s7MZKk7TzmHEGbEfWqPH5pDq3EPdTfxnJWhIps TW1JVz7A0cAJSlqjmzxizL60yFfuG9Yibw63xzzWj5krM7GSsAg2TBt2ElM0u4p1hAKO M1JA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=dt6Vd9nG; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:4 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from howler.vger.email (howler.vger.email. [2620:137:e000::3:4]) by mx.google.com with ESMTPS id r10-20020a170903410a00b001c7361b71d7si9353091pld.7.2023.10.02.02.08.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Oct 2023 02:08:28 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:4 as permitted sender) client-ip=2620:137:e000::3:4; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=dt6Vd9nG; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:4 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by howler.vger.email (Postfix) with ESMTP id 20053802419A; Sun, 1 Oct 2023 23:55:17 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at howler.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235602AbjJBGy7 (ORCPT + 17 others); Mon, 2 Oct 2023 02:54:59 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55926 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235321AbjJBGy4 (ORCPT ); Mon, 2 Oct 2023 02:54:56 -0400 Received: from mail-lf1-x131.google.com (mail-lf1-x131.google.com [IPv6:2a00:1450:4864:20::131]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B92A4C9 for ; Sun, 1 Oct 2023 23:54:52 -0700 (PDT) Received: by mail-lf1-x131.google.com with SMTP id 2adb3069b0e04-50433d8385cso24254963e87.0 for ; Sun, 01 Oct 2023 23:54:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1696229691; x=1696834491; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=31dDSPmTEwAk2xBEYscYsgGP3NvqtS1pbeFP7C1NdB4=; b=dt6Vd9nG9qDpW941cQjAwAeGjdz9yy6LtWIW2GaGjvNHkQeZNCO388x9EvAfqIeeQw FagqXGsoT1RVFgC4OHK59GhIeQXSTps8UFHxKUObP8q1g1M/NTTiHMxRMUbY7jyyySYy ok1XeuaeB1SRg5A9bx6RDv75VMAA5A9CNTRh7+427TCi7Q6AYhRQq2rxKdt7cT8j37cz FDfzd8KjQ3rkH3qjwtIj7knBmzHO87Dsiy2ofMciKju8Iqmo0WHYJxc+2xxGW640Rcdb NJS4hlqdF3D8x8NYwzeASN61/SqgxfmfSASVQtJ2tr/AEc2yGHRAyF07Ciqiws8vHNyu 2CCg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1696229691; x=1696834491; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=31dDSPmTEwAk2xBEYscYsgGP3NvqtS1pbeFP7C1NdB4=; b=PD+ta+N4T0TUdzt4liBFBZanjQQ+K5u6R0G7p8oS9aHUuET/CcNNHvqhIvc7NXM5qn tD+PLHWxmFCdCNFheHLf8HhlXROGoR6jT7yZ8wheflXgIs1EsZK77uZq315iAsc6smjV tlso3U2ImEn6OC/U+CQ7ApgVBKoVqw+WXRKaHugNLtDSzK2GWf+r73zt2ww7P6i1c77E Fghok3wxZ02yqatVhif5kpqtW83eORR0o6PMeqahe7bSij1+IjomG3rXeJ48PjKxiqA+ flm9St6+4GW2/4G8dYTLhzl2IACCdl12XlFm7RKot1dZyzyCs1VUU/PA/RySV6I09dsX 4c4w== X-Gm-Message-State: AOJu0Yx8s0sUgibUQemU2JXfZ6FtKlhUOWQa68TQm1yCYMbKWVCwBDUc CW307Qi0C/4NsjrdQUnc1u1xBw== X-Received: by 2002:a19:7b03:0:b0:503:294d:78b with SMTP id w3-20020a197b03000000b00503294d078bmr7626208lfc.46.1696229690977; Sun, 01 Oct 2023 23:54:50 -0700 (PDT) Received: from arrakeen.starnux.net ([2a01:e0a:982:cbb0:52eb:f6ff:feb3:451a]) by smtp.gmail.com with ESMTPSA id 3-20020a05600c020300b004063cced50bsm6601815wmi.23.2023.10.01.23.54.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Oct 2023 23:54:50 -0700 (PDT) From: Neil Armstrong Date: Mon, 02 Oct 2023 08:54:44 +0200 Subject: [PATCH v7 1/4] dt-bindings: input: document Goodix Berlin Touchscreen IC MIME-Version: 1.0 Message-Id: <20231002-topic-goodix-berlin-upstream-initial-v7-1-792fb91f5e88@linaro.org> References: <20231002-topic-goodix-berlin-upstream-initial-v7-0-792fb91f5e88@linaro.org> In-Reply-To: <20231002-topic-goodix-berlin-upstream-initial-v7-0-792fb91f5e88@linaro.org> To: Dmitry Torokhov Cc: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Bastien Nocera , Hans de Goede , Henrik Rydberg , Jeff LaBundy , linux-input@vger.kernel.org, linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Neil Armstrong , Rob Herring X-Mailer: b4 0.12.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=3093; i=neil.armstrong@linaro.org; h=from:subject:message-id; bh=sfk9uxvNPIwk9f8d5iBn9m2N4nTZgMQFpRmAil1gnVU=; b=owEBbQKS/ZANAwAKAXfc29rIyEnRAcsmYgBlGmk3U3UsAa1cjEtpG5e5LmXNy0LTD6XksEgNaSyR dMVHkrmJAjMEAAEKAB0WIQQ9U8YmyFYF/h30LIt33NvayMhJ0QUCZRppNwAKCRB33NvayMhJ0VRbD/ 4vX6m42uwbgaKhQ0cl+IxY7rcs4VmhEDz89yRcmGxYkKLhJffOUndRYkg54mwZBwb9KNuocUScPwi0 oFCYmHKzfOEEbjS9HxKqrcY+Qm7QU/RqOoHWQWVhdoCKIwSxgvp5XSAb0Bt3rJdogaVVkJyzQ/H6em DjqXF+RqcQFRzvfUxRgRfiSeCbZi4s1NlRunTO4TCTCJSngJ56sm5Je/iqmfqDl56EXvRjj28RYZAh KFZOhff4lJQIoQqM/VvRU9bJAzA62ezXaHqfHlMsMC8Dg9yfRKbExUNLPi6j2WEVVRsXz4vr82Qe/m GQNX/OXuzp0tMCJCRIMhMfsazSHqmiDJ+X5ZquaKqweX4OmYedxWDtD0gflNQLc3l/7It9DCj4wuvG SDYL28uuKJdCKTPYFSrUr1TuIXTYVh1D8tf0RE/lHL0pXFw4wV4Sh1vX/EJzypZRD6WDzkkqL2oyPf 8ypx94GcoKC0Ruf17R/b8PpDWX3WN0fV4BRrkIQjuJNQ9ainEHBPAR0F1aOUUqgxPtxiA4sk3YQ2Z8 gWd/2Ag6Tx5LqYLyXwUHu/9yH03YTrfwMavh4FURYkzNSUgcZutimLeFTcCaQwx0DsZQ7zDWI6dGzD LsIWefxh893JcWi9ww/Up0DcF5QAocZ6n8FEC32bDqfnBGs0nDP5TaotjyrQ== X-Developer-Key: i=neil.armstrong@linaro.org; a=openpgp; fpr=89EC3D058446217450F22848169AB7B1A4CFF8AE X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS autolearn=unavailable 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-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (howler.vger.email [0.0.0.0]); Sun, 01 Oct 2023 23:55:17 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1778634150984994467 X-GMAIL-MSGID: 1778634150984994467 Document the Goodix GT9916 wich is part of the "Berlin" serie of Touchscreen controllers IC from Goodix. Reviewed-by: Rob Herring Signed-off-by: Neil Armstrong --- .../bindings/input/touchscreen/goodix,gt9916.yaml | 95 ++++++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/Documentation/devicetree/bindings/input/touchscreen/goodix,gt9916.yaml b/Documentation/devicetree/bindings/input/touchscreen/goodix,gt9916.yaml new file mode 100644 index 000000000000..d90f045ac06c --- /dev/null +++ b/Documentation/devicetree/bindings/input/touchscreen/goodix,gt9916.yaml @@ -0,0 +1,95 @@ +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/input/touchscreen/goodix,gt9916.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Goodix Berlin series touchscreen controller + +description: The Goodix Berlin series of touchscreen controllers + be connected to either I2C or SPI buses. + +maintainers: + - Neil Armstrong + +allOf: + - $ref: touchscreen.yaml# + - $ref: /schemas/spi/spi-peripheral-props.yaml# + +properties: + compatible: + enum: + - goodix,gt9916 + + reg: + maxItems: 1 + + interrupts: + maxItems: 1 + + reset-gpios: + maxItems: 1 + + avdd-supply: + description: Analog power supply regulator on AVDD pin + + vddio-supply: + description: power supply regulator on VDDIO pin + + spi-max-frequency: true + touchscreen-inverted-x: true + touchscreen-inverted-y: true + touchscreen-size-x: true + touchscreen-size-y: true + touchscreen-swapped-x-y: true + +additionalProperties: false + +required: + - compatible + - reg + - interrupts + - avdd-supply + - touchscreen-size-x + - touchscreen-size-y + +examples: + - | + #include + #include + i2c { + #address-cells = <1>; + #size-cells = <0>; + touchscreen@5d { + compatible = "goodix,gt9916"; + reg = <0x5d>; + interrupt-parent = <&gpio>; + interrupts = <25 IRQ_TYPE_LEVEL_LOW>; + reset-gpios = <&gpio1 1 GPIO_ACTIVE_LOW>; + avdd-supply = <&ts_avdd>; + touchscreen-size-x = <1024>; + touchscreen-size-y = <768>; + }; + }; + - | + #include + #include + spi { + #address-cells = <1>; + #size-cells = <0>; + num-cs = <1>; + cs-gpios = <&gpio 2 GPIO_ACTIVE_HIGH>; + touchscreen@0 { + compatible = "goodix,gt9916"; + reg = <0>; + interrupt-parent = <&gpio>; + interrupts = <25 IRQ_TYPE_LEVEL_LOW>; + reset-gpios = <&gpio1 1 GPIO_ACTIVE_LOW>; + avdd-supply = <&ts_avdd>; + spi-max-frequency = <1000000>; + touchscreen-size-x = <1024>; + touchscreen-size-y = <768>; + }; + }; + +... From patchwork Mon Oct 2 06:54:45 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Neil Armstrong X-Patchwork-Id: 147207 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:612c:2a8e:b0:403:3b70:6f57 with SMTP id in14csp1276226vqb; Mon, 2 Oct 2023 01:33:21 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFfALu7zWJov47R3vHSR1Vzg4eCpSF67m8bMfG/OYPkkvyivo/gQFnJt3BOqr607AEpYLzD X-Received: by 2002:a17:902:e851:b0:1c5:de65:f8a8 with SMTP id t17-20020a170902e85100b001c5de65f8a8mr10048490plg.1.1696235600635; Mon, 02 Oct 2023 01:33:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1696235600; cv=none; d=google.com; s=arc-20160816; b=SHESlCM8RxJbEajdtsx7knJfQ/mQV4eragfoGo8hu7wsLP1DJEd+AXI2R63OYjeYAc 3ffkcgk7TPX3mggsPbkfvMGK+m1XYY2pUXMXsleLnHOk8d8JqhAP7hiikUEibG5lVcnr sP0xPgnNAWEf5oIuuXCKK/Xjfh/AmRYnrS1cyd1kwGdJOFqqq4/YE85wuRpG/PbjnBhS sLy/cg7umr88xkmwsM3pprhgpr3yhdSAmGGCU3eaHMB9U20oTNqOh82wJGUE9Te3bw5B pHhiPQ8dE8OEBKf35Pb9oP0Z1LRG8ZyKsTOokG1l4os+H8JcGKR/nDZ2MpZdGz0w4sgL KsDA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:in-reply-to:references:message-id :content-transfer-encoding:mime-version:subject:date:from :dkim-signature; bh=em9RTsjObwQUEP4XyuA6EnxTHmOtkzKo6f+Ew4QQgA8=; fh=t3x7F6NpUzrytwgfepnkBkLU3hDzeHi9cNdOi64ABcI=; b=A52VywZl4mEvhwaChseHW1A+zqzGmzjgTAbWdk+fbaYclVZSoj9GmQO2HoLD+SYvTY HhBlEnv3M8z2SeWH+TfIXkRxsq5ywdfQnjvf4TWVhkf8JJ/T+kGcGMBalmEvHcH5ktwY S0NWVF2M5RssY6myTPMx0DBK62oGW3v8ESKIra8r8pI1yJyItYypU2vWLv53Qha11yy6 JjEqHwggmOjV5ofsxPfz92GWzFFvykKWlPr+c9Wp4HXsxQhJiIvOHJsTamo6+8b6QT3q oVaCjDFUMhWUGMVG2fmqh7VffljamFn5NUuv5UdF/vFko0z6qDdterH8/g52+frwMXmh rrAg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=DiXdb9Hk; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from snail.vger.email (snail.vger.email. [2620:137:e000::3:7]) by mx.google.com with ESMTPS id d19-20020a170903209300b001c7374da019si8804439plc.13.2023.10.02.01.33.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Oct 2023 01:33:20 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) client-ip=2620:137:e000::3:7; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=DiXdb9Hk; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by snail.vger.email (Postfix) with ESMTP id 6B31F802B404; Sun, 1 Oct 2023 23:55:10 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at snail.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235608AbjJBGzC (ORCPT + 17 others); Mon, 2 Oct 2023 02:55:02 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34494 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235594AbjJBGy6 (ORCPT ); Mon, 2 Oct 2023 02:54:58 -0400 Received: from mail-wm1-x334.google.com (mail-wm1-x334.google.com [IPv6:2a00:1450:4864:20::334]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BF105E1 for ; Sun, 1 Oct 2023 23:54:53 -0700 (PDT) Received: by mail-wm1-x334.google.com with SMTP id 5b1f17b1804b1-4054f790190so153334885e9.2 for ; Sun, 01 Oct 2023 23:54:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1696229692; x=1696834492; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=em9RTsjObwQUEP4XyuA6EnxTHmOtkzKo6f+Ew4QQgA8=; b=DiXdb9HkASooJOmDtDDDuMooPVrSSqD+rkNqsaukS/lTNnLwm6dIprEx4zsFIN1xyf AIozHtDe9F4Heu7daxQyQgTbT1JZ6Q9NzEa5rksSJhX/zSoeF+K+H+48D6rftY88Do9S HNjFF/Ixpp1bGSEy6c23WHsMmR311mOze3uCiM65OXGJIX+4kltS5R7gWb03Ky/lZlRs 2XIkdnJSXb9T7gTNQcrmR3DGJwtbXsjRlzimnupmyV/8VCAMz6BIzMploS7e+pPuV6/G UXVDz5gp7m1RuUScsKZ3ea2RuicHY3frhqg8lPwsP/2P6PzqvURhVGpRRgwEULxyOmSF h2GA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1696229692; x=1696834492; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=em9RTsjObwQUEP4XyuA6EnxTHmOtkzKo6f+Ew4QQgA8=; b=fMlrOR2VR1IxcCw99ZVf0UxTJfNEsp8yXnzxN5upn9kC7r3OmnHxaA1X2dOHkQLotc 9/AjxvcZYps/CCuwTgWdVLSTPOuXlAI9YGLeNJR5kauxPJzTh2VmXL+e3dL0sBAZy0g/ H0BEoaw9+qgICekaFGilAt1Xi4+j57m6aHDMiRz7wd7I4paKbieXC2JiA+8lGAOZFXlR i60/xUaYLKdyMZu6v4q0EBJEY7AP2bHbOTLxIqQULEcgCAKAdk1iJhSWTtoT1w9+JOJX s5+ojoXsil415zfx2PxeULe+zftkM5Ah6xJdb3nmJ6GuVJoO8QU8JJTUeb4kv6joqL3l 7f9A== X-Gm-Message-State: AOJu0YyTa5vM7knrFgKhYaloIF7YxyhQOM3aUp70AzT7gpP2W7g0k/Xl cX9y1Gzv+mM73z8hPPQ2SCtFrQ== X-Received: by 2002:a05:600c:210e:b0:401:daf2:2737 with SMTP id u14-20020a05600c210e00b00401daf22737mr8540510wml.30.1696229692074; Sun, 01 Oct 2023 23:54:52 -0700 (PDT) Received: from arrakeen.starnux.net ([2a01:e0a:982:cbb0:52eb:f6ff:feb3:451a]) by smtp.gmail.com with ESMTPSA id 3-20020a05600c020300b004063cced50bsm6601815wmi.23.2023.10.01.23.54.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Oct 2023 23:54:51 -0700 (PDT) From: Neil Armstrong Date: Mon, 02 Oct 2023 08:54:45 +0200 Subject: [PATCH v7 2/4] Input: add core support for Goodix Berlin Touchscreen IC MIME-Version: 1.0 Message-Id: <20231002-topic-goodix-berlin-upstream-initial-v7-2-792fb91f5e88@linaro.org> References: <20231002-topic-goodix-berlin-upstream-initial-v7-0-792fb91f5e88@linaro.org> In-Reply-To: <20231002-topic-goodix-berlin-upstream-initial-v7-0-792fb91f5e88@linaro.org> To: Dmitry Torokhov Cc: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Bastien Nocera , Hans de Goede , Henrik Rydberg , Jeff LaBundy , linux-input@vger.kernel.org, linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Neil Armstrong X-Mailer: b4 0.12.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=22945; i=neil.armstrong@linaro.org; h=from:subject:message-id; bh=sUC1C/2VhtkIjU5L4OMU5MG5QKY41PGrxU75dUaJK8c=; b=owEBbQKS/ZANAwAKAXfc29rIyEnRAcsmYgBlGmk3+vojwj4hjnf0zc1AjodkinWlcz2WLe1ajPcq 9gea/hyJAjMEAAEKAB0WIQQ9U8YmyFYF/h30LIt33NvayMhJ0QUCZRppNwAKCRB33NvayMhJ0WbHEA DLozF4bWPfcAQ6z3DfHNo0qXyREaSJM4bq1ilQTPx/PgruZrd3dHUAYITRmBiK2XoNT2Rq11C1YgQt 6r0TXC1SOJ56kpHbYaHEGWNUYeyxWMbAkwNE5q14hOnCWiQ59pIdFePY3C/ZLmEjkBhEbKsvHCH17g rTsCV2B9Z2P63hfWJGoGu7QW1jjpvHmyV15dfN7wruyNOkKelO+k8CEvnH5meD51MBQf0ASW87vNrW vZ1j/m+YD7oA0FK9qT2U3Pen1xgP0ZWRX5lCORQPXomaXj5haUgTOH0wO7Oh6i96qR8rif+mNki1MH e6mKqSXNiq4yoBoWfW1fOKQ9aUo2IAV2WuEPJaUrlV66u7TvqDGE9dFk6CiL4BiUBp9RwkhPj3KGZa uxv21pSN4oirJJofBjsECwDAKOXNU6eTkSD0YegzVfFCZ+/mNt9rzlu1Cx7yIDKSvspzwhryJOaO7K nkOIhd6b8lL03Ql0rTg6u9t+g0/CBllsbjVEY6cJsalar2G2LrBmctzFGdSYNY4FlK5oaYC3mg48KQ mfrDF1l2w6Ff3qpQMUJdJ55zkRfVgo1iXfJPlAqpCV5udv1MaRJJEbych00E13Bd+/QnienikrlOLR LnkxprSvu6OoMPb4NL91cHE2H+fRyI4N9/eXpTUaWIkxI3vhbnyL/dGSR1xw== X-Developer-Key: i=neil.armstrong@linaro.org; a=openpgp; fpr=89EC3D058446217450F22848169AB7B1A4CFF8AE X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, 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-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (snail.vger.email [0.0.0.0]); Sun, 01 Oct 2023 23:55:10 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1778631940977147471 X-GMAIL-MSGID: 1778631940977147471 Add initial support for the new Goodix "Berlin" touchscreen ICs. These touchscreen ICs support SPI, I2C and I3C interface, up to 10 finger touch, stylus and gestures events. This initial driver is derived from the Goodix goodix_ts_berlin available at [1] and [2] and only supports the GT9916 IC present on the Qualcomm SM8550 MTP & QRD touch panel. The current implementation only supports BerlinD, aka GT9916. Support for advanced features like: - Firmware & config update - Stylus events - Gestures events - Previous revisions support (BerlinA or BerlinB) is not included in current version. The current support will work with currently flashed firmware and config, and bail out if firmware or config aren't flashed yet. [1] https://github.com/goodix/goodix_ts_berlin [2] https://git.codelinaro.org/clo/la/platform/vendor/opensource/touch-drivers Reviewed-by: Jeff LaBundy Signed-off-by: Neil Armstrong --- drivers/input/touchscreen/Kconfig | 3 + drivers/input/touchscreen/Makefile | 1 + drivers/input/touchscreen/goodix_berlin.h | 159 +++++++ drivers/input/touchscreen/goodix_berlin_core.c | 581 +++++++++++++++++++++++++ 4 files changed, 744 insertions(+) diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig index e3e2324547b9..950da599ae1a 100644 --- a/drivers/input/touchscreen/Kconfig +++ b/drivers/input/touchscreen/Kconfig @@ -416,6 +416,9 @@ config TOUCHSCREEN_GOODIX To compile this driver as a module, choose M here: the module will be called goodix. +config TOUCHSCREEN_GOODIX_BERLIN_CORE + tristate + config TOUCHSCREEN_HIDEEP tristate "HiDeep Touch IC" depends on I2C diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile index 62bd24f3ac8e..2e2f3e70cd2c 100644 --- a/drivers/input/touchscreen/Makefile +++ b/drivers/input/touchscreen/Makefile @@ -47,6 +47,7 @@ obj-$(CONFIG_TOUCHSCREEN_EGALAX_SERIAL) += egalax_ts_serial.o obj-$(CONFIG_TOUCHSCREEN_EXC3000) += exc3000.o obj-$(CONFIG_TOUCHSCREEN_FUJITSU) += fujitsu_ts.o obj-$(CONFIG_TOUCHSCREEN_GOODIX) += goodix_ts.o +obj-$(CONFIG_TOUCHSCREEN_GOODIX_BERLIN_CORE) += goodix_berlin_core.o obj-$(CONFIG_TOUCHSCREEN_HIDEEP) += hideep.o obj-$(CONFIG_TOUCHSCREEN_HYNITRON_CSTXXX) += hynitron_cstxxx.o obj-$(CONFIG_TOUCHSCREEN_ILI210X) += ili210x.o diff --git a/drivers/input/touchscreen/goodix_berlin.h b/drivers/input/touchscreen/goodix_berlin.h new file mode 100644 index 000000000000..235f44947a28 --- /dev/null +++ b/drivers/input/touchscreen/goodix_berlin.h @@ -0,0 +1,159 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Goodix Touchscreen Driver + * Copyright (C) 2020 - 2021 Goodix, Inc. + * Copyright (C) 2023 Linaro Ltd. + * + * Based on goodix_berlin_berlin driver. + */ + +#ifndef __GOODIX_BERLIN_H_ +#define __GOODIX_BERLIN_H_ + +#include +#include +#include +#include +#include + +#define GOODIX_BERLIN_MAX_TOUCH 10 + +#define GOODIX_BERLIN_NORMAL_RESET_DELAY_MS 100 + +#define GOODIX_BERLIN_IRQ_EVENT_HEAD_LEN 8 +#define GOODIX_BERLIN_STATUS_OFFSET 0 +#define GOODIX_BERLIN_REQUEST_TYPE_OFFSET 2 + +#define GOODIX_BERLIN_BYTES_PER_POINT 8 +#define GOODIX_BERLIN_COOR_DATA_CHECKSUM_SIZE 2 +#define GOODIX_BERLIN_COOR_DATA_CHECKSUM_MASK GENMASK(15, 0) + +/* Read n finger events */ +#define GOODIX_BERLIN_IRQ_READ_LEN(n) (GOODIX_BERLIN_IRQ_EVENT_HEAD_LEN + \ + (GOODIX_BERLIN_BYTES_PER_POINT * (n)) + \ + GOODIX_BERLIN_COOR_DATA_CHECKSUM_SIZE) + +#define GOODIX_BERLIN_TOUCH_EVENT BIT(7) +#define GOODIX_BERLIN_REQUEST_EVENT BIT(6) +#define GOODIX_BERLIN_TOUCH_COUNT_MASK GENMASK(3, 0) + +#define GOODIX_BERLIN_REQUEST_CODE_RESET 3 + +#define GOODIX_BERLIN_POINT_TYPE_MASK GENMASK(3, 0) +#define GOODIX_BERLIN_POINT_TYPE_STYLUS_HOVER 1 +#define GOODIX_BERLIN_POINT_TYPE_STYLUS 3 + +#define GOODIX_BERLIN_TOUCH_ID_MASK GENMASK(7, 4) + +#define GOODIX_BERLIN_DEV_CONFIRM_VAL 0xAA +#define GOODIX_BERLIN_BOOTOPTION_ADDR 0x10000 +#define GOODIX_BERLIN_FW_VERSION_INFO_ADDR 0x10014 + +#define GOODIX_BERLIN_IC_INFO_MAX_LEN SZ_1K +#define GOODIX_BERLIN_IC_INFO_ADDR 0x10070 + +struct goodix_berlin_fw_version { + u8 rom_pid[6]; + u8 rom_vid[3]; + u8 rom_vid_reserved; + u8 patch_pid[8]; + u8 patch_vid[4]; + u8 patch_vid_reserved; + u8 sensor_id; + u8 reserved[2]; + __le16 checksum; +} __packed; + +struct goodix_berlin_ic_info_version { + u8 info_customer_id; + u8 info_version_id; + u8 ic_die_id; + u8 ic_version_id; + __le32 config_id; + u8 config_version; + u8 frame_data_customer_id; + u8 frame_data_version_id; + u8 touch_data_customer_id; + u8 touch_data_version_id; + u8 reserved[3]; +} __packed; + +struct goodix_berlin_ic_info_feature { + __le16 freqhop_feature; + __le16 calibration_feature; + __le16 gesture_feature; + __le16 side_touch_feature; + __le16 stylus_feature; +} __packed; + +struct goodix_berlin_ic_info_misc { + __le32 cmd_addr; + __le16 cmd_max_len; + __le32 cmd_reply_addr; + __le16 cmd_reply_len; + __le32 fw_state_addr; + __le16 fw_state_len; + __le32 fw_buffer_addr; + __le16 fw_buffer_max_len; + __le32 frame_data_addr; + __le16 frame_data_head_len; + __le16 fw_attr_len; + __le16 fw_log_len; + u8 pack_max_num; + u8 pack_compress_version; + __le16 stylus_struct_len; + __le16 mutual_struct_len; + __le16 self_struct_len; + __le16 noise_struct_len; + __le32 touch_data_addr; + __le16 touch_data_head_len; + __le16 point_struct_len; + __le16 reserved1; + __le16 reserved2; + __le32 mutual_rawdata_addr; + __le32 mutual_diffdata_addr; + __le32 mutual_refdata_addr; + __le32 self_rawdata_addr; + __le32 self_diffdata_addr; + __le32 self_refdata_addr; + __le32 iq_rawdata_addr; + __le32 iq_refdata_addr; + __le32 im_rawdata_addr; + __le16 im_readata_len; + __le32 noise_rawdata_addr; + __le16 noise_rawdata_len; + __le32 stylus_rawdata_addr; + __le16 stylus_rawdata_len; + __le32 noise_data_addr; + __le32 esd_addr; +} __packed; + +struct goodix_berlin_touch_data { + u8 id; + u8 unused; + __le16 x; + __le16 y; + __le16 w; +} __packed; + +struct goodix_berlin_core { + struct device *dev; + struct regmap *regmap; + struct regulator *avdd; + struct regulator *iovdd; + struct gpio_desc *reset_gpio; + struct touchscreen_properties props; + struct goodix_berlin_fw_version fw_version; + struct input_dev *input_dev; + int irq; + + /* Runtime parameters extracted from IC_INFO buffer */ + u32 touch_data_addr; +}; + +int goodix_berlin_probe(struct device *dev, int irq, const struct input_id *id, + struct regmap *regmap); + +extern const struct dev_pm_ops goodix_berlin_pm_ops; + +#endif diff --git a/drivers/input/touchscreen/goodix_berlin_core.c b/drivers/input/touchscreen/goodix_berlin_core.c new file mode 100644 index 000000000000..08c508677669 --- /dev/null +++ b/drivers/input/touchscreen/goodix_berlin_core.c @@ -0,0 +1,581 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Goodix Touchscreen Driver + * Copyright (C) 2020 - 2021 Goodix, Inc. + * Copyright (C) 2023 Linaro Ltd. + * + * Based on goodix_ts_berlin driver. + */ +#include +#include +#include +#include + +#include "goodix_berlin.h" + +/* + * Goodix "Berlin" Touchscreen ID driver + * + * This driver is distinct from goodix.c since hardware interface + * is different enough to require a new driver. + * None of the register address or data structure are close enough + * to the previous generations. + * + * Currently only handles Multitouch events with already + * programmed firmware and "config" for "Revision D" Berlin IC. + * + * Support is missing for: + * - ESD Management + * - Firmware update/flashing + * - "Config" update/flashing + * - Stylus Events + * - Gesture Events + * - Support for older revisions (A & B) + */ + +static bool goodix_berlin_checksum_valid(const u8 *data, int size) +{ + u32 cal_checksum = 0; + u16 r_checksum; + u32 i; + + if (size < GOODIX_BERLIN_COOR_DATA_CHECKSUM_SIZE) + return false; + + for (i = 0; i < size - GOODIX_BERLIN_COOR_DATA_CHECKSUM_SIZE; i++) + cal_checksum += data[i]; + + r_checksum = get_unaligned_le16(&data[i]); + + return FIELD_GET(GOODIX_BERLIN_COOR_DATA_CHECKSUM_MASK, cal_checksum) == r_checksum; +} + +static bool goodix_berlin_is_dummy_data(struct goodix_berlin_core *cd, + const u8 *data, int size) +{ + int i; + + /* + * If the device is missing or doesn't respond the buffer + * could be filled with bus default line state, 0x00 or 0xff, + * so declare success the first time we encounter neither. + */ + for (i = 0; i < size; i++) + if (data[i] > 0 && data[i] < 0xff) + return false; + + return true; +} + +static int goodix_berlin_dev_confirm(struct goodix_berlin_core *cd) +{ + u8 tx_buf[8], rx_buf[8]; + int retry = 3; + int error; + + memset(tx_buf, GOODIX_BERLIN_DEV_CONFIRM_VAL, sizeof(tx_buf)); + while (retry--) { + error = regmap_raw_write(cd->regmap, GOODIX_BERLIN_BOOTOPTION_ADDR, tx_buf, + sizeof(tx_buf)); + if (error) + return error; + + error = regmap_raw_read(cd->regmap, GOODIX_BERLIN_BOOTOPTION_ADDR, rx_buf, + sizeof(rx_buf)); + if (error) + return error; + + if (!memcmp(tx_buf, rx_buf, sizeof(tx_buf))) + return 0; + + usleep_range(5000, 5100); + } + + dev_err(cd->dev, "device confirm failed, rx_buf: %*ph\n", 8, rx_buf); + + return -EINVAL; +} + +static int goodix_berlin_power_on(struct goodix_berlin_core *cd, bool on) +{ + int error = 0; + + if (on) { + error = regulator_enable(cd->iovdd); + if (error) { + dev_err(cd->dev, "Failed to enable iovdd: %d\n", error); + return error; + } + + /* Vendor waits 3ms for IOVDD to settle */ + usleep_range(3000, 3100); + + error = regulator_enable(cd->avdd); + if (error) { + dev_err(cd->dev, "Failed to enable avdd: %d\n", error); + goto err_iovdd_disable; + } + + /* Vendor waits 15ms for IOVDD to settle */ + usleep_range(15000, 15100); + + gpiod_set_value(cd->reset_gpio, 0); + + /* Vendor waits 4ms for Firmware to initialize */ + usleep_range(4000, 4100); + + error = goodix_berlin_dev_confirm(cd); + if (error) + goto err_dev_reset; + + /* Vendor waits 100ms for Firmware to fully boot */ + msleep(GOODIX_BERLIN_NORMAL_RESET_DELAY_MS); + + return 0; + } + +err_dev_reset: + gpiod_set_value(cd->reset_gpio, 1); + + regulator_disable(cd->avdd); + +err_iovdd_disable: + regulator_disable(cd->iovdd); + + return error; +} + +static int goodix_berlin_read_version(struct goodix_berlin_core *cd) +{ + u8 buf[sizeof(struct goodix_berlin_fw_version)]; + int error; + + error = regmap_raw_read(cd->regmap, GOODIX_BERLIN_FW_VERSION_INFO_ADDR, buf, sizeof(buf)); + if (error) { + dev_err(cd->dev, "error reading fw version, %d\n", error); + return error; + } + + if (!goodix_berlin_checksum_valid(buf, sizeof(buf))) { + dev_err(cd->dev, "invalid fw version: checksum error\n"); + return -EINVAL; + } + + memcpy(&cd->fw_version, buf, sizeof(cd->fw_version)); + + return 0; +} + +/* Only extract necessary data for runtime */ +static int goodix_berlin_convert_ic_info(struct goodix_berlin_core *cd, + const u8 *data, u16 length) +{ + struct goodix_berlin_ic_info_misc misc; + unsigned int offset = 0; + u8 param_num; + + offset += sizeof(__le16); /* length */ + offset += sizeof(struct goodix_berlin_ic_info_version); + offset += sizeof(struct goodix_berlin_ic_info_feature); + + /* IC_INFO Parameters, variable width structure */ + offset += 4 * sizeof(u8); /* drv_num, sen_num, button_num, force_num */ + + if (offset >= length) + goto invalid_offset; + + param_num = data[offset++]; /* active_scan_rate_num */ + + offset += param_num * sizeof(__le16); + + if (offset >= length) + goto invalid_offset; + + param_num = data[offset++]; /* mutual_freq_num*/ + + offset += param_num * sizeof(__le16); + + if (offset >= length) + goto invalid_offset; + + param_num = data[offset++]; /* self_tx_freq_num */ + + offset += param_num * sizeof(__le16); + + if (offset >= length) + goto invalid_offset; + + param_num = data[offset++]; /* self_rx_freq_num */ + + offset += param_num * sizeof(__le16); + + if (offset >= length) + goto invalid_offset; + + param_num = data[offset++]; /* stylus_freq_num */ + + offset += param_num * sizeof(__le16); + + if (offset + sizeof(misc) > length) + goto invalid_offset; + + /* goodix_berlin_ic_info_misc */ + memcpy(&misc, &data[offset], sizeof(misc)); + + cd->touch_data_addr = le32_to_cpu(misc.touch_data_addr); + + return 0; + +invalid_offset: + dev_err(cd->dev, "ic_info length is invalid (offset %d length %d)\n", + offset, length); + return -EINVAL; +} + +static int goodix_berlin_get_ic_info(struct goodix_berlin_core *cd) +{ + u8 afe_data[GOODIX_BERLIN_IC_INFO_MAX_LEN]; + __le16 length_raw; + u16 length; + int error; + + error = regmap_raw_read(cd->regmap, GOODIX_BERLIN_IC_INFO_ADDR, + &length_raw, sizeof(length_raw)); + if (error) { + dev_info(cd->dev, "failed get ic info length, %d\n", error); + return error; + } + + length = le16_to_cpu(length_raw); + if (length >= GOODIX_BERLIN_IC_INFO_MAX_LEN) { + dev_info(cd->dev, "invalid ic info length %d\n", length); + return -EINVAL; + } + + error = regmap_raw_read(cd->regmap, GOODIX_BERLIN_IC_INFO_ADDR, + afe_data, length); + if (error) { + dev_info(cd->dev, "failed get ic info data, %d\n", error); + return error; + } + + /* check whether the data is valid (ex. bus default values) */ + if (goodix_berlin_is_dummy_data(cd, (const uint8_t *)afe_data, length)) { + dev_err(cd->dev, "fw info data invalid\n"); + return -EINVAL; + } + + if (!goodix_berlin_checksum_valid((const uint8_t *)afe_data, length)) { + dev_info(cd->dev, "fw info checksum error\n"); + return -EINVAL; + } + + error = goodix_berlin_convert_ic_info(cd, afe_data, length); + if (error) + return error; + + /* check some key info */ + if (!cd->touch_data_addr) { + dev_err(cd->dev, "touch_data_addr is null\n"); + return -EINVAL; + } + + return 0; +} + +static void goodix_berlin_parse_finger(struct goodix_berlin_core *cd, + const void *buf, int touch_num) +{ + const struct goodix_berlin_touch_data *touch_data = buf; + int i; + + /* Check for data validity */ + for (i = 0; i < touch_num; i++) { + unsigned int id; + + id = FIELD_GET(GOODIX_BERLIN_TOUCH_ID_MASK, touch_data[i].id); + + if (id >= GOODIX_BERLIN_MAX_TOUCH) { + dev_warn(cd->dev, "invalid finger id %d\n", id); + return; + } + } + + /* Report finger touches */ + for (i = 0; i < touch_num; i++) { + input_mt_slot(cd->input_dev, + FIELD_GET(GOODIX_BERLIN_TOUCH_ID_MASK, + touch_data[i].id)); + input_mt_report_slot_state(cd->input_dev, MT_TOOL_FINGER, true); + + touchscreen_report_pos(cd->input_dev, &cd->props, + __le16_to_cpu(touch_data[i].x), + __le16_to_cpu(touch_data[i].y), + true); + input_report_abs(cd->input_dev, ABS_MT_TOUCH_MAJOR, + __le16_to_cpu(touch_data[i].w)); + } + + input_mt_sync_frame(cd->input_dev); + input_sync(cd->input_dev); +} + +static void goodix_berlin_touch_handler(struct goodix_berlin_core *cd, + const void *pre_buf, u32 pre_buf_len) +{ + static u8 buffer[GOODIX_BERLIN_IRQ_READ_LEN(GOODIX_BERLIN_MAX_TOUCH)]; + u8 point_type, touch_num; + int error; + + /* copy pre-data to buffer */ + memcpy(buffer, pre_buf, pre_buf_len); + + touch_num = FIELD_GET(GOODIX_BERLIN_TOUCH_COUNT_MASK, + buffer[GOODIX_BERLIN_REQUEST_TYPE_OFFSET]); + + if (touch_num > GOODIX_BERLIN_MAX_TOUCH) { + dev_warn(cd->dev, "invalid touch num %d\n", touch_num); + return; + } + + if (touch_num) { + /* read more data if more than 2 touch events */ + if (unlikely(touch_num > 2)) { + error = regmap_raw_read(cd->regmap, + cd->touch_data_addr + pre_buf_len, + &buffer[pre_buf_len], + (touch_num - 2) * GOODIX_BERLIN_BYTES_PER_POINT); + if (error) { + dev_err_ratelimited(cd->dev, "failed to get touch data, %d\n", + error); + return; + } + } + + point_type = FIELD_GET(GOODIX_BERLIN_POINT_TYPE_MASK, + buffer[GOODIX_BERLIN_IRQ_EVENT_HEAD_LEN]); + + if (point_type == GOODIX_BERLIN_POINT_TYPE_STYLUS || + point_type == GOODIX_BERLIN_POINT_TYPE_STYLUS_HOVER) { + dev_warn_once(cd->dev, "Stylus event type not handled\n"); + return; + } + + if (!goodix_berlin_checksum_valid(&buffer[GOODIX_BERLIN_IRQ_EVENT_HEAD_LEN], + touch_num * GOODIX_BERLIN_BYTES_PER_POINT + 2)) { + dev_err(cd->dev, "touch data checksum error, data: %*ph\n", + touch_num * GOODIX_BERLIN_BYTES_PER_POINT + 2, + &buffer[GOODIX_BERLIN_IRQ_EVENT_HEAD_LEN]); + return; + } + } + + goodix_berlin_parse_finger(cd, &buffer[GOODIX_BERLIN_IRQ_EVENT_HEAD_LEN], + touch_num); +} + +static int goodix_berlin_request_handle_reset(struct goodix_berlin_core *cd) +{ + gpiod_set_value(cd->reset_gpio, 1); + usleep_range(2000, 2100); + gpiod_set_value(cd->reset_gpio, 0); + + msleep(GOODIX_BERLIN_NORMAL_RESET_DELAY_MS); + + return 0; +} + +static irqreturn_t goodix_berlin_threadirq_func(int irq, void *data) +{ + struct goodix_berlin_core *cd = data; + u8 buf[GOODIX_BERLIN_IRQ_READ_LEN(2)]; + u8 event_status; + int error; + + /* First, read buffer with space for 2 touch events */ + error = regmap_raw_read(cd->regmap, cd->touch_data_addr, buf, + GOODIX_BERLIN_IRQ_READ_LEN(2)); + if (error) { + dev_err_ratelimited(cd->dev, "failed get event head data, %d\n", error); + return IRQ_HANDLED; + } + + if (buf[GOODIX_BERLIN_STATUS_OFFSET] == 0) + return IRQ_HANDLED; + + if (!goodix_berlin_checksum_valid(buf, GOODIX_BERLIN_IRQ_EVENT_HEAD_LEN)) { + dev_warn_ratelimited(cd->dev, "touch head checksum err : %*ph\n", + GOODIX_BERLIN_IRQ_EVENT_HEAD_LEN, buf); + return IRQ_HANDLED; + } + + event_status = buf[GOODIX_BERLIN_STATUS_OFFSET]; + + if (event_status & GOODIX_BERLIN_TOUCH_EVENT) + goodix_berlin_touch_handler(cd, buf, GOODIX_BERLIN_IRQ_READ_LEN(2)); + + if (event_status & GOODIX_BERLIN_REQUEST_EVENT) { + switch (buf[GOODIX_BERLIN_REQUEST_TYPE_OFFSET]) { + case GOODIX_BERLIN_REQUEST_CODE_RESET: + goodix_berlin_request_handle_reset(cd); + break; + + default: + dev_warn(cd->dev, "unsupported request code 0x%x\n", + buf[GOODIX_BERLIN_REQUEST_TYPE_OFFSET]); + } + } + + /* Clear up status field */ + regmap_write(cd->regmap, cd->touch_data_addr, 0); + + return IRQ_HANDLED; +} + +static int goodix_berlin_input_dev_config(struct goodix_berlin_core *cd, + const struct input_id *id) +{ + struct input_dev *input_dev; + int error; + + input_dev = devm_input_allocate_device(cd->dev); + if (!input_dev) + return -ENOMEM; + + cd->input_dev = input_dev; + input_set_drvdata(input_dev, cd); + + input_dev->name = "Goodix Berlin Capacitive TouchScreen"; + input_dev->phys = "input/ts"; + + input_dev->id = *id; + + input_set_abs_params(cd->input_dev, ABS_MT_POSITION_X, 0, SZ_64K - 1, 0, 0); + input_set_abs_params(cd->input_dev, ABS_MT_POSITION_Y, 0, SZ_64K - 1, 0, 0); + input_set_abs_params(cd->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); + + touchscreen_parse_properties(cd->input_dev, true, &cd->props); + + error = input_mt_init_slots(cd->input_dev, GOODIX_BERLIN_MAX_TOUCH, + INPUT_MT_DIRECT | INPUT_MT_DROP_UNUSED); + if (error) + return error; + + return input_register_device(cd->input_dev); +} + +static int goodix_berlin_pm_suspend(struct device *dev) +{ + struct goodix_berlin_core *cd = dev_get_drvdata(dev); + + disable_irq(cd->irq); + + return goodix_berlin_power_on(cd, false); +} + +static int goodix_berlin_pm_resume(struct device *dev) +{ + struct goodix_berlin_core *cd = dev_get_drvdata(dev); + int error; + + error = goodix_berlin_power_on(cd, true); + if (error) + return error; + + enable_irq(cd->irq); + + return 0; +} + +EXPORT_GPL_SIMPLE_DEV_PM_OPS(goodix_berlin_pm_ops, + goodix_berlin_pm_suspend, + goodix_berlin_pm_resume); + +static void goodix_berlin_power_off(void *data) +{ + struct goodix_berlin_core *cd = data; + + goodix_berlin_power_on(cd, false); +} + +int goodix_berlin_probe(struct device *dev, int irq, const struct input_id *id, + struct regmap *regmap) +{ + struct goodix_berlin_core *cd; + int error; + + if (irq <= 0) { + dev_err(dev, "Missing interrupt number\n"); + return -EINVAL; + } + + cd = devm_kzalloc(dev, sizeof(*cd), GFP_KERNEL); + if (!cd) + return -ENOMEM; + + cd->dev = dev; + cd->regmap = regmap; + cd->irq = irq; + + cd->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH); + if (IS_ERR(cd->reset_gpio)) + return dev_err_probe(dev, PTR_ERR(cd->reset_gpio), + "Failed to request reset gpio\n"); + + cd->avdd = devm_regulator_get(dev, "avdd"); + if (IS_ERR(cd->avdd)) + return dev_err_probe(dev, PTR_ERR(cd->avdd), + "Failed to request avdd regulator\n"); + + cd->iovdd = devm_regulator_get(dev, "iovdd"); + if (IS_ERR(cd->iovdd)) + return dev_err_probe(dev, PTR_ERR(cd->iovdd), + "Failed to request iovdd regulator\n"); + + error = goodix_berlin_power_on(cd, true); + if (error) { + dev_err(dev, "failed power on"); + return error; + } + + error = devm_add_action_or_reset(dev, goodix_berlin_power_off, cd); + if (error) + return error; + + error = goodix_berlin_read_version(cd); + if (error) { + dev_err(dev, "failed to get version info"); + return error; + } + + error = goodix_berlin_get_ic_info(cd); + if (error) { + dev_err(dev, "invalid ic info, abort"); + return error; + } + + error = goodix_berlin_input_dev_config(cd, id); + if (error) { + dev_err(dev, "failed set input device"); + return error; + } + + error = devm_request_threaded_irq(dev, irq, NULL, + goodix_berlin_threadirq_func, + IRQF_ONESHOT, "goodix-berlin", cd); + if (error) { + dev_err(dev, "request threaded irq failed: %d\n", error); + return error; + } + + dev_set_drvdata(dev, cd); + + dev_dbg(dev, "Goodix Berlin %s Touchscreen Controller", cd->fw_version.patch_pid); + + return 0; +} +EXPORT_SYMBOL_GPL(goodix_berlin_probe); + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Goodix Berlin Core Touchscreen driver"); +MODULE_AUTHOR("Neil Armstrong "); From patchwork Mon Oct 2 06:54:46 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Neil Armstrong X-Patchwork-Id: 147234 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:612c:2a8e:b0:403:3b70:6f57 with SMTP id in14csp1340855vqb; Mon, 2 Oct 2023 04:01:31 -0700 (PDT) X-Google-Smtp-Source: AGHT+IE3QLTWyDNt9q1DNXlCbp/oUFXsMDbRJDHB4MNT5C44k6e1NqjZdSAI89wWqRpTWs/ADKW2 X-Received: by 2002:a05:6a21:4983:b0:15e:9032:419a with SMTP id ax3-20020a056a21498300b0015e9032419amr8301033pzc.31.1696244490738; Mon, 02 Oct 2023 04:01:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1696244490; cv=none; d=google.com; s=arc-20160816; b=KSS8rr9OdW3XvWfA73CglirGCPp2m88scCe6E8kwO37itu79Nw/7T6z2EvBpQemCdt ymnVZGtZoX0WR77Q0DehMB/3TEEIvwGpGq23OWXYBDOfB5+q7Cs3VOyfO+ypj794MyHw EBmGqUQ2rT5Wb7cBtejYbrULq2SvKv4WY31HaXHkD9fG/SFn4asIysdI3uKGmlHSCWgG 0D9VrTSGfgxz9FataitneXAXdj2xCdFvceC5x/FsQubmQYwZa19gbpYWYOCrnC8V9y7t oNAHtxgVvbASuUZ59jJBczKplkziCH7pS9raDgVdXBpg323cHRp3pna8cGrgbnzs1o/b Ndhg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:in-reply-to:references:message-id :content-transfer-encoding:mime-version:subject:date:from :dkim-signature; bh=Z5GSTRd7yWsW/2h2X+KrYHhvI8Ce18nIFifnprRO8h4=; fh=t3x7F6NpUzrytwgfepnkBkLU3hDzeHi9cNdOi64ABcI=; b=rk+1If70tscwo5BpQFuRM8y2u2qnOcyfFBHbJi0uKE/Ak5fm/CLvP0tNtXKu6x9dSl y1xkTSJ+NTIWKM/A9UcSQ6uNMhZADED2dipeo7VAGolTGY8iaiO0BEBNC0C4C/AGaEio tcWhl8a/UQmhHBj8YiSIw9mSP5AgUq8SEyL5bFiQLV6KwxraInDmycOyeMApdBJg3TNt SKktjbLI1Dwu1HasK4e1M1r2tNUzhotTjHhKLYQ9SXp55DsoiWOktAIlbMrcCdYNVUbL Mv+qbPo08WiBPppwW5hpbTkBluKuroblAYrJfHyavWaDW6ZUuHypM042K10HvVvEMASk 2QOQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="Tlrn/vYw"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from snail.vger.email (snail.vger.email. [23.128.96.37]) by mx.google.com with ESMTPS id v20-20020a056a00149400b0068c01fba736si29440743pfu.301.2023.10.02.04.01.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Oct 2023 04:01:30 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) client-ip=23.128.96.37; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="Tlrn/vYw"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by snail.vger.email (Postfix) with ESMTP id ABCEE80CF54D; Sun, 1 Oct 2023 23:55:20 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at snail.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235631AbjJBGzI (ORCPT + 17 others); Mon, 2 Oct 2023 02:55:08 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34568 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235584AbjJBGy7 (ORCPT ); Mon, 2 Oct 2023 02:54:59 -0400 Received: from mail-wm1-x335.google.com (mail-wm1-x335.google.com [IPv6:2a00:1450:4864:20::335]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BCFE5BA for ; Sun, 1 Oct 2023 23:54:54 -0700 (PDT) Received: by mail-wm1-x335.google.com with SMTP id 5b1f17b1804b1-4060b623e64so16011615e9.0 for ; Sun, 01 Oct 2023 23:54:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1696229693; x=1696834493; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=Z5GSTRd7yWsW/2h2X+KrYHhvI8Ce18nIFifnprRO8h4=; b=Tlrn/vYwuXInBZVAoirYIDlHxS5qQvGlzrblrEPbG+wxNX9m32ZzQTAwpjqOqze+Eo 0S/oYSS1a8ItskZ8HkZdO/PZZbTRPAKh+onDCv6k0d4RU1MK2zmlEL8A0cyxCHZ3tqk3 jJgUAPDHryL8UfgVeLq2xv/GER4kM6h/Zt6yX1OlvtPmDkYB9j2eZcePCULWMSduXcOM 5f26Is1pSy2hhfeEI8cdov9YhZgfxIM//6BG/bewFrhLMMKzKQ+43toFVVvfNqfW6iGU j18Thk2e4/cDjV+YfuRs4AalVcqDozyvp6aASBWv7fnnuKtwnKqVg89FLb43JTZYgPVB MMhA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1696229693; x=1696834493; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Z5GSTRd7yWsW/2h2X+KrYHhvI8Ce18nIFifnprRO8h4=; b=nroTVXEb3UzG/cct759R5s1/2mAmEE4dqG5IXwo16MyOnZZgIS+cU8WYMGJeKaEKhg Sx8SpTIoLnwqlJdk/2BCIjKd+sXtaB9l9AMe0uDO/5zxcq94yY3/hxO1M5WEpOEzxGFu VMZIL/TBdu61XKD5XDeDrWohpwCEygjqXr033gN0S46YaJ6zncggPBpqIiuf84FKyJ/0 Z97QHwKKNQLASO/CfO4prUjJClHaYUg4cYcyAkemlT4DDXyyeTgaEiLPFzBojGE2M+YJ rYKVH5E6W40KmEIvB8dV0a1mglmT0HAe6lzw/q8tCHVJI6UJpnZ8R7lVuAf9KtwG9JCB QtCQ== X-Gm-Message-State: AOJu0YyQMthBfUdhtG7ZBPzW9TFTs8dtKQnG2SMyZ9e2u4WUqOmuHDXo tscKlCAT+VB1Id6J8UtB3lDIPg== X-Received: by 2002:a05:600c:1614:b0:401:c7ec:b930 with SMTP id m20-20020a05600c161400b00401c7ecb930mr9033273wmn.10.1696229693038; Sun, 01 Oct 2023 23:54:53 -0700 (PDT) Received: from arrakeen.starnux.net ([2a01:e0a:982:cbb0:52eb:f6ff:feb3:451a]) by smtp.gmail.com with ESMTPSA id 3-20020a05600c020300b004063cced50bsm6601815wmi.23.2023.10.01.23.54.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Oct 2023 23:54:52 -0700 (PDT) From: Neil Armstrong Date: Mon, 02 Oct 2023 08:54:46 +0200 Subject: [PATCH v7 3/4] Input: goodix-berlin - add I2C support for Goodix Berlin Touchscreen IC MIME-Version: 1.0 Message-Id: <20231002-topic-goodix-berlin-upstream-initial-v7-3-792fb91f5e88@linaro.org> References: <20231002-topic-goodix-berlin-upstream-initial-v7-0-792fb91f5e88@linaro.org> In-Reply-To: <20231002-topic-goodix-berlin-upstream-initial-v7-0-792fb91f5e88@linaro.org> To: Dmitry Torokhov Cc: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Bastien Nocera , Hans de Goede , Henrik Rydberg , Jeff LaBundy , linux-input@vger.kernel.org, linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Neil Armstrong X-Mailer: b4 0.12.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=4476; i=neil.armstrong@linaro.org; h=from:subject:message-id; bh=fvuZaiaDmAw7atVHwbHQLhUjO6UmtXJUopSvbqmyj84=; b=owEBbQKS/ZANAwAKAXfc29rIyEnRAcsmYgBlGmk4tCyb25I35FtjvUenlxHQ8UL7bQWz4AcVVWsU vGcBx7uJAjMEAAEKAB0WIQQ9U8YmyFYF/h30LIt33NvayMhJ0QUCZRppOAAKCRB33NvayMhJ0XQxEA Chl5zW0Hi8HXH8SwInfIPW+Vi6Bib44xGgRAQAoj3+vQ059D/qHy4smy1OefWyNNwIoe6u2hOw0Dt6 /he9t69hKb5BbWTFxHUnRX71x26/aVA9FTFl7YTJfZqLBWgC1J7P4QyIm+jloGtehnfIdQ7p8titKd WuFNz/BBySZ1WBJu64YueATtcdLbl5sniJX0Q+vs4FYuciei1lPgWHPx397oK8wOfWb0z9m6/zCByY 3KabTvGXon0k0UBS3KHMdm8M8H8TbryLyBZQAFKq8nYQC4nZi139OH92b4RgYaYvM3n0G/1cXXKmGF 5cNKqvNoX8WqpLHuBNOt6Sbg4AtBSiTjqZcLIGNhG8EGKvQpqkWDThcgo5dlyTLBZzwm05csQ42Sdl 2mUJLHESSkvI7SgSQY8YT10feeiJJGWjJalzqi/MpLL7flnvuq7OiUgSO9cOovSX8gGCeyT4GCjHRs +DkfuxvallwDAPsS9xh9z/AE78RKSM7FjY/gd92FOzdKqi4AiJcQf+r9xtEmSQLEiSZ9QR5WXlOZJI /raYBWaQpyMVNpKq8q5AYaGmsbPjmjbESdiYnME3pmdux4m/yMlucltOqhvivK2aAwjzM0qlVsXAqs 4Toq+I4GoCpMg14qEz9WuOW4COcQtQL1ySBtS3eeEgyGyvnoLdoQyQ3Kb18w== X-Developer-Key: i=neil.armstrong@linaro.org; a=openpgp; fpr=89EC3D058446217450F22848169AB7B1A4CFF8AE X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS autolearn=unavailable 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-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (snail.vger.email [0.0.0.0]); Sun, 01 Oct 2023 23:55:20 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1778641263002213191 X-GMAIL-MSGID: 1778641263002213191 Add initial support for the new Goodix "Berlin" touchscreen ICs over the I2C interface. This initial driver is derived from the Goodix goodix_ts_berlin available at [1] and [2] and only supports the GT9916 IC present on the Qualcomm SM8550 MTP & QRD touch panel. The current implementation only supports BerlinD, aka GT9916. [1] https://github.com/goodix/goodix_ts_berlin [2] https://git.codelinaro.org/clo/la/platform/vendor/opensource/touch-drivers Reviewed-by: Jeff LaBundy Signed-off-by: Neil Armstrong --- drivers/input/touchscreen/Kconfig | 14 ++++++ drivers/input/touchscreen/Makefile | 1 + drivers/input/touchscreen/goodix_berlin_i2c.c | 69 +++++++++++++++++++++++++++ 3 files changed, 84 insertions(+) diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig index 950da599ae1a..cc7b88118158 100644 --- a/drivers/input/touchscreen/Kconfig +++ b/drivers/input/touchscreen/Kconfig @@ -419,6 +419,20 @@ config TOUCHSCREEN_GOODIX config TOUCHSCREEN_GOODIX_BERLIN_CORE tristate +config TOUCHSCREEN_GOODIX_BERLIN_I2C + tristate "Goodix Berlin I2C touchscreen" + depends on I2C + select REGMAP_I2C + select TOUCHSCREEN_GOODIX_BERLIN_CORE + help + Say Y here if you have a Goodix Berlin IC connected to + your system via I2C. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called goodix_berlin_i2c. + config TOUCHSCREEN_HIDEEP tristate "HiDeep Touch IC" depends on I2C diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile index 2e2f3e70cd2c..7ef677cf7a10 100644 --- a/drivers/input/touchscreen/Makefile +++ b/drivers/input/touchscreen/Makefile @@ -48,6 +48,7 @@ obj-$(CONFIG_TOUCHSCREEN_EXC3000) += exc3000.o obj-$(CONFIG_TOUCHSCREEN_FUJITSU) += fujitsu_ts.o obj-$(CONFIG_TOUCHSCREEN_GOODIX) += goodix_ts.o obj-$(CONFIG_TOUCHSCREEN_GOODIX_BERLIN_CORE) += goodix_berlin_core.o +obj-$(CONFIG_TOUCHSCREEN_GOODIX_BERLIN_I2C) += goodix_berlin_i2c.o obj-$(CONFIG_TOUCHSCREEN_HIDEEP) += hideep.o obj-$(CONFIG_TOUCHSCREEN_HYNITRON_CSTXXX) += hynitron_cstxxx.o obj-$(CONFIG_TOUCHSCREEN_ILI210X) += ili210x.o diff --git a/drivers/input/touchscreen/goodix_berlin_i2c.c b/drivers/input/touchscreen/goodix_berlin_i2c.c new file mode 100644 index 000000000000..6407b2258eb1 --- /dev/null +++ b/drivers/input/touchscreen/goodix_berlin_i2c.c @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Goodix Berlin Touchscreen Driver + * + * Copyright (C) 2020 - 2021 Goodix, Inc. + * Copyright (C) 2023 Linaro Ltd. + * + * Based on goodix_ts_berlin driver. + */ +#include +#include +#include +#include + +#include "goodix_berlin.h" + +#define I2C_MAX_TRANSFER_SIZE 256 + +static const struct regmap_config goodix_berlin_i2c_regmap_conf = { + .reg_bits = 32, + .val_bits = 8, + .max_raw_read = I2C_MAX_TRANSFER_SIZE, + .max_raw_write = I2C_MAX_TRANSFER_SIZE, +}; + +/* vendor & product left unassigned here, should probably be updated from fw info */ +static const struct input_id goodix_berlin_i2c_input_id = { + .bustype = BUS_I2C, +}; + +static int goodix_berlin_i2c_probe(struct i2c_client *client) +{ + struct regmap *regmap; + + regmap = devm_regmap_init_i2c(client, &goodix_berlin_i2c_regmap_conf); + if (IS_ERR(regmap)) + return PTR_ERR(regmap); + + return goodix_berlin_probe(&client->dev, client->irq, + &goodix_berlin_i2c_input_id, regmap); +} + +static const struct i2c_device_id goodix_berlin_i2c_id[] = { + { "gt9916", 0 }, + { } +}; + +MODULE_DEVICE_TABLE(i2c, goodix_berlin_i2c_id); + +static const struct of_device_id goodix_berlin_i2c_of_match[] = { + { .compatible = "goodix,gt9916", }, + { } +}; +MODULE_DEVICE_TABLE(of, goodix_berlin_i2c_of_match); + +static struct i2c_driver goodix_berlin_i2c_driver = { + .driver = { + .name = "goodix-berlin-i2c", + .of_match_table = goodix_berlin_i2c_of_match, + .pm = pm_sleep_ptr(&goodix_berlin_pm_ops), + }, + .probe = goodix_berlin_i2c_probe, + .id_table = goodix_berlin_i2c_id, +}; +module_i2c_driver(goodix_berlin_i2c_driver); + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Goodix Berlin I2C Touchscreen driver"); +MODULE_AUTHOR("Neil Armstrong "); From patchwork Mon Oct 2 06:54:47 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Neil Armstrong X-Patchwork-Id: 147201 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:612c:2a8e:b0:403:3b70:6f57 with SMTP id in14csp1253098vqb; Mon, 2 Oct 2023 00:34:43 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHiGEpe4s0VG5pCoWriUSlIJs1ftDJQ7DZbXJhOksSfXttjDs/JVyza64yZytZgQU6tR+B6 X-Received: by 2002:a05:6a20:1045:b0:13c:ca8b:7e29 with SMTP id gt5-20020a056a20104500b0013cca8b7e29mr10756037pzc.12.1696232082956; Mon, 02 Oct 2023 00:34:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1696232082; cv=none; d=google.com; s=arc-20160816; b=XLTbgzcuqpOW/knix3cmVuyLJ5fN8Gkl5AJCr7C2PvozsyFmvKLDDc0VNpQWuDinTc HMG3D1GEQ9+TKLEOYWAxx//Cf4TJzkU68blLd+m0K8kkeaVK2obtnKrv+yawzit4NMQL TQVoI28UOwYx/IvUksI94CHL1o46d7IyTK6pwEd7RcKE7T4JGeRMB9XKG3DWEscdDewk NKUde1rlft41hQL9AbjzlCkUSuDPf44kbC2xz3LGfaesxaC96itgpHrxYvXtr9e0u0Ur W7eBVxLe08WScQbACOfQBCkLgGudTRZByR2PljQzbiE16Zm/4RepNWAUBPM0GEIXkLUi rxXg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:in-reply-to:references:message-id :content-transfer-encoding:mime-version:subject:date:from :dkim-signature; bh=aB4JTBbloeJlOrROqSHyOpiwaZu7mID8DECUoJEbjX8=; fh=t3x7F6NpUzrytwgfepnkBkLU3hDzeHi9cNdOi64ABcI=; b=nMhEYHt8FxURel/V+krvx4QEnpWj7fkow0itTtQqrNAUMeCOKDou94Ci6OCdm2NDc4 wVxRFmSRwxxHAURk3G+T2UVJkSVwSIITzjtagyt8RRpV9x1JiZsclTnS1X/PCGnkwowe 2YN3SVcYeEcO4bcCHFP++Fejukyuzo8J8xJ9lTKi+aiEypnYuX6uzSD4wOWbQgZuIk15 AdbwDujBnoyAl7WhAydjhrRHzeoj5eFdk1P4cOtT9hVBQtVcUCu3REeCKFAhxOks5Aiz nHDvUbBuTB8DXTjqwB2/k1ltRnIBwzmafrV5mzTpRhWKSIEJL7+GMYke8hL4gHr9xgn7 0Ecw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=wBWMIwJ1; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from snail.vger.email (snail.vger.email. [2620:137:e000::3:7]) by mx.google.com with ESMTPS id g123-20020a636b81000000b0056a55b14f2bsi25372006pgc.285.2023.10.02.00.34.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Oct 2023 00:34:42 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) client-ip=2620:137:e000::3:7; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=wBWMIwJ1; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by snail.vger.email (Postfix) with ESMTP id 4F2EC802A549; Sun, 1 Oct 2023 23:55:18 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at snail.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235610AbjJBGzF (ORCPT + 17 others); Mon, 2 Oct 2023 02:55:05 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34554 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235595AbjJBGy7 (ORCPT ); Mon, 2 Oct 2023 02:54:59 -0400 Received: from mail-wm1-x334.google.com (mail-wm1-x334.google.com [IPv6:2a00:1450:4864:20::334]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A0293E6 for ; Sun, 1 Oct 2023 23:54:55 -0700 (PDT) Received: by mail-wm1-x334.google.com with SMTP id 5b1f17b1804b1-40572aeb73cso131948595e9.3 for ; Sun, 01 Oct 2023 23:54:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1696229694; x=1696834494; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=aB4JTBbloeJlOrROqSHyOpiwaZu7mID8DECUoJEbjX8=; b=wBWMIwJ1VFgZRThuGT9U3A2QXJqZ4Mb3tjQVPqPez9sRl/xAWsS77UtozHiPmEMWUI tloLl3Kaxb9M6seLS8JIf7Zp+e5yTV9643EVbsqvsiR2MS2Q2Wj1rYKVAXxrjs97LgzR jTlo1d4uqDWwPHsDcYeSI6J359zSadKNOLbevVOaFtTvCay0nwuyJ9JGACYIA50GpaQm odQdw/l9ppUTNFbtNbudEVtJ2zSdGTFToGOcNOAoU97ZFnP1saN+gPB67jxil2lkHP8L XUSRUWAYMRdn2jelHNEMGAUx+DSTltmkrPtIDc7qblPnCsuz9pMi/GeaeBf+Ikm6CSA2 weWw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1696229694; x=1696834494; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=aB4JTBbloeJlOrROqSHyOpiwaZu7mID8DECUoJEbjX8=; b=uCwvnWLqubyA8rrG74Em8SJsf0D1Bbv8pCm2LKWWSA0oTVrB3FvvdVgWn1F8d1AnZJ OVKIcG8Vzbx794gC/+BSfmehSLdkv7j2uuO2+0Z+IG6x8m+wcq7yQ7t0h30DOdDo9sU7 dHkIY6M6Kn3SN35TMDts5SrLN17eF4ijkkOP2g+QQIbchTsE9kqnUa1Oxm1wRaG/V0VC aNxDas5wSLWk1WyGJC0OJD5LmDTL5dIj/SwA0Q5678vEqSwfQIr5k4OLwP06uhlG4Jec WYgx3bj7noI4P4Q67//GavQVzkhaeLF6cIU+7rj+g0CnYNWkllNdud/29LR4phnPhqmL jUGQ== X-Gm-Message-State: AOJu0YytHgzwfppQE5KcoQPA7OIx+a6OuSzqB9FsSmkH8wuC/1b9FGlg tRAsbO6d6Eg3TyUK/a11IZaplQ== X-Received: by 2002:a7b:cd85:0:b0:401:d803:624f with SMTP id y5-20020a7bcd85000000b00401d803624fmr9311059wmj.4.1696229694032; Sun, 01 Oct 2023 23:54:54 -0700 (PDT) Received: from arrakeen.starnux.net ([2a01:e0a:982:cbb0:52eb:f6ff:feb3:451a]) by smtp.gmail.com with ESMTPSA id 3-20020a05600c020300b004063cced50bsm6601815wmi.23.2023.10.01.23.54.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Oct 2023 23:54:53 -0700 (PDT) From: Neil Armstrong Date: Mon, 02 Oct 2023 08:54:47 +0200 Subject: [PATCH v7 4/4] Input: goodix-berlin - add SPI support for Goodix Berlin Touchscreen IC MIME-Version: 1.0 Message-Id: <20231002-topic-goodix-berlin-upstream-initial-v7-4-792fb91f5e88@linaro.org> References: <20231002-topic-goodix-berlin-upstream-initial-v7-0-792fb91f5e88@linaro.org> In-Reply-To: <20231002-topic-goodix-berlin-upstream-initial-v7-0-792fb91f5e88@linaro.org> To: Dmitry Torokhov Cc: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Bastien Nocera , Hans de Goede , Henrik Rydberg , Jeff LaBundy , linux-input@vger.kernel.org, linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Neil Armstrong X-Mailer: b4 0.12.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=8018; i=neil.armstrong@linaro.org; h=from:subject:message-id; bh=Qt+npl8i2OE+s8j4Ze03++ftzJ+qPlUeps9Tw1QwAkg=; b=owEBbQKS/ZANAwAKAXfc29rIyEnRAcsmYgBlGmk4wMV4BqHlgQSXmgf1Ii0uww1d2PtfuIdwfSSw kU1HKhaJAjMEAAEKAB0WIQQ9U8YmyFYF/h30LIt33NvayMhJ0QUCZRppOAAKCRB33NvayMhJ0ay+D/ 9bQZ6yeCbdJpHnWEYBeGL2jrUre3L4qV+ItLBHK3Ldxb9hNDXYhUb9fmz0GlMU87GSDntBiQ8225dh 8Ss0Ug7tlSz7f0TvBA7C6pqQ4c+JP8x2nchD6a3ASS7MWqyphQGMsksNdqFzO+9ZfhsVLtK93cKbHG 5aFvOcR7ZOOGPdhYF/tqrKSkPOgSqmQjq4izNvG0/lCLvqHZ2cBHpOBKzGK6+iCTA6l6sLlDsDsLn3 YiWc5UX6Koyfo0Mkzldr3QEY9/n3lrKCsIdzslmJFXqzJBiizDRjpE5SKgrwND1WUOSA/aWdLkviwO JTGSE7Z0cJ2zpCAcNCj3NfMqe38OjxEs4hnsgI2ZzAMNu9D0zvf7HkK/a3WS0msjPEGtuY1syk4hWq d6JEwc51L32+yrkbXDuImqwJJ0/EPu1rnWhdSMJ44+LVbckUIs7sZQceWQSDmqrwt8zzCRFKfBc92Y DBRyaQRCzNGuQo1TpNA4r/t999p4QP+WJu/08kFk4QdjqIiaakTrA3MRq6orFwoNDYNNf7t9ElWmIf svP+1tMjuBJXeSGRg2zON97FBik9IJ8l3dKenP1KnO+BJZ8eytG1qgHtjRCV3LxbifHL4AJPLn9aJr EjvwJa+l953lbz3xVmII+QbtSAYxAelJMHhyqRZcfbkVPEF55wLSBHUYlpMQ== X-Developer-Key: i=neil.armstrong@linaro.org; a=openpgp; fpr=89EC3D058446217450F22848169AB7B1A4CFF8AE X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS autolearn=unavailable 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-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (snail.vger.email [0.0.0.0]); Sun, 01 Oct 2023 23:55:18 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1778628252430672807 X-GMAIL-MSGID: 1778628252430672807 Add initial support for the new Goodix "Berlin" touchscreen ICs over the SPI interface. The driver doesn't use the regmap_spi code since the SPI messages needs to be prefixed, thus this custom regmap code. This initial driver is derived from the Goodix goodix_ts_berlin available at [1] and [2] and only supports the GT9916 IC present on the Qualcomm SM8550 MTP & QRD touch panel. The current implementation only supports BerlinD, aka GT9916. [1] https://github.com/goodix/goodix_ts_berlin [2] https://git.codelinaro.org/clo/la/platform/vendor/opensource/touch-drivers Reviewed-by: Jeff LaBundy Signed-off-by: Neil Armstrong --- drivers/input/touchscreen/Kconfig | 14 +++ drivers/input/touchscreen/Makefile | 1 + drivers/input/touchscreen/goodix_berlin_spi.c | 173 ++++++++++++++++++++++++++ 3 files changed, 188 insertions(+) diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig index cc7b88118158..c821fe3ee794 100644 --- a/drivers/input/touchscreen/Kconfig +++ b/drivers/input/touchscreen/Kconfig @@ -433,6 +433,20 @@ config TOUCHSCREEN_GOODIX_BERLIN_I2C To compile this driver as a module, choose M here: the module will be called goodix_berlin_i2c. +config TOUCHSCREEN_GOODIX_BERLIN_SPI + tristate "Goodix Berlin SPI touchscreen" + depends on SPI_MASTER + select REGMAP + select TOUCHSCREEN_GOODIX_BERLIN_CORE + help + Say Y here if you have a Goodix Berlin IC 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 goodix_berlin_spi. + config TOUCHSCREEN_HIDEEP tristate "HiDeep Touch IC" depends on I2C diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile index 7ef677cf7a10..a81cb5aa21a5 100644 --- a/drivers/input/touchscreen/Makefile +++ b/drivers/input/touchscreen/Makefile @@ -49,6 +49,7 @@ obj-$(CONFIG_TOUCHSCREEN_FUJITSU) += fujitsu_ts.o obj-$(CONFIG_TOUCHSCREEN_GOODIX) += goodix_ts.o obj-$(CONFIG_TOUCHSCREEN_GOODIX_BERLIN_CORE) += goodix_berlin_core.o obj-$(CONFIG_TOUCHSCREEN_GOODIX_BERLIN_I2C) += goodix_berlin_i2c.o +obj-$(CONFIG_TOUCHSCREEN_GOODIX_BERLIN_SPI) += goodix_berlin_spi.o obj-$(CONFIG_TOUCHSCREEN_HIDEEP) += hideep.o obj-$(CONFIG_TOUCHSCREEN_HYNITRON_CSTXXX) += hynitron_cstxxx.o obj-$(CONFIG_TOUCHSCREEN_ILI210X) += ili210x.o diff --git a/drivers/input/touchscreen/goodix_berlin_spi.c b/drivers/input/touchscreen/goodix_berlin_spi.c new file mode 100644 index 000000000000..1f57c3592918 --- /dev/null +++ b/drivers/input/touchscreen/goodix_berlin_spi.c @@ -0,0 +1,173 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Goodix Berlin Touchscreen Driver + * + * Copyright (C) 2020 - 2021 Goodix, Inc. + * Copyright (C) 2023 Linaro Ltd. + * + * Based on goodix_ts_berlin driver. + */ +#include +#include +#include +#include +#include + +#include "goodix_berlin.h" + +#define GOODIX_BERLIN_SPI_TRANS_PREFIX_LEN 1 +#define GOODIX_BERLIN_REGISTER_WIDTH 4 +#define GOODIX_BERLIN_SPI_READ_DUMMY_LEN 3 +#define GOODIX_BERLIN_SPI_READ_PREFIX_LEN (GOODIX_BERLIN_SPI_TRANS_PREFIX_LEN + \ + GOODIX_BERLIN_REGISTER_WIDTH + \ + GOODIX_BERLIN_SPI_READ_DUMMY_LEN) +#define GOODIX_BERLIN_SPI_WRITE_PREFIX_LEN (GOODIX_BERLIN_SPI_TRANS_PREFIX_LEN + \ + GOODIX_BERLIN_REGISTER_WIDTH) + +#define GOODIX_BERLIN_SPI_WRITE_FLAG 0xF0 +#define GOODIX_BERLIN_SPI_READ_FLAG 0xF1 + +static int goodix_berlin_spi_read(void *context, const void *reg_buf, + size_t reg_size, void *val_buf, + size_t val_size) +{ + struct spi_device *spi = context; + struct spi_transfer xfers; + struct spi_message spi_msg; + const u32 *reg = reg_buf; /* reg is stored as native u32 at start of buffer */ + u8 *buf; + int error; + + if (reg_size != GOODIX_BERLIN_REGISTER_WIDTH) + return -EINVAL; + + buf = kzalloc(GOODIX_BERLIN_SPI_READ_PREFIX_LEN + val_size, GFP_KERNEL); + if (!buf) + return -ENOMEM; + + spi_message_init(&spi_msg); + memset(&xfers, 0, sizeof(xfers)); + + /* buffer format: 0xF1 + addr(4bytes) + dummy(3bytes) + data */ + buf[0] = GOODIX_BERLIN_SPI_READ_FLAG; + put_unaligned_be32(*reg, buf + GOODIX_BERLIN_SPI_TRANS_PREFIX_LEN); + memset(buf + GOODIX_BERLIN_SPI_TRANS_PREFIX_LEN + GOODIX_BERLIN_REGISTER_WIDTH, + 0xff, GOODIX_BERLIN_SPI_READ_DUMMY_LEN); + + xfers.tx_buf = buf; + xfers.rx_buf = buf; + xfers.len = GOODIX_BERLIN_SPI_READ_PREFIX_LEN + val_size; + xfers.cs_change = 0; + spi_message_add_tail(&xfers, &spi_msg); + + error = spi_sync(spi, &spi_msg); + if (error < 0) + dev_err(&spi->dev, "spi transfer error, %d", error); + else + memcpy(val_buf, buf + GOODIX_BERLIN_SPI_READ_PREFIX_LEN, val_size); + + kfree(buf); + return error; +} + +static int goodix_berlin_spi_write(void *context, const void *data, + size_t count) +{ + unsigned int len = count - GOODIX_BERLIN_REGISTER_WIDTH; + struct spi_device *spi = context; + struct spi_transfer xfers; + struct spi_message spi_msg; + const u32 *reg = data; /* reg is stored as native u32 at start of buffer */ + u8 *buf; + int error; + + buf = kzalloc(GOODIX_BERLIN_SPI_WRITE_PREFIX_LEN + len, GFP_KERNEL); + if (!buf) + return -ENOMEM; + + spi_message_init(&spi_msg); + memset(&xfers, 0, sizeof(xfers)); + + buf[0] = GOODIX_BERLIN_SPI_WRITE_FLAG; + put_unaligned_be32(*reg, buf + GOODIX_BERLIN_SPI_TRANS_PREFIX_LEN); + memcpy(buf + GOODIX_BERLIN_SPI_WRITE_PREFIX_LEN, + data + GOODIX_BERLIN_REGISTER_WIDTH, len); + + xfers.tx_buf = buf; + xfers.len = GOODIX_BERLIN_SPI_WRITE_PREFIX_LEN + len; + xfers.cs_change = 0; + spi_message_add_tail(&xfers, &spi_msg); + + error = spi_sync(spi, &spi_msg); + if (error < 0) + dev_err(&spi->dev, "spi transfer error, %d", error); + + kfree(buf); + return error; +} + +static const struct regmap_config goodix_berlin_spi_regmap_conf = { + .reg_bits = 32, + .val_bits = 8, + .read = goodix_berlin_spi_read, + .write = goodix_berlin_spi_write, +}; + +/* vendor & product left unassigned here, should probably be updated from fw info */ +static const struct input_id goodix_berlin_spi_input_id = { + .bustype = BUS_SPI, +}; + +static int goodix_berlin_spi_probe(struct spi_device *spi) +{ + struct regmap_config regmap_config; + struct regmap *regmap; + size_t max_size; + int error = 0; + + spi->mode = SPI_MODE_0; + spi->bits_per_word = 8; + error = spi_setup(spi); + if (error) + return error; + + max_size = spi_max_transfer_size(spi); + + regmap_config = goodix_berlin_spi_regmap_conf; + regmap_config.max_raw_read = max_size - GOODIX_BERLIN_SPI_READ_PREFIX_LEN; + regmap_config.max_raw_write = max_size - GOODIX_BERLIN_SPI_WRITE_PREFIX_LEN; + + regmap = devm_regmap_init(&spi->dev, NULL, spi, ®map_config); + if (IS_ERR(regmap)) + return PTR_ERR(regmap); + + return goodix_berlin_probe(&spi->dev, spi->irq, + &goodix_berlin_spi_input_id, regmap); +} + +static const struct spi_device_id goodix_berlin_spi_ids[] = { + { "gt9916" }, + { }, +}; +MODULE_DEVICE_TABLE(spi, goodix_berlin_spi_ids); + +static const struct of_device_id goodix_berlin_spi_of_match[] = { + { .compatible = "goodix,gt9916", }, + { } +}; +MODULE_DEVICE_TABLE(of, goodix_berlin_spi_of_match); + +static struct spi_driver goodix_berlin_spi_driver = { + .driver = { + .name = "goodix-berlin-spi", + .of_match_table = goodix_berlin_spi_of_match, + .pm = pm_sleep_ptr(&goodix_berlin_pm_ops), + }, + .probe = goodix_berlin_spi_probe, + .id_table = goodix_berlin_spi_ids, +}; +module_spi_driver(goodix_berlin_spi_driver); + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Goodix Berlin SPI Touchscreen driver"); +MODULE_AUTHOR("Neil Armstrong ");