CHROMIUM: Input: elan_i2c - Recovery exception ic type

When driver get exception ic type (0xFF), maybe occurred from wrong
I2C protocol communication, system crash or other unknown situation,
we need to reset ic type from iap_version.

Signed-off-by: Duson Lin <dusonlin@emc.com.tw>
BUG=chrome-os-partner:43652
TEST=on Heli with Elan touchpad, boot and touchpad works.

Change-Id: Icbdd0ae1f28f291d070dbc181adae7829bbec509
Reviewed-on: https://chromium-review.googlesource.com/294996
Commit-Ready: 政維 林 <dusonlin@emc.com.tw>
Tested-by: 政維 林 <dusonlin@emc.com.tw>
Reviewed-by: Dmitry Torokhov <dtor@chromium.org>
Reviewed-by: 政維 林 <dusonlin@emc.com.tw>
(cherry picked from commit c2a8c7606406cbb5f85ae293dc60163102b1ea8d)
Reviewed-on: https://chromium-review.googlesource.com/317380
Reviewed-by: Charlie Mooney <charliemooney@chromium.org>
Commit-Queue: Saurabh Madan <ssmadan@chromium.org>
Trybot-Ready: Saurabh Madan <ssmadan@chromium.org>
Tested-by: Saurabh Madan <ssmadan@chromium.org>
diff --git a/drivers/input/mouse/elan_i2c.c b/drivers/input/mouse/elan_i2c.c
index f92eb10..1afb15e 100644
--- a/drivers/input/mouse/elan_i2c.c
+++ b/drivers/input/mouse/elan_i2c.c
@@ -4,7 +4,7 @@
  * Copyright (c) 2013 ELAN Microelectronics Corp.
  *
  * Author: 林政維 (Duson Lin) <dusonlin@emc.com.tw>
- * Version: 1.5.9
+ * Version: 1.6.0
  *
  * Based on cyapa driver:
  * copyright (c) 2011-2012 Cypress Semiconductor, Inc.
@@ -40,7 +40,7 @@
 #include <linux/of.h>
 
 #define DRIVER_NAME		"elan_i2c"
-#define ELAN_DRIVER_VERSION	"1.5.9"
+#define ELAN_DRIVER_VERSION	"1.6.0"
 #define ELAN_VENDOR_ID		0x04f3
 #define ETP_PRESSURE_OFFSET	25
 #define ETP_MAX_PRESSURE	255
@@ -1099,6 +1099,10 @@
 				  ETP_I2C_SM_VERSION_CMD, val);
 	data->sm_version = val[0];
 	data->ic_type = val[1];
+
+	/* exception type, need reset from iap_version */
+	if (data->ic_type == 0xFF)
+		data->ic_type = data->iap_version;
 	return 0;
 }
 
@@ -1769,8 +1773,8 @@
 
 	data->product_id = elan_get_product_id(data);
 	data->fw_version = elan_get_fw_version(data);
-	elan_get_sm_version(data);
 	data->iap_version = elan_get_iap_version(data);
+	elan_get_sm_version(data);
 	data->pressure_adjustment = elan_get_pressure_adjustment(data);
 	data->max_x = elan_get_x_max(data);
 	data->max_y = elan_get_y_max(data);