14397c98aSMike Frysinger /* 24397c98aSMike Frysinger * AD7879-1/AD7889-1 touchscreen (I2C bus) 34397c98aSMike Frysinger * 44397c98aSMike Frysinger * Copyright (C) 2008-2010 Michael Hennerich, Analog Devices Inc. 54397c98aSMike Frysinger * 64397c98aSMike Frysinger * Licensed under the GPL-2 or later. 74397c98aSMike Frysinger */ 84397c98aSMike Frysinger 94397c98aSMike Frysinger #include <linux/input.h> /* BUS_I2C */ 104397c98aSMike Frysinger #include <linux/i2c.h> 114397c98aSMike Frysinger #include <linux/module.h> 124397c98aSMike Frysinger #include <linux/types.h> 13d5dc9ac3SMark Brown #include <linux/pm.h> 144397c98aSMike Frysinger 154397c98aSMike Frysinger #include "ad7879.h" 164397c98aSMike Frysinger 174397c98aSMike Frysinger #define AD7879_DEVID 0x79 /* AD7879-1/AD7889-1 */ 184397c98aSMike Frysinger 194397c98aSMike Frysinger #ifdef CONFIG_PM 20d5dc9ac3SMark Brown static int ad7879_i2c_suspend(struct device *dev) 214397c98aSMike Frysinger { 22d5dc9ac3SMark Brown struct i2c_client *client = to_i2c_client(dev); 234397c98aSMike Frysinger struct ad7879 *ts = i2c_get_clientdata(client); 244397c98aSMike Frysinger 2514fbbc36SDmitry Torokhov ad7879_suspend(ts); 264397c98aSMike Frysinger 274397c98aSMike Frysinger return 0; 284397c98aSMike Frysinger } 294397c98aSMike Frysinger 30d5dc9ac3SMark Brown static int ad7879_i2c_resume(struct device *dev) 314397c98aSMike Frysinger { 32d5dc9ac3SMark Brown struct i2c_client *client = to_i2c_client(dev); 334397c98aSMike Frysinger struct ad7879 *ts = i2c_get_clientdata(client); 344397c98aSMike Frysinger 3514fbbc36SDmitry Torokhov ad7879_resume(ts); 364397c98aSMike Frysinger 374397c98aSMike Frysinger return 0; 384397c98aSMike Frysinger } 39d5dc9ac3SMark Brown 40d5dc9ac3SMark Brown static SIMPLE_DEV_PM_OPS(ad7879_i2c_pm, ad7879_i2c_suspend, ad7879_i2c_resume); 414397c98aSMike Frysinger #endif 424397c98aSMike Frysinger 434397c98aSMike Frysinger /* All registers are word-sized. 444397c98aSMike Frysinger * AD7879 uses a high-byte first convention. 454397c98aSMike Frysinger */ 464397c98aSMike Frysinger static int ad7879_i2c_read(struct device *dev, u8 reg) 474397c98aSMike Frysinger { 484397c98aSMike Frysinger struct i2c_client *client = to_i2c_client(dev); 494397c98aSMike Frysinger 504397c98aSMike Frysinger return swab16(i2c_smbus_read_word_data(client, reg)); 514397c98aSMike Frysinger } 524397c98aSMike Frysinger 534397c98aSMike Frysinger static int ad7879_i2c_multi_read(struct device *dev, 544397c98aSMike Frysinger u8 first_reg, u8 count, u16 *buf) 554397c98aSMike Frysinger { 5616ea10a7SMichael Hennerich struct i2c_client *client = to_i2c_client(dev); 574397c98aSMike Frysinger u8 idx; 584397c98aSMike Frysinger 5916ea10a7SMichael Hennerich i2c_smbus_read_i2c_block_data(client, first_reg, count * 2, (u8 *)buf); 6016ea10a7SMichael Hennerich 614397c98aSMike Frysinger for (idx = 0; idx < count; ++idx) 6216ea10a7SMichael Hennerich buf[idx] = swab16(buf[idx]); 634397c98aSMike Frysinger 644397c98aSMike Frysinger return 0; 654397c98aSMike Frysinger } 664397c98aSMike Frysinger 674397c98aSMike Frysinger static int ad7879_i2c_write(struct device *dev, u8 reg, u16 val) 684397c98aSMike Frysinger { 694397c98aSMike Frysinger struct i2c_client *client = to_i2c_client(dev); 704397c98aSMike Frysinger 714397c98aSMike Frysinger return i2c_smbus_write_word_data(client, reg, swab16(val)); 724397c98aSMike Frysinger } 734397c98aSMike Frysinger 744397c98aSMike Frysinger static const struct ad7879_bus_ops ad7879_i2c_bus_ops = { 754397c98aSMike Frysinger .bustype = BUS_I2C, 764397c98aSMike Frysinger .read = ad7879_i2c_read, 774397c98aSMike Frysinger .multi_read = ad7879_i2c_multi_read, 784397c98aSMike Frysinger .write = ad7879_i2c_write, 794397c98aSMike Frysinger }; 804397c98aSMike Frysinger 814397c98aSMike Frysinger static int __devinit ad7879_i2c_probe(struct i2c_client *client, 824397c98aSMike Frysinger const struct i2c_device_id *id) 834397c98aSMike Frysinger { 844397c98aSMike Frysinger struct ad7879 *ts; 854397c98aSMike Frysinger 864397c98aSMike Frysinger if (!i2c_check_functionality(client->adapter, 874397c98aSMike Frysinger I2C_FUNC_SMBUS_WORD_DATA)) { 884397c98aSMike Frysinger dev_err(&client->dev, "SMBUS Word Data not Supported\n"); 894397c98aSMike Frysinger return -EIO; 904397c98aSMike Frysinger } 914397c98aSMike Frysinger 924397c98aSMike Frysinger ts = ad7879_probe(&client->dev, AD7879_DEVID, client->irq, 934397c98aSMike Frysinger &ad7879_i2c_bus_ops); 944397c98aSMike Frysinger if (IS_ERR(ts)) 954397c98aSMike Frysinger return PTR_ERR(ts); 964397c98aSMike Frysinger 974397c98aSMike Frysinger i2c_set_clientdata(client, ts); 984397c98aSMike Frysinger 994397c98aSMike Frysinger return 0; 1004397c98aSMike Frysinger } 1014397c98aSMike Frysinger 1024397c98aSMike Frysinger static int __devexit ad7879_i2c_remove(struct i2c_client *client) 1034397c98aSMike Frysinger { 1044397c98aSMike Frysinger struct ad7879 *ts = i2c_get_clientdata(client); 1054397c98aSMike Frysinger 1064397c98aSMike Frysinger ad7879_remove(ts); 1074397c98aSMike Frysinger 1084397c98aSMike Frysinger return 0; 1094397c98aSMike Frysinger } 1104397c98aSMike Frysinger 1114397c98aSMike Frysinger static const struct i2c_device_id ad7879_id[] = { 1124397c98aSMike Frysinger { "ad7879", 0 }, 1134397c98aSMike Frysinger { "ad7889", 0 }, 1144397c98aSMike Frysinger { } 1154397c98aSMike Frysinger }; 1164397c98aSMike Frysinger MODULE_DEVICE_TABLE(i2c, ad7879_id); 1174397c98aSMike Frysinger 1184397c98aSMike Frysinger static struct i2c_driver ad7879_i2c_driver = { 1194397c98aSMike Frysinger .driver = { 1204397c98aSMike Frysinger .name = "ad7879", 1214397c98aSMike Frysinger .owner = THIS_MODULE, 122d5dc9ac3SMark Brown #ifdef CONFIG_PM 123d5dc9ac3SMark Brown .pm = &ad7879_i2c_pm, 124d5dc9ac3SMark Brown #endif 1254397c98aSMike Frysinger }, 1264397c98aSMike Frysinger .probe = ad7879_i2c_probe, 1274397c98aSMike Frysinger .remove = __devexit_p(ad7879_i2c_remove), 1284397c98aSMike Frysinger .id_table = ad7879_id, 1294397c98aSMike Frysinger }; 1304397c98aSMike Frysinger 1314397c98aSMike Frysinger static int __init ad7879_i2c_init(void) 1324397c98aSMike Frysinger { 1334397c98aSMike Frysinger return i2c_add_driver(&ad7879_i2c_driver); 1344397c98aSMike Frysinger } 1354397c98aSMike Frysinger module_init(ad7879_i2c_init); 1364397c98aSMike Frysinger 1374397c98aSMike Frysinger static void __exit ad7879_i2c_exit(void) 1384397c98aSMike Frysinger { 1394397c98aSMike Frysinger i2c_del_driver(&ad7879_i2c_driver); 1404397c98aSMike Frysinger } 1414397c98aSMike Frysinger module_exit(ad7879_i2c_exit); 1424397c98aSMike Frysinger 1434397c98aSMike Frysinger MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>"); 1444397c98aSMike Frysinger MODULE_DESCRIPTION("AD7879(-1) touchscreen I2C bus driver"); 1454397c98aSMike Frysinger MODULE_LICENSE("GPL"); 1464397c98aSMike Frysinger MODULE_ALIAS("i2c:ad7879"); 147