mako: touch: added tool type and touch minor option

- Let the low level driver pass tool type and use it
  (Synaptics: PEN when major = 0, minor = 0, Other: FINGER)
- Split touch major and minor value to choose
  circle vs. ellipse from platform datai
  (Currently defined to support circle)

Change-Id: Ibd79efb5d88843174c45147a4c7ea170632c3fdb
diff --git a/drivers/input/touchscreen/lge_touch_core.c b/drivers/input/touchscreen/lge_touch_core.c
index 50bd7c2..191c155 100644
--- a/drivers/input/touchscreen/lge_touch_core.c
+++ b/drivers/input/touchscreen/lge_touch_core.c
@@ -46,8 +46,8 @@
 };
 
 static int is_pressure;
-static int is_width;
-static int is_id;
+static int is_width_major;
+static int is_width_minor;
 
 #define LGE_TOUCH_ATTR(_name, _mode, _show, _store)               \
 	struct lge_touch_attribute lge_touch_attr_##_name =       \
@@ -257,12 +257,13 @@
 {
 	int id;
 
-	for (id = 0; id < MAX_FINGER; id++) {
+	for (id = 0; id < ts->pdata->caps->max_id; id++) {
 		if (!ts->ts_data.curr_data[id].state)
 			continue;
 
 		input_mt_slot(ts->input_dev, id);
-		input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, 0);
+		input_mt_report_slot_state(ts->input_dev,
+				ts->ts_data.curr_data[id].tool_type, 0);
 		ts->ts_data.curr_data[id].state = 0;
 	}
 
@@ -574,7 +575,7 @@
 	if (ts->accuracy_filter.finish_filter)
 		return 0;
 
-	for (id = 0; id < MAX_FINGER; id++) {
+	for (id = 0; id < ts->pdata->caps->max_id; id++) {
 		u16 width;
 
 		if (!ts->ts_data.curr_data[id].state)
@@ -642,7 +643,7 @@
 
 	bit_mask = ts->jitter_filter.id_mask ^ new_id_mask;
 
-	for (id = 0, bit_id = 1; id < MAX_FINGER; id++) {
+	for (id = 0, bit_id = 1; id < ts->pdata->caps->max_id; id++) {
 		if ((ts->jitter_filter.id_mask & bit_id) &&
 						!(new_id_mask & bit_id)) {
 			if (unlikely(touch_debug_mask & DEBUG_JITTER))
@@ -655,7 +656,7 @@
 		bit_id = bit_id << 1;
 	}
 
-	for (id = 0; id < MAX_FINGER; id++) {
+	for (id = 0; id < ts->pdata->caps->max_id; id++) {
 		if (!ts->ts_data.curr_data[id].state)
 			continue;
 
@@ -673,7 +674,7 @@
 		return -1;
 	}
 
-	for (id = 0; id < MAX_FINGER; id++) {
+	for (id = 0; id < ts->pdata->caps->max_id; id++) {
 		if (!ts->ts_data.curr_data[id].state)
 			continue;
 
@@ -739,12 +740,13 @@
 {
 	int	id;
 
-	for (id = 0; id < MAX_FINGER; id++) {
+	for (id = 0; id < ts->pdata->caps->max_id; id++) {
 		if (!ts->ts_data.curr_data[id].state)
 			continue;
 
 		input_mt_slot(ts->input_dev, id);
-		input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER,
+		input_mt_report_slot_state(ts->input_dev,
+				ts->ts_data.curr_data[id].tool_type,
 				ts->ts_data.curr_data[id].state != ABS_RELEASE);
 
 		if (ts->ts_data.curr_data[id].state != ABS_RELEASE) {
@@ -757,9 +759,15 @@
 					ts->ts_data.curr_data[id].pressure);
 
 			/* Only support circle region */
-			if (is_width)
-				input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR,
+			if (is_width_major)
+				input_report_abs(ts->input_dev,
+					ABS_MT_TOUCH_MAJOR,
 					ts->ts_data.curr_data[id].width_major);
+
+			if (is_width_minor)
+				input_report_abs(ts->input_dev,
+					ABS_MT_TOUCH_MINOR,
+					ts->ts_data.curr_data[id].width_minor);
 #ifdef LGE_TOUCH_POINT_DEBUG
 			if (id == 0 && tr_last_index < MAX_TRACE) {
 				tr_data[tr_last_index].x = ts->ts_data.curr_data[id].x_position;
@@ -1166,14 +1174,18 @@
 			pdata->caps->button_name[2],
 			pdata->caps->button_name[3]);
 	}
-	ret += sprintf(buf+ret, "\tis_width_supported    = %d\n",
-			pdata->caps->is_width_supported);
+	ret += sprintf(buf+ret, "\tis_width_major_supported    = %d\n",
+			pdata->caps->is_width_major_supported);
+	ret += sprintf(buf+ret, "\tis_width_minor_supported    = %d\n",
+			pdata->caps->is_width_minor_supported);
 	ret += sprintf(buf+ret, "\tis_pressure_supported = %d\n",
 			pdata->caps->is_pressure_supported);
 	ret += sprintf(buf+ret, "\tis_id_supported       = %d\n",
 			pdata->caps->is_id_supported);
-	ret += sprintf(buf+ret, "\tmax_width             = %d\n",
-			pdata->caps->max_width);
+	ret += sprintf(buf+ret, "\tmax_width_major       = %d\n",
+			pdata->caps->max_width_major);
+	ret += sprintf(buf+ret, "\tmax_width_minor       = %d\n",
+			pdata->caps->max_width_minor);
 	ret += sprintf(buf+ret, "\tmax_pressure          = %d\n",
 			pdata->caps->max_pressure);
 	ret += sprintf(buf+ret, "\tmax_id                = %d\n",
@@ -1700,7 +1712,11 @@
 		}
 	}
 
-	input_mt_init_slots(ts->input_dev, MAX_FINGER);
+	if (ts->pdata->caps->max_id > MAX_FINGER) {
+		ts->pdata->caps->max_id = MAX_FINGER;
+	}
+
+	input_mt_init_slots(ts->input_dev, ts->pdata->caps->max_id);
 	input_set_abs_params(ts->input_dev,
 			ABS_MT_POSITION_X, 0, ts->pdata->caps->x_max, 0, 0);
 	input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y, 0,
@@ -1711,20 +1727,20 @@
 
 	/* Copy for efficient handling */
 	is_pressure = ts->pdata->caps->is_pressure_supported;
-	is_width = ts->pdata->caps->is_width_supported;
-	is_id = ts->pdata->caps->is_id_supported;
+	is_width_major = ts->pdata->caps->is_width_major_supported;
+	is_width_minor = ts->pdata->caps->is_width_minor_supported;
 
 	if (is_pressure)
 		input_set_abs_params(ts->input_dev, ABS_MT_PRESSURE,
 				0, ts->pdata->caps->max_pressure, 0, 0);
 
-	if (ts->pdata->caps->is_width_supported) {
-		/* Only circle supported */
+	if (is_width_major)
 		input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR,
-				0, ts->pdata->caps->max_width, 0, 0);
-		input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR,
-				0, ts->pdata->caps->max_width, 0, 0);
-	}
+				0, ts->pdata->caps->max_width_major, 0, 0);
+
+	if (is_width_minor)
+		input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MINOR,
+				0, ts->pdata->caps->max_width_minor, 0, 0);
 
 	ret = input_register_device(ts->input_dev);
 	if (ret < 0) {
diff --git a/drivers/input/touchscreen/touch_synaptics.c b/drivers/input/touchscreen/touch_synaptics.c
index 4a91d64..96d8701 100644
--- a/drivers/input/touchscreen/touch_synaptics.c
+++ b/drivers/input/touchscreen/touch_synaptics.c
@@ -24,6 +24,7 @@
 #include <linux/gpio.h>
 
 #include <linux/earlysuspend.h>
+#include <linux/input/mt.h>
 #include <linux/input/lge_touch_core.h>
 #include <linux/input/touch_synaptics.h>
 
@@ -275,6 +276,7 @@
 				data[id].y_position = TS_SNTS_GET_Y_POSITION(ts->ts_data.finger.finger_reg[id][REG_Y_POSITION], ts->ts_data.finger.finger_reg[id][REG_YX_POSITION]);
 				data[id].width_major = TS_SNTS_GET_WIDTH_MAJOR(ts->ts_data.finger.finger_reg[id][REG_WY_WX]);
 				data[id].width_minor = TS_SNTS_GET_WIDTH_MINOR(ts->ts_data.finger.finger_reg[id][REG_WY_WX]);
+				data[id].tool_type = (data[id].width_major == 0 && data[id].width_minor == 0) ? MT_TOOL_PEN : MT_TOOL_FINGER;
 				data[id].width_orientation = TS_SNTS_GET_ORIENTATION(ts->ts_data.finger.finger_reg[id][REG_WY_WX]);
 				data[id].pressure = TS_SNTS_GET_PRESSURE(ts->ts_data.finger.finger_reg[id][REG_Z]);