diff mbox

[v2] Input: atmel_mxt_ts - Support 12bit resolution

Message ID 1302241446-29201-1-git-send-email-jy0922.shim@samsung.com (mailing list archive)
State Accepted
Commit 910d80513056589d3b12b3aad8598d19e0a0a5bd
Headers show

Commit Message

Joonyoung Shim April 8, 2011, 5:44 a.m. UTC
Atmel touchscreen chip can support 12bit resolution and this patch
modifies to get maximum x and y size from platform data.

Signed-off-by: Joonyoung Shim <jy0922.shim@samsung.com>
---
v2: Fix absinfo->maximum value of x and y

 drivers/input/touchscreen/atmel_mxt_ts.c |   53 ++++++++++++++++++++++--------
 1 files changed, 39 insertions(+), 14 deletions(-)

Comments

Dmitry Torokhov April 12, 2011, 6:57 a.m. UTC | #1
On Fri, Apr 08, 2011 at 02:44:06PM +0900, Joonyoung Shim wrote:
> Atmel touchscreen chip can support 12bit resolution and this patch
> modifies to get maximum x and y size from platform data.
> 
> Signed-off-by: Joonyoung Shim <jy0922.shim@samsung.com>

Iiro, can I have your Acked-by for this please?

> ---
> v2: Fix absinfo->maximum value of x and y
> 
>  drivers/input/touchscreen/atmel_mxt_ts.c |   53 ++++++++++++++++++++++--------
>  1 files changed, 39 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
> index 4012436..a97905a 100644
> --- a/drivers/input/touchscreen/atmel_mxt_ts.c
> +++ b/drivers/input/touchscreen/atmel_mxt_ts.c
> @@ -196,9 +196,12 @@
>  #define MXT_PRESS		(1 << 6)
>  #define MXT_DETECT		(1 << 7)
>  
> +/* Touch orient bits */
> +#define MXT_XY_SWITCH		(1 << 0)
> +#define MXT_X_INVERT		(1 << 1)
> +#define MXT_Y_INVERT		(1 << 2)
> +
>  /* Touchscreen absolute values */
> -#define MXT_MAX_XC		0x3ff
> -#define MXT_MAX_YC		0x3ff
>  #define MXT_MAX_AREA		0xff
>  
>  #define MXT_MAX_FINGER		10
> @@ -246,6 +249,8 @@ struct mxt_data {
>  	struct mxt_info info;
>  	struct mxt_finger finger[MXT_MAX_FINGER];
>  	unsigned int irq;
> +	unsigned int max_x;
> +	unsigned int max_y;
>  };
>  
>  static bool mxt_object_readable(unsigned int type)
> @@ -549,8 +554,13 @@ static void mxt_input_touchevent(struct mxt_data *data,
>  	if (!(status & (MXT_PRESS | MXT_MOVE)))
>  		return;
>  
> -	x = (message->message[1] << 2) | ((message->message[3] & ~0x3f) >> 6);
> -	y = (message->message[2] << 2) | ((message->message[3] & ~0xf3) >> 2);
> +	x = (message->message[1] << 4) | ((message->message[3] >> 4) & 0xf);
> +	y = (message->message[2] << 4) | ((message->message[3] & 0xf));
> +	if (data->max_x < 1024)
> +		x = x >> 2;
> +	if (data->max_y < 1024)
> +		y = y >> 2;
> +
>  	area = message->message[4];
>  
>  	dev_dbg(dev, "[%d] %s x: %d, y: %d, area: %d\n", id,
> @@ -845,6 +855,20 @@ static int mxt_initialize(struct mxt_data *data)
>  	return 0;
>  }
>  
> +static void mxt_calc_resolution(struct mxt_data *data)
> +{
> +	unsigned int max_x = data->pdata->x_size - 1;
> +	unsigned int max_y = data->pdata->y_size - 1;
> +
> +	if (data->pdata->orient & MXT_XY_SWITCH) {
> +		data->max_x = max_y;
> +		data->max_y = max_x;
> +	} else {
> +		data->max_x = max_x;
> +		data->max_y = max_y;
> +	}
> +}
> +
>  static ssize_t mxt_object_show(struct device *dev,
>  				    struct device_attribute *attr, char *buf)
>  {
> @@ -1052,31 +1076,32 @@ static int __devinit mxt_probe(struct i2c_client *client,
>  	input_dev->open = mxt_input_open;
>  	input_dev->close = mxt_input_close;
>  
> +	data->client = client;
> +	data->input_dev = input_dev;
> +	data->pdata = pdata;
> +	data->irq = client->irq;
> +
> +	mxt_calc_resolution(data);
> +
>  	__set_bit(EV_ABS, input_dev->evbit);
>  	__set_bit(EV_KEY, input_dev->evbit);
>  	__set_bit(BTN_TOUCH, input_dev->keybit);
>  
>  	/* For single touch */
>  	input_set_abs_params(input_dev, ABS_X,
> -			     0, MXT_MAX_XC, 0, 0);
> +			     0, data->max_x, 0, 0);
>  	input_set_abs_params(input_dev, ABS_Y,
> -			     0, MXT_MAX_YC, 0, 0);
> +			     0, data->max_y, 0, 0);
>  
>  	/* For multi touch */
>  	input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR,
>  			     0, MXT_MAX_AREA, 0, 0);
>  	input_set_abs_params(input_dev, ABS_MT_POSITION_X,
> -			     0, MXT_MAX_XC, 0, 0);
> +			     0, data->max_x, 0, 0);
>  	input_set_abs_params(input_dev, ABS_MT_POSITION_Y,
> -			     0, MXT_MAX_YC, 0, 0);
> +			     0, data->max_y, 0, 0);
>  
>  	input_set_drvdata(input_dev, data);
> -
> -	data->client = client;
> -	data->input_dev = input_dev;
> -	data->pdata = pdata;
> -	data->irq = client->irq;
> -
>  	i2c_set_clientdata(client, data);
>  
>  	error = mxt_initialize(data);
> -- 
> 1.7.0.4
>
Iiro Valkonen April 12, 2011, 2:54 p.m. UTC | #2
On 04/08/2011 08:44 AM, Joonyoung Shim wrote:
> Atmel touchscreen chip can support 12bit resolution and this patch
> modifies to get maximum x and y size from platform data.
> 
> Signed-off-by: Joonyoung Shim <jy0922.shim@samsung.com>

