Thread (2 messages) 2 messages, 2 authors, 2020-08-13

Re: [PATCH v17 2/3] drivers: input: keyboard: Add mtk keypad driver

flat view

From: Andy Shevchenko <hidden>
Date: 2020-08-13 10:00:41
Also in: linux-arm-kernel, linux-devicetree, linux-mediatek, lkml

On Thu, Aug 13, 2020 at 3:57 AM Dmitry Torokhov
[off-list ref] wrote:
On Mon, Aug 10, 2020 at 02:51:28PM +0800, Fengping Yu wrote:
quoted
From: "fengping.yu" <redacted>

This patch adds matrix keypad support for Mediatek SoCs.
...
quoted
+static irqreturn_t kpd_irq_handler(int irq, void *dev_id)
+{
+     struct mtk_keypad *keypad = dev_id;
+     unsigned short *keycode = keypad->input_dev->keycode;
+     DECLARE_BITMAP(new_state, MTK_KPD_NUM_BITS);
+     DECLARE_BITMAP(change, MTK_KPD_NUM_BITS);
+     int bit_nr;
+     int pressed;
+     unsigned short code;
+
+     regmap_bulk_read(keypad->regmap, MTK_KPD_MEM,
+                     new_state, MTK_KPD_NUM_MEMS);
+
+     bitmap_xor(change, new_state, keypad->keymap_state, MTK_KPD_NUM_BITS);
+
+     for_each_set_bit(bit_nr, change, MTK_KPD_NUM_BITS) {
Should we be explicit:

                if (bit_nr % 32 >= 16) // or "if ((bit_nr / 16) % 2)"
                        continue;

so that we sure we do not trip over garbage (if any) in the unused
bits?
Shouldn't we rather rely on the fact that bitmap API explicitly takes
a bit number as an argument. What garbage are you thinking of?
If you are talking about gaps, then probably existing
for_each_set_clump8() or free size analogue (not yet in upstream,
though) should be used instead?
quoted
+             /* 1: not pressed, 0: pressed */
+             pressed = !test_bit(bit_nr, new_state);
+             dev_dbg(&keypad->input_dev->dev, "%s",
+                     pressed ? "pressed" : "released");
+
+             /* 32bit register only use low 16bit as keypad mem register */
+             code = keycode[bit_nr - 16 * (BITS_TO_U32(bit_nr) - 1)];
This will give index of 16 for (0,0).
I was also puzzled by this in one of the review rounds, but I don't
remember what was the explanation.
Is this what we want? Hmm, this is
all weird... I think we need:

                row = bit_nr / 32;
                col = bit_nr % 32;
                if (col > 15)
                        continue;

                // set row_shift in probe() as:
                // keypad_data->row_shift =
                //              get_count_order(keypad_data->n_cols);
                code = keycode[MATRIX_SCAN_CODE(row, col,
                                                keypad_data->row_shift)];

This will properly unpack the keymap built by
matrix_keypad_build_keymap().
quoted
+
+             input_report_key(keypad->input_dev, code, pressed);
+             input_sync(keypad->input_dev);
+
+             dev_dbg(&keypad->input_dev->dev,
+                     "report Linux keycode = %d\n", code);
+     }
+
+     bitmap_copy(keypad->keymap_state, new_state, MTK_KPD_NUM_BITS);
+
+     return IRQ_HANDLED;
+}
-- 
With Best Regards,
Andy Shevchenko
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help