]>
Commit | Line | Data |
---|---|---|
4397c98a MF |
1 | /* |
2 | * AD7879-1/AD7889-1 touchscreen (I2C bus) | |
3 | * | |
4 | * Copyright (C) 2008-2010 Michael Hennerich, 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> | |
d5dc9ac3 | 13 | #include <linux/pm.h> |
4397c98a MF |
14 | |
15 | #include "ad7879.h" | |
16 | ||
17 | #define AD7879_DEVID 0x79 /* AD7879-1/AD7889-1 */ | |
18 | ||
4397c98a MF |
19 | /* All registers are word-sized. |
20 | * AD7879 uses a high-byte first convention. | |
21 | */ | |
22 | static int ad7879_i2c_read(struct device *dev, u8 reg) | |
23 | { | |
24 | struct i2c_client *client = to_i2c_client(dev); | |
25 | ||
75255b29 | 26 | return i2c_smbus_read_word_swapped(client, reg); |
4397c98a MF |
27 | } |
28 | ||
29 | static int ad7879_i2c_multi_read(struct device *dev, | |
30 | u8 first_reg, u8 count, u16 *buf) | |
31 | { | |
16ea10a7 | 32 | struct i2c_client *client = to_i2c_client(dev); |
4397c98a MF |
33 | u8 idx; |
34 | ||
16ea10a7 MH |
35 | i2c_smbus_read_i2c_block_data(client, first_reg, count * 2, (u8 *)buf); |
36 | ||
4397c98a | 37 | for (idx = 0; idx < count; ++idx) |
16ea10a7 | 38 | buf[idx] = swab16(buf[idx]); |
4397c98a MF |
39 | |
40 | return 0; | |
41 | } | |
42 | ||
43 | static int ad7879_i2c_write(struct device *dev, u8 reg, u16 val) | |
44 | { | |
45 | struct i2c_client *client = to_i2c_client(dev); | |
46 | ||
75255b29 | 47 | return i2c_smbus_write_word_swapped(client, reg, val); |
4397c98a MF |
48 | } |
49 | ||
50 | static const struct ad7879_bus_ops ad7879_i2c_bus_ops = { | |
51 | .bustype = BUS_I2C, | |
52 | .read = ad7879_i2c_read, | |
53 | .multi_read = ad7879_i2c_multi_read, | |
54 | .write = ad7879_i2c_write, | |
55 | }; | |
56 | ||
5298cc4c | 57 | static int ad7879_i2c_probe(struct i2c_client *client, |
4397c98a MF |
58 | const struct i2c_device_id *id) |
59 | { | |
60 | struct ad7879 *ts; | |
61 | ||
62 | if (!i2c_check_functionality(client->adapter, | |
63 | I2C_FUNC_SMBUS_WORD_DATA)) { | |
64 | dev_err(&client->dev, "SMBUS Word Data not Supported\n"); | |
65 | return -EIO; | |
66 | } | |
67 | ||
68 | ts = ad7879_probe(&client->dev, AD7879_DEVID, client->irq, | |
69 | &ad7879_i2c_bus_ops); | |
70 | if (IS_ERR(ts)) | |
71 | return PTR_ERR(ts); | |
72 | ||
73 | i2c_set_clientdata(client, ts); | |
74 | ||
75 | return 0; | |
76 | } | |
77 | ||
78 | static int __devexit ad7879_i2c_remove(struct i2c_client *client) | |
79 | { | |
80 | struct ad7879 *ts = i2c_get_clientdata(client); | |
81 | ||
82 | ad7879_remove(ts); | |
83 | ||
84 | return 0; | |
85 | } | |
86 | ||
87 | static const struct i2c_device_id ad7879_id[] = { | |
88 | { "ad7879", 0 }, | |
89 | { "ad7889", 0 }, | |
90 | { } | |
91 | }; | |
92 | MODULE_DEVICE_TABLE(i2c, ad7879_id); | |
93 | ||
94 | static struct i2c_driver ad7879_i2c_driver = { | |
95 | .driver = { | |
96 | .name = "ad7879", | |
97 | .owner = THIS_MODULE, | |
8672bd93 | 98 | .pm = &ad7879_pm_ops, |
4397c98a MF |
99 | }, |
100 | .probe = ad7879_i2c_probe, | |
1cb0aa88 | 101 | .remove = ad7879_i2c_remove, |
4397c98a MF |
102 | .id_table = ad7879_id, |
103 | }; | |
104 | ||
1b92c1cf | 105 | module_i2c_driver(ad7879_i2c_driver); |
4397c98a MF |
106 | |
107 | MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>"); | |
108 | MODULE_DESCRIPTION("AD7879(-1) touchscreen I2C bus driver"); | |
109 | MODULE_LICENSE("GPL"); |