Acked-by: Iiro Valkonen <iiro.valkonen@atmel.com>

Thanks,
Iiro

> ---
> v2: Fix absinfo->maximum value of x and y
> 
>  drivers/input/touchscreen/atmel_mxt_ts.c |   53 ++++++++++++++++++++++--------
>  1 files changed, 39 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
> index 4012436..a97905a 100644
> --- a/drivers/input/touchscreen/atmel_mxt_ts.c
> +++ b/drivers/input/touchscreen/atmel_mxt_ts.c
> @@ -196,9 +196,12 @@
>  #define MXT_PRESS		(1 << 6)
>  #define MXT_DETECT		(1 << 7)
>  
> +/* Touch orient bits */
> +#define MXT_XY_SWITCH		(1 << 0)
> +#define MXT_X_INVERT		(1 << 1)
> +#define MXT_Y_INVERT		(1 << 2)
> +
>  /* Touchscreen absolute values */
> -#define MXT_MAX_XC		0x3ff
> -#define MXT_MAX_YC		0x3ff
>  #define MXT_MAX_AREA		0xff
>  
>  #define MXT_MAX_FINGER		10
> @@ -246,6 +249,8 @@ struct mxt_data {
>  	struct mxt_info info;
>  	struct mxt_finger finger[MXT_MAX_FINGER];
>  	unsigned int irq;
> +	unsigned int max_x;
> +	unsigned int max_y;
>  };
>  
>  static bool mxt_object_readable(unsigned int type)
> @@ -549,8 +554,13 @@ static void mxt_input_touchevent(struct mxt_data *data,
>  	if (!(status & (MXT_PRESS | MXT_MOVE)))
>  		return;
>  
> -	x = (message->message[1] << 2) | ((message->message[3] & ~0x3f) >> 6);
> -	y = (message->message[2] << 2) | ((message->message[3] & ~0xf3) >> 2);
> +	x = (message->message[1] << 4) | ((message->message[3] >> 4) & 0xf);
> +	y = (message->message[2] << 4) | ((message->message[3] & 0xf));
> +	if (data->max_x < 1024)
> +		x = x >> 2;
> +	if (data->max_y < 1024)
> +		y = y >> 2;
> +
>  	area = message->message[4];
>  
>  	dev_dbg(dev, "[%d] %s x: %d, y: %d, area: %d\n", id,
> @@ -845,6 +855,20 @@ static int mxt_initialize(struct mxt_data *data)
>  	return 0;
>  }
>  
> +static void mxt_calc_resolution(struct mxt_data *data)
> +{
> +	unsigned int max_x = data->pdata->x_size - 1;
> +	unsigned int max_y = data->pdata->y_size - 1;
> +
> +	if (data->pdata->orient & MXT_XY_SWITCH) {
> +		data->max_x = max_y;
> +		data->max_y = max_x;
> +	} else {
> +		data->max_x = max_x;
> +		data->max_y = max_y;
> +	}
> +}
> +
>  static ssize_t mxt_object_show(struct device *dev,
>  				    struct device_attribute *attr, char *buf)
>  {
> @@ -1052,31 +1076,32 @@ static int __devinit mxt_probe(struct i2c_client *client,
>  	input_dev->open = mxt_input_open;
>  	input_dev->close = mxt_input_close;
>  
> +	data->client = client;
> +	data->input_dev = input_dev;
> +	data->pdata = pdata;
> +	data->irq = client->irq;
> +
> +	mxt_calc_resolution(data);
> +
>  	__set_bit(EV_ABS, input_dev->evbit);
>  	__set_bit(EV_KEY, input_dev->evbit);
>  	__set_bit(BTN_TOUCH, input_dev->keybit);
>  
>  	/* For single touch */
>  	input_set_abs_params(input_dev, ABS_X,
> -			     0, MXT_MAX_XC, 0, 0);
> +			     0, data->max_x, 0, 0);
>  	input_set_abs_params(input_dev, ABS_Y,
> -			     0, MXT_MAX_YC, 0, 0);
> +			     0, data->max_y, 0, 0);
>  
>  	/* For multi touch */
>  	input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR,
>  			     0, MXT_MAX_AREA, 0, 0);
>  	input_set_abs_params(input_dev, ABS_MT_POSITION_X,
> -			     0, MXT_MAX_XC, 0, 0);
> +			     0, data->max_x, 0, 0);
>  	input_set_abs_params(input_dev, ABS_MT_POSITION_Y,
> -			     0, MXT_MAX_YC, 0, 0);
> +			     0, data->max_y, 0, 0);
>  
>  	input_set_drvdata(input_dev, data);
> -
> -	data->client = client;
> -	data->input_dev = input_dev;
> -	data->pdata = pdata;
> -	data->irq = client->irq;
> -
>  	i2c_set_clientdata(client, data);
>  
>  	error = mxt_initialize(data);


