Merge branch 'staging-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh...
[pandora-kernel.git] / drivers / staging / iio / addac / adt7316-i2c.c
1 /*
2  * I2C bus driver for ADT7316/7/8 ADT7516/7/9 digital temperature
3  * sensor, ADC and DAC
4  *
5  * Copyright 2010 Analog Devices Inc.
6  *
7  * Licensed under the GPL-2 or later.
8  */
9
10 #include <linux/device.h>
11 #include <linux/kernel.h>
12 #include <linux/i2c.h>
13 #include <linux/interrupt.h>
14
15 #include "adt7316.h"
16
17 /*
18  * adt7316 register access by I2C
19  */
20 static int adt7316_i2c_read(void *client, u8 reg, u8 *data)
21 {
22         struct i2c_client *cl = client;
23         int ret = 0;
24
25         ret = i2c_smbus_write_byte(cl, reg);
26         if (ret < 0) {
27                 dev_err(&cl->dev, "I2C fail to select reg\n");
28                 return ret;
29         }
30
31         ret = i2c_smbus_read_byte(client);
32         if (ret < 0) {
33                 dev_err(&cl->dev, "I2C read error\n");
34                 return ret;
35         }
36
37         return 0;
38 }
39
40 static int adt7316_i2c_write(void *client, u8 reg, u8 data)
41 {
42         struct i2c_client *cl = client;
43         int ret = 0;
44
45         ret = i2c_smbus_write_byte_data(cl, reg, data);
46         if (ret < 0)
47                 dev_err(&cl->dev, "I2C write error\n");
48
49         return ret;
50 }
51
52 static int adt7316_i2c_multi_read(void *client, u8 reg, u8 count, u8 *data)
53 {
54         struct i2c_client *cl = client;
55         int i, ret = 0;
56
57         if (count > ADT7316_REG_MAX_ADDR)
58                 count = ADT7316_REG_MAX_ADDR;
59
60         for (i = 0; i < count; i++) {
61                 ret = adt7316_i2c_read(cl, reg, &data[i]);
62                 if (ret < 0) {
63                         dev_err(&cl->dev, "I2C multi read error\n");
64                         return ret;
65                 }
66         }
67
68         return 0;
69 }
70
71 static int adt7316_i2c_multi_write(void *client, u8 reg, u8 count, u8 *data)
72 {
73         struct i2c_client *cl = client;
74         int i, ret = 0;
75
76         if (count > ADT7316_REG_MAX_ADDR)
77                 count = ADT7316_REG_MAX_ADDR;
78
79         for (i = 0; i < count; i++) {
80                 ret = adt7316_i2c_write(cl, reg, data[i]);
81                 if (ret < 0) {
82                         dev_err(&cl->dev, "I2C multi write error\n");
83                         return ret;
84                 }
85         }
86
87         return 0;
88 }
89
90 /*
91  * device probe and remove
92  */
93
94 static int __devinit adt7316_i2c_probe(struct i2c_client *client,
95                 const struct i2c_device_id *id)
96 {
97         struct adt7316_bus bus = {
98                 .client = client,
99                 .irq = client->irq,
100                 .irq_flags = IRQF_TRIGGER_LOW,
101                 .read = adt7316_i2c_read,
102                 .write = adt7316_i2c_write,
103                 .multi_read = adt7316_i2c_multi_read,
104                 .multi_write = adt7316_i2c_multi_write,
105         };
106
107         return adt7316_probe(&client->dev, &bus, id->name);
108 }
109
110 static int __devexit adt7316_i2c_remove(struct i2c_client *client)
111 {
112         return adt7316_remove(&client->dev);;
113 }
114
115 static const struct i2c_device_id adt7316_i2c_id[] = {
116         { "adt7316", 0 },
117         { "adt7317", 0 },
118         { "adt7318", 0 },
119         { "adt7516", 0 },
120         { "adt7517", 0 },
121         { "adt7519", 0 },
122         { }
123 };
124
125 MODULE_DEVICE_TABLE(i2c, adt7316_i2c_id);
126
127 #ifdef CONFIG_PM
128 static int adt7316_i2c_suspend(struct i2c_client *client, pm_message_t message)
129 {
130         return adt7316_disable(&client->dev);
131 }
132
133 static int adt7316_i2c_resume(struct i2c_client *client)
134 {
135         return adt7316_enable(&client->dev);
136 }
137 #else
138 # define adt7316_i2c_suspend NULL
139 # define adt7316_i2c_resume  NULL
140 #endif
141
142 static struct i2c_driver adt7316_driver = {
143         .driver = {
144                 .name = "adt7316",
145                 .owner  = THIS_MODULE,
146         },
147         .probe = adt7316_i2c_probe,
148         .remove = __devexit_p(adt7316_i2c_remove),
149         .suspend = adt7316_i2c_suspend,
150         .resume = adt7316_i2c_resume,
151         .id_table = adt7316_i2c_id,
152 };
153
154 static __init int adt7316_i2c_init(void)
155 {
156         return i2c_add_driver(&adt7316_driver);
157 }
158
159 static __exit void adt7316_i2c_exit(void)
160 {
161         i2c_del_driver(&adt7316_driver);
162 }
163
164 MODULE_AUTHOR("Sonic Zhang <sonic.zhang@analog.com>");
165 MODULE_DESCRIPTION("I2C bus driver for Analog Devices ADT7316/7/9 and"
166                         "ADT7516/7/8 digital temperature sensor, ADC and DAC");
167 MODULE_LICENSE("GPL v2");
168
169 module_init(adt7316_i2c_init);
170 module_exit(adt7316_i2c_exit);