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/driver.h>
16 #include <linux/interrupt.h>
17 #include <linux/irq.h>
19 #include <linux/platform_data/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
= gpiochip_get_data(chip
);
71 unsigned bank
= ADP5588_BANK(off
);
72 unsigned bit
= ADP5588_BIT(off
);
75 mutex_lock(&dev
->lock
);
77 if (dev
->dir
[bank
] & bit
)
78 val
= dev
->dat_out
[bank
];
80 val
= adp5588_gpio_read(dev
->client
, GPIO_DAT_STAT1
+ bank
);
82 mutex_unlock(&dev
->lock
);
87 static void adp5588_gpio_set_value(struct gpio_chip
*chip
,
88 unsigned off
, int val
)
91 struct adp5588_gpio
*dev
= gpiochip_get_data(chip
);
93 bank
= ADP5588_BANK(off
);
94 bit
= ADP5588_BIT(off
);
96 mutex_lock(&dev
->lock
);
98 dev
->dat_out
[bank
] |= bit
;
100 dev
->dat_out
[bank
] &= ~bit
;
102 adp5588_gpio_write(dev
->client
, GPIO_DAT_OUT1
+ bank
,
104 mutex_unlock(&dev
->lock
);
107 static int adp5588_gpio_direction_input(struct gpio_chip
*chip
, unsigned off
)
111 struct adp5588_gpio
*dev
= gpiochip_get_data(chip
);
113 bank
= ADP5588_BANK(off
);
115 mutex_lock(&dev
->lock
);
116 dev
->dir
[bank
] &= ~ADP5588_BIT(off
);
117 ret
= adp5588_gpio_write(dev
->client
, GPIO_DIR1
+ bank
, dev
->dir
[bank
]);
118 mutex_unlock(&dev
->lock
);
123 static int adp5588_gpio_direction_output(struct gpio_chip
*chip
,
124 unsigned off
, int val
)
128 struct adp5588_gpio
*dev
= gpiochip_get_data(chip
);
130 bank
= ADP5588_BANK(off
);
131 bit
= ADP5588_BIT(off
);
133 mutex_lock(&dev
->lock
);
134 dev
->dir
[bank
] |= bit
;
137 dev
->dat_out
[bank
] |= bit
;
139 dev
->dat_out
[bank
] &= ~bit
;
141 ret
= adp5588_gpio_write(dev
->client
, GPIO_DAT_OUT1
+ bank
,
143 ret
|= adp5588_gpio_write(dev
->client
, GPIO_DIR1
+ bank
,
145 mutex_unlock(&dev
->lock
);
150 #ifdef CONFIG_GPIO_ADP5588_IRQ
151 static int adp5588_gpio_to_irq(struct gpio_chip
*chip
, unsigned off
)
153 struct adp5588_gpio
*dev
= gpiochip_get_data(chip
);
155 return dev
->irq_base
+ off
;
158 static void adp5588_irq_bus_lock(struct irq_data
*d
)
160 struct adp5588_gpio
*dev
= irq_data_get_irq_chip_data(d
);
162 mutex_lock(&dev
->irq_lock
);
166 * genirq core code can issue chip->mask/unmask from atomic context.
167 * This doesn't work for slow busses where an access needs to sleep.
168 * bus_sync_unlock() is therefore called outside the atomic context,
169 * syncs the current irq mask state with the slow external controller
170 * and unlocks the bus.
173 static void adp5588_irq_bus_sync_unlock(struct irq_data
*d
)
175 struct adp5588_gpio
*dev
= irq_data_get_irq_chip_data(d
);
178 for (i
= 0; i
<= ADP5588_BANK(ADP5588_MAXGPIO
); i
++) {
179 if (dev
->int_input_en
[i
]) {
180 mutex_lock(&dev
->lock
);
181 dev
->dir
[i
] &= ~dev
->int_input_en
[i
];
182 dev
->int_input_en
[i
] = 0;
183 adp5588_gpio_write(dev
->client
, GPIO_DIR1
+ i
,
185 mutex_unlock(&dev
->lock
);
188 if (dev
->int_lvl_cached
[i
] != dev
->int_lvl
[i
]) {
189 dev
->int_lvl_cached
[i
] = dev
->int_lvl
[i
];
190 adp5588_gpio_write(dev
->client
, GPIO_INT_LVL1
+ i
,
194 if (dev
->int_en
[i
] ^ dev
->irq_mask
[i
]) {
195 dev
->int_en
[i
] = dev
->irq_mask
[i
];
196 adp5588_gpio_write(dev
->client
, GPIO_INT_EN1
+ i
,
201 mutex_unlock(&dev
->irq_lock
);
204 static void adp5588_irq_mask(struct irq_data
*d
)
206 struct adp5588_gpio
*dev
= irq_data_get_irq_chip_data(d
);
207 unsigned gpio
= d
->irq
- dev
->irq_base
;
209 dev
->irq_mask
[ADP5588_BANK(gpio
)] &= ~ADP5588_BIT(gpio
);
212 static void adp5588_irq_unmask(struct irq_data
*d
)
214 struct adp5588_gpio
*dev
= irq_data_get_irq_chip_data(d
);
215 unsigned gpio
= d
->irq
- dev
->irq_base
;
217 dev
->irq_mask
[ADP5588_BANK(gpio
)] |= ADP5588_BIT(gpio
);
220 static int adp5588_irq_set_type(struct irq_data
*d
, unsigned int type
)
222 struct adp5588_gpio
*dev
= irq_data_get_irq_chip_data(d
);
223 uint16_t gpio
= d
->irq
- dev
->irq_base
;
226 if ((type
& IRQ_TYPE_EDGE_BOTH
)) {
227 dev_err(&dev
->client
->dev
, "irq %d: unsupported type %d\n",
232 bank
= ADP5588_BANK(gpio
);
233 bit
= ADP5588_BIT(gpio
);
235 if (type
& IRQ_TYPE_LEVEL_HIGH
)
236 dev
->int_lvl
[bank
] |= bit
;
237 else if (type
& IRQ_TYPE_LEVEL_LOW
)
238 dev
->int_lvl
[bank
] &= ~bit
;
242 dev
->int_input_en
[bank
] |= bit
;
247 static struct irq_chip adp5588_irq_chip
= {
249 .irq_mask
= adp5588_irq_mask
,
250 .irq_unmask
= adp5588_irq_unmask
,
251 .irq_bus_lock
= adp5588_irq_bus_lock
,
252 .irq_bus_sync_unlock
= adp5588_irq_bus_sync_unlock
,
253 .irq_set_type
= adp5588_irq_set_type
,
256 static int adp5588_gpio_read_intstat(struct i2c_client
*client
, u8
*buf
)
258 int ret
= i2c_smbus_read_i2c_block_data(client
, GPIO_INT_STAT1
, 3, buf
);
261 dev_err(&client
->dev
, "Read INT_STAT Error\n");
266 static irqreturn_t
adp5588_irq_handler(int irq
, void *devid
)
268 struct adp5588_gpio
*dev
= devid
;
269 unsigned status
, bank
, bit
, pending
;
271 status
= adp5588_gpio_read(dev
->client
, INT_STAT
);
273 if (status
& ADP5588_GPI_INT
) {
274 ret
= adp5588_gpio_read_intstat(dev
->client
, dev
->irq_stat
);
276 memset(dev
->irq_stat
, 0, ARRAY_SIZE(dev
->irq_stat
));
278 for (bank
= 0, bit
= 0; bank
<= ADP5588_BANK(ADP5588_MAXGPIO
);
280 pending
= dev
->irq_stat
[bank
] & dev
->irq_mask
[bank
];
283 if (pending
& (1 << bit
)) {
284 handle_nested_irq(dev
->irq_base
+
286 pending
&= ~(1 << bit
);
294 adp5588_gpio_write(dev
->client
, INT_STAT
, status
); /* Status is W1C */
299 static int adp5588_irq_setup(struct adp5588_gpio
*dev
)
301 struct i2c_client
*client
= dev
->client
;
302 struct adp5588_gpio_platform_data
*pdata
=
303 dev_get_platdata(&client
->dev
);
307 adp5588_gpio_write(client
, CFG
, ADP5588_AUTO_INC
);
308 adp5588_gpio_write(client
, INT_STAT
, -1); /* status is W1C */
309 adp5588_gpio_read_intstat(client
, dev
->irq_stat
); /* read to clear */
311 dev
->irq_base
= pdata
->irq_base
;
312 mutex_init(&dev
->irq_lock
);
314 for (gpio
= 0; gpio
< dev
->gpio_chip
.ngpio
; gpio
++) {
315 int irq
= gpio
+ dev
->irq_base
;
316 irq_set_chip_data(irq
, dev
);
317 irq_set_chip_and_handler(irq
, &adp5588_irq_chip
,
319 irq_set_nested_thread(irq
, 1);
320 irq_modify_status(irq
, IRQ_NOREQUEST
, IRQ_NOPROBE
);
323 ret
= request_threaded_irq(client
->irq
,
326 IRQF_TRIGGER_FALLING
| IRQF_ONESHOT
,
327 dev_name(&client
->dev
), dev
);
329 dev_err(&client
->dev
, "failed to request irq %d\n",
334 dev
->gpio_chip
.to_irq
= adp5588_gpio_to_irq
;
335 adp5588_gpio_write(client
, CFG
,
336 ADP5588_AUTO_INC
| ADP5588_INT_CFG
| ADP5588_GPI_INT
);
345 static void adp5588_irq_teardown(struct adp5588_gpio
*dev
)
348 free_irq(dev
->client
->irq
, dev
);
352 static int adp5588_irq_setup(struct adp5588_gpio
*dev
)
354 struct i2c_client
*client
= dev
->client
;
355 dev_warn(&client
->dev
, "interrupt support not compiled in\n");
360 static void adp5588_irq_teardown(struct adp5588_gpio
*dev
)
363 #endif /* CONFIG_GPIO_ADP5588_IRQ */
365 static int adp5588_gpio_probe(struct i2c_client
*client
,
366 const struct i2c_device_id
*id
)
368 struct adp5588_gpio_platform_data
*pdata
=
369 dev_get_platdata(&client
->dev
);
370 struct adp5588_gpio
*dev
;
371 struct gpio_chip
*gc
;
375 dev_err(&client
->dev
, "missing platform data\n");
379 if (!i2c_check_functionality(client
->adapter
,
380 I2C_FUNC_SMBUS_BYTE_DATA
)) {
381 dev_err(&client
->dev
, "SMBUS Byte Data not Supported\n");
385 dev
= devm_kzalloc(&client
->dev
, sizeof(*dev
), GFP_KERNEL
);
389 dev
->client
= client
;
391 gc
= &dev
->gpio_chip
;
392 gc
->direction_input
= adp5588_gpio_direction_input
;
393 gc
->direction_output
= adp5588_gpio_direction_output
;
394 gc
->get
= adp5588_gpio_get_value
;
395 gc
->set
= adp5588_gpio_set_value
;
396 gc
->can_sleep
= true;
398 gc
->base
= pdata
->gpio_start
;
399 gc
->ngpio
= ADP5588_MAXGPIO
;
400 gc
->label
= client
->name
;
401 gc
->owner
= THIS_MODULE
;
402 gc
->names
= pdata
->names
;
404 mutex_init(&dev
->lock
);
406 ret
= adp5588_gpio_read(dev
->client
, DEV_ID
);
410 revid
= ret
& ADP5588_DEVICE_ID_MASK
;
412 for (i
= 0, ret
= 0; i
<= ADP5588_BANK(ADP5588_MAXGPIO
); i
++) {
413 dev
->dat_out
[i
] = adp5588_gpio_read(client
, GPIO_DAT_OUT1
+ i
);
414 dev
->dir
[i
] = adp5588_gpio_read(client
, GPIO_DIR1
+ i
);
415 ret
|= adp5588_gpio_write(client
, KP_GPIO1
+ i
, 0);
416 ret
|= adp5588_gpio_write(client
, GPIO_PULL1
+ i
,
417 (pdata
->pullup_dis_mask
>> (8 * i
)) & 0xFF);
418 ret
|= adp5588_gpio_write(client
, GPIO_INT_EN1
+ i
, 0);
423 if (pdata
->irq_base
) {
424 if (WA_DELAYED_READOUT_REVID(revid
)) {
425 dev_warn(&client
->dev
, "GPIO int not supported\n");
427 ret
= adp5588_irq_setup(dev
);
433 ret
= devm_gpiochip_add_data(&client
->dev
, &dev
->gpio_chip
, dev
);
437 dev_info(&client
->dev
, "IRQ Base: %d Rev.: %d\n",
438 pdata
->irq_base
, revid
);
441 ret
= pdata
->setup(client
, gc
->base
, gc
->ngpio
, pdata
->context
);
443 dev_warn(&client
->dev
, "setup failed, %d\n", ret
);
446 i2c_set_clientdata(client
, dev
);
451 adp5588_irq_teardown(dev
);
456 static int adp5588_gpio_remove(struct i2c_client
*client
)
458 struct adp5588_gpio_platform_data
*pdata
=
459 dev_get_platdata(&client
->dev
);
460 struct adp5588_gpio
*dev
= i2c_get_clientdata(client
);
463 if (pdata
->teardown
) {
464 ret
= pdata
->teardown(client
,
465 dev
->gpio_chip
.base
, dev
->gpio_chip
.ngpio
,
468 dev_err(&client
->dev
, "teardown failed %d\n", ret
);
474 free_irq(dev
->client
->irq
, dev
);
479 static const struct i2c_device_id adp5588_gpio_id
[] = {
484 MODULE_DEVICE_TABLE(i2c
, adp5588_gpio_id
);
486 static struct i2c_driver adp5588_gpio_driver
= {
490 .probe
= adp5588_gpio_probe
,
491 .remove
= adp5588_gpio_remove
,
492 .id_table
= adp5588_gpio_id
,
495 module_i2c_driver(adp5588_gpio_driver
);
497 MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
498 MODULE_DESCRIPTION("GPIO ADP5588 Driver");
499 MODULE_LICENSE("GPL");