From 677ef29f71cba2017015c5a804e931314dc71df6 Mon Sep 17 00:00:00 2001
From: Colin Cross <ccross@android.com>
Date: Fri, 7 Jan 2011 14:52:56 -0800
Subject: [PATCH 220/696] input: keyreset: Allow reset function to be overriden

Change-Id: Ibb3dda05772b2e89d7b2646689944d309cb1f74e
Signed-off-by: Colin Cross <ccross@android.com>
---
 drivers/input/keyreset.c |   13 +++++++++++--
 include/linux/keyreset.h |    1 +
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/drivers/input/keyreset.c b/drivers/input/keyreset.c
index b513506..a5091ac 100644
--- a/drivers/input/keyreset.c
+++ b/drivers/input/keyreset.c
@@ -33,6 +33,7 @@ struct keyreset_state {
 	int key_down;
 	int key_up;
 	int restart_disabled;
+	int (*reset_fn)(void);
 };
 
 int restart_requested;
@@ -88,8 +89,12 @@ static void keyreset_event(struct input_handle *handle, unsigned int type,
 		if (restart_requested)
 			panic("keyboard reset failed, %d", restart_requested);
 		pr_info("keyboard reset\n");
-		schedule_work(&restart_work);
-		restart_requested = 1;
+		if (state->reset_fn) {
+			restart_requested = state->reset_fn();
+		} else {
+			schedule_work(&restart_work);
+			restart_requested = 1;
+		}
 	}
 done:
 	spin_unlock_irqrestore(&state->lock, flags);
@@ -187,6 +192,10 @@ static int keyreset_probe(struct platform_device *pdev)
 			__set_bit(key, state->upbit);
 		}
 	}
+
+	if (pdata->reset_fn)
+		state->reset_fn = pdata->reset_fn;
+
 	state->input_handler.event = keyreset_event;
 	state->input_handler.connect = keyreset_connect;
 	state->input_handler.disconnect = keyreset_disconnect;
diff --git a/include/linux/keyreset.h b/include/linux/keyreset.h
index 50c4b95..a2ac49e 100644
--- a/include/linux/keyreset.h
+++ b/include/linux/keyreset.h
@@ -20,6 +20,7 @@
 #define KEYRESET_NAME "keyreset"
 
 struct keyreset_platform_data {
+	int (*reset_fn)(void);
 	int *keys_up;
 	int keys_down[]; /* 0 terminated */
 };
-- 
1.7.1


