[Meego-kernel] [PATCH 5/9] intel_mid_keypad: clean up
Kristen Carlson Accardi
kristen at linux.intel.com
Tue Feb 1 16:04:18 PST 2011
clean up some unused defines, take out remaining hardcodes of
matrix size, tighten up the matrix scan function a little bit.
Signed-off-by: Kristen Carlson Accardi <kristen at linux.intel.com>
---
drivers/input/keyboard/intel_mid_keypad.c | 103 +++++++----------------------
1 files changed, 24 insertions(+), 79 deletions(-)
diff --git a/drivers/input/keyboard/intel_mid_keypad.c b/drivers/input/keyboard/intel_mid_keypad.c
index b4de682..3c5b5cd 100644
--- a/drivers/input/keyboard/intel_mid_keypad.c
+++ b/drivers/input/keyboard/intel_mid_keypad.c
@@ -45,11 +45,10 @@
* Keypad Controller registers
*/
#define KPC 0x0000 /* Keypad Control register */
-#define KPDK 0x0004 /* Keypad Direct Key register */
-#define KPREC 0x0008 /* Keypad Rotary Encoder register */
-#define KPMK 0x000C /* Keypad Matrix Key register */
#define KPAS 0x0010 /* Keypad Automatic Scan register */
+#define KPC_MI (0x1 << 22) /* Matrix interrupt bit */
+
/* Keypad Automatic Scan Multiple Key Presser register 0-3 */
#define KPASMKP0 0x0014
#define KPASMKP1 0x0018
@@ -57,47 +56,10 @@
#define KPASMKP3 0x0020
#define KPKDI 0x0024
-/* bit definitions */
-#define KPC_MKRN(n) ((((n) - 1) & 0x7) << 26) /* matrix key row number */
-#define KPC_MKCN(n) ((((n) - 1) & 0x7) << 23) /* matrix key col number */
-
-#define KPC_AS (0x1 << 30) /* Automatic Scan bit */
-#define KPC_ASACT (0x1 << 29) /* Automatic Scan on Activity */
-#define KPC_MI (0x1 << 22) /* Matrix interrupt bit */
-#define KPC_IMKP (0x1 << 21) /* Ignore Multiple Key Press */
-
-#define KPC_MS(n) (0x1 << (13 + (n))) /* Matrix scan line 'n' */
-#define KPC_MS_ALL (0xff << 13)
-
-#define KPC_ME (0x1 << 12) /* Matrix Keypad Enable */
-#define KPC_MIE (0x1 << 11) /* Matrix Interrupt Enable */
-#define KPC_DK_DEB_SEL (0x1 << 9) /* Direct Keypad Debounce Select */
-#define KPC_DI (0x1 << 5) /* Direct key interrupt bit */
-#define KPC_RE_ZERO_DEB (0x1 << 4) /* Rotary Encoder Zero Debounce */
-#define KPC_REE1 (0x1 << 3) /* Rotary Encoder1 Enable */
-#define KPC_REE0 (0x1 << 2) /* Rotary Encoder0 Enable */
-#define KPC_DE (0x1 << 1) /* Direct Keypad Enable */
-#define KPC_DIE (0x1 << 0) /* Direct Keypad interrupt Enable */
-
-#define KPDK_DKP (0x1 << 31)
-#define KPDK_DK(n) ((n) & 0xff)
-
-#define KPREC_OF1 (0x1 << 31)
-#define kPREC_UF1 (0x1 << 30)
-#define KPREC_OF0 (0x1 << 15)
-#define KPREC_UF0 (0x1 << 14)
-
-#define KPREC_RECOUNT0(n) ((n) & 0xff)
-#define KPREC_RECOUNT1(n) (((n) >> 16) & 0xff)
-
-#define KPMK_MKP (0x1 << 31)
#define KPAS_SO (0x1 << 31)
-#define KPASMKPx_SO (0x1 << 31)
-
#define KPAS_MUKP(n) (((n) >> 26) & 0x1f)
#define KPAS_RP(n) (((n) >> 4) & 0xf)
#define KPAS_CP(n) ((n) & 0xf)
-
#define KPASMKP_MKC_MASK (0xff)
#define KEYPAD_MATRIX_GPIO_IN_PIN 24
@@ -107,14 +69,7 @@
#define keypad_writel(off, v) writel((v), keypad->mmio_base + (off))
#define MAX_MATRIX_KEY_NUM (8 * 8)
-
-#define MAX_MATRIX_KEY_ROWS (8)
#define MAX_MATRIX_KEY_COLS (8)
-#define MATRIX_ROW_SHIFT 3
-#define DEBOUNCE_INTERVAL 100
-
-#define KEY_HALFSHUTTER KEY_PROG1
-#define KEY_FULLSHUTTER KEY_CAMERA
static unsigned int mrst_default_keymap[] = {
KEY(0, 0, KEY_1),
@@ -230,32 +185,20 @@ static void mrst_keypad_scan_matrix(struct mrst_keypad *keypad)
int row, col, code, num_keys_pressed = 0;
uint32_t new_state[MAX_MATRIX_KEY_COLS];
uint32_t kpas = keypad_readl(KPAS);
- int status;
num_keys_pressed = KPAS_MUKP(kpas);
memset(new_state, 0, sizeof(new_state));
- if (num_keys_pressed == 0) {
- status = keypad->matrix_key_state[0] & (1 << 0);
- goto scan;
- }
-
if (num_keys_pressed == 1) {
col = KPAS_CP(kpas);
row = KPAS_RP(kpas);
- /* if invalid row/col, treat as no key pressed */
- if (col < MAX_MATRIX_KEY_COLS &&
- row < MAX_MATRIX_KEY_ROWS) {
- status = keypad->matrix_key_state[col] & (1 << row);
- new_state[col] = (1 << row);
- }
+ if (row < 0 || col < 0)
+ return;
- goto scan;
- }
-
- if (num_keys_pressed > 1) {
+ new_state[col] = (1 << row);
+ } else if (num_keys_pressed > 1) {
uint32_t kpasmkp0 = keypad_readl(KPASMKP0);
uint32_t kpasmkp1 = keypad_readl(KPASMKP1);
uint32_t kpasmkp2 = keypad_readl(KPASMKP2);
@@ -271,7 +214,6 @@ static void mrst_keypad_scan_matrix(struct mrst_keypad *keypad)
new_state[7] = (kpasmkp3 >> 16) & KPASMKP_MKC_MASK;
}
-scan:
for (col = 0; col < keypad->matrix_key_cols; col++) {
uint32_t bits_changed;
@@ -283,7 +225,7 @@ scan:
if ((bits_changed & (1 << row)) == 0)
continue;
- code = MATRIX_SCAN_CODE(row, col, MATRIX_ROW_SHIFT);
+ code = MATRIX_SCAN_CODE(row, col, keypad->row_shift);
input_report_key(keypad->input_dev,
keypad->keycode[code],
new_state[col] & (1 << row));
@@ -308,33 +250,36 @@ static irqreturn_t mrst_keypad_irq_handler(int irq, void *dev_id)
static int mrst_keypad_gpio_init(struct mrst_keypad *keypad)
{
int i, err, cnt = 0;
- int pins = KEYPAD_MATRIX_GPIO_IN_PIN + MAX_MATRIX_KEY_ROWS +
- MAX_MATRIX_KEY_COLS;
+ int in_pins = KEYPAD_MATRIX_GPIO_IN_PIN + keypad->matrix_key_rows;
+ int out_pins = KEYPAD_MATRIX_GPIO_OUT_PIN + keypad->matrix_key_cols;
/* explicitely tell which pins have been occupied... */
- for (i = KEYPAD_MATRIX_GPIO_IN_PIN; i < pins; i++, cnt++) {
+ for (i = KEYPAD_MATRIX_GPIO_IN_PIN; i < in_pins; i++, cnt++) {
err = gpio_request(i, NULL);
+ gpio_direction_input(i);
+
if (err) {
pr_err(DRV_NAME "GPIO pin %d failed to request.\n", i);
goto err_request;
}
}
- for (i = 0; i < MAX_MATRIX_KEY_ROWS; i++)
- gpio_direction_input(KEYPAD_MATRIX_GPIO_IN_PIN + i);
-
- for (i = 0; i < MAX_MATRIX_KEY_COLS; i++)
- /* __gpio_set_value(KEYPAD_GPIO_OUT_PIN + i, 1); */
- /* set action is executed in gpio_direction_output() */
- gpio_direction_output(KEYPAD_MATRIX_GPIO_OUT_PIN + i, 1);
+ for (i = KEYPAD_MATRIX_GPIO_OUT_PIN; i < out_pins; i++, cnt++) {
+ err = gpio_request(i, NULL);
+ gpio_direction_output(i, 1);
+ if (err) {
+ pr_err(DRV_NAME "GPIO pin %d failed to request.\n", i);
+ goto err_request;
+ }
+ }
return 0;
err_request:
/* free requested pins... */
- for (i = KEYPAD_MATRIX_GPIO_IN_PIN + cnt - 1;
- i >= KEYPAD_MATRIX_GPIO_IN_PIN; i--)
+ for (i = out_pins - 1; i >= KEYPAD_MATRIX_GPIO_OUT_PIN; i--)
gpio_free(i);
+
return err;
}
@@ -355,8 +300,8 @@ static int mrst_keypad_open(struct input_dev *dev)
static void mrst_keypad_close(struct input_dev *dev)
{
struct mrst_keypad *keypad = input_get_drvdata(dev);
- int pins = KEYPAD_MATRIX_GPIO_IN_PIN + MAX_MATRIX_KEY_ROWS +
- MAX_MATRIX_KEY_COLS;
+ int pins = KEYPAD_MATRIX_GPIO_IN_PIN + keypad->matrix_key_rows +
+ keypad->matrix_key_cols;
int i;
--
1.7.3.1
More information about the MeeGo-kernel
mailing list