]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blob - drivers/gpio/pca953x.c
sata_fsl: Return non-zero on error in probe()
[linux-2.6-omap-h63xx.git] / drivers / gpio / pca953x.c
1 /*
2  *  pca953x.c - 4/8/16 bit I/O ports
3  *
4  *  Copyright (C) 2005 Ben Gardner <bgardner@wabtec.com>
5  *  Copyright (C) 2007 Marvell International Ltd.
6  *
7  *  Derived from drivers/i2c/chips/pca9539.c
8  *
9  *  This program is free software; you can redistribute it and/or modify
10  *  it under the terms of the GNU General Public License as published by
11  *  the Free Software Foundation; version 2 of the License.
12  */
13
14 #include <linux/module.h>
15 #include <linux/init.h>
16 #include <linux/i2c.h>
17 #include <linux/i2c/pca953x.h>
18
19 #include <asm/gpio.h>
20
21 #define PCA953X_INPUT          0
22 #define PCA953X_OUTPUT         1
23 #define PCA953X_INVERT         2
24 #define PCA953X_DIRECTION      3
25
26 static const struct i2c_device_id pca953x_id[] = {
27         { "pca9534", 8, },
28         { "pca9535", 16, },
29         { "pca9536", 4, },
30         { "pca9537", 4, },
31         { "pca9538", 8, },
32         { "pca9539", 16, },
33         { "pca9554", 8, },
34         { "pca9555", 16, },
35         { "pca9557", 8, },
36
37         { "max7310", 8, },
38         { "pca6107", 8, },
39         { "tca6408", 8, },
40         { "tca6416", 16, },
41         /* NYET:  { "tca6424", 24, }, */
42         { }
43 };
44 MODULE_DEVICE_TABLE(i2c, pca953x_id);
45
46 struct pca953x_chip {
47         unsigned gpio_start;
48         uint16_t reg_output;
49         uint16_t reg_direction;
50
51         struct i2c_client *client;
52         struct gpio_chip gpio_chip;
53 };
54
55 static int pca953x_write_reg(struct pca953x_chip *chip, int reg, uint16_t val)
56 {
57         int ret;
58
59         if (chip->gpio_chip.ngpio <= 8)
60                 ret = i2c_smbus_write_byte_data(chip->client, reg, val);
61         else
62                 ret = i2c_smbus_write_word_data(chip->client, reg << 1, val);
63
64         if (ret < 0) {
65                 dev_err(&chip->client->dev, "failed writing register\n");
66                 return ret;
67         }
68
69         return 0;
70 }
71
72 static int pca953x_read_reg(struct pca953x_chip *chip, int reg, uint16_t *val)
73 {
74         int ret;
75
76         if (chip->gpio_chip.ngpio <= 8)
77                 ret = i2c_smbus_read_byte_data(chip->client, reg);
78         else
79                 ret = i2c_smbus_read_word_data(chip->client, reg << 1);
80
81         if (ret < 0) {
82                 dev_err(&chip->client->dev, "failed reading register\n");
83                 return ret;
84         }
85
86         *val = (uint16_t)ret;
87         return 0;
88 }
89
90 static int pca953x_gpio_direction_input(struct gpio_chip *gc, unsigned off)
91 {
92         struct pca953x_chip *chip;
93         uint16_t reg_val;
94         int ret;
95
96         chip = container_of(gc, struct pca953x_chip, gpio_chip);
97
98         reg_val = chip->reg_direction | (1u << off);
99         ret = pca953x_write_reg(chip, PCA953X_DIRECTION, reg_val);
100         if (ret)
101                 return ret;
102
103         chip->reg_direction = reg_val;
104         return 0;
105 }
106
107 static int pca953x_gpio_direction_output(struct gpio_chip *gc,
108                 unsigned off, int val)
109 {
110         struct pca953x_chip *chip;
111         uint16_t reg_val;
112         int ret;
113
114         chip = container_of(gc, struct pca953x_chip, gpio_chip);
115
116         /* set output level */
117         if (val)
118                 reg_val = chip->reg_output | (1u << off);
119         else
120                 reg_val = chip->reg_output & ~(1u << off);
121
122         ret = pca953x_write_reg(chip, PCA953X_OUTPUT, reg_val);
123         if (ret)
124                 return ret;
125
126         chip->reg_output = reg_val;
127
128         /* then direction */
129         reg_val = chip->reg_direction & ~(1u << off);
130         ret = pca953x_write_reg(chip, PCA953X_DIRECTION, reg_val);
131         if (ret)
132                 return ret;
133
134         chip->reg_direction = reg_val;
135         return 0;
136 }
137
138 static int pca953x_gpio_get_value(struct gpio_chip *gc, unsigned off)
139 {
140         struct pca953x_chip *chip;
141         uint16_t reg_val;
142         int ret;
143
144         chip = container_of(gc, struct pca953x_chip, gpio_chip);
145
146         ret = pca953x_read_reg(chip, PCA953X_INPUT, &reg_val);
147         if (ret < 0) {
148                 /* NOTE:  diagnostic already emitted; that's all we should
149                  * do unless gpio_*_value_cansleep() calls become different
150                  * from their nonsleeping siblings (and report faults).
151                  */
152                 return 0;
153         }
154
155         return (reg_val & (1u << off)) ? 1 : 0;
156 }
157
158 static void pca953x_gpio_set_value(struct gpio_chip *gc, unsigned off, int val)
159 {
160         struct pca953x_chip *chip;
161         uint16_t reg_val;
162         int ret;
163
164         chip = container_of(gc, struct pca953x_chip, gpio_chip);
165
166         if (val)
167                 reg_val = chip->reg_output | (1u << off);
168         else
169                 reg_val = chip->reg_output & ~(1u << off);
170
171         ret = pca953x_write_reg(chip, PCA953X_OUTPUT, reg_val);
172         if (ret)
173                 return;
174
175         chip->reg_output = reg_val;
176 }
177
178 static void pca953x_setup_gpio(struct pca953x_chip *chip, int gpios)
179 {
180         struct gpio_chip *gc;
181
182         gc = &chip->gpio_chip;
183
184         gc->direction_input  = pca953x_gpio_direction_input;
185         gc->direction_output = pca953x_gpio_direction_output;
186         gc->get = pca953x_gpio_get_value;
187         gc->set = pca953x_gpio_set_value;
188         gc->can_sleep = 1;
189
190         gc->base = chip->gpio_start;
191         gc->ngpio = gpios;
192         gc->label = chip->client->name;
193         gc->dev = &chip->client->dev;
194         gc->owner = THIS_MODULE;
195 }
196
197 static int __devinit pca953x_probe(struct i2c_client *client,
198                                    const struct i2c_device_id *id)
199 {
200         struct pca953x_platform_data *pdata;
201         struct pca953x_chip *chip;
202         int ret;
203
204         pdata = client->dev.platform_data;
205         if (pdata == NULL)
206                 return -ENODEV;
207
208         chip = kzalloc(sizeof(struct pca953x_chip), GFP_KERNEL);
209         if (chip == NULL)
210                 return -ENOMEM;
211
212         chip->client = client;
213
214         chip->gpio_start = pdata->gpio_base;
215
216         /* initialize cached registers from their original values.
217          * we can't share this chip with another i2c master.
218          */
219         pca953x_setup_gpio(chip, id->driver_data);
220
221         ret = pca953x_read_reg(chip, PCA953X_OUTPUT, &chip->reg_output);
222         if (ret)
223                 goto out_failed;
224
225         ret = pca953x_read_reg(chip, PCA953X_DIRECTION, &chip->reg_direction);
226         if (ret)
227                 goto out_failed;
228
229         /* set platform specific polarity inversion */
230         ret = pca953x_write_reg(chip, PCA953X_INVERT, pdata->invert);
231         if (ret)
232                 goto out_failed;
233
234
235         ret = gpiochip_add(&chip->gpio_chip);
236         if (ret)
237                 goto out_failed;
238
239         if (pdata->setup) {
240                 ret = pdata->setup(client, chip->gpio_chip.base,
241                                 chip->gpio_chip.ngpio, pdata->context);
242                 if (ret < 0)
243                         dev_warn(&client->dev, "setup failed, %d\n", ret);
244         }
245
246         i2c_set_clientdata(client, chip);
247         return 0;
248
249 out_failed:
250         kfree(chip);
251         return ret;
252 }
253
254 static int pca953x_remove(struct i2c_client *client)
255 {
256         struct pca953x_platform_data *pdata = client->dev.platform_data;
257         struct pca953x_chip *chip = i2c_get_clientdata(client);
258         int ret = 0;
259
260         if (pdata->teardown) {
261                 ret = pdata->teardown(client, chip->gpio_chip.base,
262                                 chip->gpio_chip.ngpio, pdata->context);
263                 if (ret < 0) {
264                         dev_err(&client->dev, "%s failed, %d\n",
265                                         "teardown", ret);
266                         return ret;
267                 }
268         }
269
270         ret = gpiochip_remove(&chip->gpio_chip);
271         if (ret) {
272                 dev_err(&client->dev, "%s failed, %d\n",
273                                 "gpiochip_remove()", ret);
274                 return ret;
275         }
276
277         kfree(chip);
278         return 0;
279 }
280
281 static struct i2c_driver pca953x_driver = {
282         .driver = {
283                 .name   = "pca953x",
284         },
285         .probe          = pca953x_probe,
286         .remove         = pca953x_remove,
287         .id_table       = pca953x_id,
288 };
289
290 static int __init pca953x_init(void)
291 {
292         return i2c_add_driver(&pca953x_driver);
293 }
294 /* register after i2c postcore initcall and before
295  * subsys initcalls that may rely on these GPIOs
296  */
297 subsys_initcall(pca953x_init);
298
299 static void __exit pca953x_exit(void)
300 {
301         i2c_del_driver(&pca953x_driver);
302 }
303 module_exit(pca953x_exit);
304
305 MODULE_AUTHOR("eric miao <eric.miao@marvell.com>");
306 MODULE_DESCRIPTION("GPIO expander driver for PCA953x");
307 MODULE_LICENSE("GPL");