Title: [9074] trunk: [#6140] ADP5589 Linux Driver Support
Revision
9074
Author
hennerich
Date
2010-08-10 04:30:57 -0400 (Tue, 10 Aug 2010)

Log Message

[#6140] ADP5589 Linux Driver Support
Allow holes in Keypad row and columns definition

Modified Paths

Diff

Modified: trunk/drivers/input/keyboard/adp5589-keys.c (9073 => 9074)


--- trunk/drivers/input/keyboard/adp5589-keys.c	2010-08-10 07:03:29 UTC (rev 9073)
+++ trunk/drivers/input/keyboard/adp5589-keys.c	2010-08-10 08:30:57 UTC (rev 9074)
@@ -65,8 +65,6 @@
 #define KEY_EV_PRESSED		(1 << 7)
 #define KEY_EV_MASK		(0x7F)
 
-#define KP_SEL(x)		(0xFFFF >> (16 - x))	/* 2^x-1 */
-
 #define KEYP_MAX_EVENT		16
 
 #define MAXGPIO			19
@@ -190,13 +188,10 @@
 
 	memset(pin_used, false, sizeof(pin_used));
 
-	for (i = 0; i < pdata->rows; i++)
-		pin_used[i] = true;
+	for (i = 0; i < MAXGPIO; i++)
+		if (pdata->keypad_en_mask & (1 << i))
+			pin_used[i] = true;
 
-	for (i = 0; i < pdata->cols; i++)
-		pin_used[i + ADP5589_GPI_PIN_COL_BASE -
-			 ADP5589_GPI_PIN_BASE] = true;
-
 	for (i = 0; i < kpad->gpimapsize; i++)
 		pin_used[kpad->gpimap[i].pin - ADP5589_GPI_PIN_BASE] = true;
 
@@ -353,11 +348,12 @@
 	unsigned char evt_mode1 = 0, evt_mode2 = 0, evt_mode3 = 0;
 	unsigned char pull_mask = 0;
 
-	ret = adp5589_write(client, ADP5589_PIN_CONFIG_A, KP_SEL(pdata->rows));
+	ret = adp5589_write(client, ADP5589_PIN_CONFIG_A,
+			    pdata->keypad_en_mask & 0xFF);
 	ret |= adp5589_write(client, ADP5589_PIN_CONFIG_B,
-			     KP_SEL(pdata->cols) & 0xFF);
+			     (pdata->keypad_en_mask >> 8) & 0xFF);
 	ret |= adp5589_write(client, ADP5589_PIN_CONFIG_C,
-			     KP_SEL(pdata->cols) >> 8);
+			     (pdata->keypad_en_mask >> 16) & 0xFF);
 
 	if (pdata->en_keylock) {
 		ret |= adp5589_write(client, ADP5589_UNLOCK1,
@@ -498,7 +494,8 @@
 		return -EINVAL;
 	}
 
-	if (!pdata->rows || !pdata->cols || !pdata->keymap) {
+	if (!((pdata->keypad_en_mask & 0xFF) &&
+		(pdata->keypad_en_mask >> 8)) || !pdata->keymap) {
 		dev_err(&client->dev, "no rows, cols or keymap from pdata\n");
 		return -EINVAL;
 	}
@@ -526,16 +523,10 @@
 			return -EINVAL;
 		}
 
-		if (pin <= ADP5589_GPI_PIN_ROW_END) {
-			if (pin - ADP5589_GPI_PIN_ROW_BASE + 1 <= pdata->rows) {
-				dev_err(&client->dev, "invalid gpi row data\n");
-				return -EINVAL;
-			}
-		} else {
-			if (pin - ADP5589_GPI_PIN_COL_BASE + 1 <= pdata->cols) {
-				dev_err(&client->dev, "invalid gpi col data\n");
-				return -EINVAL;
-			}
+		if ((1 << (pin - ADP5589_GPI_PIN_ROW_BASE)) &
+			pdata->keypad_en_mask) {
+			dev_err(&client->dev, "invalid gpi row/col data\n");
+			return -EINVAL;
 		}
 	}
 

Modified: trunk/include/linux/input/adp5589.h (9073 => 9074)


--- trunk/include/linux/input/adp5589.h	2010-08-10 07:03:29 UTC (rev 9073)
+++ trunk/include/linux/input/adp5589.h	2010-08-10 08:30:57 UTC (rev 9074)
@@ -133,14 +133,26 @@
 	unsigned short sw_evt;
 };
 
+/* scan_cycle_time */
 #define ADP5589_SCAN_CYCLE_10ms		0
 #define ADP5589_SCAN_CYCLE_20ms		1
 #define ADP5589_SCAN_CYCLE_30ms		2
 #define ADP5589_SCAN_CYCLE_40ms		3
 
+/* Mask Bits:
+ * C C C C C C C C C C C | R R R R R R R R
+ * 1 9 8 7 6 5 4 3 2 1 0 | 7 6 5 4 3 2 1 0
+ * 0
+ * ---------------- BIT ------------------
+ * 1 1 1 1 1 1 1 1 1 0 0 | 0 0 0 0 0 0 0 0
+ * 8 7 6 5 4 3 2 1 0 9 8 | 7 6 5 4 3 2 1 0
+ */
+
+#define ADP_ROW(x)			(1 << (x))
+#define ADP_COL(x)			(1 << (x + 8))
+
 struct adp5589_kpad_platform_data {
-	int rows;			/* Number of rows */
-	int cols;			/* Number of columns */
+	unsigned keypad_en_mask;	/* Keypad (Rows/Columns) enable mask */
 	const unsigned short *keymap;	/* Pointer to keymap */
 	unsigned short keymapsize;	/* Keymap size */
 	unsigned repeat:1;		/* Enable key repeat */
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
https://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits

Reply via email to