2 * Copyright (C) 2015 Broadcom Corporation
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation version 2.
8 * This program is distributed "as is" WITHOUT ANY WARRANTY of any
9 * kind, whether express or implied; without even the implied warranty
10 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
14 #include <linux/bitops.h>
15 #include <linux/gpio/driver.h>
16 #include <linux/of_device.h>
17 #include <linux/of_irq.h>
18 #include <linux/module.h>
19 #include <linux/irqdomain.h>
20 #include <linux/irqchip/chained_irq.h>
21 #include <linux/interrupt.h>
22 #include <linux/reboot.h>
24 #define GIO_BANK_SIZE 0x20
25 #define GIO_ODEN(bank) (((bank) * GIO_BANK_SIZE) + 0x00)
26 #define GIO_DATA(bank) (((bank) * GIO_BANK_SIZE) + 0x04)
27 #define GIO_IODIR(bank) (((bank) * GIO_BANK_SIZE) + 0x08)
28 #define GIO_EC(bank) (((bank) * GIO_BANK_SIZE) + 0x0c)
29 #define GIO_EI(bank) (((bank) * GIO_BANK_SIZE) + 0x10)
30 #define GIO_MASK(bank) (((bank) * GIO_BANK_SIZE) + 0x14)
31 #define GIO_LEVEL(bank) (((bank) * GIO_BANK_SIZE) + 0x18)
32 #define GIO_STAT(bank) (((bank) * GIO_BANK_SIZE) + 0x1c)
34 struct brcmstb_gpio_bank
{
35 struct list_head node
;
38 struct brcmstb_gpio_priv
*parent_priv
;
40 struct irq_chip irq_chip
;
43 struct brcmstb_gpio_priv
{
44 struct list_head bank_list
;
45 void __iomem
*reg_base
;
46 struct platform_device
*pdev
;
51 struct notifier_block reboot_notifier
;
54 #define MAX_GPIO_PER_BANK 32
55 #define GPIO_BANK(gpio) ((gpio) >> 5)
56 /* assumes MAX_GPIO_PER_BANK is a multiple of 2 */
57 #define GPIO_BIT(gpio) ((gpio) & (MAX_GPIO_PER_BANK - 1))
59 static inline struct brcmstb_gpio_priv
*
60 brcmstb_gpio_gc_to_priv(struct gpio_chip
*gc
)
62 struct brcmstb_gpio_bank
*bank
= gpiochip_get_data(gc
);
63 return bank
->parent_priv
;
66 static void brcmstb_gpio_set_imask(struct brcmstb_gpio_bank
*bank
,
67 unsigned int offset
, bool enable
)
69 struct gpio_chip
*gc
= &bank
->gc
;
70 struct brcmstb_gpio_priv
*priv
= bank
->parent_priv
;
71 u32 mask
= gc
->pin2mask(gc
, offset
);
75 spin_lock_irqsave(&gc
->bgpio_lock
, flags
);
76 imask
= gc
->read_reg(priv
->reg_base
+ GIO_MASK(bank
->id
));
81 gc
->write_reg(priv
->reg_base
+ GIO_MASK(bank
->id
), imask
);
82 spin_unlock_irqrestore(&gc
->bgpio_lock
, flags
);
85 /* -------------------- IRQ chip functions -------------------- */
87 static void brcmstb_gpio_irq_mask(struct irq_data
*d
)
89 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(d
);
90 struct brcmstb_gpio_bank
*bank
= gpiochip_get_data(gc
);
92 brcmstb_gpio_set_imask(bank
, d
->hwirq
, false);
95 static void brcmstb_gpio_irq_unmask(struct irq_data
*d
)
97 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(d
);
98 struct brcmstb_gpio_bank
*bank
= gpiochip_get_data(gc
);
100 brcmstb_gpio_set_imask(bank
, d
->hwirq
, true);
103 static int brcmstb_gpio_irq_set_type(struct irq_data
*d
, unsigned int type
)
105 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(d
);
106 struct brcmstb_gpio_bank
*bank
= gpiochip_get_data(gc
);
107 struct brcmstb_gpio_priv
*priv
= bank
->parent_priv
;
108 u32 mask
= BIT(d
->hwirq
);
109 u32 edge_insensitive
, iedge_insensitive
;
110 u32 edge_config
, iedge_config
;
115 case IRQ_TYPE_LEVEL_LOW
:
118 edge_insensitive
= 0;
120 case IRQ_TYPE_LEVEL_HIGH
:
123 edge_insensitive
= 0;
125 case IRQ_TYPE_EDGE_FALLING
:
128 edge_insensitive
= 0;
130 case IRQ_TYPE_EDGE_RISING
:
133 edge_insensitive
= 0;
135 case IRQ_TYPE_EDGE_BOTH
:
137 edge_config
= 0; /* don't care, but want known value */
138 edge_insensitive
= mask
;
144 spin_lock_irqsave(&bank
->gc
.bgpio_lock
, flags
);
146 iedge_config
= bank
->gc
.read_reg(priv
->reg_base
+
147 GIO_EC(bank
->id
)) & ~mask
;
148 iedge_insensitive
= bank
->gc
.read_reg(priv
->reg_base
+
149 GIO_EI(bank
->id
)) & ~mask
;
150 ilevel
= bank
->gc
.read_reg(priv
->reg_base
+
151 GIO_LEVEL(bank
->id
)) & ~mask
;
153 bank
->gc
.write_reg(priv
->reg_base
+ GIO_EC(bank
->id
),
154 iedge_config
| edge_config
);
155 bank
->gc
.write_reg(priv
->reg_base
+ GIO_EI(bank
->id
),
156 iedge_insensitive
| edge_insensitive
);
157 bank
->gc
.write_reg(priv
->reg_base
+ GIO_LEVEL(bank
->id
),
160 spin_unlock_irqrestore(&bank
->gc
.bgpio_lock
, flags
);
164 static int brcmstb_gpio_priv_set_wake(struct brcmstb_gpio_priv
*priv
,
170 * Only enable wake IRQ once for however many hwirqs can wake
171 * since they all use the same wake IRQ. Mask will be set
172 * up appropriately thanks to IRQCHIP_MASK_ON_SUSPEND flag.
175 ret
= enable_irq_wake(priv
->parent_wake_irq
);
177 ret
= disable_irq_wake(priv
->parent_wake_irq
);
179 dev_err(&priv
->pdev
->dev
, "failed to %s wake-up interrupt\n",
180 enable
? "enable" : "disable");
184 static int brcmstb_gpio_irq_set_wake(struct irq_data
*d
, unsigned int enable
)
186 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(d
);
187 struct brcmstb_gpio_priv
*priv
= brcmstb_gpio_gc_to_priv(gc
);
189 return brcmstb_gpio_priv_set_wake(priv
, enable
);
192 static irqreturn_t
brcmstb_gpio_wake_irq_handler(int irq
, void *data
)
194 struct brcmstb_gpio_priv
*priv
= data
;
196 if (!priv
|| irq
!= priv
->parent_wake_irq
)
198 pm_wakeup_event(&priv
->pdev
->dev
, 0);
202 static void brcmstb_gpio_irq_bank_handler(struct brcmstb_gpio_bank
*bank
)
204 struct brcmstb_gpio_priv
*priv
= bank
->parent_priv
;
205 struct irq_domain
*irq_domain
= bank
->gc
.irqdomain
;
206 void __iomem
*reg_base
= priv
->reg_base
;
207 unsigned long status
;
210 spin_lock_irqsave(&bank
->gc
.bgpio_lock
, flags
);
211 while ((status
= bank
->gc
.read_reg(reg_base
+ GIO_STAT(bank
->id
)) &
212 bank
->gc
.read_reg(reg_base
+ GIO_MASK(bank
->id
)))) {
215 for_each_set_bit(bit
, &status
, 32) {
216 u32 stat
= bank
->gc
.read_reg(reg_base
+
218 if (bit
>= bank
->width
)
219 dev_warn(&priv
->pdev
->dev
,
220 "IRQ for invalid GPIO (bank=%d, offset=%d)\n",
222 bank
->gc
.write_reg(reg_base
+ GIO_STAT(bank
->id
),
224 generic_handle_irq(irq_find_mapping(irq_domain
, bit
));
227 spin_unlock_irqrestore(&bank
->gc
.bgpio_lock
, flags
);
230 /* Each UPG GIO block has one IRQ for all banks */
231 static void brcmstb_gpio_irq_handler(struct irq_desc
*desc
)
233 struct gpio_chip
*gc
= irq_desc_get_handler_data(desc
);
234 struct brcmstb_gpio_priv
*priv
= brcmstb_gpio_gc_to_priv(gc
);
235 struct irq_chip
*chip
= irq_desc_get_chip(desc
);
236 struct brcmstb_gpio_bank
*bank
;
238 /* Interrupts weren't properly cleared during probe */
239 BUG_ON(!priv
|| !chip
);
241 chained_irq_enter(chip
, desc
);
242 list_for_each_entry(bank
, &priv
->bank_list
, node
)
243 brcmstb_gpio_irq_bank_handler(bank
);
244 chained_irq_exit(chip
, desc
);
247 static int brcmstb_gpio_reboot(struct notifier_block
*nb
,
248 unsigned long action
, void *data
)
250 struct brcmstb_gpio_priv
*priv
=
251 container_of(nb
, struct brcmstb_gpio_priv
, reboot_notifier
);
253 /* Enable GPIO for S5 cold boot */
254 if (action
== SYS_POWER_OFF
)
255 brcmstb_gpio_priv_set_wake(priv
, 1);
260 /* Make sure that the number of banks matches up between properties */
261 static int brcmstb_gpio_sanity_check_banks(struct device
*dev
,
262 struct device_node
*np
, struct resource
*res
)
264 int res_num_banks
= resource_size(res
) / GIO_BANK_SIZE
;
266 of_property_count_u32_elems(np
, "brcm,gpio-bank-widths");
268 if (res_num_banks
!= num_banks
) {
269 dev_err(dev
, "Mismatch in banks: res had %d, bank-widths had %d\n",
270 res_num_banks
, num_banks
);
277 static int brcmstb_gpio_remove(struct platform_device
*pdev
)
279 struct brcmstb_gpio_priv
*priv
= platform_get_drvdata(pdev
);
280 struct brcmstb_gpio_bank
*bank
;
284 dev_err(&pdev
->dev
, "called %s without drvdata!\n", __func__
);
289 * You can lose return values below, but we report all errors, and it's
290 * more important to actually perform all of the steps.
292 list_for_each_entry(bank
, &priv
->bank_list
, node
)
293 gpiochip_remove(&bank
->gc
);
295 if (priv
->reboot_notifier
.notifier_call
) {
296 ret
= unregister_reboot_notifier(&priv
->reboot_notifier
);
299 "failed to unregister reboot notifier\n");
304 static int brcmstb_gpio_of_xlate(struct gpio_chip
*gc
,
305 const struct of_phandle_args
*gpiospec
, u32
*flags
)
307 struct brcmstb_gpio_priv
*priv
= brcmstb_gpio_gc_to_priv(gc
);
308 struct brcmstb_gpio_bank
*bank
= gpiochip_get_data(gc
);
311 if (gc
->of_gpio_n_cells
!= 2) {
316 if (WARN_ON(gpiospec
->args_count
< gc
->of_gpio_n_cells
))
319 offset
= gpiospec
->args
[0] - (gc
->base
- priv
->gpio_base
);
320 if (offset
>= gc
->ngpio
|| offset
< 0)
323 if (unlikely(offset
>= bank
->width
)) {
324 dev_warn_ratelimited(&priv
->pdev
->dev
,
325 "Received request for invalid GPIO offset %d\n",
330 *flags
= gpiospec
->args
[1];
335 /* Before calling, must have bank->parent_irq set and gpiochip registered */
336 static int brcmstb_gpio_irq_setup(struct platform_device
*pdev
,
337 struct brcmstb_gpio_bank
*bank
)
339 struct brcmstb_gpio_priv
*priv
= bank
->parent_priv
;
340 struct device
*dev
= &pdev
->dev
;
341 struct device_node
*np
= dev
->of_node
;
343 bank
->irq_chip
.name
= dev_name(dev
);
344 bank
->irq_chip
.irq_mask
= brcmstb_gpio_irq_mask
;
345 bank
->irq_chip
.irq_unmask
= brcmstb_gpio_irq_unmask
;
346 bank
->irq_chip
.irq_set_type
= brcmstb_gpio_irq_set_type
;
348 /* Ensures that all non-wakeup IRQs are disabled at suspend */
349 bank
->irq_chip
.flags
= IRQCHIP_MASK_ON_SUSPEND
;
351 if (IS_ENABLED(CONFIG_PM_SLEEP
) && !priv
->can_wake
&&
352 of_property_read_bool(np
, "wakeup-source")) {
353 priv
->parent_wake_irq
= platform_get_irq(pdev
, 1);
354 if (priv
->parent_wake_irq
< 0) {
356 "Couldn't get wake IRQ - GPIOs will not be able to wake from sleep");
361 * Set wakeup capability before requesting wakeup
362 * interrupt, so we can process boot-time "wakeups"
363 * (e.g., from S5 cold boot)
365 device_set_wakeup_capable(dev
, true);
366 device_wakeup_enable(dev
);
367 err
= devm_request_irq(dev
, priv
->parent_wake_irq
,
368 brcmstb_gpio_wake_irq_handler
, 0,
369 "brcmstb-gpio-wake", priv
);
372 dev_err(dev
, "Couldn't request wake IRQ");
376 priv
->reboot_notifier
.notifier_call
=
378 register_reboot_notifier(&priv
->reboot_notifier
);
379 priv
->can_wake
= true;
384 bank
->irq_chip
.irq_set_wake
= brcmstb_gpio_irq_set_wake
;
386 gpiochip_irqchip_add(&bank
->gc
, &bank
->irq_chip
, 0,
387 handle_simple_irq
, IRQ_TYPE_NONE
);
388 gpiochip_set_chained_irqchip(&bank
->gc
, &bank
->irq_chip
,
389 priv
->parent_irq
, brcmstb_gpio_irq_handler
);
394 static int brcmstb_gpio_probe(struct platform_device
*pdev
)
396 struct device
*dev
= &pdev
->dev
;
397 struct device_node
*np
= dev
->of_node
;
398 void __iomem
*reg_base
;
399 struct brcmstb_gpio_priv
*priv
;
400 struct resource
*res
;
401 struct property
*prop
;
406 static int gpio_base
;
407 unsigned long flags
= 0;
409 priv
= devm_kzalloc(dev
, sizeof(*priv
), GFP_KERNEL
);
412 platform_set_drvdata(pdev
, priv
);
413 INIT_LIST_HEAD(&priv
->bank_list
);
415 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
416 reg_base
= devm_ioremap_resource(dev
, res
);
417 if (IS_ERR(reg_base
))
418 return PTR_ERR(reg_base
);
420 priv
->gpio_base
= gpio_base
;
421 priv
->reg_base
= reg_base
;
424 if (of_property_read_bool(np
, "interrupt-controller")) {
425 priv
->parent_irq
= platform_get_irq(pdev
, 0);
426 if (priv
->parent_irq
<= 0) {
427 dev_err(dev
, "Couldn't get IRQ");
431 priv
->parent_irq
= -ENOENT
;
434 if (brcmstb_gpio_sanity_check_banks(dev
, np
, res
))
438 * MIPS endianness is configured by boot strap, which also reverses all
439 * bus endianness (i.e., big-endian CPU + big endian bus ==> native
442 * Other architectures (e.g., ARM) either do not support big endian, or
443 * else leave I/O in little endian mode.
445 #if defined(CONFIG_MIPS) && defined(__BIG_ENDIAN)
446 flags
= BGPIOF_BIG_ENDIAN_BYTE_ORDER
;
449 of_property_for_each_u32(np
, "brcm,gpio-bank-widths", prop
, p
,
451 struct brcmstb_gpio_bank
*bank
;
452 struct gpio_chip
*gc
;
454 bank
= devm_kzalloc(dev
, sizeof(*bank
), GFP_KERNEL
);
460 bank
->parent_priv
= priv
;
461 bank
->id
= num_banks
;
462 if (bank_width
<= 0 || bank_width
> MAX_GPIO_PER_BANK
) {
463 dev_err(dev
, "Invalid bank width %d\n", bank_width
);
467 bank
->width
= bank_width
;
471 * Regs are 4 bytes wide, have data reg, no set/clear regs,
472 * and direction bits have 0 = output and 1 = input
475 err
= bgpio_init(gc
, dev
, 4,
476 reg_base
+ GIO_DATA(bank
->id
),
478 reg_base
+ GIO_IODIR(bank
->id
), flags
);
480 dev_err(dev
, "bgpio_init() failed\n");
485 gc
->owner
= THIS_MODULE
;
486 gc
->label
= np
->full_name
;
487 gc
->base
= gpio_base
;
488 gc
->of_gpio_n_cells
= 2;
489 gc
->of_xlate
= brcmstb_gpio_of_xlate
;
490 /* not all ngpio lines are valid, will use bank width later */
491 gc
->ngpio
= MAX_GPIO_PER_BANK
;
494 * Mask all interrupts by default, since wakeup interrupts may
495 * be retained from S5 cold boot
497 gc
->write_reg(reg_base
+ GIO_MASK(bank
->id
), 0);
499 err
= gpiochip_add_data(gc
, bank
);
501 dev_err(dev
, "Could not add gpiochip for bank %d\n",
505 gpio_base
+= gc
->ngpio
;
507 if (priv
->parent_irq
> 0) {
508 err
= brcmstb_gpio_irq_setup(pdev
, bank
);
513 dev_dbg(dev
, "bank=%d, base=%d, ngpio=%d, width=%d\n", bank
->id
,
514 gc
->base
, gc
->ngpio
, bank
->width
);
516 /* Everything looks good, so add bank to list */
517 list_add(&bank
->node
, &priv
->bank_list
);
522 dev_info(dev
, "Registered %d banks (GPIO(s): %d-%d)\n",
523 num_banks
, priv
->gpio_base
, gpio_base
- 1);
528 (void) brcmstb_gpio_remove(pdev
);
532 static const struct of_device_id brcmstb_gpio_of_match
[] = {
533 { .compatible
= "brcm,brcmstb-gpio" },
537 MODULE_DEVICE_TABLE(of
, brcmstb_gpio_of_match
);
539 static struct platform_driver brcmstb_gpio_driver
= {
541 .name
= "brcmstb-gpio",
542 .of_match_table
= brcmstb_gpio_of_match
,
544 .probe
= brcmstb_gpio_probe
,
545 .remove
= brcmstb_gpio_remove
,
547 module_platform_driver(brcmstb_gpio_driver
);
549 MODULE_AUTHOR("Gregory Fong");
550 MODULE_DESCRIPTION("Driver for Broadcom BRCMSTB SoC UPG GPIO");
551 MODULE_LICENSE("GPL v2");