Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/drivers/input/misc/ad714x-i2c.c
15109 views
1
/*
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>
13
#include <linux/pm.h>
14
#include "ad714x.h"
15
16
#ifdef CONFIG_PM
17
static int ad714x_i2c_suspend(struct device *dev)
18
{
19
return ad714x_disable(i2c_get_clientdata(to_i2c_client(dev)));
20
}
21
22
static int ad714x_i2c_resume(struct device *dev)
23
{
24
return ad714x_enable(i2c_get_clientdata(to_i2c_client(dev)));
25
}
26
#endif
27
28
static SIMPLE_DEV_PM_OPS(ad714x_i2c_pm, ad714x_i2c_suspend, ad714x_i2c_resume);
29
30
static 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;
35
u8 *_reg = (u8 *)&reg;
36
u8 *_data = (u8 *)&data;
37
38
u8 tx[4] = {
39
_reg[1],
40
_reg[0],
41
_data[1],
42
_data[0]
43
};
44
45
ret = i2c_master_send(client, tx, 4);
46
if (ret < 0)
47
dev_err(&client->dev, "I2C write error\n");
48
49
return ret;
50
}
51
52
static int ad714x_i2c_read(struct device *dev, unsigned short reg,
53
unsigned short *data)
54
{
55
struct i2c_client *client = to_i2c_client(dev);
56
int ret = 0;
57
u8 *_reg = (u8 *)&reg;
58
u8 *_data = (u8 *)data;
59
60
u8 tx[2] = {
61
_reg[1],
62
_reg[0]
63
};
64
u8 rx[2];
65
66
ret = i2c_master_send(client, tx, 2);
67
if (ret >= 0)
68
ret = i2c_master_recv(client, rx, 2);
69
70
if (unlikely(ret < 0)) {
71
dev_err(&client->dev, "I2C read error\n");
72
} else {
73
_data[0] = rx[1];
74
_data[1] = rx[0];
75
}
76
77
return ret;
78
}
79
80
static int __devinit ad714x_i2c_probe(struct i2c_client *client,
81
const struct i2c_device_id *id)
82
{
83
struct ad714x_chip *chip;
84
85
chip = ad714x_probe(&client->dev, BUS_I2C, client->irq,
86
ad714x_i2c_read, ad714x_i2c_write);
87
if (IS_ERR(chip))
88
return PTR_ERR(chip);
89
90
i2c_set_clientdata(client, chip);
91
92
return 0;
93
}
94
95
static int __devexit ad714x_i2c_remove(struct i2c_client *client)
96
{
97
struct ad714x_chip *chip = i2c_get_clientdata(client);
98
99
ad714x_remove(chip);
100
101
return 0;
102
}
103
104
static const struct i2c_device_id ad714x_id[] = {
105
{ "ad7142_captouch", 0 },
106
{ "ad7143_captouch", 0 },
107
{ "ad7147_captouch", 0 },
108
{ "ad7147a_captouch", 0 },
109
{ "ad7148_captouch", 0 },
110
{ }
111
};
112
MODULE_DEVICE_TABLE(i2c, ad714x_id);
113
114
static struct i2c_driver ad714x_i2c_driver = {
115
.driver = {
116
.name = "ad714x_captouch",
117
.pm = &ad714x_i2c_pm,
118
},
119
.probe = ad714x_i2c_probe,
120
.remove = __devexit_p(ad714x_i2c_remove),
121
.id_table = ad714x_id,
122
};
123
124
static __init int ad714x_i2c_init(void)
125
{
126
return i2c_add_driver(&ad714x_i2c_driver);
127
}
128
module_init(ad714x_i2c_init);
129
130
static __exit void ad714x_i2c_exit(void)
131
{
132
i2c_del_driver(&ad714x_i2c_driver);
133
}
134
module_exit(ad714x_i2c_exit);
135
136
MODULE_DESCRIPTION("Analog Devices AD714X Capacitance Touch Sensor I2C Bus Driver");
137
MODULE_AUTHOR("Barry Song <[email protected]>");
138
MODULE_LICENSE("GPL");
139
140