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 */