From patchwork Mon Jun 26 13:00:05 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: 112942 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp7468057vqr; Mon, 26 Jun 2023 06:06:44 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ4lM1TMvnaKczZJLdDiPgVLZHrKISj9lGSmTlxb2ndqoIO2o2aYez+HxkL1yK93QZuBdjPx X-Received: by 2002:a17:907:36c3:b0:988:fa98:2e7f with SMTP id bj3-20020a17090736c300b00988fa982e7fmr16188989ejc.38.1687784804243; Mon, 26 Jun 2023 06:06:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1687784804; cv=none; d=google.com; s=arc-20160816; b=N+/UAp0BP2v67GAqwJGBKJQfiJDJWs209i8Xx0vVQ+fh3fpNcxHxcEQHgX8hF6PaX+ ZLptMPOtYvzYX//Z4j/JydMHoQfZM0AALgyNodpiOHJUZgC2SUcGqMwbhN3pI5vIe9xv 87FHDV46rrFhbUs155GYEcnLrs2Z9G8D2ZlxgKHNNpo/1WdQffwoIuQR/7CNljxx+1sC +l5pV3lKtCDbxWX1YmU9n+iHsMFf3d2uI6cAjeOV1/izcK1vyYpPYCaMwdp1I7FBCgtu 22sqWPFUiUCdluyfh0cPrglvkYtY7ws2q8Ws5gXHK/gkOXNnUJOX7auKrhBDH+nMYU6k TUTw== 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=fchfhPBiXhNezCICPouexBXBWF7mmavFQ5pd/NEGqXA=; fh=BzO1TmygyCyLOwLJ2Ae6kNMUtQa51KA7FJAUgZkJj4w=; b=oSUJ4vDrUisKpuhQlmdzm15J/klGRktn2qkrFUBq3Q1nlW2q/mRX5qb0uqFCRLnw1V fjEms62rFus9dr3gylICB5Mor7za9IGUT+/+04MqtTW7UT/HXKwucdMPlqH6i0bc9950 0clx+TY98T1ZC1aWBrsyGE3skLkTnLP8dnAY01mA++OTqPA73yxE75tsW18OOm1f60cS fQq2KZ8QRmILCogytIqilTc3Qyh/vzCiW4fkW9HHoonA+orPK6L1+AKjyTepAnIB2Egw IokxrHdrViiDPY9kDKTfp1OaaMsKtOxoM7WcbgmtDT4T/wuI/HcVUjMHZzyT/K1IYj2q blcQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass (test mode) header.i=@axis.com header.s=axis-central1 header.b=ECPHtS+Z; 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 s23-20020a1709066c9700b0098896420108si2888294ejr.170.2023.06.26.06.06.16; Mon, 26 Jun 2023 06:06:44 -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=ECPHtS+Z; 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 S230280AbjFZNAZ (ORCPT + 99 others); Mon, 26 Jun 2023 09:00:25 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50608 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229562AbjFZNAV (ORCPT ); Mon, 26 Jun 2023 09:00:21 -0400 Received: from smtp2.axis.com (smtp2.axis.com [195.60.68.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D88BA10A; Mon, 26 Jun 2023 06:00:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=axis.com; q=dns/txt; s=axis-central1; t=1687784420; x=1719320420; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=fchfhPBiXhNezCICPouexBXBWF7mmavFQ5pd/NEGqXA=; b=ECPHtS+ZzApIesCt9t81Hjo4MAPGOT9keais/wehlQzgRY2XHb2/6dMp sxpURlWF8mmXpR3wC6t55/MFh+s+hyscZEgxP5p7EO44tEZo1x5FMAmdM X5xauvkSbTTYZ9GcCsE09r+K2RlFck8sWT3EZWa59hJPLmAVduBF6idG6 ym/H1kaD1ImUW/qlT1q5zJTapIarTih3uCxvJKN8gX8vHc2FUWkyl6Tur eyvh/dYdlHgTvDBXeXcGZXiVFIONvxzu691J0JULlRP0rjImBRrlcqmKU 30/8OtiVm52Xx9tsVofrUZU00IhZpEP2tlevi5qpUeixDDUk03qlxu13P A==; From: Jiri Valek - 2N To: , CC: , , , , , Subject: [PATCH v3 1/2] dt-bindings: input: microchip,cap11xx: add advanced sensitivity settings Date: Mon, 26 Jun 2023 15:00:05 +0200 Message-ID: <20230626130006.850254-2-jiriv@axis.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230626130006.850254-1-jiriv@axis.com> References: <20230626130006.850254-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?1769770638959568699?= X-GMAIL-MSGID: =?utf-8?q?1769770638959568699?= Add support for advanced sensitivity settings and signal guard feature. Signed-off-by: Jiri Valek - 2N --- .../bindings/input/microchip,cap11xx.yaml | 77 +++++++++++++++++-- 1 file changed, 72 insertions(+), 5 deletions(-) diff --git a/Documentation/devicetree/bindings/input/microchip,cap11xx.yaml b/Documentation/devicetree/bindings/input/microchip,cap11xx.yaml index 5fa625b5c5fb..b69dac1fba0e 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,55 @@ 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,signal-guard: + $ref: /schemas/types.yaml#/definitions/uint32-array + minItems: 3 + maxItems: 8 + items: + minimum: 0 + maximum: 1 + description: | + Optional parameter supported only for CAP129x. + 0 - off + 1 - on + 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: + $ref: /schemas/types.yaml#/definitions/uint32-array + minItems: 3 + maxItems: 8 + items: + minimum: 0 + maximum: 127 + 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: + $ref: /schemas/types.yaml#/definitions/uint32-array + minItems: 3 + maxItems: 8 + items: + minimum: 1 + maximum: 4 + 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 @@ -98,10 +147,23 @@ allOf: compatible: contains: enum: - - microchip,cap1106 + - microchip,cap1188 then: patternProperties: - "^led@[0-7]$": false + "^led@[0-7]$": true + + - if: + properties: + compatible: + contains: + enum: + - microchip,cap1293 + - microchip,cap1298 + + then: + properties: + microchip,signal-guard: true + microchip,calib-sensitivity: true required: - compatible @@ -122,6 +184,11 @@ examples: reg = <0x28>; autorepeat; microchip,sensor-gain = <2>; + microchip,sensitivity-delta-sense = <16>; + + microchip,signal-guard = <0>, <0>, <0>, <0>, <0>, <0>; + microchip,input-treshold = <21>, <18>, <46>, <46>, <46>, <21>; + microchip,calib-sensitivity = <1>, <2>, <2>, <1>, <1>, <2>; linux,keycodes = <103>, /* KEY_UP */ <106>, /* KEY_RIGHT */ From patchwork Mon Jun 26 13:00:06 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: 112941 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp7468039vqr; Mon, 26 Jun 2023 06:06:42 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ6Ywyjh+SdLEsAXSRamBAr3LIuisrury5I6lEGMcG7uFQx348/B3qtZp78Fx39kQRhb6YfM X-Received: by 2002:aa7:d882:0:b0:51d:a2d9:85a3 with SMTP id u2-20020aa7d882000000b0051da2d985a3mr889178edq.8.1687784802642; Mon, 26 Jun 2023 06:06:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1687784802; cv=none; d=google.com; s=arc-20160816; b=cSlVOz5ko+pBkDod1UzWFjHGCW78YrHTuRingwduzCUJ9Jeat5VZeARD15QI2Ezg4M IYtEbaJLTQM7c/5QOf2XD7PVwZNKboFP3SEVSrPEKo/bOf9TX0T4JN4uySOIy01Eq1og otc0IaumbyJcJNOwuJo+MFjT1SmVSm0QIQY4yvnwCI9kO4OBVM2+z2lRjA55Lh3DsJ+J ImrB0hTtKpxvSNzJ3J3eITkfAOhWoJBg3wwkcgOYRi4Mpq9t4YN4JYg7VP5K/WuCGIfw aIR2/7gnY6Mt4fZK+MXeatnxi37XZh9RTOmjgoULchJnJaH5Y8p3/sCd27eGqlbXzhuR RAKA== 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=x7rsPlijUtnZxkdJjZYFr9R/Ht3lRfk2OxKsxXZf0Ds=; fh=BzO1TmygyCyLOwLJ2Ae6kNMUtQa51KA7FJAUgZkJj4w=; b=EAcecTLSDAgAF4bdugnHWavWS7MTlHhmQT4LWyJ+os9nMgImDYOUzz4YH77ECVGCmb ZNB69J11obo52ZGJ/VFkXDYqOym/jKiL0yJr17lnFt44oM4HsWHVV92TmU7G1Xl7l1n5 hiw9a43oV8GtDksdyZDl9sw3e/dKfgQvk1LUK8iades6IM/C8BtwWNYoyX1oU8QKxUdc lAGm8hNR/6XG0+WnAZ5v1Xk2Lmii4LbHBzlHOqW6CA0uIGI5PGurUw/kgQwSNsqVGdoc n8N9g7m5u+Bc/SxGcbro7wB3KD4vRlWHIc7aJ79RCAZdC+vWlwEFbi8/8X56MqOYMBBK +Vbw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass (test mode) header.i=@axis.com header.s=axis-central1 header.b=ghbADP9M; 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 y14-20020aa7c24e000000b00514a495a024si2719500edo.132.2023.06.26.06.06.17; Mon, 26 Jun 2023 06:06:42 -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=ghbADP9M; 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 S230399AbjFZNA2 (ORCPT + 99 others); Mon, 26 Jun 2023 09:00:28 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50614 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229806AbjFZNAY (ORCPT ); Mon, 26 Jun 2023 09:00:24 -0400 Received: from smtp2.axis.com (smtp2.axis.com [195.60.68.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2FDF4A0; Mon, 26 Jun 2023 06:00:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=axis.com; q=dns/txt; s=axis-central1; t=1687784422; x=1719320422; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=x7rsPlijUtnZxkdJjZYFr9R/Ht3lRfk2OxKsxXZf0Ds=; b=ghbADP9MWZCaHShihVXHuUUGZKLp2MRP9nJotGoBbnksRcvk1qzm4i9u kdE0VFC7PxU02m4yzVS8MTYCUzlnJLOT8oqCSleZpcWjhPBUGXxiA3yR6 2Vo9L7lQjjWiLWkvI0GavN661MykBoIoHmFMPV99FuX+44uevCQukJygO Ozm6upWcTpZOq/Cfrp4JiuuNN1vcJHaaTVWoFLC55Y4FJqLwIl8S71hnX jtOpaT7hzKSpJ+OM5xh9nAhxp2cXSZnMlpPp0ggjROxWr8Wog6tzBhmgX IpF2nvcjhqub4NFAokZ+uIWkw6ZE5LdlyC53hOLQMe9WuBNXfzbsf3b0Q Q==; From: Jiri Valek - 2N To: , CC: , , , , , Subject: [PATCH v3 2/2] Input: cap11xx - add advanced sensitivity settings Date: Mon, 26 Jun 2023 15:00:06 +0200 Message-ID: <20230626130006.850254-3-jiriv@axis.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230626130006.850254-1-jiriv@axis.com> References: <20230626130006.850254-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?1769770636946367535?= X-GMAIL-MSGID: =?utf-8?q?1769770636946367535?= 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 | 250 ++++++++++++++++++++++++------- 1 file changed, 197 insertions(+), 53 deletions(-) diff --git a/drivers/input/keyboard/cap11xx.c b/drivers/input/keyboard/cap11xx.c index 040696d0e49c..9e5391da0d51 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,7 @@ #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_CONFIG 0x20 #define CAP11XX_REG_SENSOR_ENABLE 0x21 #define CAP11XX_REG_SENSOR_CONFIG 0x22 @@ -32,6 +34,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 +50,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 +83,20 @@ 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 signal_guard_inputs_mask; + u32 thresholds[8]; + u32 calib_sensitivities[8]; u32 keycodes[]; }; @@ -181,6 +194,178 @@ 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_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 +517,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 +538,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 +569,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; - } - } - - /* 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); + priv->model = cap; + priv->id = id->driver_data; - 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 +589,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,14 +624,8 @@ static int cap11xx_i2c_probe(struct i2c_client *i2c_client) if (error) return error; - irq = irq_of_parse_and_map(node, 0); - if (!irq) { - dev_err(dev, "Unable to parse or map IRQ\n"); - return -ENXIO; - } - - error = devm_request_threaded_irq(dev, irq, NULL, cap11xx_thread_func, - IRQF_ONESHOT, dev_name(dev), priv); + error = devm_request_threaded_irq(dev, i2c_client->irq, NULL, + cap11xx_thread_func, IRQF_ONESHOT, dev_name(dev), priv); if (error) return error;