Root/
1 | /* |
2 | * MAX732x I2C Port Expander with 8/16 I/O |
3 | * |
4 | * Copyright (C) 2007 Marvell International Ltd. |
5 | * Copyright (C) 2008 Jack Ren <jack.ren@marvell.com> |
6 | * Copyright (C) 2008 Eric Miao <eric.miao@marvell.com> |
7 | * |
8 | * Derived from drivers/gpio/pca953x.c |
9 | * |
10 | * This program is free software; you can redistribute it and/or modify |
11 | * it under the terms of the GNU General Public License as published by |
12 | * the Free Software Foundation; version 2 of the License. |
13 | */ |
14 | |
15 | #include <linux/module.h> |
16 | #include <linux/init.h> |
17 | #include <linux/slab.h> |
18 | #include <linux/string.h> |
19 | #include <linux/gpio.h> |
20 | #include <linux/interrupt.h> |
21 | #include <linux/irq.h> |
22 | #include <linux/i2c.h> |
23 | #include <linux/i2c/max732x.h> |
24 | |
25 | |
26 | /* |
27 | * Each port of MAX732x (including MAX7319) falls into one of the |
28 | * following three types: |
29 | * |
30 | * - Push Pull Output |
31 | * - Input |
32 | * - Open Drain I/O |
33 | * |
34 | * designated by 'O', 'I' and 'P' individually according to MAXIM's |
35 | * datasheets. 'I' and 'P' ports are interrupt capables, some with |
36 | * a dedicated interrupt mask. |
37 | * |
38 | * There are two groups of I/O ports, each group usually includes |
39 | * up to 8 I/O ports, and is accessed by a specific I2C address: |
40 | * |
41 | * - Group A : by I2C address 0b'110xxxx |
42 | * - Group B : by I2C address 0b'101xxxx |
43 | * |
44 | * where 'xxxx' is decided by the connections of pin AD2/AD0. The |
45 | * address used also affects the initial state of output signals. |
46 | * |
47 | * Within each group of ports, there are five known combinations of |
48 | * I/O ports: 4I4O, 4P4O, 8I, 8P, 8O, see the definitions below for |
49 | * the detailed organization of these ports. Only Goup A is interrupt |
50 | * capable. |
51 | * |
52 | * GPIO numbers start from 'gpio_base + 0' to 'gpio_base + 8/16', |
53 | * and GPIOs from GROUP_A are numbered before those from GROUP_B |
54 | * (if there are two groups). |
55 | * |
56 | * NOTE: MAX7328/MAX7329 are drop-in replacements for PCF8574/a, so |
57 | * they are not supported by this driver. |
58 | */ |
59 | |
60 | #define PORT_NONE 0x0 /* '/' No Port */ |
61 | #define PORT_OUTPUT 0x1 /* 'O' Push-Pull, Output Only */ |
62 | #define PORT_INPUT 0x2 /* 'I' Input Only */ |
63 | #define PORT_OPENDRAIN 0x3 /* 'P' Open-Drain, I/O */ |
64 | |
65 | #define IO_4I4O 0x5AA5 /* O7 O6 I5 I4 I3 I2 O1 O0 */ |
66 | #define IO_4P4O 0x5FF5 /* O7 O6 P5 P4 P3 P2 O1 O0 */ |
67 | #define IO_8I 0xAAAA /* I7 I6 I5 I4 I3 I2 I1 I0 */ |
68 | #define IO_8P 0xFFFF /* P7 P6 P5 P4 P3 P2 P1 P0 */ |
69 | #define IO_8O 0x5555 /* O7 O6 O5 O4 O3 O2 O1 O0 */ |
70 | |
71 | #define GROUP_A(x) ((x) & 0xffff) /* I2C Addr: 0b'110xxxx */ |
72 | #define GROUP_B(x) ((x) << 16) /* I2C Addr: 0b'101xxxx */ |
73 | |
74 | #define INT_NONE 0x0 /* No interrupt capability */ |
75 | #define INT_NO_MASK 0x1 /* Has interrupts, no mask */ |
76 | #define INT_INDEP_MASK 0x2 /* Has interrupts, independent mask */ |
77 | #define INT_MERGED_MASK 0x3 /* Has interrupts, merged mask */ |
78 | |
79 | #define INT_CAPS(x) (((uint64_t)(x)) << 32) |
80 | |
81 | enum { |
82 | MAX7319, |
83 | MAX7320, |
84 | MAX7321, |
85 | MAX7322, |
86 | MAX7323, |
87 | MAX7324, |
88 | MAX7325, |
89 | MAX7326, |
90 | MAX7327, |
91 | }; |
92 | |
93 | static uint64_t max732x_features[] = { |
94 | [MAX7319] = GROUP_A(IO_8I) | INT_CAPS(INT_MERGED_MASK), |
95 | [MAX7320] = GROUP_B(IO_8O), |
96 | [MAX7321] = GROUP_A(IO_8P) | INT_CAPS(INT_NO_MASK), |
97 | [MAX7322] = GROUP_A(IO_4I4O) | INT_CAPS(INT_MERGED_MASK), |
98 | [MAX7323] = GROUP_A(IO_4P4O) | INT_CAPS(INT_INDEP_MASK), |
99 | [MAX7324] = GROUP_A(IO_8I) | GROUP_B(IO_8O) | INT_CAPS(INT_MERGED_MASK), |
100 | [MAX7325] = GROUP_A(IO_8P) | GROUP_B(IO_8O) | INT_CAPS(INT_NO_MASK), |
101 | [MAX7326] = GROUP_A(IO_4I4O) | GROUP_B(IO_8O) | INT_CAPS(INT_MERGED_MASK), |
102 | [MAX7327] = GROUP_A(IO_4P4O) | GROUP_B(IO_8O) | INT_CAPS(INT_NO_MASK), |
103 | }; |
104 | |
105 | static const struct i2c_device_id max732x_id[] = { |
106 | { "max7319", MAX7319 }, |
107 | { "max7320", MAX7320 }, |
108 | { "max7321", MAX7321 }, |
109 | { "max7322", MAX7322 }, |
110 | { "max7323", MAX7323 }, |
111 | { "max7324", MAX7324 }, |
112 | { "max7325", MAX7325 }, |
113 | { "max7326", MAX7326 }, |
114 | { "max7327", MAX7327 }, |
115 | { }, |
116 | }; |
117 | MODULE_DEVICE_TABLE(i2c, max732x_id); |
118 | |
119 | struct max732x_chip { |
120 | struct gpio_chip gpio_chip; |
121 | |
122 | struct i2c_client *client; /* "main" client */ |
123 | struct i2c_client *client_dummy; |
124 | struct i2c_client *client_group_a; |
125 | struct i2c_client *client_group_b; |
126 | |
127 | unsigned int mask_group_a; |
128 | unsigned int dir_input; |
129 | unsigned int dir_output; |
130 | |
131 | struct mutex lock; |
132 | uint8_t reg_out[2]; |
133 | |
134 | #ifdef CONFIG_GPIO_MAX732X_IRQ |
135 | struct mutex irq_lock; |
136 | int irq_base; |
137 | uint8_t irq_mask; |
138 | uint8_t irq_mask_cur; |
139 | uint8_t irq_trig_raise; |
140 | uint8_t irq_trig_fall; |
141 | uint8_t irq_features; |
142 | #endif |
143 | }; |
144 | |
145 | static int max732x_writeb(struct max732x_chip *chip, int group_a, uint8_t val) |
146 | { |
147 | struct i2c_client *client; |
148 | int ret; |
149 | |
150 | client = group_a ? chip->client_group_a : chip->client_group_b; |
151 | ret = i2c_smbus_write_byte(client, val); |
152 | if (ret < 0) { |
153 | dev_err(&client->dev, "failed writing\n"); |
154 | return ret; |
155 | } |
156 | |
157 | return 0; |
158 | } |
159 | |
160 | static int max732x_readb(struct max732x_chip *chip, int group_a, uint8_t *val) |
161 | { |
162 | struct i2c_client *client; |
163 | int ret; |
164 | |
165 | client = group_a ? chip->client_group_a : chip->client_group_b; |
166 | ret = i2c_smbus_read_byte(client); |
167 | if (ret < 0) { |
168 | dev_err(&client->dev, "failed reading\n"); |
169 | return ret; |
170 | } |
171 | |
172 | *val = (uint8_t)ret; |
173 | return 0; |
174 | } |
175 | |
176 | static inline int is_group_a(struct max732x_chip *chip, unsigned off) |
177 | { |
178 | return (1u << off) & chip->mask_group_a; |
179 | } |
180 | |
181 | static int max732x_gpio_get_value(struct gpio_chip *gc, unsigned off) |
182 | { |
183 | struct max732x_chip *chip; |
184 | uint8_t reg_val; |
185 | int ret; |
186 | |
187 | chip = container_of(gc, struct max732x_chip, gpio_chip); |
188 | |
189 | ret = max732x_readb(chip, is_group_a(chip, off), ®_val); |
190 | if (ret < 0) |
191 | return 0; |
192 | |
193 | return reg_val & (1u << (off & 0x7)); |
194 | } |
195 | |
196 | static void max732x_gpio_set_value(struct gpio_chip *gc, unsigned off, int val) |
197 | { |
198 | struct max732x_chip *chip; |
199 | uint8_t reg_out, mask = 1u << (off & 0x7); |
200 | int ret; |
201 | |
202 | chip = container_of(gc, struct max732x_chip, gpio_chip); |
203 | |
204 | mutex_lock(&chip->lock); |
205 | |
206 | reg_out = (off > 7) ? chip->reg_out[1] : chip->reg_out[0]; |
207 | reg_out = (val) ? reg_out | mask : reg_out & ~mask; |
208 | |
209 | ret = max732x_writeb(chip, is_group_a(chip, off), reg_out); |
210 | if (ret < 0) |
211 | goto out; |
212 | |
213 | /* update the shadow register then */ |
214 | if (off > 7) |
215 | chip->reg_out[1] = reg_out; |
216 | else |
217 | chip->reg_out[0] = reg_out; |
218 | out: |
219 | mutex_unlock(&chip->lock); |
220 | } |
221 | |
222 | static int max732x_gpio_direction_input(struct gpio_chip *gc, unsigned off) |
223 | { |
224 | struct max732x_chip *chip; |
225 | unsigned int mask = 1u << off; |
226 | |
227 | chip = container_of(gc, struct max732x_chip, gpio_chip); |
228 | |
229 | if ((mask & chip->dir_input) == 0) { |
230 | dev_dbg(&chip->client->dev, "%s port %d is output only\n", |
231 | chip->client->name, off); |
232 | return -EACCES; |
233 | } |
234 | |
235 | /* |
236 | * Open-drain pins must be set to high impedance (which is |
237 | * equivalent to output-high) to be turned into an input. |
238 | */ |
239 | if ((mask & chip->dir_output)) |
240 | max732x_gpio_set_value(gc, off, 1); |
241 | |
242 | return 0; |
243 | } |
244 | |
245 | static int max732x_gpio_direction_output(struct gpio_chip *gc, |
246 | unsigned off, int val) |
247 | { |
248 | struct max732x_chip *chip; |
249 | unsigned int mask = 1u << off; |
250 | |
251 | chip = container_of(gc, struct max732x_chip, gpio_chip); |
252 | |
253 | if ((mask & chip->dir_output) == 0) { |
254 | dev_dbg(&chip->client->dev, "%s port %d is input only\n", |
255 | chip->client->name, off); |
256 | return -EACCES; |
257 | } |
258 | |
259 | max732x_gpio_set_value(gc, off, val); |
260 | return 0; |
261 | } |
262 | |
263 | #ifdef CONFIG_GPIO_MAX732X_IRQ |
264 | static int max732x_writew(struct max732x_chip *chip, uint16_t val) |
265 | { |
266 | int ret; |
267 | |
268 | val = cpu_to_le16(val); |
269 | |
270 | ret = i2c_master_send(chip->client_group_a, (char *)&val, 2); |
271 | if (ret < 0) { |
272 | dev_err(&chip->client_group_a->dev, "failed writing\n"); |
273 | return ret; |
274 | } |
275 | |
276 | return 0; |
277 | } |
278 | |
279 | static int max732x_readw(struct max732x_chip *chip, uint16_t *val) |
280 | { |
281 | int ret; |
282 | |
283 | ret = i2c_master_recv(chip->client_group_a, (char *)val, 2); |
284 | if (ret < 0) { |
285 | dev_err(&chip->client_group_a->dev, "failed reading\n"); |
286 | return ret; |
287 | } |
288 | |
289 | *val = le16_to_cpu(*val); |
290 | return 0; |
291 | } |
292 | |
293 | static void max732x_irq_update_mask(struct max732x_chip *chip) |
294 | { |
295 | uint16_t msg; |
296 | |
297 | if (chip->irq_mask == chip->irq_mask_cur) |
298 | return; |
299 | |
300 | chip->irq_mask = chip->irq_mask_cur; |
301 | |
302 | if (chip->irq_features == INT_NO_MASK) |
303 | return; |
304 | |
305 | mutex_lock(&chip->lock); |
306 | |
307 | switch (chip->irq_features) { |
308 | case INT_INDEP_MASK: |
309 | msg = (chip->irq_mask << 8) | chip->reg_out[0]; |
310 | max732x_writew(chip, msg); |
311 | break; |
312 | |
313 | case INT_MERGED_MASK: |
314 | msg = chip->irq_mask | chip->reg_out[0]; |
315 | max732x_writeb(chip, 1, (uint8_t)msg); |
316 | break; |
317 | } |
318 | |
319 | mutex_unlock(&chip->lock); |
320 | } |
321 | |
322 | static int max732x_gpio_to_irq(struct gpio_chip *gc, unsigned off) |
323 | { |
324 | struct max732x_chip *chip; |
325 | |
326 | chip = container_of(gc, struct max732x_chip, gpio_chip); |
327 | return chip->irq_base + off; |
328 | } |
329 | |
330 | static void max732x_irq_mask(struct irq_data *d) |
331 | { |
332 | struct max732x_chip *chip = irq_data_get_irq_chip_data(d); |
333 | |
334 | chip->irq_mask_cur &= ~(1 << (d->irq - chip->irq_base)); |
335 | } |
336 | |
337 | static void max732x_irq_unmask(struct irq_data *d) |
338 | { |
339 | struct max732x_chip *chip = irq_data_get_irq_chip_data(d); |
340 | |
341 | chip->irq_mask_cur |= 1 << (d->irq - chip->irq_base); |
342 | } |
343 | |
344 | static void max732x_irq_bus_lock(struct irq_data *d) |
345 | { |
346 | struct max732x_chip *chip = irq_data_get_irq_chip_data(d); |
347 | |
348 | mutex_lock(&chip->irq_lock); |
349 | chip->irq_mask_cur = chip->irq_mask; |
350 | } |
351 | |
352 | static void max732x_irq_bus_sync_unlock(struct irq_data *d) |
353 | { |
354 | struct max732x_chip *chip = irq_data_get_irq_chip_data(d); |
355 | |
356 | max732x_irq_update_mask(chip); |
357 | mutex_unlock(&chip->irq_lock); |
358 | } |
359 | |
360 | static int max732x_irq_set_type(struct irq_data *d, unsigned int type) |
361 | { |
362 | struct max732x_chip *chip = irq_data_get_irq_chip_data(d); |
363 | uint16_t off = d->irq - chip->irq_base; |
364 | uint16_t mask = 1 << off; |
365 | |
366 | if (!(mask & chip->dir_input)) { |
367 | dev_dbg(&chip->client->dev, "%s port %d is output only\n", |
368 | chip->client->name, off); |
369 | return -EACCES; |
370 | } |
371 | |
372 | if (!(type & IRQ_TYPE_EDGE_BOTH)) { |
373 | dev_err(&chip->client->dev, "irq %d: unsupported type %d\n", |
374 | d->irq, type); |
375 | return -EINVAL; |
376 | } |
377 | |
378 | if (type & IRQ_TYPE_EDGE_FALLING) |
379 | chip->irq_trig_fall |= mask; |
380 | else |
381 | chip->irq_trig_fall &= ~mask; |
382 | |
383 | if (type & IRQ_TYPE_EDGE_RISING) |
384 | chip->irq_trig_raise |= mask; |
385 | else |
386 | chip->irq_trig_raise &= ~mask; |
387 | |
388 | return max732x_gpio_direction_input(&chip->gpio_chip, off); |
389 | } |
390 | |
391 | static struct irq_chip max732x_irq_chip = { |
392 | .name = "max732x", |
393 | .irq_mask = max732x_irq_mask, |
394 | .irq_unmask = max732x_irq_unmask, |
395 | .irq_bus_lock = max732x_irq_bus_lock, |
396 | .irq_bus_sync_unlock = max732x_irq_bus_sync_unlock, |
397 | .irq_set_type = max732x_irq_set_type, |
398 | }; |
399 | |
400 | static uint8_t max732x_irq_pending(struct max732x_chip *chip) |
401 | { |
402 | uint8_t cur_stat; |
403 | uint8_t old_stat; |
404 | uint8_t trigger; |
405 | uint8_t pending; |
406 | uint16_t status; |
407 | int ret; |
408 | |
409 | ret = max732x_readw(chip, &status); |
410 | if (ret) |
411 | return 0; |
412 | |
413 | trigger = status >> 8; |
414 | trigger &= chip->irq_mask; |
415 | |
416 | if (!trigger) |
417 | return 0; |
418 | |
419 | cur_stat = status & 0xFF; |
420 | cur_stat &= chip->irq_mask; |
421 | |
422 | old_stat = cur_stat ^ trigger; |
423 | |
424 | pending = (old_stat & chip->irq_trig_fall) | |
425 | (cur_stat & chip->irq_trig_raise); |
426 | pending &= trigger; |
427 | |
428 | return pending; |
429 | } |
430 | |
431 | static irqreturn_t max732x_irq_handler(int irq, void *devid) |
432 | { |
433 | struct max732x_chip *chip = devid; |
434 | uint8_t pending; |
435 | uint8_t level; |
436 | |
437 | pending = max732x_irq_pending(chip); |
438 | |
439 | if (!pending) |
440 | return IRQ_HANDLED; |
441 | |
442 | do { |
443 | level = __ffs(pending); |
444 | handle_nested_irq(level + chip->irq_base); |
445 | |
446 | pending &= ~(1 << level); |
447 | } while (pending); |
448 | |
449 | return IRQ_HANDLED; |
450 | } |
451 | |
452 | static int max732x_irq_setup(struct max732x_chip *chip, |
453 | const struct i2c_device_id *id) |
454 | { |
455 | struct i2c_client *client = chip->client; |
456 | struct max732x_platform_data *pdata = client->dev.platform_data; |
457 | int has_irq = max732x_features[id->driver_data] >> 32; |
458 | int ret; |
459 | |
460 | if (pdata->irq_base && has_irq != INT_NONE) { |
461 | int lvl; |
462 | |
463 | chip->irq_base = pdata->irq_base; |
464 | chip->irq_features = has_irq; |
465 | mutex_init(&chip->irq_lock); |
466 | |
467 | for (lvl = 0; lvl < chip->gpio_chip.ngpio; lvl++) { |
468 | int irq = lvl + chip->irq_base; |
469 | |
470 | if (!(chip->dir_input & (1 << lvl))) |
471 | continue; |
472 | |
473 | irq_set_chip_data(irq, chip); |
474 | irq_set_chip_and_handler(irq, &max732x_irq_chip, |
475 | handle_edge_irq); |
476 | irq_set_nested_thread(irq, 1); |
477 | #ifdef CONFIG_ARM |
478 | set_irq_flags(irq, IRQF_VALID); |
479 | #else |
480 | irq_set_noprobe(irq); |
481 | #endif |
482 | } |
483 | |
484 | ret = request_threaded_irq(client->irq, |
485 | NULL, |
486 | max732x_irq_handler, |
487 | IRQF_TRIGGER_FALLING | IRQF_ONESHOT, |
488 | dev_name(&client->dev), chip); |
489 | if (ret) { |
490 | dev_err(&client->dev, "failed to request irq %d\n", |
491 | client->irq); |
492 | goto out_failed; |
493 | } |
494 | |
495 | chip->gpio_chip.to_irq = max732x_gpio_to_irq; |
496 | } |
497 | |
498 | return 0; |
499 | |
500 | out_failed: |
501 | chip->irq_base = 0; |
502 | return ret; |
503 | } |
504 | |
505 | static void max732x_irq_teardown(struct max732x_chip *chip) |
506 | { |
507 | if (chip->irq_base) |
508 | free_irq(chip->client->irq, chip); |
509 | } |
510 | #else /* CONFIG_GPIO_MAX732X_IRQ */ |
511 | static int max732x_irq_setup(struct max732x_chip *chip, |
512 | const struct i2c_device_id *id) |
513 | { |
514 | struct i2c_client *client = chip->client; |
515 | struct max732x_platform_data *pdata = client->dev.platform_data; |
516 | int has_irq = max732x_features[id->driver_data] >> 32; |
517 | |
518 | if (pdata->irq_base && has_irq != INT_NONE) |
519 | dev_warn(&client->dev, "interrupt support not compiled in\n"); |
520 | |
521 | return 0; |
522 | } |
523 | |
524 | static void max732x_irq_teardown(struct max732x_chip *chip) |
525 | { |
526 | } |
527 | #endif |
528 | |
529 | static int __devinit max732x_setup_gpio(struct max732x_chip *chip, |
530 | const struct i2c_device_id *id, |
531 | unsigned gpio_start) |
532 | { |
533 | struct gpio_chip *gc = &chip->gpio_chip; |
534 | uint32_t id_data = (uint32_t)max732x_features[id->driver_data]; |
535 | int i, port = 0; |
536 | |
537 | for (i = 0; i < 16; i++, id_data >>= 2) { |
538 | unsigned int mask = 1 << port; |
539 | |
540 | switch (id_data & 0x3) { |
541 | case PORT_OUTPUT: |
542 | chip->dir_output |= mask; |
543 | break; |
544 | case PORT_INPUT: |
545 | chip->dir_input |= mask; |
546 | break; |
547 | case PORT_OPENDRAIN: |
548 | chip->dir_output |= mask; |
549 | chip->dir_input |= mask; |
550 | break; |
551 | default: |
552 | continue; |
553 | } |
554 | |
555 | if (i < 8) |
556 | chip->mask_group_a |= mask; |
557 | port++; |
558 | } |
559 | |
560 | if (chip->dir_input) |
561 | gc->direction_input = max732x_gpio_direction_input; |
562 | if (chip->dir_output) { |
563 | gc->direction_output = max732x_gpio_direction_output; |
564 | gc->set = max732x_gpio_set_value; |
565 | } |
566 | gc->get = max732x_gpio_get_value; |
567 | gc->can_sleep = 1; |
568 | |
569 | gc->base = gpio_start; |
570 | gc->ngpio = port; |
571 | gc->label = chip->client->name; |
572 | gc->owner = THIS_MODULE; |
573 | |
574 | return port; |
575 | } |
576 | |
577 | static int __devinit max732x_probe(struct i2c_client *client, |
578 | const struct i2c_device_id *id) |
579 | { |
580 | struct max732x_platform_data *pdata; |
581 | struct max732x_chip *chip; |
582 | struct i2c_client *c; |
583 | uint16_t addr_a, addr_b; |
584 | int ret, nr_port; |
585 | |
586 | pdata = client->dev.platform_data; |
587 | if (pdata == NULL) { |
588 | dev_dbg(&client->dev, "no platform data\n"); |
589 | return -EINVAL; |
590 | } |
591 | |
592 | chip = kzalloc(sizeof(struct max732x_chip), GFP_KERNEL); |
593 | if (chip == NULL) |
594 | return -ENOMEM; |
595 | chip->client = client; |
596 | |
597 | nr_port = max732x_setup_gpio(chip, id, pdata->gpio_base); |
598 | |
599 | addr_a = (client->addr & 0x0f) | 0x60; |
600 | addr_b = (client->addr & 0x0f) | 0x50; |
601 | |
602 | switch (client->addr & 0x70) { |
603 | case 0x60: |
604 | chip->client_group_a = client; |
605 | if (nr_port > 8) { |
606 | c = i2c_new_dummy(client->adapter, addr_b); |
607 | chip->client_group_b = chip->client_dummy = c; |
608 | } |
609 | break; |
610 | case 0x50: |
611 | chip->client_group_b = client; |
612 | if (nr_port > 8) { |
613 | c = i2c_new_dummy(client->adapter, addr_a); |
614 | chip->client_group_a = chip->client_dummy = c; |
615 | } |
616 | break; |
617 | default: |
618 | dev_err(&client->dev, "invalid I2C address specified %02x\n", |
619 | client->addr); |
620 | ret = -EINVAL; |
621 | goto out_failed; |
622 | } |
623 | |
624 | mutex_init(&chip->lock); |
625 | |
626 | max732x_readb(chip, is_group_a(chip, 0), &chip->reg_out[0]); |
627 | if (nr_port > 8) |
628 | max732x_readb(chip, is_group_a(chip, 8), &chip->reg_out[1]); |
629 | |
630 | ret = max732x_irq_setup(chip, id); |
631 | if (ret) |
632 | goto out_failed; |
633 | |
634 | ret = gpiochip_add(&chip->gpio_chip); |
635 | if (ret) |
636 | goto out_failed; |
637 | |
638 | if (pdata->setup) { |
639 | ret = pdata->setup(client, chip->gpio_chip.base, |
640 | chip->gpio_chip.ngpio, pdata->context); |
641 | if (ret < 0) |
642 | dev_warn(&client->dev, "setup failed, %d\n", ret); |
643 | } |
644 | |
645 | i2c_set_clientdata(client, chip); |
646 | return 0; |
647 | |
648 | out_failed: |
649 | max732x_irq_teardown(chip); |
650 | kfree(chip); |
651 | return ret; |
652 | } |
653 | |
654 | static int __devexit max732x_remove(struct i2c_client *client) |
655 | { |
656 | struct max732x_platform_data *pdata = client->dev.platform_data; |
657 | struct max732x_chip *chip = i2c_get_clientdata(client); |
658 | int ret; |
659 | |
660 | if (pdata->teardown) { |
661 | ret = pdata->teardown(client, chip->gpio_chip.base, |
662 | chip->gpio_chip.ngpio, pdata->context); |
663 | if (ret < 0) { |
664 | dev_err(&client->dev, "%s failed, %d\n", |
665 | "teardown", ret); |
666 | return ret; |
667 | } |
668 | } |
669 | |
670 | ret = gpiochip_remove(&chip->gpio_chip); |
671 | if (ret) { |
672 | dev_err(&client->dev, "%s failed, %d\n", |
673 | "gpiochip_remove()", ret); |
674 | return ret; |
675 | } |
676 | |
677 | max732x_irq_teardown(chip); |
678 | |
679 | /* unregister any dummy i2c_client */ |
680 | if (chip->client_dummy) |
681 | i2c_unregister_device(chip->client_dummy); |
682 | |
683 | kfree(chip); |
684 | return 0; |
685 | } |
686 | |
687 | static struct i2c_driver max732x_driver = { |
688 | .driver = { |
689 | .name = "max732x", |
690 | .owner = THIS_MODULE, |
691 | }, |
692 | .probe = max732x_probe, |
693 | .remove = __devexit_p(max732x_remove), |
694 | .id_table = max732x_id, |
695 | }; |
696 | |
697 | static int __init max732x_init(void) |
698 | { |
699 | return i2c_add_driver(&max732x_driver); |
700 | } |
701 | /* register after i2c postcore initcall and before |
702 | * subsys initcalls that may rely on these GPIOs |
703 | */ |
704 | subsys_initcall(max732x_init); |
705 | |
706 | static void __exit max732x_exit(void) |
707 | { |
708 | i2c_del_driver(&max732x_driver); |
709 | } |
710 | module_exit(max732x_exit); |
711 | |
712 | MODULE_AUTHOR("Eric Miao <eric.miao@marvell.com>"); |
713 | MODULE_DESCRIPTION("GPIO expander driver for MAX732X"); |
714 | MODULE_LICENSE("GPL"); |
715 |
Branches:
ben-wpan
ben-wpan-stefan
javiroman/ks7010
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9