2 * Copyright (c) 2011 Jamie Iles
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
8 * All enquiries to support@picochip.com
10 #include <linux/gpio/driver.h>
11 /* FIXME: for gpio_get_value(), replace this with direct register read */
12 #include <linux/gpio.h>
13 #include <linux/err.h>
14 #include <linux/init.h>
15 #include <linux/interrupt.h>
17 #include <linux/ioport.h>
18 #include <linux/irq.h>
19 #include <linux/irqdomain.h>
20 #include <linux/module.h>
22 #include <linux/of_address.h>
23 #include <linux/of_irq.h>
24 #include <linux/platform_device.h>
25 #include <linux/spinlock.h>
26 #include <linux/platform_data/gpio-dwapb.h>
27 #include <linux/slab.h>
29 #define GPIO_SWPORTA_DR 0x00
30 #define GPIO_SWPORTA_DDR 0x04
31 #define GPIO_SWPORTB_DR 0x0c
32 #define GPIO_SWPORTB_DDR 0x10
33 #define GPIO_SWPORTC_DR 0x18
34 #define GPIO_SWPORTC_DDR 0x1c
35 #define GPIO_SWPORTD_DR 0x24
36 #define GPIO_SWPORTD_DDR 0x28
37 #define GPIO_INTEN 0x30
38 #define GPIO_INTMASK 0x34
39 #define GPIO_INTTYPE_LEVEL 0x38
40 #define GPIO_INT_POLARITY 0x3c
41 #define GPIO_INTSTATUS 0x40
42 #define GPIO_PORTA_DEBOUNCE 0x48
43 #define GPIO_PORTA_EOI 0x4c
44 #define GPIO_EXT_PORTA 0x50
45 #define GPIO_EXT_PORTB 0x54
46 #define GPIO_EXT_PORTC 0x58
47 #define GPIO_EXT_PORTD 0x5c
49 #define DWAPB_MAX_PORTS 4
50 #define GPIO_EXT_PORT_SIZE (GPIO_EXT_PORTB - GPIO_EXT_PORTA)
51 #define GPIO_SWPORT_DR_SIZE (GPIO_SWPORTB_DR - GPIO_SWPORTA_DR)
52 #define GPIO_SWPORT_DDR_SIZE (GPIO_SWPORTB_DDR - GPIO_SWPORTA_DDR)
56 #ifdef CONFIG_PM_SLEEP
57 /* Store GPIO context across system-wide suspend/resume transitions */
58 struct dwapb_context
{
70 struct dwapb_gpio_port
{
73 struct dwapb_gpio
*gpio
;
74 #ifdef CONFIG_PM_SLEEP
75 struct dwapb_context
*ctx
;
83 struct dwapb_gpio_port
*ports
;
84 unsigned int nr_ports
;
85 struct irq_domain
*domain
;
88 static inline u32
dwapb_read(struct dwapb_gpio
*gpio
, unsigned int offset
)
90 struct gpio_chip
*gc
= &gpio
->ports
[0].gc
;
91 void __iomem
*reg_base
= gpio
->regs
;
93 return gc
->read_reg(reg_base
+ offset
);
96 static inline void dwapb_write(struct dwapb_gpio
*gpio
, unsigned int offset
,
99 struct gpio_chip
*gc
= &gpio
->ports
[0].gc
;
100 void __iomem
*reg_base
= gpio
->regs
;
102 gc
->write_reg(reg_base
+ offset
, val
);
105 static int dwapb_gpio_to_irq(struct gpio_chip
*gc
, unsigned offset
)
107 struct dwapb_gpio_port
*port
= gpiochip_get_data(gc
);
108 struct dwapb_gpio
*gpio
= port
->gpio
;
110 return irq_find_mapping(gpio
->domain
, offset
);
113 static void dwapb_toggle_trigger(struct dwapb_gpio
*gpio
, unsigned int offs
)
115 u32 v
= dwapb_read(gpio
, GPIO_INT_POLARITY
);
117 if (gpio_get_value(gpio
->ports
[0].gc
.base
+ offs
))
122 dwapb_write(gpio
, GPIO_INT_POLARITY
, v
);
125 static u32
dwapb_do_irq(struct dwapb_gpio
*gpio
)
127 u32 irq_status
= readl_relaxed(gpio
->regs
+ GPIO_INTSTATUS
);
128 u32 ret
= irq_status
;
131 int hwirq
= fls(irq_status
) - 1;
132 int gpio_irq
= irq_find_mapping(gpio
->domain
, hwirq
);
134 generic_handle_irq(gpio_irq
);
135 irq_status
&= ~BIT(hwirq
);
137 if ((irq_get_trigger_type(gpio_irq
) & IRQ_TYPE_SENSE_MASK
)
138 == IRQ_TYPE_EDGE_BOTH
)
139 dwapb_toggle_trigger(gpio
, hwirq
);
145 static void dwapb_irq_handler(struct irq_desc
*desc
)
147 struct dwapb_gpio
*gpio
= irq_desc_get_handler_data(desc
);
148 struct irq_chip
*chip
= irq_desc_get_chip(desc
);
153 chip
->irq_eoi(irq_desc_get_irq_data(desc
));
156 static void dwapb_irq_enable(struct irq_data
*d
)
158 struct irq_chip_generic
*igc
= irq_data_get_irq_chip_data(d
);
159 struct dwapb_gpio
*gpio
= igc
->private;
160 struct gpio_chip
*gc
= &gpio
->ports
[0].gc
;
164 spin_lock_irqsave(&gc
->bgpio_lock
, flags
);
165 val
= dwapb_read(gpio
, GPIO_INTEN
);
166 val
|= BIT(d
->hwirq
);
167 dwapb_write(gpio
, GPIO_INTEN
, val
);
168 spin_unlock_irqrestore(&gc
->bgpio_lock
, flags
);
171 static void dwapb_irq_disable(struct irq_data
*d
)
173 struct irq_chip_generic
*igc
= irq_data_get_irq_chip_data(d
);
174 struct dwapb_gpio
*gpio
= igc
->private;
175 struct gpio_chip
*gc
= &gpio
->ports
[0].gc
;
179 spin_lock_irqsave(&gc
->bgpio_lock
, flags
);
180 val
= dwapb_read(gpio
, GPIO_INTEN
);
181 val
&= ~BIT(d
->hwirq
);
182 dwapb_write(gpio
, GPIO_INTEN
, val
);
183 spin_unlock_irqrestore(&gc
->bgpio_lock
, flags
);
186 static int dwapb_irq_reqres(struct irq_data
*d
)
188 struct irq_chip_generic
*igc
= irq_data_get_irq_chip_data(d
);
189 struct dwapb_gpio
*gpio
= igc
->private;
190 struct gpio_chip
*gc
= &gpio
->ports
[0].gc
;
192 if (gpiochip_lock_as_irq(gc
, irqd_to_hwirq(d
))) {
193 dev_err(gpio
->dev
, "unable to lock HW IRQ %lu for IRQ\n",
200 static void dwapb_irq_relres(struct irq_data
*d
)
202 struct irq_chip_generic
*igc
= irq_data_get_irq_chip_data(d
);
203 struct dwapb_gpio
*gpio
= igc
->private;
204 struct gpio_chip
*gc
= &gpio
->ports
[0].gc
;
206 gpiochip_unlock_as_irq(gc
, irqd_to_hwirq(d
));
209 static int dwapb_irq_set_type(struct irq_data
*d
, u32 type
)
211 struct irq_chip_generic
*igc
= irq_data_get_irq_chip_data(d
);
212 struct dwapb_gpio
*gpio
= igc
->private;
213 struct gpio_chip
*gc
= &gpio
->ports
[0].gc
;
215 unsigned long level
, polarity
, flags
;
217 if (type
& ~(IRQ_TYPE_EDGE_RISING
| IRQ_TYPE_EDGE_FALLING
|
218 IRQ_TYPE_LEVEL_HIGH
| IRQ_TYPE_LEVEL_LOW
))
221 spin_lock_irqsave(&gc
->bgpio_lock
, flags
);
222 level
= dwapb_read(gpio
, GPIO_INTTYPE_LEVEL
);
223 polarity
= dwapb_read(gpio
, GPIO_INT_POLARITY
);
226 case IRQ_TYPE_EDGE_BOTH
:
228 dwapb_toggle_trigger(gpio
, bit
);
230 case IRQ_TYPE_EDGE_RISING
:
232 polarity
|= BIT(bit
);
234 case IRQ_TYPE_EDGE_FALLING
:
236 polarity
&= ~BIT(bit
);
238 case IRQ_TYPE_LEVEL_HIGH
:
240 polarity
|= BIT(bit
);
242 case IRQ_TYPE_LEVEL_LOW
:
244 polarity
&= ~BIT(bit
);
248 irq_setup_alt_chip(d
, type
);
250 dwapb_write(gpio
, GPIO_INTTYPE_LEVEL
, level
);
251 dwapb_write(gpio
, GPIO_INT_POLARITY
, polarity
);
252 spin_unlock_irqrestore(&gc
->bgpio_lock
, flags
);
257 static int dwapb_gpio_set_debounce(struct gpio_chip
*gc
,
258 unsigned offset
, unsigned debounce
)
260 struct dwapb_gpio_port
*port
= gpiochip_get_data(gc
);
261 struct dwapb_gpio
*gpio
= port
->gpio
;
262 unsigned long flags
, val_deb
;
263 unsigned long mask
= gc
->pin2mask(gc
, offset
);
265 spin_lock_irqsave(&gc
->bgpio_lock
, flags
);
267 val_deb
= dwapb_read(gpio
, GPIO_PORTA_DEBOUNCE
);
269 dwapb_write(gpio
, GPIO_PORTA_DEBOUNCE
, val_deb
| mask
);
271 dwapb_write(gpio
, GPIO_PORTA_DEBOUNCE
, val_deb
& ~mask
);
273 spin_unlock_irqrestore(&gc
->bgpio_lock
, flags
);
278 static irqreturn_t
dwapb_irq_handler_mfd(int irq
, void *dev_id
)
281 struct dwapb_gpio
*gpio
= dev_id
;
283 worked
= dwapb_do_irq(gpio
);
285 return worked
? IRQ_HANDLED
: IRQ_NONE
;
288 static void dwapb_configure_irqs(struct dwapb_gpio
*gpio
,
289 struct dwapb_gpio_port
*port
,
290 struct dwapb_port_property
*pp
)
292 struct gpio_chip
*gc
= &port
->gc
;
293 struct device_node
*node
= pp
->node
;
294 struct irq_chip_generic
*irq_gc
= NULL
;
295 unsigned int hwirq
, ngpio
= gc
->ngpio
;
296 struct irq_chip_type
*ct
;
299 gpio
->domain
= irq_domain_add_linear(node
, ngpio
,
300 &irq_generic_chip_ops
, gpio
);
304 err
= irq_alloc_domain_generic_chips(gpio
->domain
, ngpio
, 2,
305 "gpio-dwapb", handle_level_irq
,
307 IRQ_GC_INIT_NESTED_LOCK
);
309 dev_info(gpio
->dev
, "irq_alloc_domain_generic_chips failed\n");
310 irq_domain_remove(gpio
->domain
);
315 irq_gc
= irq_get_domain_generic_chip(gpio
->domain
, 0);
317 irq_domain_remove(gpio
->domain
);
322 irq_gc
->reg_base
= gpio
->regs
;
323 irq_gc
->private = gpio
;
325 for (i
= 0; i
< 2; i
++) {
326 ct
= &irq_gc
->chip_types
[i
];
327 ct
->chip
.irq_ack
= irq_gc_ack_set_bit
;
328 ct
->chip
.irq_mask
= irq_gc_mask_set_bit
;
329 ct
->chip
.irq_unmask
= irq_gc_mask_clr_bit
;
330 ct
->chip
.irq_set_type
= dwapb_irq_set_type
;
331 ct
->chip
.irq_enable
= dwapb_irq_enable
;
332 ct
->chip
.irq_disable
= dwapb_irq_disable
;
333 ct
->chip
.irq_request_resources
= dwapb_irq_reqres
;
334 ct
->chip
.irq_release_resources
= dwapb_irq_relres
;
335 ct
->regs
.ack
= GPIO_PORTA_EOI
;
336 ct
->regs
.mask
= GPIO_INTMASK
;
337 ct
->type
= IRQ_TYPE_LEVEL_MASK
;
340 irq_gc
->chip_types
[0].type
= IRQ_TYPE_LEVEL_MASK
;
341 irq_gc
->chip_types
[1].type
= IRQ_TYPE_EDGE_BOTH
;
342 irq_gc
->chip_types
[1].handler
= handle_edge_irq
;
344 if (!pp
->irq_shared
) {
345 irq_set_chained_handler_and_data(pp
->irq
, dwapb_irq_handler
,
349 * Request a shared IRQ since where MFD would have devices
350 * using the same irq pin
352 err
= devm_request_irq(gpio
->dev
, pp
->irq
,
353 dwapb_irq_handler_mfd
,
354 IRQF_SHARED
, "gpio-dwapb-mfd", gpio
);
356 dev_err(gpio
->dev
, "error requesting IRQ\n");
357 irq_domain_remove(gpio
->domain
);
363 for (hwirq
= 0 ; hwirq
< ngpio
; hwirq
++)
364 irq_create_mapping(gpio
->domain
, hwirq
);
366 port
->gc
.to_irq
= dwapb_gpio_to_irq
;
369 static void dwapb_irq_teardown(struct dwapb_gpio
*gpio
)
371 struct dwapb_gpio_port
*port
= &gpio
->ports
[0];
372 struct gpio_chip
*gc
= &port
->gc
;
373 unsigned int ngpio
= gc
->ngpio
;
374 irq_hw_number_t hwirq
;
379 for (hwirq
= 0 ; hwirq
< ngpio
; hwirq
++)
380 irq_dispose_mapping(irq_find_mapping(gpio
->domain
, hwirq
));
382 irq_domain_remove(gpio
->domain
);
386 static int dwapb_gpio_add_port(struct dwapb_gpio
*gpio
,
387 struct dwapb_port_property
*pp
,
390 struct dwapb_gpio_port
*port
;
391 void __iomem
*dat
, *set
, *dirout
;
394 port
= &gpio
->ports
[offs
];
398 #ifdef CONFIG_PM_SLEEP
399 port
->ctx
= devm_kzalloc(gpio
->dev
, sizeof(*port
->ctx
), GFP_KERNEL
);
404 dat
= gpio
->regs
+ GPIO_EXT_PORTA
+ (pp
->idx
* GPIO_EXT_PORT_SIZE
);
405 set
= gpio
->regs
+ GPIO_SWPORTA_DR
+ (pp
->idx
* GPIO_SWPORT_DR_SIZE
);
406 dirout
= gpio
->regs
+ GPIO_SWPORTA_DDR
+
407 (pp
->idx
* GPIO_SWPORT_DDR_SIZE
);
409 err
= bgpio_init(&port
->gc
, gpio
->dev
, 4, dat
, set
, NULL
, dirout
,
412 dev_err(gpio
->dev
, "failed to init gpio chip for %s\n",
417 #ifdef CONFIG_OF_GPIO
418 port
->gc
.of_node
= pp
->node
;
420 port
->gc
.ngpio
= pp
->ngpio
;
421 port
->gc
.base
= pp
->gpio_base
;
423 /* Only port A support debounce */
425 port
->gc
.set_debounce
= dwapb_gpio_set_debounce
;
428 dwapb_configure_irqs(gpio
, port
, pp
);
430 err
= gpiochip_add_data(&port
->gc
, port
);
432 dev_err(gpio
->dev
, "failed to register gpiochip for %s\n",
435 port
->is_registered
= true;
440 static void dwapb_gpio_unregister(struct dwapb_gpio
*gpio
)
444 for (m
= 0; m
< gpio
->nr_ports
; ++m
)
445 if (gpio
->ports
[m
].is_registered
)
446 gpiochip_remove(&gpio
->ports
[m
].gc
);
449 static struct dwapb_platform_data
*
450 dwapb_gpio_get_pdata_of(struct device
*dev
)
452 struct device_node
*node
, *port_np
;
453 struct dwapb_platform_data
*pdata
;
454 struct dwapb_port_property
*pp
;
459 if (!IS_ENABLED(CONFIG_OF_GPIO
) || !node
)
460 return ERR_PTR(-ENODEV
);
462 nports
= of_get_child_count(node
);
464 return ERR_PTR(-ENODEV
);
466 pdata
= devm_kzalloc(dev
, sizeof(*pdata
), GFP_KERNEL
);
468 return ERR_PTR(-ENOMEM
);
470 pdata
->properties
= devm_kcalloc(dev
, nports
, sizeof(*pp
), GFP_KERNEL
);
471 if (!pdata
->properties
)
472 return ERR_PTR(-ENOMEM
);
474 pdata
->nports
= nports
;
477 for_each_child_of_node(node
, port_np
) {
478 pp
= &pdata
->properties
[i
++];
481 if (of_property_read_u32(port_np
, "reg", &pp
->idx
) ||
482 pp
->idx
>= DWAPB_MAX_PORTS
) {
483 dev_err(dev
, "missing/invalid port index for %s\n",
485 return ERR_PTR(-EINVAL
);
488 if (of_property_read_u32(port_np
, "snps,nr-gpios",
490 dev_info(dev
, "failed to get number of gpios for %s\n",
496 * Only port A can provide interrupts in all configurations of
500 of_property_read_bool(port_np
, "interrupt-controller")) {
501 pp
->irq
= irq_of_parse_and_map(port_np
, 0);
503 dev_warn(dev
, "no irq for bank %s\n",
508 pp
->irq_shared
= false;
510 pp
->name
= port_np
->full_name
;
516 static int dwapb_gpio_probe(struct platform_device
*pdev
)
519 struct resource
*res
;
520 struct dwapb_gpio
*gpio
;
522 struct device
*dev
= &pdev
->dev
;
523 struct dwapb_platform_data
*pdata
= dev_get_platdata(dev
);
526 pdata
= dwapb_gpio_get_pdata_of(dev
);
528 return PTR_ERR(pdata
);
534 gpio
= devm_kzalloc(&pdev
->dev
, sizeof(*gpio
), GFP_KERNEL
);
538 gpio
->dev
= &pdev
->dev
;
539 gpio
->nr_ports
= pdata
->nports
;
541 gpio
->ports
= devm_kcalloc(&pdev
->dev
, gpio
->nr_ports
,
542 sizeof(*gpio
->ports
), GFP_KERNEL
);
546 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
547 gpio
->regs
= devm_ioremap_resource(&pdev
->dev
, res
);
548 if (IS_ERR(gpio
->regs
))
549 return PTR_ERR(gpio
->regs
);
551 for (i
= 0; i
< gpio
->nr_ports
; i
++) {
552 err
= dwapb_gpio_add_port(gpio
, &pdata
->properties
[i
], i
);
556 platform_set_drvdata(pdev
, gpio
);
561 dwapb_gpio_unregister(gpio
);
562 dwapb_irq_teardown(gpio
);
567 static int dwapb_gpio_remove(struct platform_device
*pdev
)
569 struct dwapb_gpio
*gpio
= platform_get_drvdata(pdev
);
571 dwapb_gpio_unregister(gpio
);
572 dwapb_irq_teardown(gpio
);
577 static const struct of_device_id dwapb_of_match
[] = {
578 { .compatible
= "snps,dw-apb-gpio" },
581 MODULE_DEVICE_TABLE(of
, dwapb_of_match
);
583 #ifdef CONFIG_PM_SLEEP
584 static int dwapb_gpio_suspend(struct device
*dev
)
586 struct platform_device
*pdev
= to_platform_device(dev
);
587 struct dwapb_gpio
*gpio
= platform_get_drvdata(pdev
);
588 struct gpio_chip
*gc
= &gpio
->ports
[0].gc
;
592 spin_lock_irqsave(&gc
->bgpio_lock
, flags
);
593 for (i
= 0; i
< gpio
->nr_ports
; i
++) {
595 unsigned int idx
= gpio
->ports
[i
].idx
;
596 struct dwapb_context
*ctx
= gpio
->ports
[i
].ctx
;
600 offset
= GPIO_SWPORTA_DDR
+ idx
* GPIO_SWPORT_DDR_SIZE
;
601 ctx
->dir
= dwapb_read(gpio
, offset
);
603 offset
= GPIO_SWPORTA_DR
+ idx
* GPIO_SWPORT_DR_SIZE
;
604 ctx
->data
= dwapb_read(gpio
, offset
);
606 offset
= GPIO_EXT_PORTA
+ idx
* GPIO_EXT_PORT_SIZE
;
607 ctx
->ext
= dwapb_read(gpio
, offset
);
609 /* Only port A can provide interrupts */
611 ctx
->int_mask
= dwapb_read(gpio
, GPIO_INTMASK
);
612 ctx
->int_en
= dwapb_read(gpio
, GPIO_INTEN
);
613 ctx
->int_pol
= dwapb_read(gpio
, GPIO_INT_POLARITY
);
614 ctx
->int_type
= dwapb_read(gpio
, GPIO_INTTYPE_LEVEL
);
615 ctx
->int_deb
= dwapb_read(gpio
, GPIO_PORTA_DEBOUNCE
);
617 /* Mask out interrupts */
618 dwapb_write(gpio
, GPIO_INTMASK
, 0xffffffff);
621 spin_unlock_irqrestore(&gc
->bgpio_lock
, flags
);
626 static int dwapb_gpio_resume(struct device
*dev
)
628 struct platform_device
*pdev
= to_platform_device(dev
);
629 struct dwapb_gpio
*gpio
= platform_get_drvdata(pdev
);
630 struct gpio_chip
*gc
= &gpio
->ports
[0].gc
;
634 spin_lock_irqsave(&gc
->bgpio_lock
, flags
);
635 for (i
= 0; i
< gpio
->nr_ports
; i
++) {
637 unsigned int idx
= gpio
->ports
[i
].idx
;
638 struct dwapb_context
*ctx
= gpio
->ports
[i
].ctx
;
642 offset
= GPIO_SWPORTA_DR
+ idx
* GPIO_SWPORT_DR_SIZE
;
643 dwapb_write(gpio
, offset
, ctx
->data
);
645 offset
= GPIO_SWPORTA_DDR
+ idx
* GPIO_SWPORT_DDR_SIZE
;
646 dwapb_write(gpio
, offset
, ctx
->dir
);
648 offset
= GPIO_EXT_PORTA
+ idx
* GPIO_EXT_PORT_SIZE
;
649 dwapb_write(gpio
, offset
, ctx
->ext
);
651 /* Only port A can provide interrupts */
653 dwapb_write(gpio
, GPIO_INTTYPE_LEVEL
, ctx
->int_type
);
654 dwapb_write(gpio
, GPIO_INT_POLARITY
, ctx
->int_pol
);
655 dwapb_write(gpio
, GPIO_PORTA_DEBOUNCE
, ctx
->int_deb
);
656 dwapb_write(gpio
, GPIO_INTEN
, ctx
->int_en
);
657 dwapb_write(gpio
, GPIO_INTMASK
, ctx
->int_mask
);
659 /* Clear out spurious interrupts */
660 dwapb_write(gpio
, GPIO_PORTA_EOI
, 0xffffffff);
663 spin_unlock_irqrestore(&gc
->bgpio_lock
, flags
);
669 static SIMPLE_DEV_PM_OPS(dwapb_gpio_pm_ops
, dwapb_gpio_suspend
,
672 static struct platform_driver dwapb_gpio_driver
= {
674 .name
= "gpio-dwapb",
675 .pm
= &dwapb_gpio_pm_ops
,
676 .of_match_table
= of_match_ptr(dwapb_of_match
),
678 .probe
= dwapb_gpio_probe
,
679 .remove
= dwapb_gpio_remove
,
682 module_platform_driver(dwapb_gpio_driver
);
684 MODULE_LICENSE("GPL");
685 MODULE_AUTHOR("Jamie Iles");
686 MODULE_DESCRIPTION("Synopsys DesignWare APB GPIO driver");