summaryrefslogtreecommitdiff
path: root/arch/arm/mach-ux500/board-u5500.c
diff options
context:
space:
mode:
authorChethan Krishna N <chethan.krishna@stericsson.com>2011-08-30 15:28:29 +0530
committerUlf Hansson <ulf.hansson@stericsson.com>2011-09-19 16:05:52 +0200
commit990e4453add6278571caaa1b04b610f31ccf7cf0 (patch)
treeff254718fdcc4049efca54ceb93cc4e2c9f9969e /arch/arm/mach-ux500/board-u5500.c
parent0849ab4cc7160a699688e97c6def603bf98106d2 (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.c92
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 */
};
/*