~ubuntu-branches/ubuntu/saucy/linux-n900/saucy

« back to all changes in this revision

Viewing changes to drivers/input/misc/ad714x-i2c.c

  • Committer: Bazaar Package Importer
  • Author(s): Mathieu Poirier
  • Date: 2011-02-18 09:43:31 UTC
  • Revision ID: james.westby@ubuntu.com-20110218094331-eyubsja4f9k0yhmq
Tags: 2.6.35-1.1
Initial release.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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 "ad714x.h"
 
14
 
 
15
#ifdef CONFIG_PM
 
16
static int ad714x_i2c_suspend(struct i2c_client *client, pm_message_t message)
 
17
{
 
18
        return ad714x_disable(i2c_get_clientdata(client));
 
19
}
 
20
 
 
21
static int ad714x_i2c_resume(struct i2c_client *client)
 
22
{
 
23
        return ad714x_enable(i2c_get_clientdata(client));
 
24
}
 
25
#else
 
26
# define ad714x_i2c_suspend NULL
 
27
# define ad714x_i2c_resume  NULL
 
28
#endif
 
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
        },
 
118
        .probe    = ad714x_i2c_probe,
 
119
        .remove   = __devexit_p(ad714x_i2c_remove),
 
120
        .suspend  = ad714x_i2c_suspend,
 
121
        .resume   = ad714x_i2c_resume,
 
122
        .id_table = ad714x_id,
 
123
};
 
124
 
 
125
static __init int ad714x_i2c_init(void)
 
126
{
 
127
        return i2c_add_driver(&ad714x_i2c_driver);
 
128
}
 
129
module_init(ad714x_i2c_init);
 
130
 
 
131
static __exit void ad714x_i2c_exit(void)
 
132
{
 
133
        i2c_del_driver(&ad714x_i2c_driver);
 
134
}
 
135
module_exit(ad714x_i2c_exit);
 
136
 
 
137
MODULE_DESCRIPTION("Analog Devices AD714X Capacitance Touch Sensor I2C Bus Driver");
 
138
MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
 
139
MODULE_LICENSE("GPL");