2 * GPIO Chip driver for Analog Devices
3 * ADP5588/ADP5587 I/O Expander and QWERTY Keypad Controller
5 * Copyright 2009-2010 Analog Devices Inc.
7 * Licensed under the GPL-2 or later.
10 #include <linux/module.h>
11 #include <linux/kernel.h>
12 #include <linux/slab.h>
13 #include <linux/init.h>
14 #include <linux/i2c.h>
15 #include <linux/gpio.h>
16 #include <linux/interrupt.h>
17 #include <linux/irq.h>
19 #include <linux/i2c/adp5588.h>
21 #define DRV_NAME "adp5588-gpio"
24 * Early pre 4.0 Silicon required to delay readout by at least 25ms,
25 * since the Event Counter Register updated 25ms after the interrupt
28 #define WA_DELAYED_READOUT_REVID(rev) ((rev) < 4)
31 struct i2c_client
*client
;
32 struct gpio_chip gpio_chip
;
33 struct mutex lock
; /* protect cached dir, dat_out */
34 /* protect serialized access to the interrupt controller bus */
35 struct mutex irq_lock
;
44 uint8_t int_input_en
[3];
45 uint8_t int_lvl_cached
[3];
48 static int adp5588_gpio_read(struct i2c_client
*client
, u8 reg
)
50 int ret
= i2c_smbus_read_byte_data(client
, reg
);
53 dev_err(&client
->dev
, "Read Error\n");
58 static int adp5588_gpio_write(struct i2c_client
*client
, u8 reg
, u8 val
)
60 int ret
= i2c_smbus_write_byte_data(client
, reg
, val
);
63 dev_err(&client
->dev
, "Write Error\n");
68 static int adp5588_gpio_get_value(struct gpio_chip
*chip
, unsigned off
)
70 struct adp5588_gpio
*dev
=
71 container_of(chip
, struct adp5588_gpio
, gpio_chip
);
72 unsigned bank
= ADP5588_BANK(off
);
73 unsigned bit
= ADP5588_BIT(off
);
76 mutex_lock(&dev
->lock
);
78 if (dev
->dir
[bank
] & bit
)
79 val
= dev
->dat_out
[bank
];
81 val
= adp5588_gpio_read(dev
->client
, GPIO_DAT_STAT1
+ bank
);
83 mutex_unlock(&dev
->lock
);
88 static void adp5588_gpio_set_value(struct gpio_chip
*chip
,
89 unsigned off
, int val
)
92 struct adp5588_gpio
*dev
=
93 container_of(chip
, struct adp5588_gpio
, gpio_chip
);
95 bank
= ADP5588_BANK(off
);
96 bit
= ADP5588_BIT(off
);
98 mutex_lock(&dev
->lock
);
100 dev
->dat_out
[bank
] |= bit
;
102 dev
->dat_out
[bank
] &= ~bit
;
104 adp5588_gpio_write(dev
->client
, GPIO_DAT_OUT1
+ bank
,
106 mutex_unlock(&dev
->lock
);
109 static int adp5588_gpio_direction_input(struct gpio_chip
*chip
, unsigned off
)
113 struct adp5588_gpio
*dev
=
114 container_of(chip
, struct adp5588_gpio
, gpio_chip
);
116 bank
= ADP5588_BANK(off
);
118 mutex_lock(&dev
->lock
);
119 dev
->dir
[bank
] &= ~ADP5588_BIT(off
);
120 ret
= adp5588_gpio_write(dev
->client
, GPIO_DIR1
+ bank
, dev
->dir
[bank
]);
121 mutex_unlock(&dev
->lock
);
126 static int adp5588_gpio_direction_output(struct gpio_chip
*chip
,
127 unsigned off
, int val
)
131 struct adp5588_gpio
*dev
=
132 container_of(chip
, struct adp5588_gpio
, gpio_chip
);
134 bank
= ADP5588_BANK(off
);
135 bit
= ADP5588_BIT(off
);
137 mutex_lock(&dev
->lock
);
138 dev
->dir
[bank
] |= bit
;
141 dev
->dat_out
[bank
] |= bit
;
143 dev
->dat_out
[bank
] &= ~bit
;
145 ret
= adp5588_gpio_write(dev
->client
, GPIO_DAT_OUT1
+ bank
,
147 ret
|= adp5588_gpio_write(dev
->client
, GPIO_DIR1
+ bank
,
149 mutex_unlock(&dev
->lock
);
154 #ifdef CONFIG_GPIO_ADP5588_IRQ
155 static int adp5588_gpio_to_irq(struct gpio_chip
*chip
, unsigned off
)
157 struct adp5588_gpio
*dev
=
158 container_of(chip
, struct adp5588_gpio
, gpio_chip
);
159 return dev
->irq_base
+ off
;
162 static void adp5588_irq_bus_lock(struct irq_data
*d
)
164 struct adp5588_gpio
*dev
= irq_data_get_irq_chip_data(d
);
166 mutex_lock(&dev
->irq_lock
);
170 * genirq core code can issue chip->mask/unmask from atomic context.
171 * This doesn't work for slow busses where an access needs to sleep.
172 * bus_sync_unlock() is therefore called outside the atomic context,
173 * syncs the current irq mask state with the slow external controller
174 * and unlocks the bus.
177 static void adp5588_irq_bus_sync_unlock(struct irq_data
*d
)
179 struct adp5588_gpio
*dev
= irq_data_get_irq_chip_data(d
);
182 for (i
= 0; i
<= ADP5588_BANK(ADP5588_MAXGPIO
); i
++) {
183 if (dev
->int_input_en
[i
]) {
184 mutex_lock(&dev
->lock
);
185 dev
->dir
[i
] &= ~dev
->int_input_en
[i
];
186 dev
->int_input_en
[i
] = 0;
187 adp5588_gpio_write(dev
->client
, GPIO_DIR1
+ i
,
189 mutex_unlock(&dev
->lock
);
192 if (dev
->int_lvl_cached
[i
] != dev
->int_lvl
[i
]) {
193 dev
->int_lvl_cached
[i
] = dev
->int_lvl
[i
];
194 adp5588_gpio_write(dev
->client
, GPIO_INT_LVL1
+ i
,
198 if (dev
->int_en
[i
] ^ dev
->irq_mask
[i
]) {
199 dev
->int_en
[i
] = dev
->irq_mask
[i
];
200 adp5588_gpio_write(dev
->client
, GPIO_INT_EN1
+ i
,
205 mutex_unlock(&dev
->irq_lock
);
208 static void adp5588_irq_mask(struct irq_data
*d
)
210 struct adp5588_gpio
*dev
= irq_data_get_irq_chip_data(d
);
211 unsigned gpio
= d
->irq
- dev
->irq_base
;
213 dev
->irq_mask
[ADP5588_BANK(gpio
)] &= ~ADP5588_BIT(gpio
);
216 static void adp5588_irq_unmask(struct irq_data
*d
)
218 struct adp5588_gpio
*dev
= irq_data_get_irq_chip_data(d
);
219 unsigned gpio
= d
->irq
- dev
->irq_base
;
221 dev
->irq_mask
[ADP5588_BANK(gpio
)] |= ADP5588_BIT(gpio
);
224 static int adp5588_irq_set_type(struct irq_data
*d
, unsigned int type
)
226 struct adp5588_gpio
*dev
= irq_data_get_irq_chip_data(d
);
227 uint16_t gpio
= d
->irq
- dev
->irq_base
;
230 if ((type
& IRQ_TYPE_EDGE_BOTH
)) {
231 dev_err(&dev
->client
->dev
, "irq %d: unsupported type %d\n",
236 bank
= ADP5588_BANK(gpio
);
237 bit
= ADP5588_BIT(gpio
);
239 if (type
& IRQ_TYPE_LEVEL_HIGH
)
240 dev
->int_lvl
[bank
] |= bit
;
241 else if (type
& IRQ_TYPE_LEVEL_LOW
)
242 dev
->int_lvl
[bank
] &= ~bit
;
246 dev
->int_input_en
[bank
] |= bit
;
251 static struct irq_chip adp5588_irq_chip
= {
253 .irq_mask
= adp5588_irq_mask
,
254 .irq_unmask
= adp5588_irq_unmask
,
255 .irq_bus_lock
= adp5588_irq_bus_lock
,
256 .irq_bus_sync_unlock
= adp5588_irq_bus_sync_unlock
,
257 .irq_set_type
= adp5588_irq_set_type
,
260 static int adp5588_gpio_read_intstat(struct i2c_client
*client
, u8
*buf
)
262 int ret
= i2c_smbus_read_i2c_block_data(client
, GPIO_INT_STAT1
, 3, buf
);
265 dev_err(&client
->dev
, "Read INT_STAT Error\n");
270 static irqreturn_t
adp5588_irq_handler(int irq
, void *devid
)
272 struct adp5588_gpio
*dev
= devid
;
273 unsigned status
, bank
, bit
, pending
;
275 status
= adp5588_gpio_read(dev
->client
, INT_STAT
);
277 if (status
& ADP5588_GPI_INT
) {
278 ret
= adp5588_gpio_read_intstat(dev
->client
, dev
->irq_stat
);
280 memset(dev
->irq_stat
, 0, ARRAY_SIZE(dev
->irq_stat
));
282 for (bank
= 0, bit
= 0; bank
<= ADP5588_BANK(ADP5588_MAXGPIO
);
284 pending
= dev
->irq_stat
[bank
] & dev
->irq_mask
[bank
];
287 if (pending
& (1 << bit
)) {
288 handle_nested_irq(dev
->irq_base
+
290 pending
&= ~(1 << bit
);
298 adp5588_gpio_write(dev
->client
, INT_STAT
, status
); /* Status is W1C */
303 static int adp5588_irq_setup(struct adp5588_gpio
*dev
)
305 struct i2c_client
*client
= dev
->client
;
306 struct adp5588_gpio_platform_data
*pdata
=
307 dev_get_platdata(&client
->dev
);
311 adp5588_gpio_write(client
, CFG
, ADP5588_AUTO_INC
);
312 adp5588_gpio_write(client
, INT_STAT
, -1); /* status is W1C */
313 adp5588_gpio_read_intstat(client
, dev
->irq_stat
); /* read to clear */
315 dev
->irq_base
= pdata
->irq_base
;
316 mutex_init(&dev
->irq_lock
);
318 for (gpio
= 0; gpio
< dev
->gpio_chip
.ngpio
; gpio
++) {
319 int irq
= gpio
+ dev
->irq_base
;
320 irq_set_chip_data(irq
, dev
);
321 irq_set_chip_and_handler(irq
, &adp5588_irq_chip
,
323 irq_set_nested_thread(irq
, 1);
324 irq_modify_status(irq
, IRQ_NOREQUEST
, IRQ_NOPROBE
);
327 ret
= request_threaded_irq(client
->irq
,
330 IRQF_TRIGGER_FALLING
| IRQF_ONESHOT
,
331 dev_name(&client
->dev
), dev
);
333 dev_err(&client
->dev
, "failed to request irq %d\n",
338 dev
->gpio_chip
.to_irq
= adp5588_gpio_to_irq
;
339 adp5588_gpio_write(client
, CFG
,
340 ADP5588_AUTO_INC
| ADP5588_INT_CFG
| ADP5588_GPI_INT
);
349 static void adp5588_irq_teardown(struct adp5588_gpio
*dev
)
352 free_irq(dev
->client
->irq
, dev
);
356 static int adp5588_irq_setup(struct adp5588_gpio
*dev
)
358 struct i2c_client
*client
= dev
->client
;
359 dev_warn(&client
->dev
, "interrupt support not compiled in\n");
364 static void adp5588_irq_teardown(struct adp5588_gpio
*dev
)
367 #endif /* CONFIG_GPIO_ADP5588_IRQ */
369 static int adp5588_gpio_probe(struct i2c_client
*client
,
370 const struct i2c_device_id
*id
)
372 struct adp5588_gpio_platform_data
*pdata
=
373 dev_get_platdata(&client
->dev
);
374 struct adp5588_gpio
*dev
;
375 struct gpio_chip
*gc
;
379 dev_err(&client
->dev
, "missing platform data\n");
383 if (!i2c_check_functionality(client
->adapter
,
384 I2C_FUNC_SMBUS_BYTE_DATA
)) {
385 dev_err(&client
->dev
, "SMBUS Byte Data not Supported\n");
389 dev
= devm_kzalloc(&client
->dev
, sizeof(*dev
), GFP_KERNEL
);
393 dev
->client
= client
;
395 gc
= &dev
->gpio_chip
;
396 gc
->direction_input
= adp5588_gpio_direction_input
;
397 gc
->direction_output
= adp5588_gpio_direction_output
;
398 gc
->get
= adp5588_gpio_get_value
;
399 gc
->set
= adp5588_gpio_set_value
;
400 gc
->can_sleep
= true;
402 gc
->base
= pdata
->gpio_start
;
403 gc
->ngpio
= ADP5588_MAXGPIO
;
404 gc
->label
= client
->name
;
405 gc
->owner
= THIS_MODULE
;
406 gc
->names
= pdata
->names
;
408 mutex_init(&dev
->lock
);
410 ret
= adp5588_gpio_read(dev
->client
, DEV_ID
);
414 revid
= ret
& ADP5588_DEVICE_ID_MASK
;
416 for (i
= 0, ret
= 0; i
<= ADP5588_BANK(ADP5588_MAXGPIO
); i
++) {
417 dev
->dat_out
[i
] = adp5588_gpio_read(client
, GPIO_DAT_OUT1
+ i
);
418 dev
->dir
[i
] = adp5588_gpio_read(client
, GPIO_DIR1
+ i
);
419 ret
|= adp5588_gpio_write(client
, KP_GPIO1
+ i
, 0);
420 ret
|= adp5588_gpio_write(client
, GPIO_PULL1
+ i
,
421 (pdata
->pullup_dis_mask
>> (8 * i
)) & 0xFF);
422 ret
|= adp5588_gpio_write(client
, GPIO_INT_EN1
+ i
, 0);
427 if (pdata
->irq_base
) {
428 if (WA_DELAYED_READOUT_REVID(revid
)) {
429 dev_warn(&client
->dev
, "GPIO int not supported\n");
431 ret
= adp5588_irq_setup(dev
);
437 ret
= gpiochip_add(&dev
->gpio_chip
);
441 dev_info(&client
->dev
, "IRQ Base: %d Rev.: %d\n",
442 pdata
->irq_base
, revid
);
445 ret
= pdata
->setup(client
, gc
->base
, gc
->ngpio
, pdata
->context
);
447 dev_warn(&client
->dev
, "setup failed, %d\n", ret
);
450 i2c_set_clientdata(client
, dev
);
455 adp5588_irq_teardown(dev
);
460 static int adp5588_gpio_remove(struct i2c_client
*client
)
462 struct adp5588_gpio_platform_data
*pdata
=
463 dev_get_platdata(&client
->dev
);
464 struct adp5588_gpio
*dev
= i2c_get_clientdata(client
);
467 if (pdata
->teardown
) {
468 ret
= pdata
->teardown(client
,
469 dev
->gpio_chip
.base
, dev
->gpio_chip
.ngpio
,
472 dev_err(&client
->dev
, "teardown failed %d\n", ret
);
478 free_irq(dev
->client
->irq
, dev
);
480 gpiochip_remove(&dev
->gpio_chip
);
485 static const struct i2c_device_id adp5588_gpio_id
[] = {
490 MODULE_DEVICE_TABLE(i2c
, adp5588_gpio_id
);
492 static struct i2c_driver adp5588_gpio_driver
= {
496 .probe
= adp5588_gpio_probe
,
497 .remove
= adp5588_gpio_remove
,
498 .id_table
= adp5588_gpio_id
,
501 module_i2c_driver(adp5588_gpio_driver
);
503 MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
504 MODULE_DESCRIPTION("GPIO ADP5588 Driver");
505 MODULE_LICENSE("GPL");