summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/arm/mach-ux500/board-u5500.c18
-rw-r--r--arch/arm/mach-ux500/include/mach/db5500-keypad.h5
-rw-r--r--drivers/input/keyboard/db5500_keypad.c25
3 files changed, 23 insertions, 25 deletions
diff --git a/arch/arm/mach-ux500/board-u5500.c b/arch/arm/mach-ux500/board-u5500.c
index b5a911b6cae..44a00c4478f 100644
--- a/arch/arm/mach-ux500/board-u5500.c
+++ b/arch/arm/mach-ux500/board-u5500.c
@@ -230,27 +230,15 @@ static struct i2c_board_info __initdata u5500_i2c2_devices[] = {
#define ROW_PIN_I1 130
#define ROW_PIN_I2 132
#define ROW_PIN_I3 134
-#define ROW_PIN_I4 136
-#define ROW_PIN_I5 138
-#define ROW_PIN_I6 140
-#define ROW_PIN_I7 142
-#define COL_PIN_O0 129
-#define COL_PIN_O1 131
-#define COL_PIN_O2 133
-#define COL_PIN_O3 135
#define COL_PIN_O4 137
#define COL_PIN_O5 139
-#define COL_PIN_O6 141
-#define COL_PIN_O7 143
static int db5500_kp_rows[] = {
ROW_PIN_I0, ROW_PIN_I1, ROW_PIN_I2, ROW_PIN_I3,
- ROW_PIN_I4, ROW_PIN_I5, ROW_PIN_I6, ROW_PIN_I7,
};
static int db5500_kp_cols[] = {
- COL_PIN_O0, COL_PIN_O1, COL_PIN_O2, COL_PIN_O3,
- COL_PIN_O4, COL_PIN_O5, COL_PIN_O6, COL_PIN_O7,
+ COL_PIN_O4, COL_PIN_O5,
};
static bool db5500_config;
@@ -285,7 +273,7 @@ static int db5500_kp_init(void)
if (pins)
ux500_pins_enable(pins);
- for (i = 0; i < KEYPAD_MAX_ROWS - 1; i++) {
+ for (i = 0; i < ARRAY_SIZE(db5500_kp_rows); i++) {
ret = db5500_set_gpio_row(db5500_kp_rows[i]);
if (ret < 0) {
pr_err("db5500_kp_init: failed init\n");
@@ -339,6 +327,8 @@ static struct db5500_keypad_platform_data u5500_keypad_board = {
.gpio_output_pins = db5500_kp_cols,
.keymap_data = &u5500_keymap_data,
.no_autorepeat = true,
+ .krow = ARRAY_SIZE(db5500_kp_rows),
+ .kcol = ARRAY_SIZE(db5500_kp_cols),
.debounce_ms = 40, /* milliseconds */
.switch_delay = 200, /* in jiffies */
};
diff --git a/arch/arm/mach-ux500/include/mach/db5500-keypad.h b/arch/arm/mach-ux500/include/mach/db5500-keypad.h
index 8db5a05017b..d9d23419ab3 100644
--- a/arch/arm/mach-ux500/include/mach/db5500-keypad.h
+++ b/arch/arm/mach-ux500/include/mach/db5500-keypad.h
@@ -12,6 +12,7 @@
#define KEYPAD_MAX_ROWS 9
#define KEYPAD_MAX_COLS 8
+
/**
* struct db5500_keypad_platform_data - structure for platform specific data
* @keymap_data: matrix scan code table for keycodes
@@ -19,6 +20,8 @@
* @no_autorepeat: flag for auto repetition
* @init : pointer to keypad init function
* @exit : pointer to keypad exit function
+ * @krow : maximum number of rows
+ * @kcol : maximum number of cols
* @gpio_input_pins: pointer to gpio input pins
* @gpio_output_pins: pointer to gpio output pins
* @switch_delay : gpio switch_delay
@@ -29,6 +32,8 @@ struct db5500_keypad_platform_data {
bool no_autorepeat;
int (*init)(void);
int (*exit)(void);
+ u8 krow;
+ u8 kcol;
int *gpio_input_pins;
int *gpio_output_pins;
int switch_delay;
diff --git a/drivers/input/keyboard/db5500_keypad.c b/drivers/input/keyboard/db5500_keypad.c
index 61cda09cacf..b1f069ea825 100644
--- a/drivers/input/keyboard/db5500_keypad.c
+++ b/drivers/input/keyboard/db5500_keypad.c
@@ -74,9 +74,9 @@ struct db5500_keypad {
u8 previous_set[KEYPAD_MAX_ROWS];
bool enable;
bool valid_key;
- int db5500_rows[KEYPAD_MAX_ROWS - 1];
+ int db5500_rows[KEYPAD_MAX_ROWS];
int db5500_cols[KEYPAD_MAX_COLS];
- int gpio_input_irq[KEYPAD_MAX_ROWS - 1];
+ int gpio_input_irq[KEYPAD_MAX_ROWS];
int gpio_row;
int gpio_col;
};
@@ -274,7 +274,7 @@ static void db5500_mode_enable(struct db5500_keypad *keypad, bool enable)
db5500_keypad_writel(keypad, 0, KEYPAD_INT_ENABLE);
if (keypad->board->exit)
keypad->board->exit();
- for (i = 0; i < KEYPAD_MAX_ROWS - 1; i++) {
+ for (i = 0; i < keypad->board->krow; i++) {
enable_irq(keypad->gpio_input_irq[i]);
enable_irq_wake(keypad->gpio_input_irq[i]);
}
@@ -283,7 +283,7 @@ static void db5500_mode_enable(struct db5500_keypad *keypad, bool enable)
} else {
regulator_enable(keypad->regulator);
clk_enable(keypad->clk);
- for (i = 0; i < KEYPAD_MAX_ROWS - 1; i++) {
+ for (i = 0; i < keypad->board->krow; i++) {
disable_irq_nosync(keypad->gpio_input_irq[i]);
disable_irq_wake(keypad->gpio_input_irq[i]);
}
@@ -325,13 +325,13 @@ static int db5500_read_get_gpio_row(struct db5500_keypad *keypad)
int ret;
/* read all rows GPIO data register values */
- for (row = 0; row < KEYPAD_MAX_ROWS - 1; row++) {
+ for (row = 0; row < keypad->board->krow; row++) {
ret = gpio_get_value(keypad->db5500_rows[row]);
value += (1 << row) * ret;
}
/* get the exact row */
- for (row = 0; row < KEYPAD_MAX_ROWS - 1; row++) {
+ for (row = 0; row < keypad->board->krow; row++) {
if (((1 << row) & value) == 0)
return row;
}
@@ -363,7 +363,7 @@ static void db5500_free_cols(struct db5500_keypad *keypad)
{
int i ;
- for (i = 0; i < KEYPAD_MAX_COLS; i++) {
+ for (i = 0; i < keypad->board->kcol; i++) {
gpio_request(keypad->db5500_cols[i], "db5500-kpd");
gpio_direction_output(keypad->db5500_cols[i], 0);
gpio_free(keypad->db5500_cols[i]);
@@ -377,7 +377,7 @@ static void db5500_manual_scan(struct db5500_keypad *keypad)
keypad->valid_key = false;
- for (col = 0; col < KEYPAD_MAX_COLS; col++) {
+ for (col = 0; col < keypad->board->kcol; col++) {
db5500_set_cols(keypad, col);
row = db5500_read_get_gpio_row(keypad);
if (row >= 0) {
@@ -580,16 +580,19 @@ if (!keypad->board->init) {
goto out_unregisterinput;
}
- for (i = 0; i < KEYPAD_MAX_ROWS - 1; i++) {
+ for (i = 0; i < keypad->board->krow; i++) {
keypad->db5500_rows[i] = *plat->gpio_input_pins;
- keypad->db5500_cols[i] = *plat->gpio_output_pins;
keypad->gpio_input_irq[i] =
GPIO_TO_IRQ(keypad->db5500_rows[i]);
plat->gpio_input_pins++;
+ }
+
+ for (i = 0; i < keypad->board->kcol; i++) {
+ keypad->db5500_cols[i] = *plat->gpio_output_pins;
plat->gpio_output_pins++;
}
- for (i = 0; i < KEYPAD_MAX_ROWS - 1; i++) {
+ for (i = 0; i < keypad->board->krow; i++) {
ret = request_threaded_irq(keypad->gpio_input_irq[i],
NULL, db5500_keypad_gpio_irq,
IRQF_TRIGGER_FALLING | IRQF_NO_SUSPEND,