Input: ad714x - fix endianness issues
[deliverable/linux.git] / drivers / input / misc / ad714x-i2c.c
CommitLineData
31a62963
BW
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>
6b7cfd19 13#include <linux/pm.h>
31a62963
BW
14#include "ad714x.h"
15
16#ifdef CONFIG_PM
6b7cfd19 17static int ad714x_i2c_suspend(struct device *dev)
31a62963 18{
6b7cfd19 19 return ad714x_disable(i2c_get_clientdata(to_i2c_client(dev)));
31a62963
BW
20}
21
6b7cfd19 22static int ad714x_i2c_resume(struct device *dev)
31a62963 23{
6b7cfd19 24 return ad714x_enable(i2c_get_clientdata(to_i2c_client(dev)));
31a62963 25}
31a62963
BW
26#endif
27
6b7cfd19
MB
28static SIMPLE_DEV_PM_OPS(ad714x_i2c_pm, ad714x_i2c_suspend, ad714x_i2c_resume);
29
31a62963
BW
30static 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;
6337de22
MH
35 unsigned short tx[2] = {
36 cpu_to_be16(reg),
37 cpu_to_be16(data)
31a62963
BW
38 };
39
6337de22 40 ret = i2c_master_send(client, (u8 *)tx, 4);
31a62963
BW
41 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;
6337de22 52 unsigned short tx = cpu_to_be16(reg);
31a62963 53
6337de22 54 ret = i2c_master_send(client, (u8 *)&tx, 2);
31a62963 55 if (ret >= 0)
6337de22 56 ret = i2c_master_recv(client, (u8 *)data, 2);
31a62963 57
6337de22 58 if (unlikely(ret < 0))
31a62963 59 dev_err(&client->dev, "I2C read error\n");
6337de22
MH
60 else
61 *data = be16_to_cpu(*data);
31a62963
BW
62
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);
31a62963
BW
86
87 return 0;
88}
89
90static const struct i2c_device_id ad714x_id[] = {
91 { "ad7142_captouch", 0 },
6c04d7b3 92 { "ad7143_captouch", 0 },
31a62963 93 { "ad7147_captouch", 0 },
6c04d7b3
BS
94 { "ad7147a_captouch", 0 },
95 { "ad7148_captouch", 0 },
31a62963
BW
96 { }
97};
98MODULE_DEVICE_TABLE(i2c, ad714x_id);
99
100static struct i2c_driver ad714x_i2c_driver = {
101 .driver = {
102 .name = "ad714x_captouch",
6b7cfd19 103 .pm = &ad714x_i2c_pm,
31a62963
BW
104 },
105 .probe = ad714x_i2c_probe,
106 .remove = __devexit_p(ad714x_i2c_remove),
31a62963
BW
107 .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");
This page took 0.070274 seconds and 5 git commands to generate.