From: Gerhard Sittig <gsi@denx.de>
To: Dmitry Torokhov <dmitry.torokhov@gmail.com>,
linux-input@vger.kernel.org, devicetree-discuss@lists.ozlabs.org,
linux-arm-kernel@lists.infradead.org,
Chao Xie <xiechao.mail@gmail.com>
Cc: Arnd Bergmann <arnd@arndb.de>, Sekhar Nori <nsekhar@ti.com>,
Tony Lindgren <tony@atomide.com>,
Marek Vasut <marek.vasut@gmail.com>,
Eric Miao <eric.y.miao@gmail.com>,
Haojian Zhuang <haojian.zhuang@gmail.com>,
Ralf Baechle <ralf@linux-mips.org>,
Anatolij Gustschin <agust@denx.de>, Detlev Zundel <dzu@denx.de>,
Gerhard Sittig <gsi@denx.de>
Subject: [PATCH v1 06/12] input: keypad-matrix: refactor matrix scan logic
Date: Fri, 21 Jun 2013 20:09:52 +0200 [thread overview]
Message-ID: <1371838198-7327-7-git-send-email-gsi@denx.de> (raw)
In-Reply-To: <1371838198-7327-1-git-send-email-gsi@denx.de>
- factor out determination of all rows for a column into a separate routine
- only call input_sync() when input events were generated (in the future
empty key code positions may get skipped, in the current implementation
short bounces may trigger matrix scans while no change is seen)
Signed-off-by: Gerhard Sittig <gsi@denx.de>
---
drivers/input/keyboard/matrix_keypad.c | 43 ++++++++++++++++++++++----------
1 file changed, 30 insertions(+), 13 deletions(-)
diff --git a/drivers/input/keyboard/matrix_keypad.c b/drivers/input/keyboard/matrix_keypad.c
index 85e16a2..0b2599d 100644
--- a/drivers/input/keyboard/matrix_keypad.c
+++ b/drivers/input/keyboard/matrix_keypad.c
@@ -126,6 +126,28 @@ static bool row_asserted(const struct matrix_keypad_platform_data *pdata,
}
/*
+ * this routine fetches the status of all rows within the specified
+ * column, the column will get selected and deselected before and after
+ * sampling the row status
+ */
+static uint32_t sample_rows_for_col(struct matrix_keypad *keypad, int col)
+{
+ const struct matrix_keypad_platform_data *pdata;
+ uint32_t row_state;
+ int row;
+
+ pdata = keypad->pdata;
+
+ activate_col(pdata, col, true);
+ row_state = 0;
+ for (row = 0; row < pdata->num_row_gpios; row++)
+ row_state |= row_asserted(pdata, row) ? (1 << row) : 0;
+ activate_col(pdata, col, false);
+
+ return row_state;
+}
+
+/*
* this routine enables IRQs after a keypad matrix scan has completed,
* to have any subsequent change in the key press status trigger the ISR
*
@@ -178,25 +200,18 @@ static void matrix_keypad_scan(struct work_struct *work)
const struct matrix_keypad_platform_data *pdata = keypad->pdata;
uint32_t new_state[MATRIX_MAX_COLS];
int row, col, code;
+ int has_events;
/* de-activate all columns before scanning the matrix */
activate_all_cols(pdata, false);
- memset(new_state, 0, sizeof(new_state));
-
/* assert each column in turn and read back the row status */
- for (col = 0; col < pdata->num_col_gpios; col++) {
-
- activate_col(pdata, col, true);
-
- for (row = 0; row < pdata->num_row_gpios; row++)
- new_state[col] |=
- row_asserted(pdata, row) ? (1 << row) : 0;
-
- activate_col(pdata, col, false);
- }
+ memset(new_state, 0, sizeof(new_state));
+ for (col = 0; col < pdata->num_col_gpios; col++)
+ new_state[col] = sample_rows_for_col(keypad, col);
/* detect changes and derive input events, update the snapshot */
+ has_events = 0;
for (col = 0; col < pdata->num_col_gpios; col++) {
uint32_t bits_changed;
@@ -222,9 +237,11 @@ static void matrix_keypad_scan(struct work_struct *work)
input_report_key(input_dev,
keycodes[code],
new_state[col] & (1 << row));
+ has_events++;
}
}
- input_sync(input_dev);
+ if (has_events)
+ input_sync(input_dev);
memcpy(keypad->last_key_state, new_state, sizeof(new_state));
/*
--
1.7.10.4
next prev parent reply other threads:[~2013-06-21 18:10 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-06-21 18:09 [PATCH v1 00/12] input: keypad-matrix: doc update, hw separation, polling, binary columns Gerhard Sittig
2013-06-21 18:09 ` [PATCH v1 01/12] input: matrix-keypad: update devicetree binding doc Gerhard Sittig
2013-06-21 21:31 ` Stephen Warren
2013-06-22 9:23 ` Gerhard Sittig
2013-06-24 22:00 ` Stephen Warren
2013-06-28 8:24 ` Gerhard Sittig
2013-06-28 14:50 ` Stephen Warren
2013-06-30 11:04 ` Gerhard Sittig
2013-06-21 18:09 ` [PATCH v1 02/12] input: matrix-keymap: func call coding style nit Gerhard Sittig
2013-06-22 2:18 ` Marek Vasut
2013-06-22 8:22 ` Gerhard Sittig
2013-06-22 13:23 ` Marek Vasut
2013-06-21 18:09 ` [PATCH v1 03/12] input: matrix-keypad: rename variables and funcs Gerhard Sittig
2013-06-21 18:09 ` [PATCH v1 04/12] input: matrix-keypad: push/pull, separate polarity Gerhard Sittig
2013-06-21 21:34 ` Stephen Warren
2013-06-22 9:36 ` Gerhard Sittig
2013-06-24 23:14 ` Stephen Warren
2013-06-28 8:33 ` Gerhard Sittig
2013-06-28 15:01 ` Stephen Warren
2013-06-30 11:43 ` Gerhard Sittig
2013-06-21 18:09 ` [PATCH v1 05/12] input: matrix-keypad: update comments, diagnostics Gerhard Sittig
2013-06-22 2:23 ` Marek Vasut
2013-06-21 18:09 ` Gerhard Sittig [this message]
2013-06-21 18:09 ` [PATCH v1 07/12] input: keypad-matrix: introduce polling support Gerhard Sittig
2013-06-21 21:38 ` Stephen Warren
2013-06-22 9:50 ` Gerhard Sittig
2013-06-24 23:18 ` Stephen Warren
2013-06-21 18:09 ` [PATCH v1 08/12] input: keypad-matrix: tell GPIO pins from matrix lines Gerhard Sittig
2013-06-21 21:41 ` Stephen Warren
2013-06-22 10:00 ` Gerhard Sittig
2013-06-24 23:26 ` Stephen Warren
2013-06-28 7:52 ` Gerhard Sittig
2013-06-28 14:35 ` Stephen Warren
2013-06-28 18:25 ` Dmitry Torokhov
2013-06-30 12:03 ` Gerhard Sittig
2013-06-21 18:09 ` [PATCH v1 09/12] input: matrix-keypad: add binary column encoding Gerhard Sittig
2013-06-21 21:58 ` Stephen Warren
2013-06-21 18:09 ` [PATCH v1 10/12] input: keypad_matrix: use usleep_range() for scan delay Gerhard Sittig
2013-06-21 22:00 ` Stephen Warren
2013-06-22 10:17 ` Gerhard Sittig
2013-06-24 23:27 ` Stephen Warren
2013-06-21 18:09 ` [PATCH v1 11/12] input: keypad-matrix: AC14xx device tree update Gerhard Sittig
2013-06-21 18:09 ` [PATCH v1 12/12] input: matrix-keypad: add diagnostics in probe() Gerhard Sittig
2013-06-22 2:28 ` Marek Vasut
2013-06-22 8:30 ` Gerhard Sittig
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1371838198-7327-7-git-send-email-gsi@denx.de \
--to=gsi@denx.de \
--cc=agust@denx.de \
--cc=arnd@arndb.de \
--cc=devicetree-discuss@lists.ozlabs.org \
--cc=dmitry.torokhov@gmail.com \
--cc=dzu@denx.de \
--cc=eric.y.miao@gmail.com \
--cc=haojian.zhuang@gmail.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-input@vger.kernel.org \
--cc=marek.vasut@gmail.com \
--cc=nsekhar@ti.com \
--cc=ralf@linux-mips.org \
--cc=tony@atomide.com \
--cc=xiechao.mail@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).