1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2011 Jamie Iles
5 * All enquiries to support@picochip.com
7 #include <linux/acpi.h>
10 #include <linux/gpio/driver.h>
11 #include <linux/init.h>
12 #include <linux/interrupt.h>
14 #include <linux/ioport.h>
15 #include <linux/irq.h>
16 #include <linux/irqdomain.h>
17 #include <linux/module.h>
19 #include <linux/of_address.h>
20 #include <linux/of_device.h>
21 #include <linux/of_irq.h>
22 #include <linux/platform_device.h>
23 #include <linux/property.h>
24 #include <linux/reset.h>
25 #include <linux/spinlock.h>
26 #include <linux/platform_data/gpio-dwapb.h>
27 #include <linux/slab.h>
30 #include "gpiolib-acpi.h"
32 #define GPIO_SWPORTA_DR 0x00
33 #define GPIO_SWPORTA_DDR 0x04
34 #define GPIO_SWPORTB_DR 0x0c
35 #define GPIO_SWPORTB_DDR 0x10
36 #define GPIO_SWPORTC_DR 0x18
37 #define GPIO_SWPORTC_DDR 0x1c
38 #define GPIO_SWPORTD_DR 0x24
39 #define GPIO_SWPORTD_DDR 0x28
40 #define GPIO_INTEN 0x30
41 #define GPIO_INTMASK 0x34
42 #define GPIO_INTTYPE_LEVEL 0x38
43 #define GPIO_INT_POLARITY 0x3c
44 #define GPIO_INTSTATUS 0x40
45 #define GPIO_PORTA_DEBOUNCE 0x48
46 #define GPIO_PORTA_EOI 0x4c
47 #define GPIO_EXT_PORTA 0x50
48 #define GPIO_EXT_PORTB 0x54
49 #define GPIO_EXT_PORTC 0x58
50 #define GPIO_EXT_PORTD 0x5c
52 #define DWAPB_MAX_PORTS 4
53 #define GPIO_EXT_PORT_STRIDE 0x04 /* register stride 32 bits */
54 #define GPIO_SWPORT_DR_STRIDE 0x0c /* register stride 3*32 bits */
55 #define GPIO_SWPORT_DDR_STRIDE 0x0c /* register stride 3*32 bits */
57 #define GPIO_REG_OFFSET_V2 1
59 #define GPIO_INTMASK_V2 0x44
60 #define GPIO_INTTYPE_LEVEL_V2 0x34
61 #define GPIO_INT_POLARITY_V2 0x38
62 #define GPIO_INTSTATUS_V2 0x3c
63 #define GPIO_PORTA_EOI_V2 0x40
67 #ifdef CONFIG_PM_SLEEP
68 /* Store GPIO context across system-wide suspend/resume transitions */
69 struct dwapb_context
{
82 struct dwapb_gpio_port
{
85 struct dwapb_gpio
*gpio
;
86 #ifdef CONFIG_PM_SLEEP
87 struct dwapb_context
*ctx
;
95 struct dwapb_gpio_port
*ports
;
96 unsigned int nr_ports
;
97 struct irq_domain
*domain
;
99 struct reset_control
*rst
;
103 static inline u32
gpio_reg_v2_convert(unsigned int offset
)
107 return GPIO_INTMASK_V2
;
108 case GPIO_INTTYPE_LEVEL
:
109 return GPIO_INTTYPE_LEVEL_V2
;
110 case GPIO_INT_POLARITY
:
111 return GPIO_INT_POLARITY_V2
;
113 return GPIO_INTSTATUS_V2
;
115 return GPIO_PORTA_EOI_V2
;
121 static inline u32
gpio_reg_convert(struct dwapb_gpio
*gpio
, unsigned int offset
)
123 if (gpio
->flags
& GPIO_REG_OFFSET_V2
)
124 return gpio_reg_v2_convert(offset
);
129 static inline u32
dwapb_read(struct dwapb_gpio
*gpio
, unsigned int offset
)
131 struct gpio_chip
*gc
= &gpio
->ports
[0].gc
;
132 void __iomem
*reg_base
= gpio
->regs
;
134 return gc
->read_reg(reg_base
+ gpio_reg_convert(gpio
, offset
));
137 static inline void dwapb_write(struct dwapb_gpio
*gpio
, unsigned int offset
,
140 struct gpio_chip
*gc
= &gpio
->ports
[0].gc
;
141 void __iomem
*reg_base
= gpio
->regs
;
143 gc
->write_reg(reg_base
+ gpio_reg_convert(gpio
, offset
), val
);
146 static int dwapb_gpio_to_irq(struct gpio_chip
*gc
, unsigned offset
)
148 struct dwapb_gpio_port
*port
= gpiochip_get_data(gc
);
149 struct dwapb_gpio
*gpio
= port
->gpio
;
151 return irq_find_mapping(gpio
->domain
, offset
);
154 static struct dwapb_gpio_port
*dwapb_offs_to_port(struct dwapb_gpio
*gpio
, unsigned int offs
)
156 struct dwapb_gpio_port
*port
;
159 for (i
= 0; i
< gpio
->nr_ports
; i
++) {
160 port
= &gpio
->ports
[i
];
161 if (port
->idx
== offs
/ 32)
168 static void dwapb_toggle_trigger(struct dwapb_gpio
*gpio
, unsigned int offs
)
170 struct dwapb_gpio_port
*port
= dwapb_offs_to_port(gpio
, offs
);
171 struct gpio_chip
*gc
;
179 pol
= dwapb_read(gpio
, GPIO_INT_POLARITY
);
180 /* Just read the current value right out of the data register */
181 val
= gc
->get(gc
, offs
% 32);
187 dwapb_write(gpio
, GPIO_INT_POLARITY
, pol
);
190 static u32
dwapb_do_irq(struct dwapb_gpio
*gpio
)
192 u32 irq_status
= dwapb_read(gpio
, GPIO_INTSTATUS
);
193 u32 ret
= irq_status
;
196 int hwirq
= fls(irq_status
) - 1;
197 int gpio_irq
= irq_find_mapping(gpio
->domain
, hwirq
);
199 generic_handle_irq(gpio_irq
);
200 irq_status
&= ~BIT(hwirq
);
202 if ((irq_get_trigger_type(gpio_irq
) & IRQ_TYPE_SENSE_MASK
)
203 == IRQ_TYPE_EDGE_BOTH
)
204 dwapb_toggle_trigger(gpio
, hwirq
);
210 static void dwapb_irq_handler(struct irq_desc
*desc
)
212 struct dwapb_gpio
*gpio
= irq_desc_get_handler_data(desc
);
213 struct irq_chip
*chip
= irq_desc_get_chip(desc
);
218 chip
->irq_eoi(irq_desc_get_irq_data(desc
));
221 static void dwapb_irq_enable(struct irq_data
*d
)
223 struct irq_chip_generic
*igc
= irq_data_get_irq_chip_data(d
);
224 struct dwapb_gpio
*gpio
= igc
->private;
225 struct gpio_chip
*gc
= &gpio
->ports
[0].gc
;
229 spin_lock_irqsave(&gc
->bgpio_lock
, flags
);
230 val
= dwapb_read(gpio
, GPIO_INTEN
);
231 val
|= BIT(d
->hwirq
);
232 dwapb_write(gpio
, GPIO_INTEN
, val
);
233 spin_unlock_irqrestore(&gc
->bgpio_lock
, flags
);
236 static void dwapb_irq_disable(struct irq_data
*d
)
238 struct irq_chip_generic
*igc
= irq_data_get_irq_chip_data(d
);
239 struct dwapb_gpio
*gpio
= igc
->private;
240 struct gpio_chip
*gc
= &gpio
->ports
[0].gc
;
244 spin_lock_irqsave(&gc
->bgpio_lock
, flags
);
245 val
= dwapb_read(gpio
, GPIO_INTEN
);
246 val
&= ~BIT(d
->hwirq
);
247 dwapb_write(gpio
, GPIO_INTEN
, val
);
248 spin_unlock_irqrestore(&gc
->bgpio_lock
, flags
);
251 static int dwapb_irq_reqres(struct irq_data
*d
)
253 struct irq_chip_generic
*igc
= irq_data_get_irq_chip_data(d
);
254 struct dwapb_gpio
*gpio
= igc
->private;
255 struct gpio_chip
*gc
= &gpio
->ports
[0].gc
;
258 ret
= gpiochip_lock_as_irq(gc
, irqd_to_hwirq(d
));
260 dev_err(gpio
->dev
, "unable to lock HW IRQ %lu for IRQ\n",
267 static void dwapb_irq_relres(struct irq_data
*d
)
269 struct irq_chip_generic
*igc
= irq_data_get_irq_chip_data(d
);
270 struct dwapb_gpio
*gpio
= igc
->private;
271 struct gpio_chip
*gc
= &gpio
->ports
[0].gc
;
273 gpiochip_unlock_as_irq(gc
, irqd_to_hwirq(d
));
276 static int dwapb_irq_set_type(struct irq_data
*d
, u32 type
)
278 struct irq_chip_generic
*igc
= irq_data_get_irq_chip_data(d
);
279 struct dwapb_gpio
*gpio
= igc
->private;
280 struct gpio_chip
*gc
= &gpio
->ports
[0].gc
;
282 unsigned long level
, polarity
, flags
;
284 if (type
& ~(IRQ_TYPE_EDGE_RISING
| IRQ_TYPE_EDGE_FALLING
|
285 IRQ_TYPE_LEVEL_HIGH
| IRQ_TYPE_LEVEL_LOW
))
288 spin_lock_irqsave(&gc
->bgpio_lock
, flags
);
289 level
= dwapb_read(gpio
, GPIO_INTTYPE_LEVEL
);
290 polarity
= dwapb_read(gpio
, GPIO_INT_POLARITY
);
293 case IRQ_TYPE_EDGE_BOTH
:
295 dwapb_toggle_trigger(gpio
, bit
);
297 case IRQ_TYPE_EDGE_RISING
:
299 polarity
|= BIT(bit
);
301 case IRQ_TYPE_EDGE_FALLING
:
303 polarity
&= ~BIT(bit
);
305 case IRQ_TYPE_LEVEL_HIGH
:
307 polarity
|= BIT(bit
);
309 case IRQ_TYPE_LEVEL_LOW
:
311 polarity
&= ~BIT(bit
);
315 irq_setup_alt_chip(d
, type
);
317 dwapb_write(gpio
, GPIO_INTTYPE_LEVEL
, level
);
318 if (type
!= IRQ_TYPE_EDGE_BOTH
)
319 dwapb_write(gpio
, GPIO_INT_POLARITY
, polarity
);
320 spin_unlock_irqrestore(&gc
->bgpio_lock
, flags
);
325 #ifdef CONFIG_PM_SLEEP
326 static int dwapb_irq_set_wake(struct irq_data
*d
, unsigned int enable
)
328 struct irq_chip_generic
*igc
= irq_data_get_irq_chip_data(d
);
329 struct dwapb_gpio
*gpio
= igc
->private;
330 struct dwapb_context
*ctx
= gpio
->ports
[0].ctx
;
333 ctx
->wake_en
|= BIT(d
->hwirq
);
335 ctx
->wake_en
&= ~BIT(d
->hwirq
);
341 static int dwapb_gpio_set_debounce(struct gpio_chip
*gc
,
342 unsigned offset
, unsigned debounce
)
344 struct dwapb_gpio_port
*port
= gpiochip_get_data(gc
);
345 struct dwapb_gpio
*gpio
= port
->gpio
;
346 unsigned long flags
, val_deb
;
347 unsigned long mask
= BIT(offset
);
349 spin_lock_irqsave(&gc
->bgpio_lock
, flags
);
351 val_deb
= dwapb_read(gpio
, GPIO_PORTA_DEBOUNCE
);
353 dwapb_write(gpio
, GPIO_PORTA_DEBOUNCE
, val_deb
| mask
);
355 dwapb_write(gpio
, GPIO_PORTA_DEBOUNCE
, val_deb
& ~mask
);
357 spin_unlock_irqrestore(&gc
->bgpio_lock
, flags
);
362 static int dwapb_gpio_set_config(struct gpio_chip
*gc
, unsigned offset
,
363 unsigned long config
)
367 if (pinconf_to_config_param(config
) != PIN_CONFIG_INPUT_DEBOUNCE
)
370 debounce
= pinconf_to_config_argument(config
);
371 return dwapb_gpio_set_debounce(gc
, offset
, debounce
);
374 static irqreturn_t
dwapb_irq_handler_mfd(int irq
, void *dev_id
)
377 struct dwapb_gpio
*gpio
= dev_id
;
379 worked
= dwapb_do_irq(gpio
);
381 return worked
? IRQ_HANDLED
: IRQ_NONE
;
384 static void dwapb_configure_irqs(struct dwapb_gpio
*gpio
,
385 struct dwapb_gpio_port
*port
,
386 struct dwapb_port_property
*pp
)
388 struct gpio_chip
*gc
= &port
->gc
;
389 struct fwnode_handle
*fwnode
= pp
->fwnode
;
390 struct irq_chip_generic
*irq_gc
= NULL
;
391 unsigned int hwirq
, ngpio
= gc
->ngpio
;
392 struct irq_chip_type
*ct
;
395 gpio
->domain
= irq_domain_create_linear(fwnode
, ngpio
,
396 &irq_generic_chip_ops
, gpio
);
400 err
= irq_alloc_domain_generic_chips(gpio
->domain
, ngpio
, 2,
401 "gpio-dwapb", handle_level_irq
,
403 IRQ_GC_INIT_NESTED_LOCK
);
405 dev_info(gpio
->dev
, "irq_alloc_domain_generic_chips failed\n");
406 irq_domain_remove(gpio
->domain
);
411 irq_gc
= irq_get_domain_generic_chip(gpio
->domain
, 0);
413 irq_domain_remove(gpio
->domain
);
418 irq_gc
->reg_base
= gpio
->regs
;
419 irq_gc
->private = gpio
;
421 for (i
= 0; i
< 2; i
++) {
422 ct
= &irq_gc
->chip_types
[i
];
423 ct
->chip
.irq_ack
= irq_gc_ack_set_bit
;
424 ct
->chip
.irq_mask
= irq_gc_mask_set_bit
;
425 ct
->chip
.irq_unmask
= irq_gc_mask_clr_bit
;
426 ct
->chip
.irq_set_type
= dwapb_irq_set_type
;
427 ct
->chip
.irq_enable
= dwapb_irq_enable
;
428 ct
->chip
.irq_disable
= dwapb_irq_disable
;
429 ct
->chip
.irq_request_resources
= dwapb_irq_reqres
;
430 ct
->chip
.irq_release_resources
= dwapb_irq_relres
;
431 #ifdef CONFIG_PM_SLEEP
432 ct
->chip
.irq_set_wake
= dwapb_irq_set_wake
;
434 ct
->regs
.ack
= gpio_reg_convert(gpio
, GPIO_PORTA_EOI
);
435 ct
->regs
.mask
= gpio_reg_convert(gpio
, GPIO_INTMASK
);
436 ct
->type
= IRQ_TYPE_LEVEL_MASK
;
439 irq_gc
->chip_types
[0].type
= IRQ_TYPE_LEVEL_MASK
;
440 irq_gc
->chip_types
[1].type
= IRQ_TYPE_EDGE_BOTH
;
441 irq_gc
->chip_types
[1].handler
= handle_edge_irq
;
443 if (!pp
->irq_shared
) {
446 for (i
= 0; i
< pp
->ngpio
; i
++) {
448 irq_set_chained_handler_and_data(pp
->irq
[i
],
449 dwapb_irq_handler
, gpio
);
453 * Request a shared IRQ since where MFD would have devices
454 * using the same irq pin
456 err
= devm_request_irq(gpio
->dev
, pp
->irq
[0],
457 dwapb_irq_handler_mfd
,
458 IRQF_SHARED
, "gpio-dwapb-mfd", gpio
);
460 dev_err(gpio
->dev
, "error requesting IRQ\n");
461 irq_domain_remove(gpio
->domain
);
467 for (hwirq
= 0 ; hwirq
< ngpio
; hwirq
++)
468 irq_create_mapping(gpio
->domain
, hwirq
);
470 port
->gc
.to_irq
= dwapb_gpio_to_irq
;
473 static void dwapb_irq_teardown(struct dwapb_gpio
*gpio
)
475 struct dwapb_gpio_port
*port
= &gpio
->ports
[0];
476 struct gpio_chip
*gc
= &port
->gc
;
477 unsigned int ngpio
= gc
->ngpio
;
478 irq_hw_number_t hwirq
;
483 for (hwirq
= 0 ; hwirq
< ngpio
; hwirq
++)
484 irq_dispose_mapping(irq_find_mapping(gpio
->domain
, hwirq
));
486 irq_domain_remove(gpio
->domain
);
490 static int dwapb_gpio_add_port(struct dwapb_gpio
*gpio
,
491 struct dwapb_port_property
*pp
,
494 struct dwapb_gpio_port
*port
;
495 void __iomem
*dat
, *set
, *dirout
;
498 port
= &gpio
->ports
[offs
];
502 #ifdef CONFIG_PM_SLEEP
503 port
->ctx
= devm_kzalloc(gpio
->dev
, sizeof(*port
->ctx
), GFP_KERNEL
);
508 dat
= gpio
->regs
+ GPIO_EXT_PORTA
+ (pp
->idx
* GPIO_EXT_PORT_STRIDE
);
509 set
= gpio
->regs
+ GPIO_SWPORTA_DR
+ (pp
->idx
* GPIO_SWPORT_DR_STRIDE
);
510 dirout
= gpio
->regs
+ GPIO_SWPORTA_DDR
+
511 (pp
->idx
* GPIO_SWPORT_DDR_STRIDE
);
513 /* This registers 32 GPIO lines per port */
514 err
= bgpio_init(&port
->gc
, gpio
->dev
, 4, dat
, set
, NULL
, dirout
,
517 dev_err(gpio
->dev
, "failed to init gpio chip for port%d\n",
522 #ifdef CONFIG_OF_GPIO
523 port
->gc
.of_node
= to_of_node(pp
->fwnode
);
525 port
->gc
.ngpio
= pp
->ngpio
;
526 port
->gc
.base
= pp
->gpio_base
;
528 /* Only port A support debounce */
530 port
->gc
.set_config
= dwapb_gpio_set_config
;
533 dwapb_configure_irqs(gpio
, port
, pp
);
535 err
= gpiochip_add_data(&port
->gc
, port
);
537 dev_err(gpio
->dev
, "failed to register gpiochip for port%d\n",
540 port
->is_registered
= true;
542 /* Add GPIO-signaled ACPI event support */
544 acpi_gpiochip_request_interrupts(&port
->gc
);
549 static void dwapb_gpio_unregister(struct dwapb_gpio
*gpio
)
553 for (m
= 0; m
< gpio
->nr_ports
; ++m
)
554 if (gpio
->ports
[m
].is_registered
)
555 gpiochip_remove(&gpio
->ports
[m
].gc
);
558 static struct dwapb_platform_data
*
559 dwapb_gpio_get_pdata(struct device
*dev
)
561 struct fwnode_handle
*fwnode
;
562 struct dwapb_platform_data
*pdata
;
563 struct dwapb_port_property
*pp
;
567 nports
= device_get_child_node_count(dev
);
569 return ERR_PTR(-ENODEV
);
571 pdata
= devm_kzalloc(dev
, sizeof(*pdata
), GFP_KERNEL
);
573 return ERR_PTR(-ENOMEM
);
575 pdata
->properties
= devm_kcalloc(dev
, nports
, sizeof(*pp
), GFP_KERNEL
);
576 if (!pdata
->properties
)
577 return ERR_PTR(-ENOMEM
);
579 pdata
->nports
= nports
;
582 device_for_each_child_node(dev
, fwnode
) {
583 struct device_node
*np
= NULL
;
585 pp
= &pdata
->properties
[i
++];
588 if (fwnode_property_read_u32(fwnode
, "reg", &pp
->idx
) ||
589 pp
->idx
>= DWAPB_MAX_PORTS
) {
591 "missing/invalid port index for port%d\n", i
);
592 fwnode_handle_put(fwnode
);
593 return ERR_PTR(-EINVAL
);
596 if (fwnode_property_read_u32(fwnode
, "snps,nr-gpios",
599 "failed to get number of gpios for port%d\n",
604 pp
->irq_shared
= false;
608 * Only port A can provide interrupts in all configurations of
614 if (dev
->of_node
&& fwnode_property_read_bool(fwnode
,
615 "interrupt-controller")) {
616 np
= to_of_node(fwnode
);
619 for (j
= 0; j
< pp
->ngpio
; j
++) {
623 pp
->irq
[j
] = of_irq_get(np
, j
);
624 else if (has_acpi_companion(dev
))
625 pp
->irq
[j
] = platform_get_irq(to_platform_device(dev
), j
);
632 dev_warn(dev
, "no irq for port%d\n", pp
->idx
);
638 static const struct of_device_id dwapb_of_match
[] = {
639 { .compatible
= "snps,dw-apb-gpio", .data
= (void *)0},
640 { .compatible
= "apm,xgene-gpio-v2", .data
= (void *)GPIO_REG_OFFSET_V2
},
643 MODULE_DEVICE_TABLE(of
, dwapb_of_match
);
645 static const struct acpi_device_id dwapb_acpi_match
[] = {
648 {"APMC0D81", GPIO_REG_OFFSET_V2
},
651 MODULE_DEVICE_TABLE(acpi
, dwapb_acpi_match
);
653 static int dwapb_gpio_probe(struct platform_device
*pdev
)
656 struct dwapb_gpio
*gpio
;
658 struct device
*dev
= &pdev
->dev
;
659 struct dwapb_platform_data
*pdata
= dev_get_platdata(dev
);
662 pdata
= dwapb_gpio_get_pdata(dev
);
664 return PTR_ERR(pdata
);
670 gpio
= devm_kzalloc(&pdev
->dev
, sizeof(*gpio
), GFP_KERNEL
);
674 gpio
->dev
= &pdev
->dev
;
675 gpio
->nr_ports
= pdata
->nports
;
677 gpio
->rst
= devm_reset_control_get_optional_shared(dev
, NULL
);
678 if (IS_ERR(gpio
->rst
))
679 return PTR_ERR(gpio
->rst
);
681 reset_control_deassert(gpio
->rst
);
683 gpio
->ports
= devm_kcalloc(&pdev
->dev
, gpio
->nr_ports
,
684 sizeof(*gpio
->ports
), GFP_KERNEL
);
688 gpio
->regs
= devm_platform_ioremap_resource(pdev
, 0);
689 if (IS_ERR(gpio
->regs
))
690 return PTR_ERR(gpio
->regs
);
692 /* Optional bus clock */
693 gpio
->clk
= devm_clk_get(&pdev
->dev
, "bus");
694 if (!IS_ERR(gpio
->clk
)) {
695 err
= clk_prepare_enable(gpio
->clk
);
697 dev_info(&pdev
->dev
, "Cannot enable clock\n");
704 gpio
->flags
= (uintptr_t)of_device_get_match_data(dev
);
705 } else if (has_acpi_companion(dev
)) {
706 const struct acpi_device_id
*acpi_id
;
708 acpi_id
= acpi_match_device(dwapb_acpi_match
, dev
);
710 if (acpi_id
->driver_data
)
711 gpio
->flags
= acpi_id
->driver_data
;
715 for (i
= 0; i
< gpio
->nr_ports
; i
++) {
716 err
= dwapb_gpio_add_port(gpio
, &pdata
->properties
[i
], i
);
720 platform_set_drvdata(pdev
, gpio
);
725 dwapb_gpio_unregister(gpio
);
726 dwapb_irq_teardown(gpio
);
727 clk_disable_unprepare(gpio
->clk
);
732 static int dwapb_gpio_remove(struct platform_device
*pdev
)
734 struct dwapb_gpio
*gpio
= platform_get_drvdata(pdev
);
736 dwapb_gpio_unregister(gpio
);
737 dwapb_irq_teardown(gpio
);
738 reset_control_assert(gpio
->rst
);
739 clk_disable_unprepare(gpio
->clk
);
744 #ifdef CONFIG_PM_SLEEP
745 static int dwapb_gpio_suspend(struct device
*dev
)
747 struct dwapb_gpio
*gpio
= dev_get_drvdata(dev
);
748 struct gpio_chip
*gc
= &gpio
->ports
[0].gc
;
752 spin_lock_irqsave(&gc
->bgpio_lock
, flags
);
753 for (i
= 0; i
< gpio
->nr_ports
; i
++) {
755 unsigned int idx
= gpio
->ports
[i
].idx
;
756 struct dwapb_context
*ctx
= gpio
->ports
[i
].ctx
;
760 offset
= GPIO_SWPORTA_DDR
+ idx
* GPIO_SWPORT_DDR_STRIDE
;
761 ctx
->dir
= dwapb_read(gpio
, offset
);
763 offset
= GPIO_SWPORTA_DR
+ idx
* GPIO_SWPORT_DR_STRIDE
;
764 ctx
->data
= dwapb_read(gpio
, offset
);
766 offset
= GPIO_EXT_PORTA
+ idx
* GPIO_EXT_PORT_STRIDE
;
767 ctx
->ext
= dwapb_read(gpio
, offset
);
769 /* Only port A can provide interrupts */
771 ctx
->int_mask
= dwapb_read(gpio
, GPIO_INTMASK
);
772 ctx
->int_en
= dwapb_read(gpio
, GPIO_INTEN
);
773 ctx
->int_pol
= dwapb_read(gpio
, GPIO_INT_POLARITY
);
774 ctx
->int_type
= dwapb_read(gpio
, GPIO_INTTYPE_LEVEL
);
775 ctx
->int_deb
= dwapb_read(gpio
, GPIO_PORTA_DEBOUNCE
);
777 /* Mask out interrupts */
778 dwapb_write(gpio
, GPIO_INTMASK
,
779 0xffffffff & ~ctx
->wake_en
);
782 spin_unlock_irqrestore(&gc
->bgpio_lock
, flags
);
784 clk_disable_unprepare(gpio
->clk
);
789 static int dwapb_gpio_resume(struct device
*dev
)
791 struct dwapb_gpio
*gpio
= dev_get_drvdata(dev
);
792 struct gpio_chip
*gc
= &gpio
->ports
[0].gc
;
796 if (!IS_ERR(gpio
->clk
))
797 clk_prepare_enable(gpio
->clk
);
799 spin_lock_irqsave(&gc
->bgpio_lock
, flags
);
800 for (i
= 0; i
< gpio
->nr_ports
; i
++) {
802 unsigned int idx
= gpio
->ports
[i
].idx
;
803 struct dwapb_context
*ctx
= gpio
->ports
[i
].ctx
;
807 offset
= GPIO_SWPORTA_DR
+ idx
* GPIO_SWPORT_DR_STRIDE
;
808 dwapb_write(gpio
, offset
, ctx
->data
);
810 offset
= GPIO_SWPORTA_DDR
+ idx
* GPIO_SWPORT_DDR_STRIDE
;
811 dwapb_write(gpio
, offset
, ctx
->dir
);
813 offset
= GPIO_EXT_PORTA
+ idx
* GPIO_EXT_PORT_STRIDE
;
814 dwapb_write(gpio
, offset
, ctx
->ext
);
816 /* Only port A can provide interrupts */
818 dwapb_write(gpio
, GPIO_INTTYPE_LEVEL
, ctx
->int_type
);
819 dwapb_write(gpio
, GPIO_INT_POLARITY
, ctx
->int_pol
);
820 dwapb_write(gpio
, GPIO_PORTA_DEBOUNCE
, ctx
->int_deb
);
821 dwapb_write(gpio
, GPIO_INTEN
, ctx
->int_en
);
822 dwapb_write(gpio
, GPIO_INTMASK
, ctx
->int_mask
);
824 /* Clear out spurious interrupts */
825 dwapb_write(gpio
, GPIO_PORTA_EOI
, 0xffffffff);
828 spin_unlock_irqrestore(&gc
->bgpio_lock
, flags
);
834 static SIMPLE_DEV_PM_OPS(dwapb_gpio_pm_ops
, dwapb_gpio_suspend
,
837 static struct platform_driver dwapb_gpio_driver
= {
839 .name
= "gpio-dwapb",
840 .pm
= &dwapb_gpio_pm_ops
,
841 .of_match_table
= of_match_ptr(dwapb_of_match
),
842 .acpi_match_table
= ACPI_PTR(dwapb_acpi_match
),
844 .probe
= dwapb_gpio_probe
,
845 .remove
= dwapb_gpio_remove
,
848 module_platform_driver(dwapb_gpio_driver
);
850 MODULE_LICENSE("GPL");
851 MODULE_AUTHOR("Jamie Iles");
852 MODULE_DESCRIPTION("Synopsys DesignWare APB GPIO driver");