summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChethan Krishna N <chethan.krishna@stericsson.com>2011-07-26 12:37:10 +0530
committerPhilippe Langlais <philippe.langlais@stericsson.com>2012-05-22 11:03:34 +0200
commiteb43e3a25be22cfbc89e46fa09b75b4b4fd1ceb8 (patch)
tree6644dbbe7b1bc3b19cf8f19592f342574bf7b9d0
parentdc0c779a8f09e343841063d5f19d9a71b14be402 (diff)
db5500_keypad: don't configure all keypad pins
Some keypad pins are not connected to keypad controller, do not configure them. ST-Ericsson ID: 353260 ST-Ericsson FOSS-OUT ID: NA ST-Ericsson Linux next: NA Change-Id: I4943a3febe4ad38c4e7322638c49ac91d838271a Signed-off-by: Chethan Krishna N <chethan.krishna@stericsson.com> Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/27885 Reviewed-by: QATOOLS Reviewed-by: QATEST Reviewed-by: Srinidhi KASAGAR <srinidhi.kasagar@stericsson.com> Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/29725 Reviewed-by: Naga RADHESH Y <naga.radheshy@stericsson.com> Tested-by: Naga RADHESH Y <naga.radheshy@stericsson.com>
-rw-r--r--arch/arm/mach-ux500/include/mach/db5500-keypad.h5
-rw-r--r--drivers/input/keyboard/db5500_keypad.c25
2 files changed, 19 insertions, 11 deletions
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,