From 4e8c72b0280cba496c8397b80c363deebdd88717 Mon Sep 17 00:00:00 2001 From: Robert Collins Date: Wed, 15 Jun 2011 14:43:41 -0700 Subject: Input: atmel_mxt_touch: NVIDIA touch customization * Fix suspend/resume bug to prevent unecessary i2cinterrupts when suspended. * Change input device name to match NVDA IDC name. * Add I2C address defines. * Change "printk" to "dev_info" function calls. BUG 826854 Original-Change-Id: Ic1b25bc469b86d8a26e876e80973597d9f6fb107 Reviewed-on: http://git-master/r/35285 Reviewed-by: Robert R Collins Tested-by: Robert R Collins Reviewed-by: Scott Williams Reviewed-by: Narendra Damahe Reviewed-by: Daniel Willemsen Rebase-Id: Rcba51c79d3c004372c0be18538f14f56a2249bc0 --- drivers/input/touchscreen/atmel_mxt_ts.c | 50 ++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 19 deletions(-) (limited to 'drivers/input') diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c index bbc6c151d1d1..bcd22758ce39 100644 --- a/drivers/input/touchscreen/atmel_mxt_ts.c +++ b/drivers/input/touchscreen/atmel_mxt_ts.c @@ -3,6 +3,7 @@ * * Copyright (C) 2010 Samsung Electronics Co.Ltd * Copyright (C) 2011 Atmel Corporation + * Copyright (C) 2011 NVIDIA Corporation * Author: Joonyoung Shim * * This program is free software; you can redistribute it and/or modify it @@ -265,6 +266,7 @@ struct mxt_data { u16 last_address; u8 actv_cycle_time; u8 idle_cycle_time; + u8 is_stopped; struct mutex access_mutex; }; @@ -411,6 +413,7 @@ static int __mxt_read_reg(struct i2c_client *client, { struct i2c_msg xfer[2]; u8 buf[2]; + int retval = 0; struct mxt_data *data = i2c_get_clientdata(client); if ((data->last_address == reg) && (reg == data->msg_address)) { @@ -419,11 +422,9 @@ static int __mxt_read_reg(struct i2c_client *client, dev_err(&client->dev, "%s: Failure reading maxTouch device\n", __func__); - mutex_unlock(&data->access_mutex); - return -EIO; + retval = -EIO; } - mutex_unlock(&data->access_mutex); - return 0; + goto mxt_read_exit; } buf[0] = reg & 0xff; @@ -444,13 +445,14 @@ static int __mxt_read_reg(struct i2c_client *client, mutex_lock(&data->access_mutex); if (i2c_transfer(client->adapter, xfer, 2) != 2) { dev_err(&client->dev, "%s: i2c transfer failed\n", __func__); - mutex_unlock(&data->access_mutex); - return -EIO; + retval = -EIO; } - mutex_unlock(&data->access_mutex); data->last_address = reg; - return 0; + +mxt_read_exit: + mutex_unlock(&data->access_mutex); + return retval; } static int mxt_read_reg(struct i2c_client *client, u16 reg, u8 *val) @@ -461,6 +463,7 @@ static int mxt_read_reg(struct i2c_client *client, u16 reg, u8 *val) static int mxt_write_reg(struct i2c_client *client, u16 reg, u8 val) { u8 buf[3]; + int retval = 0; struct mxt_data *data = i2c_get_clientdata(client); buf[0] = reg & 0xff; @@ -470,12 +473,14 @@ static int mxt_write_reg(struct i2c_client *client, u16 reg, u8 val) mutex_lock(&data->access_mutex); if (i2c_master_send(client, buf, 3) != 3) { dev_err(&client->dev, "%s: i2c send failed\n", __func__); - mutex_unlock(&data->access_mutex); - return -EIO; + retval = -EIO; + goto mxt_write_exit; } data->last_address = reg + 1; + +mxt_write_exit: mutex_unlock(&data->access_mutex); - return 0; + return retval; } static int mxt_read_object_table(struct i2c_client *client, @@ -1145,20 +1150,21 @@ static const struct attribute_group mxt_attr_group = { static void mxt_start(struct mxt_data *data) { int error; - - printk(KERN_WARNING "in MXT_START(), idle time: %d %d", data->idle_cycle_time, data->actv_cycle_time); + struct device *dev = &data->client->dev; + dev_info(dev, "in MXT_START(), idle time: %d %d", data->idle_cycle_time, data->actv_cycle_time); /* Restore the cycle time settings to wake from sleep */ error = mxt_write_object(data, MXT_GEN_POWER_T7, MXT_POWER_ACTVACQINT, data->actv_cycle_time); if (error) - printk("\n\nresume failed!"); + dev_info(dev, "\n\nResume failed!"); error = mxt_write_object(data, MXT_GEN_POWER_T7, MXT_POWER_IDLEACQINT, data->idle_cycle_time); if (error) - printk("\n\nresume failed!"); + dev_info(dev, "\n\nResume failed!"); - printk(KERN_WARNING "Restored ACTV %d, IDLE %d", data->actv_cycle_time, + dev_info(dev, "Restored ACTV %d, IDLE %d", data->actv_cycle_time, data->idle_cycle_time); + data->is_stopped = 0; } static void mxt_stop(struct mxt_data *data) @@ -1166,6 +1172,10 @@ static void mxt_stop(struct mxt_data *data) u8 actv_cycle_time; u8 idle_cycle_time; int error; + struct device *dev = &data->client->dev; + + if (data->is_stopped) + return; error = mxt_read_object(data, MXT_GEN_POWER_T7, MXT_POWER_ACTVACQINT, @@ -1191,12 +1201,13 @@ static void mxt_stop(struct mxt_data *data) if (error) goto i2c_error; - printk(KERN_WARNING "MXT Suspended, saved ACTV %d and IDLE %d", + dev_info(dev, "MXT Suspended, saved ACTV %d and IDLE %d", actv_cycle_time, idle_cycle_time); + data->is_stopped = 1; return; i2c_error: - printk(KERN_WARNING "MXT Suspend failed!"); + dev_info(dev, "MXT Suspend failed!"); } @@ -1234,7 +1245,7 @@ static int __devinit mxt_probe(struct i2c_client *client, goto err_free_mem; } - input_dev->name = "Atmel maXTouch Touchscreen"; + input_dev->name = "atmel-maxtouch"; input_dev->id.bustype = BUS_I2C; input_dev->dev.parent = &client->dev; input_dev->open = mxt_input_open; @@ -1244,6 +1255,7 @@ static int __devinit mxt_probe(struct i2c_client *client, data->input_dev = input_dev; data->pdata = pdata; data->irq = client->irq; + data->is_stopped = 0; mxt_calc_resolution(data); -- cgit v1.2.3