Input: mt6779-keypad - implement row/column selection
authorMattijs Korpershoek <mkorpershoek@baylibre.com>
Fri, 8 Jul 2022 21:57:43 +0000 (14:57 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Fri, 8 Jul 2022 21:58:38 +0000 (14:58 -0700)
The MediaTek keypad has a total of 6 input rows and 6 input columns.
By default, rows/columns 0-2 are enabled.

This is controlled by the KP_SEL register:
- bits[9:4]   control row selection
- bits[15:10] control column selection

Each bit enables the corresponding row/column number (e.g KP_SEL[4]
enables ROW0)

Depending on how the keypad is wired, this may result in wrong readings
of the keypad state.

Program the KP_SEL register to limit the key detection to n_rows,
n_cols we retrieve from the device tree.

Signed-off-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
Link: https://lore.kernel.org/r/20220707075236.126631-3-mkorpershoek@baylibre.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/keyboard/mt6779-keypad.c

index bd86cb9..bf447bf 100644 (file)
 #define MTK_KPD_DEBOUNCE       0x0018
 #define MTK_KPD_DEBOUNCE_MASK  GENMASK(13, 0)
 #define MTK_KPD_DEBOUNCE_MAX_MS        256
+#define MTK_KPD_SEL            0x0020
+#define MTK_KPD_SEL_COL        GENMASK(15, 10)
+#define MTK_KPD_SEL_ROW        GENMASK(9, 4)
+#define MTK_KPD_SEL_COLMASK(c) GENMASK((c) + 9, 10)
+#define MTK_KPD_SEL_ROWMASK(r) GENMASK((r) + 3, 4)
 #define MTK_KPD_NUM_MEMS       5
 #define MTK_KPD_NUM_BITS       136     /* 4*32+8 MEM5 only use 8 BITS */
 
@@ -161,6 +166,11 @@ static int mt6779_keypad_pdrv_probe(struct platform_device *pdev)
        regmap_write(keypad->regmap, MTK_KPD_DEBOUNCE,
                     (debounce * (1 << 5)) & MTK_KPD_DEBOUNCE_MASK);
 
+       regmap_update_bits(keypad->regmap, MTK_KPD_SEL, MTK_KPD_SEL_ROW,
+                          MTK_KPD_SEL_ROWMASK(keypad->n_rows));
+       regmap_update_bits(keypad->regmap, MTK_KPD_SEL, MTK_KPD_SEL_COL,
+                          MTK_KPD_SEL_COLMASK(keypad->n_cols));
+
        keypad->clk = devm_clk_get(&pdev->dev, "kpd");
        if (IS_ERR(keypad->clk))
                return PTR_ERR(keypad->clk);