1 /* 2 * ST1232 Touchscreen Controller Driver 3 * 4 * Copyright (C) 2010 Renesas Solutions Corp. 5 * Tony SIM <chinyeow.sim.xt@renesas.com> 6 * 7 * Using code from: 8 * - android.git.kernel.org: projects/kernel/common.git: synaptics_i2c_rmi.c 9 * Copyright (C) 2007 Google, Inc. 10 * 11 * This software is licensed under the terms of the GNU General Public 12 * License version 2, as published by the Free Software Foundation, and 13 * may be copied, distributed, and modified under those terms. 14 * 15 * This program is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU General Public License for more details. 19 */ 20 21 #include <linux/delay.h> 22 #include <linux/gpio.h> 23 #include <linux/i2c.h> 24 #include <linux/input.h> 25 #include <linux/interrupt.h> 26 #include <linux/module.h> 27 #include <linux/of_gpio.h> 28 #include <linux/pm_qos.h> 29 #include <linux/slab.h> 30 #include <linux/types.h> 31 #include <linux/platform_data/st1232_pdata.h> 32 33 #define ST1232_TS_NAME "st1232-ts" 34 35 #define MIN_X 0x00 36 #define MIN_Y 0x00 37 #define MAX_X 0x31f /* (800 - 1) */ 38 #define MAX_Y 0x1df /* (480 - 1) */ 39 #define MAX_AREA 0xff 40 #define MAX_FINGERS 2 41 42 struct st1232_ts_finger { 43 u16 x; 44 u16 y; 45 u8 t; 46 bool is_valid; 47 }; 48 49 struct st1232_ts_data { 50 struct i2c_client *client; 51 struct input_dev *input_dev; 52 struct st1232_ts_finger finger[MAX_FINGERS]; 53 struct dev_pm_qos_request low_latency_req; 54 int reset_gpio; 55 }; 56 57 static int st1232_ts_read_data(struct st1232_ts_data *ts) 58 { 59 struct st1232_ts_finger *finger = ts->finger; 60 struct i2c_client *client = ts->client; 61 struct i2c_msg msg[2]; 62 int error; 63 u8 start_reg; 64 u8 buf[10]; 65 66 /* read touchscreen data from ST1232 */ 67 msg[0].addr = client->addr; 68 msg[0].flags = 0; 69 msg[0].len = 1; 70 msg[0].buf = &start_reg; 71 start_reg = 0x10; 72 73 msg[1].addr = ts->client->addr; 74 msg[1].flags = I2C_M_RD; 75 msg[1].len = sizeof(buf); 76 msg[1].buf = buf; 77 78 error = i2c_transfer(client->adapter, msg, 2); 79 if (error < 0) 80 return error; 81 82 /* get "valid" bits */ 83 finger[0].is_valid = buf[2] >> 7; 84 finger[1].is_valid = buf[5] >> 7; 85 86 /* get xy coordinate */ 87 if (finger[0].is_valid) { 88 finger[0].x = ((buf[2] & 0x0070) << 4) | buf[3]; 89 finger[0].y = ((buf[2] & 0x0007) << 8) | buf[4]; 90 finger[0].t = buf[8]; 91 } 92 93 if (finger[1].is_valid) { 94 finger[1].x = ((buf[5] & 0x0070) << 4) | buf[6]; 95 finger[1].y = ((buf[5] & 0x0007) << 8) | buf[7]; 96 finger[1].t = buf[9]; 97 } 98 99 return 0; 100 } 101 102 static irqreturn_t st1232_ts_irq_handler(int irq, void *dev_id) 103 { 104 struct st1232_ts_data *ts = dev_id; 105 struct st1232_ts_finger *finger = ts->finger; 106 struct input_dev *input_dev = ts->input_dev; 107 int count = 0; 108 int i, ret; 109 110 ret = st1232_ts_read_data(ts); 111 if (ret < 0) 112 goto end; 113 114 /* multi touch protocol */ 115 for (i = 0; i < MAX_FINGERS; i++) { 116 if (!finger[i].is_valid) 117 continue; 118 119 input_report_abs(input_dev, ABS_MT_TOUCH_MAJOR, finger[i].t); 120 input_report_abs(input_dev, ABS_MT_POSITION_X, finger[i].x); 121 input_report_abs(input_dev, ABS_MT_POSITION_Y, finger[i].y); 122 input_mt_sync(input_dev); 123 count++; 124 } 125 126 /* SYN_MT_REPORT only if no contact */ 127 if (!count) { 128 input_mt_sync(input_dev); 129 if (ts->low_latency_req.dev) { 130 dev_pm_qos_remove_request(&ts->low_latency_req); 131 ts->low_latency_req.dev = NULL; 132 } 133 } else if (!ts->low_latency_req.dev) { 134 /* First contact, request 100 us latency. */ 135 dev_pm_qos_add_ancestor_request(&ts->client->dev, 136 &ts->low_latency_req, 100); 137 } 138 139 /* SYN_REPORT */ 140 input_sync(input_dev); 141 142 end: 143 return IRQ_HANDLED; 144 } 145 146 static void st1232_ts_power(struct st1232_ts_data *ts, bool poweron) 147 { 148 if (gpio_is_valid(ts->reset_gpio)) 149 gpio_direction_output(ts->reset_gpio, poweron); 150 } 151 152 static int st1232_ts_probe(struct i2c_client *client, 153 const struct i2c_device_id *id) 154 { 155 struct st1232_ts_data *ts; 156 struct st1232_pdata *pdata = client->dev.platform_data; 157 struct input_dev *input_dev; 158 int error; 159 160 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { 161 dev_err(&client->dev, "need I2C_FUNC_I2C\n"); 162 return -EIO; 163 } 164 165 if (!client->irq) { 166 dev_err(&client->dev, "no IRQ?\n"); 167 return -EINVAL; 168 } 169 170 ts = devm_kzalloc(&client->dev, sizeof(*ts), GFP_KERNEL); 171 if (!ts) 172 return -ENOMEM; 173 174 input_dev = devm_input_allocate_device(&client->dev); 175 if (!input_dev) 176 return -ENOMEM; 177 178 ts->client = client; 179 ts->input_dev = input_dev; 180 181 if (pdata) 182 ts->reset_gpio = pdata->reset_gpio; 183 else if (client->dev.of_node) 184 ts->reset_gpio = of_get_gpio(client->dev.of_node, 0); 185 else 186 ts->reset_gpio = -ENODEV; 187 188 if (gpio_is_valid(ts->reset_gpio)) { 189 error = devm_gpio_request(&client->dev, ts->reset_gpio, NULL); 190 if (error) { 191 dev_err(&client->dev, 192 "Unable to request GPIO pin %d.\n", 193 ts->reset_gpio); 194 return error; 195 } 196 } 197 198 st1232_ts_power(ts, true); 199 200 input_dev->name = "st1232-touchscreen"; 201 input_dev->id.bustype = BUS_I2C; 202 input_dev->dev.parent = &client->dev; 203 204 __set_bit(EV_SYN, input_dev->evbit); 205 __set_bit(EV_KEY, input_dev->evbit); 206 __set_bit(EV_ABS, input_dev->evbit); 207 208 input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, MAX_AREA, 0, 0); 209 input_set_abs_params(input_dev, ABS_MT_POSITION_X, MIN_X, MAX_X, 0, 0); 210 input_set_abs_params(input_dev, ABS_MT_POSITION_Y, MIN_Y, MAX_Y, 0, 0); 211 212 error = devm_request_threaded_irq(&client->dev, client->irq, 213 NULL, st1232_ts_irq_handler, 214 IRQF_ONESHOT, 215 client->name, ts); 216 if (error) { 217 dev_err(&client->dev, "Failed to register interrupt\n"); 218 return error; 219 } 220 221 error = input_register_device(ts->input_dev); 222 if (error) { 223 dev_err(&client->dev, "Unable to register %s input device\n", 224 input_dev->name); 225 return error; 226 } 227 228 i2c_set_clientdata(client, ts); 229 device_init_wakeup(&client->dev, 1); 230 231 return 0; 232 } 233 234 static int st1232_ts_remove(struct i2c_client *client) 235 { 236 struct st1232_ts_data *ts = i2c_get_clientdata(client); 237 238 device_init_wakeup(&client->dev, 0); 239 st1232_ts_power(ts, false); 240 241 return 0; 242 } 243 244 #ifdef CONFIG_PM_SLEEP 245 static int st1232_ts_suspend(struct device *dev) 246 { 247 struct i2c_client *client = to_i2c_client(dev); 248 struct st1232_ts_data *ts = i2c_get_clientdata(client); 249 250 if (device_may_wakeup(&client->dev)) { 251 enable_irq_wake(client->irq); 252 } else { 253 disable_irq(client->irq); 254 st1232_ts_power(ts, false); 255 } 256 257 return 0; 258 } 259 260 static int st1232_ts_resume(struct device *dev) 261 { 262 struct i2c_client *client = to_i2c_client(dev); 263 struct st1232_ts_data *ts = i2c_get_clientdata(client); 264 265 if (device_may_wakeup(&client->dev)) { 266 disable_irq_wake(client->irq); 267 } else { 268 st1232_ts_power(ts, true); 269 enable_irq(client->irq); 270 } 271 272 return 0; 273 } 274 275 #endif 276 277 static SIMPLE_DEV_PM_OPS(st1232_ts_pm_ops, 278 st1232_ts_suspend, st1232_ts_resume); 279 280 static const struct i2c_device_id st1232_ts_id[] = { 281 { ST1232_TS_NAME, 0 }, 282 { } 283 }; 284 MODULE_DEVICE_TABLE(i2c, st1232_ts_id); 285 286 #ifdef CONFIG_OF 287 static const struct of_device_id st1232_ts_dt_ids[] = { 288 { .compatible = "sitronix,st1232", }, 289 { } 290 }; 291 MODULE_DEVICE_TABLE(of, st1232_ts_dt_ids); 292 #endif 293 294 static struct i2c_driver st1232_ts_driver = { 295 .probe = st1232_ts_probe, 296 .remove = st1232_ts_remove, 297 .id_table = st1232_ts_id, 298 .driver = { 299 .name = ST1232_TS_NAME, 300 .owner = THIS_MODULE, 301 .of_match_table = of_match_ptr(st1232_ts_dt_ids), 302 .pm = &st1232_ts_pm_ops, 303 }, 304 }; 305 306 module_i2c_driver(st1232_ts_driver); 307 308 MODULE_AUTHOR("Tony SIM <chinyeow.sim.xt@renesas.com>"); 309 MODULE_DESCRIPTION("SITRONIX ST1232 Touchscreen Controller Driver"); 310 MODULE_LICENSE("GPL"); 311