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
