Path: blob/master/drivers/input/touchscreen/st1232.c
15111 views
/*1* ST1232 Touchscreen Controller Driver2*3* Copyright (C) 2010 Renesas Solutions Corp.4* Tony SIM <[email protected]>5*6* Using code from:7* - android.git.kernel.org: projects/kernel/common.git: synaptics_i2c_rmi.c8* Copyright (C) 2007 Google, Inc.9*10* This software is licensed under the terms of the GNU General Public11* License version 2, as published by the Free Software Foundation, and12* may be copied, distributed, and modified under those terms.13*14* This program is distributed in the hope that it will be useful,15* but WITHOUT ANY WARRANTY; without even the implied warranty of16* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the17* GNU General Public License for more details.18*/1920#include <linux/delay.h>21#include <linux/i2c.h>22#include <linux/input.h>23#include <linux/interrupt.h>24#include <linux/module.h>25#include <linux/slab.h>26#include <linux/types.h>2728#define ST1232_TS_NAME "st1232-ts"2930#define MIN_X 0x0031#define MIN_Y 0x0032#define MAX_X 0x31f /* (800 - 1) */33#define MAX_Y 0x1df /* (480 - 1) */34#define MAX_AREA 0xff35#define MAX_FINGERS 23637struct st1232_ts_finger {38u16 x;39u16 y;40u8 t;41bool is_valid;42};4344struct st1232_ts_data {45struct i2c_client *client;46struct input_dev *input_dev;47struct st1232_ts_finger finger[MAX_FINGERS];48};4950static int st1232_ts_read_data(struct st1232_ts_data *ts)51{52struct st1232_ts_finger *finger = ts->finger;53struct i2c_client *client = ts->client;54struct i2c_msg msg[2];55int error;56u8 start_reg;57u8 buf[10];5859/* read touchscreen data from ST1232 */60msg[0].addr = client->addr;61msg[0].flags = 0;62msg[0].len = 1;63msg[0].buf = &start_reg;64start_reg = 0x10;6566msg[1].addr = ts->client->addr;67msg[1].flags = I2C_M_RD;68msg[1].len = sizeof(buf);69msg[1].buf = buf;7071error = i2c_transfer(client->adapter, msg, 2);72if (error < 0)73return error;7475/* get "valid" bits */76finger[0].is_valid = buf[2] >> 7;77finger[1].is_valid = buf[5] >> 7;7879/* get xy coordinate */80if (finger[0].is_valid) {81finger[0].x = ((buf[2] & 0x0070) << 4) | buf[3];82finger[0].y = ((buf[2] & 0x0007) << 8) | buf[4];83finger[0].t = buf[8];84}8586if (finger[1].is_valid) {87finger[1].x = ((buf[5] & 0x0070) << 4) | buf[6];88finger[1].y = ((buf[5] & 0x0007) << 8) | buf[7];89finger[1].t = buf[9];90}9192return 0;93}9495static irqreturn_t st1232_ts_irq_handler(int irq, void *dev_id)96{97struct st1232_ts_data *ts = dev_id;98struct st1232_ts_finger *finger = ts->finger;99struct input_dev *input_dev = ts->input_dev;100int count = 0;101int i, ret;102103ret = st1232_ts_read_data(ts);104if (ret < 0)105goto end;106107/* multi touch protocol */108for (i = 0; i < MAX_FINGERS; i++) {109if (!finger[i].is_valid)110continue;111112input_report_abs(input_dev, ABS_MT_TOUCH_MAJOR, finger[i].t);113input_report_abs(input_dev, ABS_MT_POSITION_X, finger[i].x);114input_report_abs(input_dev, ABS_MT_POSITION_Y, finger[i].y);115input_mt_sync(input_dev);116count++;117}118119/* SYN_MT_REPORT only if no contact */120if (!count)121input_mt_sync(input_dev);122123/* SYN_REPORT */124input_sync(input_dev);125126end:127return IRQ_HANDLED;128}129130static int __devinit st1232_ts_probe(struct i2c_client *client,131const struct i2c_device_id *id)132{133struct st1232_ts_data *ts;134struct input_dev *input_dev;135int error;136137if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {138dev_err(&client->dev, "need I2C_FUNC_I2C\n");139return -EIO;140}141142if (!client->irq) {143dev_err(&client->dev, "no IRQ?\n");144return -EINVAL;145}146147148ts = kzalloc(sizeof(struct st1232_ts_data), GFP_KERNEL);149input_dev = input_allocate_device();150if (!ts || !input_dev) {151error = -ENOMEM;152goto err_free_mem;153}154155ts->client = client;156ts->input_dev = input_dev;157158input_dev->name = "st1232-touchscreen";159input_dev->id.bustype = BUS_I2C;160input_dev->dev.parent = &client->dev;161162__set_bit(EV_SYN, input_dev->evbit);163__set_bit(EV_KEY, input_dev->evbit);164__set_bit(EV_ABS, input_dev->evbit);165166input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, MAX_AREA, 0, 0);167input_set_abs_params(input_dev, ABS_MT_POSITION_X, MIN_X, MAX_X, 0, 0);168input_set_abs_params(input_dev, ABS_MT_POSITION_Y, MIN_Y, MAX_Y, 0, 0);169170error = request_threaded_irq(client->irq, NULL, st1232_ts_irq_handler,171IRQF_ONESHOT, client->name, ts);172if (error) {173dev_err(&client->dev, "Failed to register interrupt\n");174goto err_free_mem;175}176177error = input_register_device(ts->input_dev);178if (error) {179dev_err(&client->dev, "Unable to register %s input device\n",180input_dev->name);181goto err_free_irq;182}183184i2c_set_clientdata(client, ts);185device_init_wakeup(&client->dev, 1);186187return 0;188189err_free_irq:190free_irq(client->irq, ts);191err_free_mem:192input_free_device(input_dev);193kfree(ts);194return error;195}196197static int __devexit st1232_ts_remove(struct i2c_client *client)198{199struct st1232_ts_data *ts = i2c_get_clientdata(client);200201device_init_wakeup(&client->dev, 0);202free_irq(client->irq, ts);203input_unregister_device(ts->input_dev);204kfree(ts);205206return 0;207}208209#ifdef CONFIG_PM210static int st1232_ts_suspend(struct device *dev)211{212struct i2c_client *client = to_i2c_client(dev);213214if (device_may_wakeup(&client->dev))215enable_irq_wake(client->irq);216else217disable_irq(client->irq);218219return 0;220}221222static int st1232_ts_resume(struct device *dev)223{224struct i2c_client *client = to_i2c_client(dev);225226if (device_may_wakeup(&client->dev))227disable_irq_wake(client->irq);228else229enable_irq(client->irq);230231return 0;232}233234static const struct dev_pm_ops st1232_ts_pm_ops = {235.suspend = st1232_ts_suspend,236.resume = st1232_ts_resume,237};238#endif239240static const struct i2c_device_id st1232_ts_id[] = {241{ ST1232_TS_NAME, 0 },242{ }243};244MODULE_DEVICE_TABLE(i2c, st1232_ts_id);245246static struct i2c_driver st1232_ts_driver = {247.probe = st1232_ts_probe,248.remove = __devexit_p(st1232_ts_remove),249.id_table = st1232_ts_id,250.driver = {251.name = ST1232_TS_NAME,252.owner = THIS_MODULE,253#ifdef CONFIG_PM254.pm = &st1232_ts_pm_ops,255#endif256},257};258259static int __init st1232_ts_init(void)260{261return i2c_add_driver(&st1232_ts_driver);262}263module_init(st1232_ts_init);264265static void __exit st1232_ts_exit(void)266{267i2c_del_driver(&st1232_ts_driver);268}269module_exit(st1232_ts_exit);270271MODULE_AUTHOR("Tony SIM <[email protected]>");272MODULE_DESCRIPTION("SITRONIX ST1232 Touchscreen Controller Driver");273MODULE_LICENSE("GPL");274275276