Path: blob/master/drivers/input/touchscreen/ad7879-i2c.c
15111 views
/*1* AD7879-1/AD7889-1 touchscreen (I2C bus)2*3* Copyright (C) 2008-2010 Michael Hennerich, Analog Devices Inc.4*5* Licensed under the GPL-2 or later.6*/78#include <linux/input.h> /* BUS_I2C */9#include <linux/i2c.h>10#include <linux/module.h>11#include <linux/types.h>12#include <linux/pm.h>1314#include "ad7879.h"1516#define AD7879_DEVID 0x79 /* AD7879-1/AD7889-1 */1718#ifdef CONFIG_PM19static int ad7879_i2c_suspend(struct device *dev)20{21struct i2c_client *client = to_i2c_client(dev);22struct ad7879 *ts = i2c_get_clientdata(client);2324ad7879_suspend(ts);2526return 0;27}2829static int ad7879_i2c_resume(struct device *dev)30{31struct i2c_client *client = to_i2c_client(dev);32struct ad7879 *ts = i2c_get_clientdata(client);3334ad7879_resume(ts);3536return 0;37}3839static SIMPLE_DEV_PM_OPS(ad7879_i2c_pm, ad7879_i2c_suspend, ad7879_i2c_resume);40#endif4142/* All registers are word-sized.43* AD7879 uses a high-byte first convention.44*/45static int ad7879_i2c_read(struct device *dev, u8 reg)46{47struct i2c_client *client = to_i2c_client(dev);4849return swab16(i2c_smbus_read_word_data(client, reg));50}5152static int ad7879_i2c_multi_read(struct device *dev,53u8 first_reg, u8 count, u16 *buf)54{55struct i2c_client *client = to_i2c_client(dev);56u8 idx;5758i2c_smbus_read_i2c_block_data(client, first_reg, count * 2, (u8 *)buf);5960for (idx = 0; idx < count; ++idx)61buf[idx] = swab16(buf[idx]);6263return 0;64}6566static int ad7879_i2c_write(struct device *dev, u8 reg, u16 val)67{68struct i2c_client *client = to_i2c_client(dev);6970return i2c_smbus_write_word_data(client, reg, swab16(val));71}7273static const struct ad7879_bus_ops ad7879_i2c_bus_ops = {74.bustype = BUS_I2C,75.read = ad7879_i2c_read,76.multi_read = ad7879_i2c_multi_read,77.write = ad7879_i2c_write,78};7980static int __devinit ad7879_i2c_probe(struct i2c_client *client,81const struct i2c_device_id *id)82{83struct ad7879 *ts;8485if (!i2c_check_functionality(client->adapter,86I2C_FUNC_SMBUS_WORD_DATA)) {87dev_err(&client->dev, "SMBUS Word Data not Supported\n");88return -EIO;89}9091ts = ad7879_probe(&client->dev, AD7879_DEVID, client->irq,92&ad7879_i2c_bus_ops);93if (IS_ERR(ts))94return PTR_ERR(ts);9596i2c_set_clientdata(client, ts);9798return 0;99}100101static int __devexit ad7879_i2c_remove(struct i2c_client *client)102{103struct ad7879 *ts = i2c_get_clientdata(client);104105ad7879_remove(ts);106107return 0;108}109110static const struct i2c_device_id ad7879_id[] = {111{ "ad7879", 0 },112{ "ad7889", 0 },113{ }114};115MODULE_DEVICE_TABLE(i2c, ad7879_id);116117static struct i2c_driver ad7879_i2c_driver = {118.driver = {119.name = "ad7879",120.owner = THIS_MODULE,121#ifdef CONFIG_PM122.pm = &ad7879_i2c_pm,123#endif124},125.probe = ad7879_i2c_probe,126.remove = __devexit_p(ad7879_i2c_remove),127.id_table = ad7879_id,128};129130static int __init ad7879_i2c_init(void)131{132return i2c_add_driver(&ad7879_i2c_driver);133}134module_init(ad7879_i2c_init);135136static void __exit ad7879_i2c_exit(void)137{138i2c_del_driver(&ad7879_i2c_driver);139}140module_exit(ad7879_i2c_exit);141142MODULE_AUTHOR("Michael Hennerich <[email protected]>");143MODULE_DESCRIPTION("AD7879(-1) touchscreen I2C bus driver");144MODULE_LICENSE("GPL");145MODULE_ALIAS("i2c:ad7879");146147148