1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * GPIO Chip driver for Analog Devices
4 * ADP5588/ADP5587 I/O Expander and QWERTY Keypad Controller
6 * Copyright 2009-2010 Analog Devices Inc.
9 #include <linux/module.h>
10 #include <linux/kernel.h>
11 #include <linux/slab.h>
12 #include <linux/init.h>
13 #include <linux/i2c.h>
14 #include <linux/gpio/driver.h>
15 #include <linux/interrupt.h>
16 #include <linux/irq.h>
17 #include <linux/of_device.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
;
38 uint8_t int_lvl_low
[3];
39 uint8_t int_lvl_high
[3];
42 uint8_t int_input_en
[3];
45 static int adp5588_gpio_read(struct i2c_client
*client
, u8 reg
)
47 int ret
= i2c_smbus_read_byte_data(client
, reg
);
50 dev_err(&client
->dev
, "Read Error\n");
55 static int adp5588_gpio_write(struct i2c_client
*client
, u8 reg
, u8 val
)
57 int ret
= i2c_smbus_write_byte_data(client
, reg
, val
);
60 dev_err(&client
->dev
, "Write Error\n");
65 static int adp5588_gpio_get_value(struct gpio_chip
*chip
, unsigned off
)
67 struct adp5588_gpio
*dev
= gpiochip_get_data(chip
);
68 unsigned bank
= ADP5588_BANK(off
);
69 unsigned bit
= ADP5588_BIT(off
);
72 mutex_lock(&dev
->lock
);
74 if (dev
->dir
[bank
] & bit
)
75 val
= dev
->dat_out
[bank
];
77 val
= adp5588_gpio_read(dev
->client
, GPIO_DAT_STAT1
+ bank
);
79 mutex_unlock(&dev
->lock
);
84 static void adp5588_gpio_set_value(struct gpio_chip
*chip
,
85 unsigned off
, int val
)
88 struct adp5588_gpio
*dev
= gpiochip_get_data(chip
);
90 bank
= ADP5588_BANK(off
);
91 bit
= ADP5588_BIT(off
);
93 mutex_lock(&dev
->lock
);
95 dev
->dat_out
[bank
] |= bit
;
97 dev
->dat_out
[bank
] &= ~bit
;
99 adp5588_gpio_write(dev
->client
, GPIO_DAT_OUT1
+ bank
,
101 mutex_unlock(&dev
->lock
);
104 static int adp5588_gpio_direction_input(struct gpio_chip
*chip
, unsigned off
)
108 struct adp5588_gpio
*dev
= gpiochip_get_data(chip
);
110 bank
= ADP5588_BANK(off
);
112 mutex_lock(&dev
->lock
);
113 dev
->dir
[bank
] &= ~ADP5588_BIT(off
);
114 ret
= adp5588_gpio_write(dev
->client
, GPIO_DIR1
+ bank
, dev
->dir
[bank
]);
115 mutex_unlock(&dev
->lock
);
120 static int adp5588_gpio_direction_output(struct gpio_chip
*chip
,
121 unsigned off
, int val
)
125 struct adp5588_gpio
*dev
= gpiochip_get_data(chip
);
127 bank
= ADP5588_BANK(off
);
128 bit
= ADP5588_BIT(off
);
130 mutex_lock(&dev
->lock
);
131 dev
->dir
[bank
] |= bit
;
134 dev
->dat_out
[bank
] |= bit
;
136 dev
->dat_out
[bank
] &= ~bit
;
138 ret
= adp5588_gpio_write(dev
->client
, GPIO_DAT_OUT1
+ bank
,
140 ret
|= adp5588_gpio_write(dev
->client
, GPIO_DIR1
+ bank
,
142 mutex_unlock(&dev
->lock
);
147 #ifdef CONFIG_GPIO_ADP5588_IRQ
149 static void adp5588_irq_bus_lock(struct irq_data
*d
)
151 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(d
);
152 struct adp5588_gpio
*dev
= gpiochip_get_data(gc
);
154 mutex_lock(&dev
->irq_lock
);
158 * genirq core code can issue chip->mask/unmask from atomic context.
159 * This doesn't work for slow busses where an access needs to sleep.
160 * bus_sync_unlock() is therefore called outside the atomic context,
161 * syncs the current irq mask state with the slow external controller
162 * and unlocks the bus.
165 static void adp5588_irq_bus_sync_unlock(struct irq_data
*d
)
167 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(d
);
168 struct adp5588_gpio
*dev
= gpiochip_get_data(gc
);
171 for (i
= 0; i
<= ADP5588_BANK(ADP5588_MAXGPIO
); i
++) {
172 if (dev
->int_input_en
[i
]) {
173 mutex_lock(&dev
->lock
);
174 dev
->dir
[i
] &= ~dev
->int_input_en
[i
];
175 dev
->int_input_en
[i
] = 0;
176 adp5588_gpio_write(dev
->client
, GPIO_DIR1
+ i
,
178 mutex_unlock(&dev
->lock
);
181 if (dev
->int_en
[i
] ^ dev
->irq_mask
[i
]) {
182 dev
->int_en
[i
] = dev
->irq_mask
[i
];
183 adp5588_gpio_write(dev
->client
, GPI_EM1
+ i
,
188 mutex_unlock(&dev
->irq_lock
);
191 static void adp5588_irq_mask(struct irq_data
*d
)
193 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(d
);
194 struct adp5588_gpio
*dev
= gpiochip_get_data(gc
);
196 dev
->irq_mask
[ADP5588_BANK(d
->hwirq
)] &= ~ADP5588_BIT(d
->hwirq
);
199 static void adp5588_irq_unmask(struct irq_data
*d
)
201 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(d
);
202 struct adp5588_gpio
*dev
= gpiochip_get_data(gc
);
204 dev
->irq_mask
[ADP5588_BANK(d
->hwirq
)] |= ADP5588_BIT(d
->hwirq
);
207 static int adp5588_irq_set_type(struct irq_data
*d
, unsigned int type
)
209 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(d
);
210 struct adp5588_gpio
*dev
= gpiochip_get_data(gc
);
211 uint16_t gpio
= d
->hwirq
;
214 bank
= ADP5588_BANK(gpio
);
215 bit
= ADP5588_BIT(gpio
);
217 dev
->int_lvl_low
[bank
] &= ~bit
;
218 dev
->int_lvl_high
[bank
] &= ~bit
;
220 if (type
& IRQ_TYPE_EDGE_BOTH
|| type
& IRQ_TYPE_LEVEL_HIGH
)
221 dev
->int_lvl_high
[bank
] |= bit
;
223 if (type
& IRQ_TYPE_EDGE_BOTH
|| type
& IRQ_TYPE_LEVEL_LOW
)
224 dev
->int_lvl_low
[bank
] |= bit
;
226 dev
->int_input_en
[bank
] |= bit
;
231 static struct irq_chip adp5588_irq_chip
= {
233 .irq_mask
= adp5588_irq_mask
,
234 .irq_unmask
= adp5588_irq_unmask
,
235 .irq_bus_lock
= adp5588_irq_bus_lock
,
236 .irq_bus_sync_unlock
= adp5588_irq_bus_sync_unlock
,
237 .irq_set_type
= adp5588_irq_set_type
,
240 static irqreturn_t
adp5588_irq_handler(int irq
, void *devid
)
242 struct adp5588_gpio
*dev
= devid
;
243 int status
= adp5588_gpio_read(dev
->client
, INT_STAT
);
245 if (status
& ADP5588_KE_INT
) {
246 int ev_cnt
= adp5588_gpio_read(dev
->client
, KEY_LCK_EC_STAT
);
251 for (i
= 0; i
< (ev_cnt
& ADP5588_KEC
); i
++) {
252 int key
= adp5588_gpio_read(dev
->client
,
254 /* GPIN events begin at 97,
255 * bit 7 indicates logic level
257 int gpio
= (key
& 0x7f) - 97;
258 int lvl
= key
& (1 << 7);
259 int bank
= ADP5588_BANK(gpio
);
260 int bit
= ADP5588_BIT(gpio
);
262 if ((lvl
&& dev
->int_lvl_high
[bank
] & bit
) ||
263 (!lvl
&& dev
->int_lvl_low
[bank
] & bit
))
264 handle_nested_irq(irq_find_mapping(
265 dev
->gpio_chip
.irq
.domain
, gpio
));
270 adp5588_gpio_write(dev
->client
, INT_STAT
, status
); /* Status is W1C */
275 static int adp5588_irq_setup(struct adp5588_gpio
*dev
)
277 struct i2c_client
*client
= dev
->client
;
279 struct adp5588_gpio_platform_data
*pdata
=
280 dev_get_platdata(&client
->dev
);
281 int irq_base
= pdata
? pdata
->irq_base
: 0;
283 adp5588_gpio_write(client
, CFG
, ADP5588_AUTO_INC
);
284 adp5588_gpio_write(client
, INT_STAT
, -1); /* status is W1C */
286 mutex_init(&dev
->irq_lock
);
288 ret
= devm_request_threaded_irq(&client
->dev
, client
->irq
,
289 NULL
, adp5588_irq_handler
, IRQF_ONESHOT
290 | IRQF_TRIGGER_FALLING
| IRQF_SHARED
,
291 dev_name(&client
->dev
), dev
);
293 dev_err(&client
->dev
, "failed to request irq %d\n",
297 ret
= gpiochip_irqchip_add_nested(&dev
->gpio_chip
,
298 &adp5588_irq_chip
, irq_base
,
302 dev_err(&client
->dev
,
303 "could not connect irqchip to gpiochip\n");
306 gpiochip_set_nested_irqchip(&dev
->gpio_chip
,
310 adp5588_gpio_write(client
, CFG
,
311 ADP5588_AUTO_INC
| ADP5588_INT_CFG
| ADP5588_KE_IEN
);
317 static int adp5588_irq_setup(struct adp5588_gpio
*dev
)
319 struct i2c_client
*client
= dev
->client
;
320 dev_warn(&client
->dev
, "interrupt support not compiled in\n");
325 #endif /* CONFIG_GPIO_ADP5588_IRQ */
327 static int adp5588_gpio_probe(struct i2c_client
*client
)
329 struct adp5588_gpio_platform_data
*pdata
=
330 dev_get_platdata(&client
->dev
);
331 struct adp5588_gpio
*dev
;
332 struct gpio_chip
*gc
;
334 unsigned int pullup_dis_mask
= 0;
336 if (!i2c_check_functionality(client
->adapter
,
337 I2C_FUNC_SMBUS_BYTE_DATA
)) {
338 dev_err(&client
->dev
, "SMBUS Byte Data not Supported\n");
342 dev
= devm_kzalloc(&client
->dev
, sizeof(*dev
), GFP_KERNEL
);
346 dev
->client
= client
;
348 gc
= &dev
->gpio_chip
;
349 gc
->direction_input
= adp5588_gpio_direction_input
;
350 gc
->direction_output
= adp5588_gpio_direction_output
;
351 gc
->get
= adp5588_gpio_get_value
;
352 gc
->set
= adp5588_gpio_set_value
;
353 gc
->can_sleep
= true;
355 gc
->parent
= &client
->dev
;
358 gc
->base
= pdata
->gpio_start
;
359 gc
->names
= pdata
->names
;
360 pullup_dis_mask
= pdata
->pullup_dis_mask
;
363 gc
->ngpio
= ADP5588_MAXGPIO
;
364 gc
->label
= client
->name
;
365 gc
->owner
= THIS_MODULE
;
367 mutex_init(&dev
->lock
);
369 ret
= adp5588_gpio_read(dev
->client
, DEV_ID
);
373 revid
= ret
& ADP5588_DEVICE_ID_MASK
;
375 for (i
= 0, ret
= 0; i
<= ADP5588_BANK(ADP5588_MAXGPIO
); i
++) {
376 dev
->dat_out
[i
] = adp5588_gpio_read(client
, GPIO_DAT_OUT1
+ i
);
377 dev
->dir
[i
] = adp5588_gpio_read(client
, GPIO_DIR1
+ i
);
378 ret
|= adp5588_gpio_write(client
, KP_GPIO1
+ i
, 0);
379 ret
|= adp5588_gpio_write(client
, GPIO_PULL1
+ i
,
380 (pullup_dis_mask
>> (8 * i
)) & 0xFF);
381 ret
|= adp5588_gpio_write(client
, GPIO_INT_EN1
+ i
, 0);
387 if (WA_DELAYED_READOUT_REVID(revid
)) {
388 dev_warn(&client
->dev
, "GPIO int not supported\n");
390 ret
= adp5588_irq_setup(dev
);
396 ret
= devm_gpiochip_add_data(&client
->dev
, &dev
->gpio_chip
, dev
);
400 if (pdata
&& pdata
->setup
) {
401 ret
= pdata
->setup(client
, gc
->base
, gc
->ngpio
, pdata
->context
);
403 dev_warn(&client
->dev
, "setup failed, %d\n", ret
);
406 i2c_set_clientdata(client
, dev
);
411 static int adp5588_gpio_remove(struct i2c_client
*client
)
413 struct adp5588_gpio_platform_data
*pdata
=
414 dev_get_platdata(&client
->dev
);
415 struct adp5588_gpio
*dev
= i2c_get_clientdata(client
);
418 if (pdata
&& pdata
->teardown
) {
419 ret
= pdata
->teardown(client
,
420 dev
->gpio_chip
.base
, dev
->gpio_chip
.ngpio
,
423 dev_err(&client
->dev
, "teardown failed %d\n", ret
);
428 if (dev
->client
->irq
)
429 free_irq(dev
->client
->irq
, dev
);
434 static const struct i2c_device_id adp5588_gpio_id
[] = {
438 MODULE_DEVICE_TABLE(i2c
, adp5588_gpio_id
);
441 static const struct of_device_id adp5588_gpio_of_id
[] = {
442 { .compatible
= "adi," DRV_NAME
, },
445 MODULE_DEVICE_TABLE(of
, adp5588_gpio_of_id
);
448 static struct i2c_driver adp5588_gpio_driver
= {
451 .of_match_table
= of_match_ptr(adp5588_gpio_of_id
),
453 .probe_new
= adp5588_gpio_probe
,
454 .remove
= adp5588_gpio_remove
,
455 .id_table
= adp5588_gpio_id
,
458 module_i2c_driver(adp5588_gpio_driver
);
460 MODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>");
461 MODULE_DESCRIPTION("GPIO ADP5588 Driver");
462 MODULE_LICENSE("GPL");