From patchwork Fri Apr 14 23:38:14 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Jiri Valek - 2N X-Patchwork-Id: 83585 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp727425vqo; Fri, 14 Apr 2023 16:44:52 -0700 (PDT) X-Google-Smtp-Source: AKy350Y0pLb2ZfKDxRdFmJpXrpJ6+RVyJybvjtwK9Ro08wYi8tvadq3YMMMEpOBnwWm4Beajqz6v X-Received: by 2002:a17:90a:e642:b0:23f:2d2c:abcc with SMTP id ep2-20020a17090ae64200b0023f2d2cabccmr7515795pjb.9.1681515891860; Fri, 14 Apr 2023 16:44:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1681515891; cv=none; d=google.com; s=arc-20160816; b=eMHORWUenzNBEZ5AS+nQT+cFzgA8Z76ClzvRl9Xu4+ZIi73jY4QS5LLSs37nQYaWEH R54d9/d2Pn5I02opyaQsOC+9Q1XoZJKz0TQrwvGH8kFsg+SaoXJOKgmJc2O4N+J/vUDZ u/OdQGPRN/3iua5XW9jXBFj8+gmFXt7YRgnTp8lP+LO1FvQxcWjIdbGL9mWLJV1jIRcS LUqv5QK0V+UBgawiXdG4y5YiQ1xqnFdrXgCkI32bSOw27gvHGKX3MSIdxZrAlGexi3i2 PHB4g3kzwAz0UougVyzRKoLUw+HvBjJjj5VHBskhnGpiYgDtyXsEn2g9uYnPOK8kXDi1 udfg== 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=SpLMjeGM/opNypIBwbbL34Zq2CgvgZH99FHYABysyCM=; b=gmYmwjcrHhjwYf3NddTlmGt5hyuLZxR5yhUrgbsHn5GS6NAjxBUH8Vv92XfoRh4gNY 0JbCosdauQmoogW5L4qjdN9pN8fBd2alW6WrIRF6I7eKo4Vs/tin1VtXT4es/Lyg063l nYT0hdlU+sFAu56elNKBRjEoZ5x3+CjEnGMjCOyenlpyojEeOHiAQhj0MP+/M+biLFEI /kx5PdW8HmUNerQwEcCIxdfZz7lMyXSIHMi7+MRthD5+bmBjxa0Q2xYaTEQD2EMSOxy6 CgFwwdxqfxlWdYSBZhJq16SWwayoYth8emjhwARc92rILnXU60A7EJCwJhMvS8VjUxNl M+sA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass (test mode) header.i=@axis.com header.s=axis-central1 header.b="k7Nfc/x/"; 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=axis.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id z19-20020a63e113000000b00518b499da4csi5737945pgh.71.2023.04.14.16.44.36; Fri, 14 Apr 2023 16:44:51 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass (test mode) header.i=@axis.com header.s=axis-central1 header.b="k7Nfc/x/"; 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=axis.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229749AbjDNXi4 (ORCPT + 99 others); Fri, 14 Apr 2023 19:38:56 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52404 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229464AbjDNXix (ORCPT ); Fri, 14 Apr 2023 19:38:53 -0400 Received: from smtp1.axis.com (smtp1.axis.com [195.60.68.17]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7BA79526E; Fri, 14 Apr 2023 16:38:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=axis.com; q=dns/txt; s=axis-central1; t=1681515532; x=1713051532; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=SpLMjeGM/opNypIBwbbL34Zq2CgvgZH99FHYABysyCM=; b=k7Nfc/x/6cRH72h9fg7JCb+jKF4vbeCGPsO/7eWfv6FTt0uw0aO4mgJI yoLZO3mF98guuvaEZRIOIJD7HoQElDo8ptaYzV37AmyeyJYhY5EtAGm41 Vgv0FIGZtlzsXHYnxB35sEPN0An6wninEJh14HSAZAcs6oQcCNj5TF1JQ FykzngC757S8BVPsaU9ahY6Dq8iha3DgBBc+O0z/x76kWQCAizS4I1Psl oOYRAjcoYEm+Fct5sBuvH04tKeDuWLgaV6/MrieeFsbXW4OjYG9CVsGJj IJCq+mmsr3e2mTCGRWu5hvjEF7WO6pqZA9SqQ3LhElqvGSQDvIIZ7n58H A==; From: Jiri Valek - 2N To: , CC: , , , , , Subject: [PATCH 1/2] dt-bindings: input: microchip,cap11xx: add advanced sensitivity settings Date: Sat, 15 Apr 2023 01:38:14 +0200 Message-ID: <20230414233815.4004526-2-jiriv@axis.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230414233815.4004526-1-jiriv@axis.com> References: <20230414233815.4004526-1-jiriv@axis.com> MIME-Version: 1.0 X-Originating-IP: [10.0.5.60] X-ClientProxiedBy: se-mail02w.axis.com (10.20.40.8) To se-mail01w.axis.com (10.20.40.7) X-Spam-Status: No, score=-4.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, RCVD_IN_DNSWL_MED,SPF_HELO_PASS,SPF_PASS,T_SCC_BODY_TEXT_LINE 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?1763197208198398744?= X-GMAIL-MSGID: =?utf-8?q?1763197208198398744?= Add support for advanced sensitivity settings and signal guard feature. Signed-off-by: Jiri Valek - 2N --- .../bindings/input/microchip,cap11xx.yaml | 64 ++++++++++++++++++- 1 file changed, 61 insertions(+), 3 deletions(-) diff --git a/Documentation/devicetree/bindings/input/microchip,cap11xx.yaml b/Documentation/devicetree/bindings/input/microchip,cap11xx.yaml index 5fa625b5c5fb..08e28226a164 100644 --- a/Documentation/devicetree/bindings/input/microchip,cap11xx.yaml +++ b/Documentation/devicetree/bindings/input/microchip,cap11xx.yaml @@ -45,13 +45,13 @@ properties: Enables the Linux input system's autorepeat feature on the input device. linux,keycodes: - minItems: 6 - maxItems: 6 + minItems: 3 + maxItems: 8 description: | Specifies an array of numeric keycode values to be used for the channels. If this property is omitted, KEY_A, KEY_B, etc are used as defaults. - The array must have exactly six entries. + The number of entries must correspond to the number of channels. microchip,sensor-gain: $ref: /schemas/types.yaml#/definitions/uint32 @@ -70,6 +70,58 @@ properties: open drain. This property allows using the active high push-pull output. + microchip,sensitivity-delta-sense: + $ref: /schemas/types.yaml#/definitions/uint32 + default: 32 + enum: [1, 2, 4, 8, 16, 32, 64, 128] + description: | + Optional parameter. Controls the sensitivity multiplier of a touch detection. + At the more sensitive settings, touches are detected for a smaller delta + capacitance corresponding to a “lighter” touch. + + microchip,sensitivity-base-shift: + $ref: /schemas/types.yaml#/definitions/uint32 + default: 256 + enum: [1, 2, 4, 8, 16, 32, 64, 128, 256] + description: | + Optional parameter. Controls data scaling factor. + The higher the value of these bits, the larger the range and the lower + the resolution of the data presented. These settings will not affect + touch detection or sensitivity. + + microchip,signal-guard: + minItems: 3 + maxItems: 8 + enum: [0, 1] + default: 0 + description: | + Optional parameter supported only for CAP129x. + The signal guard isolates the signal from virtual grounds. + If enabled then the behavior of the channel is changed to signal guard. + The number of entries must correspond to the number of channels. + + microchip,input-treshold: + minItems: 3 + maxItems: 8 + minimum: 0 + maximum: 127 + default: 64 + description: | + Optional parameter. Specifies the delta threshold that is used to + determine if a touch has been detected. + The number of entries must correspond to the number of channels. + + microchip,calib-sensitivity: + minItems: 3 + maxItems: 8 + enum: [1, 2, 4] + default: 1 + description: | + Optional parameter supported only for CAP129x. Specifies an array of + numeric values that controls the gain used by the calibration routine to + enable sensor inputs to be more sensitive for proximity detection. + The number of entries must correspond to the number of channels. + patternProperties: "^led@[0-7]$": type: object @@ -122,6 +174,12 @@ examples: reg = <0x28>; autorepeat; microchip,sensor-gain = <2>; + microchip,sensitivity-delta-sense = <16>; + microchip,sensitivity-base-shift = <128>; + + microchip,signal-guard = <0>, <0>, <0>, <0>, <0>, <0>; + microchip,input-treshold = <21>, <18>, <46>, <46>, <46>, <21>; + microchip,calib-sensitivityj = <1>, <2>, <2>, <1>, <1>, <2>; linux,keycodes = <103>, /* KEY_UP */ <106>, /* KEY_RIGHT */ From patchwork Fri Apr 14 23:38:15 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Valek - 2N X-Patchwork-Id: 83617 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp741280vqo; Fri, 14 Apr 2023 17:20:35 -0700 (PDT) X-Google-Smtp-Source: AKy350bE2lXhok+ANF5hqBmNuNZJ4yCWA7U0nPMMvlExx2rO4SP+lRvcEAInfGBTXsDyJk8uwSle X-Received: by 2002:a17:90a:f310:b0:246:9bad:2354 with SMTP id ca16-20020a17090af31000b002469bad2354mr7340482pjb.43.1681518034991; Fri, 14 Apr 2023 17:20:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1681518034; cv=none; d=google.com; s=arc-20160816; b=sb5yAbuY6i+t66Ecroya2RLms9dAB3v2SOZ1+ks3ZHeccxRVTye/VY4n+rVZnA00dc OctkQrynuPTpjEF5JueOuv5J2RzmHr0O9+l5iO+69UXoiFzmPk8FLG8nLEcKHuUP+PsO nOFJgt+yFk5ui1cX2f7is6i07YIt22TZ60/XaZb/jYQ0EOVpio18jr2D5+QcXcAgqNZl OvbmnaKZYV7F1DiFc6Z+SElhGHEtRE/IB0q9ggdbb8bUgXtyhC6DqtBS/i/6LBe2eeDX gZSVhf+6gCWYqdgOA2gK96ywkgdkqLgIOvFWthKSRH8dFqRZfJHEV8tfh/qYt5264vpR EyKg== 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=6QIxtJ/MY1fTBU4VbKkd3bP6Ke+kH+7tOPWORRgbwss=; b=HspO5/N8eQQ+Bwwrb9fpaCj5FjBdgvOtu4FFmjRN6u9LhK2dg9ZgLYoIVtaFglDvlC rVyleMnDpeilr2/elBgZ8fqKVZDMaXu9SMlEY1aBx8pfUSZJ66+sUxYs+7BFNiVY1I8v u5g3n/VmKexVe+Gx0Gho7Xl1y4yQwoZSLrQgQqFWesUS3qW6R6MJFhFqPuxNYe9rHCsP GJif+7WNPkkq/IdSRetvxscV7piVH37M2Ep8dLNEq1BD11yHpJ2Zq+i5num1NDghifuS fB6W76wbFPEGRdm877QiFX1QkrJYKIBYLtsTKWGuP3ImRu76lPwupOuTadywf60Fog0b cCzw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass (test mode) header.i=@axis.com header.s=axis-central1 header.b="fY5zqx/A"; 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=axis.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id hk11-20020a17090b224b00b0022387a1f9a5si6359400pjb.134.2023.04.14.17.20.20; Fri, 14 Apr 2023 17:20:34 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass (test mode) header.i=@axis.com header.s=axis-central1 header.b="fY5zqx/A"; 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=axis.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229791AbjDNXi6 (ORCPT + 99 others); Fri, 14 Apr 2023 19:38:58 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52406 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229638AbjDNXiy (ORCPT ); Fri, 14 Apr 2023 19:38:54 -0400 Received: from smtp2.axis.com (smtp2.axis.com [195.60.68.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 16F70558B; Fri, 14 Apr 2023 16:38:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=axis.com; q=dns/txt; s=axis-central1; t=1681515533; x=1713051533; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=6QIxtJ/MY1fTBU4VbKkd3bP6Ke+kH+7tOPWORRgbwss=; b=fY5zqx/Apfu1+6mh8UFt67+iQBrwqAvvpukAqmhhU52iszNhLF06TcIj XtEj2CQgRnbBNz/OVifr6S3fsuve68hE447ZFEuCtea9M90dQ9iMA5Dd/ wCjSi4t5vbE0gweIGi+/jGmf7l69z6dCZpw4vLVeEfHKHT5c955/7qRNM m9s5cGOI95kFyvNE/fLpsb4LtUqzvtZwGrfPgTyLN6QQKTbpqMjLTWocU 2s8wt5cQ3uVYt1mIhPCa6Qeavy1pr0+gsMF//4tdWHTSXVjOI6V6RkDpq bsbzhld2uKr7GXJYmSU2VuYFRtEJE1HC079gygFjZSawB55OGPW8H2yaN Q==; From: Jiri Valek - 2N To: , CC: , , , , , Subject: [PATCH 2/2] Input: cap11xx - add advanced sensitivity settings Date: Sat, 15 Apr 2023 01:38:15 +0200 Message-ID: <20230414233815.4004526-3-jiriv@axis.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230414233815.4004526-1-jiriv@axis.com> References: <20230414233815.4004526-1-jiriv@axis.com> MIME-Version: 1.0 X-Originating-IP: [10.0.5.60] X-ClientProxiedBy: se-mail02w.axis.com (10.20.40.8) To se-mail01w.axis.com (10.20.40.7) X-Spam-Status: No, score=-4.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, RCVD_IN_DNSWL_MED,SPF_HELO_PASS,SPF_PASS,T_SCC_BODY_TEXT_LINE 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?1763199455038660819?= X-GMAIL-MSGID: =?utf-8?q?1763199455038660819?= Add support for advanced sensitivity settings that allows more precise tunig of touch buttons. Input-treshold allows to set the sensitivity for each channel separately. Also add signal guard feature for CAP129x chips. Signed-off-by: Jiri Valek - 2N --- drivers/input/keyboard/cap11xx.c | 263 +++++++++++++++++++++++++------ 1 file changed, 217 insertions(+), 46 deletions(-) diff --git a/drivers/input/keyboard/cap11xx.c b/drivers/input/keyboard/cap11xx.c index 040696d0e49c..d387754e76f5 100644 --- a/drivers/input/keyboard/cap11xx.c +++ b/drivers/input/keyboard/cap11xx.c @@ -14,6 +14,7 @@ #include #include #include +#include #define CAP11XX_REG_MAIN_CONTROL 0x00 #define CAP11XX_REG_MAIN_CONTROL_GAIN_SHIFT (6) @@ -24,6 +25,8 @@ #define CAP11XX_REG_NOISE_FLAG_STATUS 0x0a #define CAP11XX_REG_SENOR_DELTA(X) (0x10 + (X)) #define CAP11XX_REG_SENSITIVITY_CONTROL 0x1f +#define CAP11XX_REG_SENSITIVITY_CONTROL_DELTA_SENSE_MASK 0x70 +#define CAP11XX_REG_SENSITIVITY_CONTROL_BASE_SHIFT_MASK 0x0F #define CAP11XX_REG_CONFIG 0x20 #define CAP11XX_REG_SENSOR_ENABLE 0x21 #define CAP11XX_REG_SENSOR_CONFIG 0x22 @@ -32,6 +35,7 @@ #define CAP11XX_REG_CALIBRATION 0x26 #define CAP11XX_REG_INT_ENABLE 0x27 #define CAP11XX_REG_REPEAT_RATE 0x28 +#define CAP11XX_REG_SIGNAL_GUARD_ENABLE 0x29 #define CAP11XX_REG_MT_CONFIG 0x2a #define CAP11XX_REG_MT_PATTERN_CONFIG 0x2b #define CAP11XX_REG_MT_PATTERN 0x2d @@ -47,6 +51,8 @@ #define CAP11XX_REG_SENSOR_BASE_CNT(X) (0x50 + (X)) #define CAP11XX_REG_LED_POLARITY 0x73 #define CAP11XX_REG_LED_OUTPUT_CONTROL 0x74 +#define CAP11XX_REG_CALIB_SENSITIVITY_CONFIG 0x80 +#define CAP11XX_REG_CALIB_SENSITIVITY_CONFIG2 0x81 #define CAP11XX_REG_LED_DUTY_CYCLE_1 0x90 #define CAP11XX_REG_LED_DUTY_CYCLE_2 0x91 @@ -78,12 +84,21 @@ struct cap11xx_led { struct cap11xx_priv { struct regmap *regmap; + struct device *dev; struct input_dev *idev; + const struct cap11xx_hw_model *model; + u8 id; struct cap11xx_led *leds; int num_leds; /* config */ + u8 analog_gain; + u8 sensitivity_delta_sense; + u8 sensitivity_base_shift; + u8 signal_guard_inputs_mask; + u32 thresholds[8]; + u32 calib_sensitivities[8]; u32 keycodes[]; }; @@ -181,6 +196,197 @@ static const struct regmap_config cap11xx_regmap_config = { .volatile_reg = cap11xx_volatile_reg, }; +static int +cap11xx_write_calib_sens_config_1(struct cap11xx_priv *priv) +{ + return regmap_write(priv->regmap, + CAP11XX_REG_CALIB_SENSITIVITY_CONFIG, + (priv->calib_sensitivities[3] << 6) | + (priv->calib_sensitivities[2] << 4) | + (priv->calib_sensitivities[1] << 2) | + priv->calib_sensitivities[0]); +} + +static int +cap11xx_write_calib_sens_config_2(struct cap11xx_priv *priv) +{ + return regmap_write(priv->regmap, + CAP11XX_REG_CALIB_SENSITIVITY_CONFIG2, + (priv->calib_sensitivities[7] << 6) | + (priv->calib_sensitivities[6] << 4) | + (priv->calib_sensitivities[5] << 2) | + priv->calib_sensitivities[4]); +} + +static int +cap11xx_init_keys(struct cap11xx_priv *priv) +{ + struct device_node *node = priv->dev->of_node; + struct device *dev = priv->dev; + int i, error; + u32 u32_val; + + if (!node) { + dev_err(dev, "Corresponding DT entry is not available\n"); + return -ENODEV; + } + + if (!of_property_read_u32(node, "microchip,sensor-gain", &u32_val)) { + if (priv->model->no_gain) { + dev_warn(dev, + "This model doesn't support 'sensor-gain'\n"); + } else if (is_power_of_2(u32_val) && u32_val <= 8) { + priv->analog_gain = (u8)ilog2(u32_val); + + error = regmap_update_bits(priv->regmap, + CAP11XX_REG_MAIN_CONTROL, + CAP11XX_REG_MAIN_CONTROL_GAIN_MASK, + priv->analog_gain << CAP11XX_REG_MAIN_CONTROL_GAIN_SHIFT); + if (error) + return error; + } else { + dev_err(dev, "Invalid sensor-gain value %u\n", u32_val); + return -EINVAL; + } + } + + if (of_property_read_bool(node, "microchip,irq-active-high")) { + if (priv->id == CAP1106 || + priv->id == CAP1126 || + priv->id == CAP1188) { + error = regmap_update_bits(priv->regmap, + CAP11XX_REG_CONFIG2, + CAP11XX_REG_CONFIG2_ALT_POL, + 0); + if (error) + return error; + } else { + dev_warn(dev, + "This model doesn't support 'irq-active-high'\n"); + } + } + + if (!of_property_read_u32(node, + "microchip,sensitivity-delta-sense", &u32_val)) { + if (!is_power_of_2(u32_val) || u32_val > 128) { + dev_err(dev, "Invalid sensitivity-delta-sense value %u\n", u32_val); + return -EINVAL; + } + + priv->sensitivity_delta_sense = (u8)ilog2(u32_val); + u32_val = ~(FIELD_PREP(CAP11XX_REG_SENSITIVITY_CONTROL_DELTA_SENSE_MASK, + priv->sensitivity_delta_sense)); + + error = regmap_update_bits(priv->regmap, + CAP11XX_REG_SENSITIVITY_CONTROL, + CAP11XX_REG_SENSITIVITY_CONTROL_DELTA_SENSE_MASK, + u32_val); + if (error) + return error; + } + + if (!of_property_read_u32(node, + "microchip,sensitivity-base-shift", &u32_val)) { + if (!is_power_of_2(u32_val) || u32_val > 256) { + dev_err(dev, "Invalid sensitivity-base-shift value %u\n", u32_val); + return -EINVAL; + } + + priv->sensitivity_base_shift = (u8)ilog2(u32_val); + u32_val = FIELD_PREP(CAP11XX_REG_SENSITIVITY_CONTROL_BASE_SHIFT_MASK, + priv->sensitivity_base_shift); + + error = regmap_update_bits(priv->regmap, + CAP11XX_REG_SENSITIVITY_CONTROL, + CAP11XX_REG_SENSITIVITY_CONTROL_BASE_SHIFT_MASK, + u32_val); + if (error) + return error; + } + + if (!of_property_read_u32_array(node, "microchip,input-treshold", + priv->thresholds, priv->model->num_channels)) { + for (i = 0; i < priv->model->num_channels; i++) { + if (priv->thresholds[i] > 127) { + dev_err(dev, "Invalid input-treshold value %u\n", + priv->thresholds[i]); + return -EINVAL; + } + + error = regmap_write(priv->regmap, + CAP11XX_REG_SENSOR_THRESH(i), + priv->thresholds[i]); + if (error) + return error; + } + } + + if (!of_property_read_u32_array(node, "microchip,calib-sensitivity", + priv->calib_sensitivities, priv->model->num_channels)) { + if (priv->id == CAP1293 || priv->id == CAP1298) { + for (i = 0; i < priv->model->num_channels; i++) { + if (!is_power_of_2(priv->calib_sensitivities[i]) || + priv->calib_sensitivities[i] > 4) { + dev_err(dev, "Invalid calib-sensitivity value %u\n", + priv->calib_sensitivities[i]); + return -EINVAL; + } + priv->calib_sensitivities[i] = ilog2(priv->calib_sensitivities[i]); + } + + error = cap11xx_write_calib_sens_config_1(priv); + if (error) + return error; + + if (priv->id == CAP1298) { + error = cap11xx_write_calib_sens_config_2(priv); + if (error) + return error; + } + } else { + dev_warn(dev, + "This model doesn't support 'calib-sensitivity'\n"); + } + } + + for (i = 0; i < priv->model->num_channels; i++) { + if (!of_property_read_u32_index(node, "microchip,signal-guard", + i, &u32_val)) { + if (u32_val > 1) + return -EINVAL; + if (u32_val) + priv->signal_guard_inputs_mask |= 0x01 << i; + } + } + + if (priv->signal_guard_inputs_mask) { + if (priv->id == CAP1293 || priv->id == CAP1298) { + error = regmap_write(priv->regmap, + CAP11XX_REG_SIGNAL_GUARD_ENABLE, + priv->signal_guard_inputs_mask); + if (error) + return error; + } else { + dev_warn(dev, + "This model doesn't support 'signal-guard'\n"); + } + } + + /* Provide some useful defaults */ + for (i = 0; i < priv->model->num_channels; i++) + priv->keycodes[i] = KEY_A + i; + + of_property_read_u32_array(node, "linux,keycodes", + priv->keycodes, priv->model->num_channels); + + /* Disable autorepeat. The Linux input system has its own handling. */ + error = regmap_write(priv->regmap, CAP11XX_REG_REPEAT_RATE, 0); + if (error) + return error; + + return 0; +} + static irqreturn_t cap11xx_thread_func(int irq_num, void *data) { struct cap11xx_priv *priv = data; @@ -332,11 +538,9 @@ static int cap11xx_i2c_probe(struct i2c_client *i2c_client) const struct i2c_device_id *id = i2c_client_get_device_id(i2c_client); struct device *dev = &i2c_client->dev; struct cap11xx_priv *priv; - struct device_node *node; const struct cap11xx_hw_model *cap; - int i, error, irq, gain = 0; + int i, error, irq; unsigned int val, rev; - u32 gain32; if (id->driver_data >= ARRAY_SIZE(cap11xx_devices)) { dev_err(dev, "Invalid device ID %lu\n", id->driver_data); @@ -355,6 +559,8 @@ static int cap11xx_i2c_probe(struct i2c_client *i2c_client) if (!priv) return -ENOMEM; + priv->dev = dev; + priv->regmap = devm_regmap_init_i2c(i2c_client, &cap11xx_regmap_config); if (IS_ERR(priv->regmap)) return PTR_ERR(priv->regmap); @@ -384,50 +590,15 @@ static int cap11xx_i2c_probe(struct i2c_client *i2c_client) return error; dev_info(dev, "CAP11XX detected, model %s, revision 0x%02x\n", - id->name, rev); - node = dev->of_node; - - if (!of_property_read_u32(node, "microchip,sensor-gain", &gain32)) { - if (cap->no_gain) - dev_warn(dev, - "This version doesn't support sensor gain\n"); - else if (is_power_of_2(gain32) && gain32 <= 8) - gain = ilog2(gain32); - else - dev_err(dev, "Invalid sensor-gain value %d\n", gain32); - } + id->name, rev); - if (id->driver_data == CAP1106 || - id->driver_data == CAP1126 || - id->driver_data == CAP1188) { - if (of_property_read_bool(node, "microchip,irq-active-high")) { - error = regmap_update_bits(priv->regmap, - CAP11XX_REG_CONFIG2, - CAP11XX_REG_CONFIG2_ALT_POL, - 0); - if (error) - return error; - } - } + priv->model = cap; + priv->id = id->driver_data; - /* Provide some useful defaults */ - for (i = 0; i < cap->num_channels; i++) - priv->keycodes[i] = KEY_A + i; - - of_property_read_u32_array(node, "linux,keycodes", - priv->keycodes, cap->num_channels); - - if (!cap->no_gain) { - error = regmap_update_bits(priv->regmap, - CAP11XX_REG_MAIN_CONTROL, - CAP11XX_REG_MAIN_CONTROL_GAIN_MASK, - gain << CAP11XX_REG_MAIN_CONTROL_GAIN_SHIFT); - if (error) - return error; - } + dev_info(dev, "CAP11XX device detected, model %s, revision 0x%02x\n", + id->name, rev); - /* Disable autorepeat. The Linux input system has its own handling. */ - error = regmap_write(priv->regmap, CAP11XX_REG_REPEAT_RATE, 0); + error = cap11xx_init_keys(priv); if (error) return error; @@ -439,7 +610,7 @@ static int cap11xx_i2c_probe(struct i2c_client *i2c_client) priv->idev->id.bustype = BUS_I2C; priv->idev->evbit[0] = BIT_MASK(EV_KEY); - if (of_property_read_bool(node, "autorepeat")) + if (of_property_read_bool(dev->of_node, "autorepeat")) __set_bit(EV_REP, priv->idev->evbit); for (i = 0; i < cap->num_channels; i++) @@ -474,7 +645,7 @@ static int cap11xx_i2c_probe(struct i2c_client *i2c_client) if (error) return error; - irq = irq_of_parse_and_map(node, 0); + irq = irq_of_parse_and_map(dev->of_node, 0); if (!irq) { dev_err(dev, "Unable to parse or map IRQ\n"); return -ENXIO;