>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
