diff options
author | Chethan Krishna N <chethan.krishna@stericsson.com> | 2011-08-30 15:28:29 +0530 |
---|---|---|
committer | Ulf Hansson <ulf.hansson@stericsson.com> | 2011-09-19 16:05:52 +0200 |
commit | 990e4453add6278571caaa1b04b610f31ccf7cf0 (patch) | |
tree | ff254718fdcc4049efca54ceb93cc4e2c9f9969e /arch/arm/mach-ux500/board-u5500.c | |
parent | 0849ab4cc7160a699688e97c6def603bf98106d2 (diff) |
db5500_keypad: handle regulator in apsleep
db5500_keypad doesn't block APSleep during CPU Idle
proper implementation of regluator framework. Key presses
are also detected using manual scan.
ST-Ericsson ID: 342613
ST-Ericsson FOSS-OUT ID: NA
ST-Ericsson Linux next : Not tested, NA
Change-Id: I9e42c56f8f2f270ce0197b035222aa9d7fecdb70
Signed-off-by: Chethan Krishna N <chethan.krishna@stericsson.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/26050
Reviewed-by: Srinidhi KASAGAR <srinidhi.kasagar@stericsson.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/29724
Reviewed-by: Naga RADHESH Y <naga.radheshy@stericsson.com>
Tested-by: Naga RADHESH Y <naga.radheshy@stericsson.com>
Diffstat (limited to 'arch/arm/mach-ux500/board-u5500.c')
-rw-r--r-- | arch/arm/mach-ux500/board-u5500.c | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/arch/arm/mach-ux500/board-u5500.c b/arch/arm/mach-ux500/board-u5500.c index 75c24a9fb11..b5a911b6cae 100644 --- a/arch/arm/mach-ux500/board-u5500.c +++ b/arch/arm/mach-ux500/board-u5500.c @@ -36,6 +36,7 @@ #include <mach/db5500-keypad.h> #include "pins-db5500.h" +#include "pins.h" #include "devices-db5500.h" #include "board-u5500.h" #include "board-u5500-bm.h" @@ -225,6 +226,92 @@ static struct i2c_board_info __initdata u5500_i2c2_devices[] = { * Keypad */ +#define ROW_PIN_I0 128 +#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, +}; + +static bool db5500_config; +static int db5500_set_gpio_row(int gpio) +{ + int ret = -1; + + if (db5500_config) + return ret; + + ret = gpio_request(gpio, "db5500_kpd"); + if (ret < 0) { + pr_err("db5500_set_gpio_row: gpio request failed\n"); + return ret; + } + + ret = gpio_direction_output(gpio, 1); + if (ret < 0) { + pr_err("db5500_set_gpio_row: gpio direction failed\n"); + gpio_free(gpio); + } + + return ret; +} + +static int db5500_kp_init(void) +{ + struct ux500_pins *pins; + int ret, i; + + pins = ux500_pins_get("db5500_kp"); + if (pins) + ux500_pins_enable(pins); + + for (i = 0; i < KEYPAD_MAX_ROWS - 1; i++) { + ret = db5500_set_gpio_row(db5500_kp_rows[i]); + if (ret < 0) { + pr_err("db5500_kp_init: failed init\n"); + ux500_pins_disable(pins); + return ret; + } + } + + BUG_ON(db5500_config); + + db5500_config = true; + + return 0; +} + +static int db5500_kp_exit(void) +{ + struct ux500_pins *pins; + + pins = ux500_pins_get("db5500_kp"); + if (pins) + ux500_pins_disable(pins); + + return 0; +} + static const unsigned int u5500_keymap[] = { KEY(4, 0, KEY_CAMERA), /* Camera2 */ KEY(4, 1, KEY_CAMERA_FOCUS), /* Camera1 */ @@ -246,9 +333,14 @@ static struct matrix_keymap_data u5500_keymap_data = { }; static struct db5500_keypad_platform_data u5500_keypad_board = { + .init = db5500_kp_init, + .exit = db5500_kp_exit, + .gpio_input_pins = db5500_kp_rows, + .gpio_output_pins = db5500_kp_cols, .keymap_data = &u5500_keymap_data, .no_autorepeat = true, .debounce_ms = 40, /* milliseconds */ + .switch_delay = 200, /* in jiffies */ }; /* |