blob: 00a6a223212a3a7458ebcdd43dad4ac81ae173a3 [file] [log] [blame]
Bryan Wu31a62962010-03-21 23:23:24 -07001/*
2 * AD714X CapTouch Programmable Controller driver (I2C bus)
3 *
4 * Copyright 2009 Analog Devices Inc.
5 *
6 * Licensed under the GPL-2 or later.
7 */
8
9#include <linux/input.h> /* BUS_I2C */
10#include <linux/i2c.h>
11#include <linux/module.h>
12#include <linux/types.h>
Mark Brown6b7cfd12011-02-11 08:49:05 -080013#include <linux/pm.h>
Bryan Wu31a62962010-03-21 23:23:24 -070014#include "ad714x.h"
15
16#ifdef CONFIG_PM
Mark Brown6b7cfd12011-02-11 08:49:05 -080017static int ad714x_i2c_suspend(struct device *dev)
Bryan Wu31a62962010-03-21 23:23:24 -070018{
Mark Brown6b7cfd12011-02-11 08:49:05 -080019 return ad714x_disable(i2c_get_clientdata(to_i2c_client(dev)));
Bryan Wu31a62962010-03-21 23:23:24 -070020}
21
Mark Brown6b7cfd12011-02-11 08:49:05 -080022static int ad714x_i2c_resume(struct device *dev)
Bryan Wu31a62962010-03-21 23:23:24 -070023{
Mark Brown6b7cfd12011-02-11 08:49:05 -080024 return ad714x_enable(i2c_get_clientdata(to_i2c_client(dev)));
Bryan Wu31a62962010-03-21 23:23:24 -070025}
Bryan Wu31a62962010-03-21 23:23:24 -070026#endif
27
Mark Brown6b7cfd12011-02-11 08:49:05 -080028static SIMPLE_DEV_PM_OPS(ad714x_i2c_pm, ad714x_i2c_suspend, ad714x_i2c_resume);
29
Bryan Wu31a62962010-03-21 23:23:24 -070030static int ad714x_i2c_write(struct device *dev, unsigned short reg,
31 unsigned short data)
32{
33 struct i2c_client *client = to_i2c_client(dev);
34 int ret = 0;
Michael Hennerich6337de22011-08-21 21:04:12 -070035 unsigned short tx[2] = {
36 cpu_to_be16(reg),
37 cpu_to_be16(data)
Bryan Wu31a62962010-03-21 23:23:24 -070038 };
39
Michael Hennerich6337de22011-08-21 21:04:12 -070040 ret = i2c_master_send(client, (u8 *)tx, 4);
Bryan Wu31a62962010-03-21 23:23:24 -070041 if (ret < 0)
42 dev_err(&client->dev, "I2C write error\n");
43
44 return ret;
45}
46
47static int ad714x_i2c_read(struct device *dev, unsigned short reg,
48 unsigned short *data)
49{
50 struct i2c_client *client = to_i2c_client(dev);
51 int ret = 0;
Michael Hennerich6337de22011-08-21 21:04:12 -070052 unsigned short tx = cpu_to_be16(reg);
Bryan Wu31a62962010-03-21 23:23:24 -070053
Michael Hennerich6337de22011-08-21 21:04:12 -070054 ret = i2c_master_send(client, (u8 *)&tx, 2);
Bryan Wu31a62962010-03-21 23:23:24 -070055 if (ret >= 0)
Michael Hennerich6337de22011-08-21 21:04:12 -070056 ret = i2c_master_recv(client, (u8 *)data, 2);
Bryan Wu31a62962010-03-21 23:23:24 -070057
Michael Hennerich6337de22011-08-21 21:04:12 -070058 if (unlikely(ret < 0))
Bryan Wu31a62962010-03-21 23:23:24 -070059 dev_err(&client->dev, "I2C read error\n");
Michael Hennerich6337de22011-08-21 21:04:12 -070060 else
61 *data = be16_to_cpu(*data);
Bryan Wu31a62962010-03-21 23:23:24 -070062
63 return ret;
64}
65
66static int __devinit ad714x_i2c_probe(struct i2c_client *client,
67 const struct i2c_device_id *id)
68{
69 struct ad714x_chip *chip;
70
71 chip = ad714x_probe(&client->dev, BUS_I2C, client->irq,
72 ad714x_i2c_read, ad714x_i2c_write);
73 if (IS_ERR(chip))
74 return PTR_ERR(chip);
75
76 i2c_set_clientdata(client, chip);
77
78 return 0;
79}
80
81static int __devexit ad714x_i2c_remove(struct i2c_client *client)
82{
83 struct ad714x_chip *chip = i2c_get_clientdata(client);
84
85 ad714x_remove(chip);
Bryan Wu31a62962010-03-21 23:23:24 -070086
87 return 0;
88}
89
90static const struct i2c_device_id ad714x_id[] = {
91 { "ad7142_captouch", 0 },
Barry Song6c04d7b2010-03-21 23:23:29 -070092 { "ad7143_captouch", 0 },
Bryan Wu31a62962010-03-21 23:23:24 -070093 { "ad7147_captouch", 0 },
Barry Song6c04d7b2010-03-21 23:23:29 -070094 { "ad7147a_captouch", 0 },
95 { "ad7148_captouch", 0 },
Bryan Wu31a62962010-03-21 23:23:24 -070096 { }
97};
98MODULE_DEVICE_TABLE(i2c, ad714x_id);
99
100static struct i2c_driver ad714x_i2c_driver = {
101 .driver = {
102 .name = "ad714x_captouch",
Mark Brown6b7cfd12011-02-11 08:49:05 -0800103 .pm = &ad714x_i2c_pm,
Bryan Wu31a62962010-03-21 23:23:24 -0700104 },
105 .probe = ad714x_i2c_probe,
106 .remove = __devexit_p(ad714x_i2c_remove),
Bryan Wu31a62962010-03-21 23:23:24 -0700107 .id_table = ad714x_id,
108};
109
110static __init int ad714x_i2c_init(void)
111{
112 return i2c_add_driver(&ad714x_i2c_driver);
113}
114module_init(ad714x_i2c_init);
115
116static __exit void ad714x_i2c_exit(void)
117{
118 i2c_del_driver(&ad714x_i2c_driver);
119}
120module_exit(ad714x_i2c_exit);
121
122MODULE_DESCRIPTION("Analog Devices AD714X Capacitance Touch Sensor I2C Bus Driver");
123MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
124MODULE_LICENSE("GPL");