* [PATCH v5 0/3] Input: cap11xx add advanced sensitivity settings @ 2023-11-08 15:56 Jiri Valek - 2N 2023-11-08 15:56 ` [PATCH v5 1/3] dt-bindings: input: microchip,cap11xx: " Jiri Valek - 2N ` (2 more replies) 0 siblings, 3 replies; 10+ messages in thread From: Jiri Valek - 2N @ 2023-11-08 15:56 UTC (permalink / raw) To: krzysztof.kozlowski+dt, dmitry.torokhov Cc: jiriv, devicetree, linux-input, linux-kernel, robh+dt, u.kleine-koenig PATCH 1 - add documentation for new options PATCH 2 - add support for advanced settings into driver PATCH 3 - remove unnecessary IRQ parsing Changes in v2: - Removed "sensitivity-base-shift" parameter (not HW propertie) in PATCH 2. - Used IRQ from I2C subsystem instead of parsing it again. - Fixed some documentation issues in PATCH 1 Changes in v3: - Remove incorrectly used "Reviewed-by" tag in PATCH 1 and 2 Changes in v4: - Remove unused variable in PATCH 2 Changes in v5: - Revert IRQ parsing in PATCH 2 and move to separate PATCH 3 - Fix 'if' condition for properties in PATCH 1 Jiri Valek - 2N (3): dt-bindings: input: microchip,cap11xx: add advanced sensitivity settings Input: cap11xx - add advanced sensitivity settings Input: cap11xx - remove unnecessary IRQ parsing .../bindings/input/microchip,cap11xx.yaml | 76 +++++- drivers/input/keyboard/cap11xx.c | 248 ++++++++++++++---- 2 files changed, 269 insertions(+), 55 deletions(-) -- 2.25.1 ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v5 1/3] dt-bindings: input: microchip,cap11xx: add advanced sensitivity settings 2023-11-08 15:56 [PATCH v5 0/3] Input: cap11xx add advanced sensitivity settings Jiri Valek - 2N @ 2023-11-08 15:56 ` Jiri Valek - 2N 2023-11-10 8:22 ` Krzysztof Kozlowski 2023-11-08 15:56 ` [PATCH v5 2/3] Input: cap11xx - " Jiri Valek - 2N 2023-11-08 15:56 ` [PATCH v5 3/3] Input: cap11xx - remove unnecessary IRQ parsing Jiri Valek - 2N 2 siblings, 1 reply; 10+ messages in thread From: Jiri Valek - 2N @ 2023-11-08 15:56 UTC (permalink / raw) To: krzysztof.kozlowski+dt, dmitry.torokhov Cc: jiriv, devicetree, linux-input, linux-kernel, robh+dt, u.kleine-koenig Add support for advanced sensitivity settings and signal guard feature. Signed-off-by: Jiri Valek - 2N <jiriv@axis.com> --- .../bindings/input/microchip,cap11xx.yaml | 76 ++++++++++++++++++- 1 file changed, 73 insertions(+), 3 deletions(-) diff --git a/Documentation/devicetree/bindings/input/microchip,cap11xx.yaml b/Documentation/devicetree/bindings/input/microchip,cap11xx.yaml index 5b5d4f7d3482..aa97702c43ef 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 @@ -99,10 +148,29 @@ allOf: contains: enum: - microchip,cap1106 + - microchip,cap1203 + - microchip,cap1206 + - microchip,cap1293 + - microchip,cap1298 then: patternProperties: "^led@[0-7]$": false + - if: + properties: + compatible: + contains: + enum: + - microchip,cap1106 + - microchip,cap1126 + - microchip,cap1188 + - microchip,cap1203 + - microchip,cap1206 + then: + properties: + microchip,signal-guard: false + microchip,calib-sensitivity: false + required: - compatible - interrupts @@ -122,6 +190,8 @@ examples: reg = <0x28>; autorepeat; microchip,sensor-gain = <2>; + microchip,sensitivity-delta-sense = <16>; + microchip,input-treshold = <21>, <18>, <46>, <46>, <46>, <21>; linux,keycodes = <103>, /* KEY_UP */ <106>, /* KEY_RIGHT */ -- 2.25.1 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH v5 1/3] dt-bindings: input: microchip,cap11xx: add advanced sensitivity settings 2023-11-08 15:56 ` [PATCH v5 1/3] dt-bindings: input: microchip,cap11xx: " Jiri Valek - 2N @ 2023-11-10 8:22 ` Krzysztof Kozlowski 2023-11-16 16:00 ` Jiri Valek - 2N 0 siblings, 1 reply; 10+ messages in thread From: Krzysztof Kozlowski @ 2023-11-10 8:22 UTC (permalink / raw) To: Jiri Valek - 2N, krzysztof.kozlowski+dt, dmitry.torokhov Cc: devicetree, linux-input, linux-kernel, robh+dt, u.kleine-koenig On 08/11/2023 16:56, Jiri Valek - 2N wrote: > Add support for advanced sensitivity settings and signal guard feature. > > Signed-off-by: Jiri Valek - 2N <jiriv@axis.com> > --- > .../bindings/input/microchip,cap11xx.yaml | 76 ++++++++++++++++++- > 1 file changed, 73 insertions(+), 3 deletions(-) > > diff --git a/Documentation/devicetree/bindings/input/microchip,cap11xx.yaml b/Documentation/devicetree/bindings/input/microchip,cap11xx.yaml > index 5b5d4f7d3482..aa97702c43ef 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 Which values are more sensitive? > + capacitance corresponding to a “lighter” touch. Looks like you use some non-ASCII characters for ". > + > + 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: typo: threshold > + $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 Drop everywhere the "optional parameter". It's redundant. required: block tells what is / is not optional. > + determine if a touch has been detected. In what units are the values? > + 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. Gain is usually in dB, isn't it? > + The number of entries must correspond to the number of channels. > + > patternProperties: > "^led@[0-7]$": Best regards, Krzysztof ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v5 1/3] dt-bindings: input: microchip,cap11xx: add advanced sensitivity settings 2023-11-10 8:22 ` Krzysztof Kozlowski @ 2023-11-16 16:00 ` Jiri Valek - 2N 2023-11-16 17:24 ` Krzysztof Kozlowski 0 siblings, 1 reply; 10+ messages in thread From: Jiri Valek - 2N @ 2023-11-16 16:00 UTC (permalink / raw) To: Krzysztof Kozlowski, krzysztof.kozlowski+dt, dmitry.torokhov Cc: devicetree, linux-input, linux-kernel, robh+dt, u.kleine-koenig On 11/10/23 09:22, Krzysztof Kozlowski wrote: > On 08/11/2023 16:56, Jiri Valek - 2N wrote: >> Add support for advanced sensitivity settings and signal guard feature. >> >> Signed-off-by: Jiri Valek - 2N <jiriv@axis.com> >> --- >> .../bindings/input/microchip,cap11xx.yaml | 76 ++++++++++++++++++- >> 1 file changed, 73 insertions(+), 3 deletions(-) >> >> diff --git a/Documentation/devicetree/bindings/input/microchip,cap11xx.yaml b/Documentation/devicetree/bindings/input/microchip,cap11xx.yaml >> index 5b5d4f7d3482..aa97702c43ef 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 > > Which values are more sensitive? Higher value means more sensitive settings. I will add this line to description. > >> + capacitance corresponding to a “lighter” touch. > > Looks like you use some non-ASCII characters for ". I will fix it. > >> + >> + 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: > > typo: threshold I will fix it in Documentation and also in source code. Copy paste error... > >> + $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 > > Drop everywhere the "optional parameter". It's redundant. required: > block tells what is / is not optional. OK will be fixed. > >> + determine if a touch has been detected. > > In what units are the values? According to the datasheet it is dimensionless, no more info. A higher value means a larger difference in capacitance is required for a touch to be registered. > >> + 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. > > Gain is usually in dB, isn't it? Usually yes, but again there are no units in datasheet. There is note that gain is based on capacitance touch pad capacitance range 1 - 5-50pF 2 - 0-25pF 4 - 0-12.5pF I will add this to description and change items to enum: [1, 2, 4] > >> + The number of entries must correspond to the number of channels. >> + >> patternProperties: >> "^led@[0-7]$": > > > Best regards, > Krzysztof > So are these changes fine for you? If yes I prepare new patch revision. Best regards, Jiri ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v5 1/3] dt-bindings: input: microchip,cap11xx: add advanced sensitivity settings 2023-11-16 16:00 ` Jiri Valek - 2N @ 2023-11-16 17:24 ` Krzysztof Kozlowski 0 siblings, 0 replies; 10+ messages in thread From: Krzysztof Kozlowski @ 2023-11-16 17:24 UTC (permalink / raw) To: Jiri Valek - 2N, krzysztof.kozlowski+dt, dmitry.torokhov Cc: devicetree, linux-input, linux-kernel, robh+dt, u.kleine-koenig On 16/11/2023 17:00, Jiri Valek - 2N wrote: >>> + The number of entries must correspond to the number of channels. >>> + >>> patternProperties: >>> "^led@[0-7]$": >> >> >> Best regards, >> Krzysztof >> > > So are these changes fine for you? > If yes I prepare new patch revision. Yes Best regards, Krzysztof ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v5 2/3] Input: cap11xx - add advanced sensitivity settings 2023-11-08 15:56 [PATCH v5 0/3] Input: cap11xx add advanced sensitivity settings Jiri Valek - 2N 2023-11-08 15:56 ` [PATCH v5 1/3] dt-bindings: input: microchip,cap11xx: " Jiri Valek - 2N @ 2023-11-08 15:56 ` Jiri Valek - 2N 2023-11-08 15:56 ` [PATCH v5 3/3] Input: cap11xx - remove unnecessary IRQ parsing Jiri Valek - 2N 2 siblings, 0 replies; 10+ messages in thread From: Jiri Valek - 2N @ 2023-11-08 15:56 UTC (permalink / raw) To: krzysztof.kozlowski+dt, dmitry.torokhov Cc: jiriv, devicetree, linux-input, linux-kernel, robh+dt, u.kleine-koenig 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 <jiriv@axis.com> --- drivers/input/keyboard/cap11xx.c | 242 +++++++++++++++++++++++++------ 1 file changed, 196 insertions(+), 46 deletions(-) diff --git a/drivers/input/keyboard/cap11xx.c b/drivers/input/keyboard/cap11xx.c index 1b4937dce672..4711ea985627 100644 --- a/drivers/input/keyboard/cap11xx.c +++ b/drivers/input/keyboard/cap11xx.c @@ -14,6 +14,7 @@ #include <linux/regmap.h> #include <linux/i2c.h> #include <linux/gpio/consumer.h> +#include <linux/bitfield.h> #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; - } - } + 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 +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,7 +624,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; -- 2.25.1 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v5 3/3] Input: cap11xx - remove unnecessary IRQ parsing 2023-11-08 15:56 [PATCH v5 0/3] Input: cap11xx add advanced sensitivity settings Jiri Valek - 2N 2023-11-08 15:56 ` [PATCH v5 1/3] dt-bindings: input: microchip,cap11xx: " Jiri Valek - 2N 2023-11-08 15:56 ` [PATCH v5 2/3] Input: cap11xx - " Jiri Valek - 2N @ 2023-11-08 15:56 ` Jiri Valek - 2N 2023-11-08 19:53 ` Rob Herring 2 siblings, 1 reply; 10+ messages in thread From: Jiri Valek - 2N @ 2023-11-08 15:56 UTC (permalink / raw) To: krzysztof.kozlowski+dt, dmitry.torokhov Cc: jiriv, devicetree, linux-input, linux-kernel, robh+dt, u.kleine-koenig Separate IRQ parsing is not necessary, I2C core do the job. Signed-off-by: Jiri Valek - 2N <jiriv@axis.com> --- drivers/input/keyboard/cap11xx.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/drivers/input/keyboard/cap11xx.c b/drivers/input/keyboard/cap11xx.c index 4711ea985627..ccca9936ef25 100644 --- a/drivers/input/keyboard/cap11xx.c +++ b/drivers/input/keyboard/cap11xx.c @@ -518,7 +518,7 @@ static int cap11xx_i2c_probe(struct i2c_client *i2c_client) struct device *dev = &i2c_client->dev; struct cap11xx_priv *priv; const struct cap11xx_hw_model *cap; - int i, error, irq; + int i, error; unsigned int val, rev; if (id->driver_data >= ARRAY_SIZE(cap11xx_devices)) { @@ -624,13 +624,7 @@ static int cap11xx_i2c_probe(struct i2c_client *i2c_client) if (error) return error; - irq = irq_of_parse_and_map(dev->of_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, + error = devm_request_threaded_irq(dev, i2c_client->irq, NULL, cap11xx_thread_func, IRQF_ONESHOT, dev_name(dev), priv); if (error) return error; -- 2.25.1 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH v5 3/3] Input: cap11xx - remove unnecessary IRQ parsing 2023-11-08 15:56 ` [PATCH v5 3/3] Input: cap11xx - remove unnecessary IRQ parsing Jiri Valek - 2N @ 2023-11-08 19:53 ` Rob Herring 2023-11-16 7:43 ` Jiri Valek - 2N 0 siblings, 1 reply; 10+ messages in thread From: Rob Herring @ 2023-11-08 19:53 UTC (permalink / raw) To: Jiri Valek - 2N Cc: krzysztof.kozlowski+dt, dmitry.torokhov, devicetree, linux-input, linux-kernel, u.kleine-koenig On Wed, Nov 8, 2023 at 9:57 AM Jiri Valek - 2N <jiriv@axis.com> wrote: > > Separate IRQ parsing is not necessary, I2C core do the job. > > Signed-off-by: Jiri Valek - 2N <jiriv@axis.com> > --- > drivers/input/keyboard/cap11xx.c | 10 ++-------- > 1 file changed, 2 insertions(+), 8 deletions(-) > > diff --git a/drivers/input/keyboard/cap11xx.c b/drivers/input/keyboard/cap11xx.c > index 4711ea985627..ccca9936ef25 100644 > --- a/drivers/input/keyboard/cap11xx.c > +++ b/drivers/input/keyboard/cap11xx.c > @@ -518,7 +518,7 @@ static int cap11xx_i2c_probe(struct i2c_client *i2c_client) > struct device *dev = &i2c_client->dev; > struct cap11xx_priv *priv; > const struct cap11xx_hw_model *cap; > - int i, error, irq; > + int i, error; > unsigned int val, rev; > > if (id->driver_data >= ARRAY_SIZE(cap11xx_devices)) { > @@ -624,13 +624,7 @@ static int cap11xx_i2c_probe(struct i2c_client *i2c_client) > if (error) > return error; > > - irq = irq_of_parse_and_map(dev->of_node, 0); Probably can drop the include of of_irq.h as well. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v5 3/3] Input: cap11xx - remove unnecessary IRQ parsing 2023-11-08 19:53 ` Rob Herring @ 2023-11-16 7:43 ` Jiri Valek - 2N 2023-11-17 2:59 ` Dmitry Torokhov 0 siblings, 1 reply; 10+ messages in thread From: Jiri Valek - 2N @ 2023-11-16 7:43 UTC (permalink / raw) To: Rob Herring Cc: krzysztof.kozlowski+dt, dmitry.torokhov, devicetree, linux-input, linux-kernel, u.kleine-koenig On 11/8/23 20:53, Rob Herring wrote: > On Wed, Nov 8, 2023 at 9:57 AM Jiri Valek - 2N <jiriv@axis.com> wrote: >> >> Separate IRQ parsing is not necessary, I2C core do the job. >> >> Signed-off-by: Jiri Valek - 2N <jiriv@axis.com> >> --- >> drivers/input/keyboard/cap11xx.c | 10 ++-------- >> 1 file changed, 2 insertions(+), 8 deletions(-) >> >> diff --git a/drivers/input/keyboard/cap11xx.c b/drivers/input/keyboard/cap11xx.c >> index 4711ea985627..ccca9936ef25 100644 >> --- a/drivers/input/keyboard/cap11xx.c >> +++ b/drivers/input/keyboard/cap11xx.c >> @@ -518,7 +518,7 @@ static int cap11xx_i2c_probe(struct i2c_client *i2c_client) >> struct device *dev = &i2c_client->dev; >> struct cap11xx_priv *priv; >> const struct cap11xx_hw_model *cap; >> - int i, error, irq; >> + int i, error; >> unsigned int val, rev; >> >> if (id->driver_data >= ARRAY_SIZE(cap11xx_devices)) { >> @@ -624,13 +624,7 @@ static int cap11xx_i2c_probe(struct i2c_client *i2c_client) >> if (error) >> return error; >> >> - irq = irq_of_parse_and_map(dev->of_node, 0); > > Probably can drop the include of of_irq.h as well. Ack. Thanks for notice! ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v5 3/3] Input: cap11xx - remove unnecessary IRQ parsing 2023-11-16 7:43 ` Jiri Valek - 2N @ 2023-11-17 2:59 ` Dmitry Torokhov 0 siblings, 0 replies; 10+ messages in thread From: Dmitry Torokhov @ 2023-11-17 2:59 UTC (permalink / raw) To: Jiri Valek - 2N Cc: Rob Herring, krzysztof.kozlowski+dt, devicetree, linux-input, linux-kernel, u.kleine-koenig On Thu, Nov 16, 2023 at 08:43:00AM +0100, Jiri Valek - 2N wrote: > On 11/8/23 20:53, Rob Herring wrote: > > On Wed, Nov 8, 2023 at 9:57 AM Jiri Valek - 2N <jiriv@axis.com> wrote: > >> > >> Separate IRQ parsing is not necessary, I2C core do the job. > >> > >> Signed-off-by: Jiri Valek - 2N <jiriv@axis.com> > >> --- > >> drivers/input/keyboard/cap11xx.c | 10 ++-------- > >> 1 file changed, 2 insertions(+), 8 deletions(-) > >> > >> diff --git a/drivers/input/keyboard/cap11xx.c b/drivers/input/keyboard/cap11xx.c > >> index 4711ea985627..ccca9936ef25 100644 > >> --- a/drivers/input/keyboard/cap11xx.c > >> +++ b/drivers/input/keyboard/cap11xx.c > >> @@ -518,7 +518,7 @@ static int cap11xx_i2c_probe(struct i2c_client *i2c_client) > >> struct device *dev = &i2c_client->dev; > >> struct cap11xx_priv *priv; > >> const struct cap11xx_hw_model *cap; > >> - int i, error, irq; > >> + int i, error; > >> unsigned int val, rev; > >> > >> if (id->driver_data >= ARRAY_SIZE(cap11xx_devices)) { > >> @@ -624,13 +624,7 @@ static int cap11xx_i2c_probe(struct i2c_client *i2c_client) > >> if (error) > >> return error; > >> > >> - irq = irq_of_parse_and_map(dev->of_node, 0); > > > > Probably can drop the include of of_irq.h as well. > Ack. Thanks for notice! I replaced it with #include <of.h> and applied, thank you. -- Dmitry ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2023-11-17 3:00 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2023-11-08 15:56 [PATCH v5 0/3] Input: cap11xx add advanced sensitivity settings Jiri Valek - 2N 2023-11-08 15:56 ` [PATCH v5 1/3] dt-bindings: input: microchip,cap11xx: " Jiri Valek - 2N 2023-11-10 8:22 ` Krzysztof Kozlowski 2023-11-16 16:00 ` Jiri Valek - 2N 2023-11-16 17:24 ` Krzysztof Kozlowski 2023-11-08 15:56 ` [PATCH v5 2/3] Input: cap11xx - " Jiri Valek - 2N 2023-11-08 15:56 ` [PATCH v5 3/3] Input: cap11xx - remove unnecessary IRQ parsing Jiri Valek - 2N 2023-11-08 19:53 ` Rob Herring 2023-11-16 7:43 ` Jiri Valek - 2N 2023-11-17 2:59 ` Dmitry Torokhov
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).