>From 6f0f14698df6fcd8c982ed0f323c269c4aa7bf17 Mon Sep 17 00:00:00 2001
From: Jekyll Lai <[email protected]>
Date: Sun, 2 Jan 2011 03:22:25 +0800
Subject: [PATCH 2/3] mid_keypad: direct key num should be flexible

The same pins also could be configured by gpio-keys.

Signed-off-by: Jekyll Lai <[email protected]>
---
 drivers/input/keyboard/intel_mid_keypad.c |   37
++++++++++++++---------------
 1 files changed, 18 insertions(+), 19 deletions(-)

diff --git a/drivers/input/keyboard/intel_mid_keypad.c
b/drivers/input/keyboard/intel_mid_keypad.c
index 7e9b04a..8886158
--- a/drivers/input/keyboard/intel_mid_keypad.c
+++ b/drivers/input/keyboard/intel_mid_keypad.c
@@ -105,7 +105,6 @@
 #define        KEYPAD_MATRIX_GPIO_OUT_PIN      32
 #define KEYPAD_DIRECT_GPIO_IN_PIN      40
 
-
 #define keypad_readl(off)      readl(keypad->mmio_base + (off))
 #define keypad_writel(off, v)  writel((v), keypad->mmio_base + (off))
 
@@ -227,6 +226,7 @@ static void mrst_keypad_build_keycode(struct
mrst_keypad *keypad)
 
        keypad->matrix_key_rows = MAX_MATRIX_KEY_ROWS;
        keypad->matrix_key_cols = MAX_MATRIX_KEY_COLS;
+       keypad->direct_key_num = MAX_DIRECT_KEY_NUM;
        keypad->matrix_key_map_size = MAX_MATRIX_KEY_NUM;
        keypad->debounce_interval = DEBOUNCE_INTERVAL;
 
@@ -251,15 +251,13 @@ static void mrst_keypad_build_keycode(struct
mrst_keypad *keypad)
        }
 
        key = &keypad->direct_key_map[0];
-       for (i = 0; i < MAX_DIRECT_KEY_NUM; i++, key++) {
+       for (i = 0; i < keypad->direct_key_num; i++, key++) {
                code = (*key) & 0xffffff;
                set_bit(code, input_dev->keybit);
        }
 
-       keypad->direct_key_num = MAX_DIRECT_KEY_NUM;
        keypad->enable_rotary0 = 0;
        keypad->enable_rotary1 = 0;
-
 }
 
 static inline unsigned int lookup_matrix_keycode(
@@ -353,9 +351,8 @@ static void mrst_keypad_scan_matrix(struct
mrst_keypad *keypad)
                row = KPAS_RP(kpas);
 
                /* if invalid row/col, treat as no key pressed */
-               if (col < MAX_MATRIX_KEY_COLS &&
-                   row < MAX_MATRIX_KEY_ROWS) {
-
+               if (col < keypad->matrix_key_cols &&
+                       row < keypad->matrix_key_rows) {
                        /* if NumLk pressed */
                        if (col == 0 && row == 1)
                                keypad->numlck = !keypad->numlck;
@@ -512,9 +509,9 @@ static void mrst_keypad_scan_direct(struct
mrst_keypad *keypad)
                                         (new_state & (1 << i)));
                }
        }
+
        input_sync(keypad->input_dev);
        keypad->direct_key_state = new_state;
-
 }
 
 static irqreturn_t mrst_keypad_irq_handler(int irq, void *dev_id)
@@ -549,11 +546,12 @@ static void mrst_keypad_set_alt_func(void)
        iounmap(mem);
 }
 
-static int mrst_keypad_gpio_init(void)
+
+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 + MAX_DIRECT_KEY_NUM;
+       int pins = KEYPAD_MATRIX_GPIO_IN_PIN + keypad->matrix_key_rows +
+           keypad->matrix_key_cols + keypad->direct_key_num;
 
        mrst_keypad_set_alt_func();
 
@@ -566,15 +564,15 @@ static int mrst_keypad_gpio_init(void)
                }
        }
 
-       for (i = 0; i < MAX_MATRIX_KEY_ROWS; i++)
+       for (i = 0; i < keypad->matrix_key_rows; i++)
                gpio_direction_input(KEYPAD_MATRIX_GPIO_IN_PIN + i);
 
-       for (i = 0; i < MAX_MATRIX_KEY_COLS; i++)
+       for (i = 0; i < keypad->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 = 0; i < MAX_DIRECT_KEY_NUM; i++)
+       for (i = 0; i < keypad->direct_key_num; i++)
                gpio_direction_input(KEYPAD_DIRECT_GPIO_IN_PIN + i);
 
        return 0;
@@ -631,7 +629,7 @@ static int mrst_keypad_open(struct input_dev *dev)
        struct mrst_keypad *keypad = input_get_drvdata(dev);
        int err;
 
-       err = mrst_keypad_gpio_init();
+       err = mrst_keypad_gpio_init(keypad);
        if (err)
                return err;
        mrst_keypad_config(keypad);
@@ -641,8 +639,9 @@ static int mrst_keypad_open(struct input_dev *dev)
 
 static void mrst_keypad_close(struct input_dev *dev)
 {
-       int pins = KEYPAD_MATRIX_GPIO_IN_PIN + MAX_MATRIX_KEY_ROWS +
-           MAX_MATRIX_KEY_COLS + MAX_DIRECT_KEY_NUM;
+       struct mrst_keypad *keypad = input_get_drvdata(dev);
+       int pins = KEYPAD_MATRIX_GPIO_IN_PIN + keypad->matrix_key_rows +
+           keypad->matrix_key_cols + keypad->direct_key_num;
 
        int i;
        /* free occupied pins */
@@ -753,8 +752,8 @@ static void __devexit mrst_keypad_remove(struct
pci_dev *pdev)
 {
        struct mrst_keypad *keypad = pci_get_drvdata(pdev);
        int i;
-       int pins = KEYPAD_MATRIX_GPIO_IN_PIN + MAX_MATRIX_KEY_ROWS +
-           MAX_MATRIX_KEY_COLS + MAX_DIRECT_KEY_NUM;
+       int pins = KEYPAD_MATRIX_GPIO_IN_PIN + keypad->matrix_key_rows +
+           keypad->matrix_key_cols + keypad->direct_key_num;
 
        for (i = pins - 1; i > KEYPAD_MATRIX_GPIO_IN_PIN; i--)
                gpio_free(i);
-- 
1.7.0.4

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

Reply via email to