[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