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 <[email protected]>
---
 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

_______________________________________________
MeeGo-kernel mailing list
[email protected]
http://lists.meego.com/listinfo/meego-kernel

Reply via email to