From: David Wu <wdc@rock-chips.com>
Date: Tue, 11 Aug 2015 18:47:10 +0000 (+0800)
Subject: rk-keys: make input registered before key isr and key timer.
X-Git-Tag: firefly_0821_release~3851
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=593f6699e6d7db1d2164fe1f3ee2e1a1aa5e159f;p=firefly-linux-kernel-4.4.55.git

rk-keys: make input registered before key isr and key timer.
	fix get pdata NULL pointer error.

Signed-off-by: David Wu <wdc@rock-chips.com>
---

diff --git a/drivers/input/keyboard/rk_keys.c b/drivers/input/keyboard/rk_keys.c
index c8688b04f859..1071b54a454c 100755
--- a/drivers/input/keyboard/rk_keys.c
+++ b/drivers/input/keyboard/rk_keys.c
@@ -59,6 +59,7 @@ enum rk_key_type {
 };
 
 struct rk_keys_button {
+	struct device *dev;
 	u32 type;		/* TYPE_GPIO, TYPE_ADC */
 	u32 code;		/* key code */
 	const char *desc;	/* key label */
@@ -85,13 +86,6 @@ struct rk_keys_drvdata {
 };
 
 static struct input_dev *sinput_dev;
-static struct rk_keys_drvdata *spdata;
-
-static void *rk_key_get_drvdata(void)
-{
-	BUG_ON(!spdata);
-	return spdata;
-}
 
 void rk_send_power_key(int state)
 {
@@ -121,8 +115,8 @@ EXPORT_SYMBOL(rk_send_wakeup_key);
 
 static void keys_timer(unsigned long _data)
 {
-	struct rk_keys_drvdata *pdata = rk_key_get_drvdata();
 	struct rk_keys_button *button = (struct rk_keys_button *)_data;
+	struct rk_keys_drvdata *pdata = dev_get_drvdata(button->dev);
 	struct input_dev *input = pdata->input;
 	int state;
 
@@ -148,8 +142,8 @@ static void keys_timer(unsigned long _data)
 
 static irqreturn_t keys_isr(int irq, void *dev_id)
 {
-	struct rk_keys_drvdata *pdata = rk_key_get_drvdata();
 	struct rk_keys_button *button = (struct rk_keys_button *)dev_id;
+	struct rk_keys_drvdata *pdata = dev_get_drvdata(button->dev);
 	struct input_dev *input = pdata->input;
 
 	BUG_ON(irq != gpio_to_irq(button->gpio));
@@ -341,6 +335,7 @@ static int keys_probe(struct platform_device *pdev)
 		return error;
 	}
 	platform_set_drvdata(pdev, ddata);
+	dev_set_drvdata(&pdev->dev, ddata);
 
 	input->name = "rk29-keypad";	/* pdev->name; */
 	input->phys = "gpio-keys/input0";
@@ -362,6 +357,14 @@ static int keys_probe(struct platform_device *pdev)
 	if (ddata->rep)
 		__set_bit(EV_REP, input->evbit);
 
+	error = input_register_device(input);
+	if (error) {
+		pr_err("gpio-keys: Unable to register input device, error: %d\n",
+		       error);
+		goto fail0;
+	}
+	sinput_dev = input;
+
 	for (i = 0; i < ddata->nbuttons; i++) {
 		struct rk_keys_button *button = &ddata->button[i];
 
@@ -377,10 +380,12 @@ static int keys_probe(struct platform_device *pdev)
 	}
 
 	wake_lock_init(&ddata->wake_lock, WAKE_LOCK_SUSPEND, input->name);
+	device_init_wakeup(dev, wakeup);
 
 	for (i = 0; i < ddata->nbuttons; i++) {
 		struct rk_keys_button *button = &ddata->button[i];
 
+		button->dev = &pdev->dev;
 		if (button->type == TYPE_GPIO) {
 			int irq;
 
@@ -427,15 +432,6 @@ static int keys_probe(struct platform_device *pdev)
 	}
 
 	input_set_capability(input, EV_KEY, KEY_WAKEUP);
-	device_init_wakeup(dev, wakeup);
-
-	error = input_register_device(input);
-	if (error) {
-		pr_err("gpio-keys: Unable to register input device, error: %d\n",
-		       error);
-		goto fail2;
-	}
-
 	/* adc polling work */
 	if (ddata->chan) {
 		INIT_DELAYED_WORK(&ddata->adc_poll_work, adc_key_poll);
@@ -443,16 +439,13 @@ static int keys_probe(struct platform_device *pdev)
 				      ADC_SAMPLE_JIFFIES);
 	}
 
-	spdata = ddata;
-	sinput_dev = input;
 	return error;
 
-fail2:
-	device_init_wakeup(dev, 0);
 fail1:
-	wake_lock_destroy(&ddata->wake_lock);
 	while (--i >= 0)
 		del_timer_sync(&ddata->button[i].timer);
+	device_init_wakeup(dev, 0);
+	wake_lock_destroy(&ddata->wake_lock);
 fail0:
 	platform_set_drvdata(pdev, NULL);
 
@@ -475,7 +468,6 @@ static int keys_remove(struct platform_device *pdev)
 	wake_lock_destroy(&ddata->wake_lock);
 
 	sinput_dev = NULL;
-	spdata = NULL;
 
 	return 0;
 }