--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index 4012436..a97905a 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -196,9 +196,12 @@ 
 #define MXT_PRESS		(1 << 6)
 #define MXT_DETECT		(1 << 7)
 
+/* Touch orient bits */
+#define MXT_XY_SWITCH		(1 << 0)
+#define MXT_X_INVERT		(1 << 1)
+#define MXT_Y_INVERT		(1 << 2)
+
 /* Touchscreen absolute values */
-#define MXT_MAX_XC		0x3ff
-#define MXT_MAX_YC		0x3ff
 #define MXT_MAX_AREA		0xff
 
 #define MXT_MAX_FINGER		10
@@ -246,6 +249,8 @@  struct mxt_data {
 	struct mxt_info info;
 	struct mxt_finger finger[MXT_MAX_FINGER];
 	unsigned int irq;
+	unsigned int max_x;
+	unsigned int max_y;
 };
 
 static bool mxt_object_readable(unsigned int type)
@@ -549,8 +554,13 @@  static void mxt_input_touchevent(struct mxt_data *data,
 	if (!(status & (MXT_PRESS | MXT_MOVE)))
 		return;
 
-	x = (message->message[1] << 2) | ((message->message[3] & ~0x3f) >> 6);
-	y = (message->message[2] << 2) | ((message->message[3] & ~0xf3) >> 2);
+	x = (message->message[1] << 4) | ((message->message[3] >> 4) & 0xf);
+	y = (message->message[2] << 4) | ((message->message[3] & 0xf));
+	if (data->max_x < 1024)
+		x = x >> 2;
+	if (data->max_y < 1024)
+		y = y >> 2;
+
 	area = message->message[4];
 
 	dev_dbg(dev, "[%d] %s x: %d, y: %d, area: %d\n", id,
@@ -845,6 +855,20 @@  static int mxt_initialize(struct mxt_data *data)
 	return 0;
 }
 
+static void mxt_calc_resolution(struct mxt_data *data)
+{
+	unsigned int max_x = data->pdata->x_size - 1;
+	unsigned int max_y = data->pdata->y_size - 1;
+
+	if (data->pdata->orient & MXT_XY_SWITCH) {
+		data->max_x = max_y;
+		data->max_y = max_x;
+	} else {
+		data->max_x = max_x;
+		data->max_y = max_y;
+	}
+}
+
 static ssize_t mxt_object_show(struct device *dev,
 				    struct device_attribute *attr, char *buf)
 {
@@ -1052,31 +1076,32 @@  static int __devinit mxt_probe(struct i2c_client *client,
 	input_dev->open = mxt_input_open;
 	input_dev->close = mxt_input_close;
 
+	data->client = client;
+	data->input_dev = input_dev;
+	data->pdata = pdata;
+	data->irq = client->irq;
+
+	mxt_calc_resolution(data);
+
 	__set_bit(EV_ABS, input_dev->evbit);
 	__set_bit(EV_KEY, input_dev->evbit);
 	__set_bit(BTN_TOUCH, input_dev->keybit);
 
 	/* For single touch */
 	input_set_abs_params(input_dev, ABS_X,
-			     0, MXT_MAX_XC, 0, 0);
+			     0, data->max_x, 0, 0);
 	input_set_abs_params(input_dev, ABS_Y,
-			     0, MXT_MAX_YC, 0, 0);
+			     0, data->max_y, 0, 0);
 
 	/* For multi touch */
 	input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR,
 			     0, MXT_MAX_AREA, 0, 0);
 	input_set_abs_params(input_dev, ABS_MT_POSITION_X,
-			     0, MXT_MAX_XC, 0, 0);
+			     0, data->max_x, 0, 0);
 	input_set_abs_params(input_dev, ABS_MT_POSITION_Y,
-			     0, MXT_MAX_YC, 0, 0);
+			     0, data->max_y, 0, 0);
 
 	input_set_drvdata(input_dev, data);
-
-	data->client = client;
-	data->input_dev = input_dev;
-	data->pdata = pdata;
-	data->irq = client->irq;
-
 	i2c_set_clientdata(client, data);
 
 	error = mxt_initialize(data);