Lines Matching +full:gpio +full:- +full:bank
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Broadcom Kona GPIO Driver
5 * Author: Broadcom Corporation <bcm-kernel-feedback-[email protected]>
6 * Copyright (C) 2012-2014 Broadcom Corporation
11 #include <linux/gpio/driver.h>
24 #define GPIO_BANK(gpio) ((gpio) >> 5) argument
25 #define GPIO_BIT(gpio) ((gpio) & (GPIO_PER_BANK - 1)) argument
27 /* There is a GPIO control register for each GPIO */
28 #define GPIO_CONTROL(gpio) (0x00000100 + ((gpio) << 2)) argument
30 /* The remaining registers are per GPIO bank */
31 #define GPIO_OUT_STATUS(bank) (0x00000000 + ((bank) << 2)) argument
32 #define GPIO_IN_STATUS(bank) (0x00000020 + ((bank) << 2)) argument
33 #define GPIO_OUT_SET(bank) (0x00000040 + ((bank) << 2)) argument
34 #define GPIO_OUT_CLEAR(bank) (0x00000060 + ((bank) << 2)) argument
35 #define GPIO_INT_STATUS(bank) (0x00000080 + ((bank) << 2)) argument
36 #define GPIO_INT_MASK(bank) (0x000000a0 + ((bank) << 2)) argument
37 #define GPIO_INT_MSKCLR(bank) (0x000000c0 + ((bank) << 2)) argument
38 #define GPIO_PWD_STATUS(bank) (0x00000500 + ((bank) << 2)) argument
73 * Used to keep track of lock/unlock operations for each GPIO in the
74 * bank.
80 * The lock function only locks the GPIO once its unlock counter is
81 * down to 0. This is necessary because the GPIO is unlocked in two
83 * requested IRQs. Since it is possible for a GPIO to be requested
84 * as both a GPIO and an IRQ, we need to ensure that we don't lock it
100 unsigned gpio) in bcm_kona_gpio_lock_gpio() argument
104 int bank_id = GPIO_BANK(gpio); in bcm_kona_gpio_lock_gpio()
105 int bit = GPIO_BIT(gpio); in bcm_kona_gpio_lock_gpio()
106 struct bcm_kona_gpio_bank *bank = &kona_gpio->banks[bank_id]; in bcm_kona_gpio_lock_gpio() local
108 if (bank->gpio_unlock_count[bit] == 0) { in bcm_kona_gpio_lock_gpio()
109 dev_err(kona_gpio->gpio_chip.parent, in bcm_kona_gpio_lock_gpio()
110 "Unbalanced locks for GPIO %u\n", gpio); in bcm_kona_gpio_lock_gpio()
114 if (--bank->gpio_unlock_count[bit] == 0) { in bcm_kona_gpio_lock_gpio()
115 raw_spin_lock_irqsave(&kona_gpio->lock, flags); in bcm_kona_gpio_lock_gpio()
117 val = readl(kona_gpio->reg_base + GPIO_PWD_STATUS(bank_id)); in bcm_kona_gpio_lock_gpio()
119 bcm_kona_gpio_write_lock_regs(kona_gpio->reg_base, bank_id, val); in bcm_kona_gpio_lock_gpio()
121 raw_spin_unlock_irqrestore(&kona_gpio->lock, flags); in bcm_kona_gpio_lock_gpio()
126 unsigned gpio) in bcm_kona_gpio_unlock_gpio() argument
130 int bank_id = GPIO_BANK(gpio); in bcm_kona_gpio_unlock_gpio()
131 int bit = GPIO_BIT(gpio); in bcm_kona_gpio_unlock_gpio()
132 struct bcm_kona_gpio_bank *bank = &kona_gpio->banks[bank_id]; in bcm_kona_gpio_unlock_gpio() local
134 if (bank->gpio_unlock_count[bit] == 0) { in bcm_kona_gpio_unlock_gpio()
135 raw_spin_lock_irqsave(&kona_gpio->lock, flags); in bcm_kona_gpio_unlock_gpio()
137 val = readl(kona_gpio->reg_base + GPIO_PWD_STATUS(bank_id)); in bcm_kona_gpio_unlock_gpio()
139 bcm_kona_gpio_write_lock_regs(kona_gpio->reg_base, bank_id, val); in bcm_kona_gpio_unlock_gpio()
141 raw_spin_unlock_irqrestore(&kona_gpio->lock, flags); in bcm_kona_gpio_unlock_gpio()
144 ++bank->gpio_unlock_count[bit]; in bcm_kona_gpio_unlock_gpio()
147 static int bcm_kona_gpio_get_dir(struct gpio_chip *chip, unsigned gpio) in bcm_kona_gpio_get_dir() argument
150 void __iomem *reg_base = kona_gpio->reg_base; in bcm_kona_gpio_get_dir()
153 val = readl(reg_base + GPIO_CONTROL(gpio)) & GPIO_GPCTR0_IOTR_MASK; in bcm_kona_gpio_get_dir()
157 static void bcm_kona_gpio_set(struct gpio_chip *chip, unsigned gpio, int value) in bcm_kona_gpio_set() argument
161 int bank_id = GPIO_BANK(gpio); in bcm_kona_gpio_set()
162 int bit = GPIO_BIT(gpio); in bcm_kona_gpio_set()
167 reg_base = kona_gpio->reg_base; in bcm_kona_gpio_set()
168 raw_spin_lock_irqsave(&kona_gpio->lock, flags); in bcm_kona_gpio_set()
171 if (bcm_kona_gpio_get_dir(chip, gpio) == GPIO_LINE_DIRECTION_IN) in bcm_kona_gpio_set()
181 raw_spin_unlock_irqrestore(&kona_gpio->lock, flags); in bcm_kona_gpio_set()
184 static int bcm_kona_gpio_get(struct gpio_chip *chip, unsigned gpio) in bcm_kona_gpio_get() argument
188 int bank_id = GPIO_BANK(gpio); in bcm_kona_gpio_get()
189 int bit = GPIO_BIT(gpio); in bcm_kona_gpio_get()
194 reg_base = kona_gpio->reg_base; in bcm_kona_gpio_get()
195 raw_spin_lock_irqsave(&kona_gpio->lock, flags); in bcm_kona_gpio_get()
197 if (bcm_kona_gpio_get_dir(chip, gpio) == GPIO_LINE_DIRECTION_IN) in bcm_kona_gpio_get()
202 /* read the GPIO bank status */ in bcm_kona_gpio_get()
205 raw_spin_unlock_irqrestore(&kona_gpio->lock, flags); in bcm_kona_gpio_get()
211 static int bcm_kona_gpio_request(struct gpio_chip *chip, unsigned gpio) in bcm_kona_gpio_request() argument
215 bcm_kona_gpio_unlock_gpio(kona_gpio, gpio); in bcm_kona_gpio_request()
219 static void bcm_kona_gpio_free(struct gpio_chip *chip, unsigned gpio) in bcm_kona_gpio_free() argument
223 bcm_kona_gpio_lock_gpio(kona_gpio, gpio); in bcm_kona_gpio_free()
226 static int bcm_kona_gpio_direction_input(struct gpio_chip *chip, unsigned gpio) in bcm_kona_gpio_direction_input() argument
234 reg_base = kona_gpio->reg_base; in bcm_kona_gpio_direction_input()
235 raw_spin_lock_irqsave(&kona_gpio->lock, flags); in bcm_kona_gpio_direction_input()
237 val = readl(reg_base + GPIO_CONTROL(gpio)); in bcm_kona_gpio_direction_input()
240 writel(val, reg_base + GPIO_CONTROL(gpio)); in bcm_kona_gpio_direction_input()
242 raw_spin_unlock_irqrestore(&kona_gpio->lock, flags); in bcm_kona_gpio_direction_input()
248 unsigned gpio, int value) in bcm_kona_gpio_direction_output() argument
252 int bank_id = GPIO_BANK(gpio); in bcm_kona_gpio_direction_output()
253 int bit = GPIO_BIT(gpio); in bcm_kona_gpio_direction_output()
258 reg_base = kona_gpio->reg_base; in bcm_kona_gpio_direction_output()
259 raw_spin_lock_irqsave(&kona_gpio->lock, flags); in bcm_kona_gpio_direction_output()
261 val = readl(reg_base + GPIO_CONTROL(gpio)); in bcm_kona_gpio_direction_output()
264 writel(val, reg_base + GPIO_CONTROL(gpio)); in bcm_kona_gpio_direction_output()
271 raw_spin_unlock_irqrestore(&kona_gpio->lock, flags); in bcm_kona_gpio_direction_output()
276 static int bcm_kona_gpio_to_irq(struct gpio_chip *chip, unsigned gpio) in bcm_kona_gpio_to_irq() argument
281 if (gpio >= kona_gpio->gpio_chip.ngpio) in bcm_kona_gpio_to_irq()
282 return -ENXIO; in bcm_kona_gpio_to_irq()
283 return irq_create_mapping(kona_gpio->irq_domain, gpio); in bcm_kona_gpio_to_irq()
286 static int bcm_kona_gpio_set_debounce(struct gpio_chip *chip, unsigned gpio, in bcm_kona_gpio_set_debounce() argument
295 reg_base = kona_gpio->reg_base; in bcm_kona_gpio_set_debounce()
296 /* debounce must be 1-128ms (or 0) */ in bcm_kona_gpio_set_debounce()
298 dev_err(chip->parent, "Debounce value %u not in range\n", in bcm_kona_gpio_set_debounce()
300 return -EINVAL; in bcm_kona_gpio_set_debounce()
308 res = fls(debounce) - 1; in bcm_kona_gpio_set_debounce()
309 /* Check if MSB-1 is set (round up or down) */ in bcm_kona_gpio_set_debounce()
310 if (res > 0 && (debounce & BIT(res - 1))) in bcm_kona_gpio_set_debounce()
314 /* spin lock for read-modify-write of the GPIO register */ in bcm_kona_gpio_set_debounce()
315 raw_spin_lock_irqsave(&kona_gpio->lock, flags); in bcm_kona_gpio_set_debounce()
317 val = readl(reg_base + GPIO_CONTROL(gpio)); in bcm_kona_gpio_set_debounce()
328 writel(val, reg_base + GPIO_CONTROL(gpio)); in bcm_kona_gpio_set_debounce()
330 raw_spin_unlock_irqrestore(&kona_gpio->lock, flags); in bcm_kona_gpio_set_debounce()
335 static int bcm_kona_gpio_set_config(struct gpio_chip *chip, unsigned gpio, in bcm_kona_gpio_set_config() argument
341 return -ENOTSUPP; in bcm_kona_gpio_set_config()
344 return bcm_kona_gpio_set_debounce(chip, gpio, debounce); in bcm_kona_gpio_set_config()
348 .label = "bcm-kona-gpio",
366 unsigned gpio = d->hwirq; in bcm_kona_gpio_irq_ack() local
367 int bank_id = GPIO_BANK(gpio); in bcm_kona_gpio_irq_ack()
368 int bit = GPIO_BIT(gpio); in bcm_kona_gpio_irq_ack()
373 reg_base = kona_gpio->reg_base; in bcm_kona_gpio_irq_ack()
374 raw_spin_lock_irqsave(&kona_gpio->lock, flags); in bcm_kona_gpio_irq_ack()
380 raw_spin_unlock_irqrestore(&kona_gpio->lock, flags); in bcm_kona_gpio_irq_ack()
387 unsigned gpio = d->hwirq; in bcm_kona_gpio_irq_mask() local
388 int bank_id = GPIO_BANK(gpio); in bcm_kona_gpio_irq_mask()
389 int bit = GPIO_BIT(gpio); in bcm_kona_gpio_irq_mask()
394 reg_base = kona_gpio->reg_base; in bcm_kona_gpio_irq_mask()
396 raw_spin_lock_irqsave(&kona_gpio->lock, flags); in bcm_kona_gpio_irq_mask()
401 gpiochip_disable_irq(&kona_gpio->gpio_chip, gpio); in bcm_kona_gpio_irq_mask()
403 raw_spin_unlock_irqrestore(&kona_gpio->lock, flags); in bcm_kona_gpio_irq_mask()
410 unsigned gpio = d->hwirq; in bcm_kona_gpio_irq_unmask() local
411 int bank_id = GPIO_BANK(gpio); in bcm_kona_gpio_irq_unmask()
412 int bit = GPIO_BIT(gpio); in bcm_kona_gpio_irq_unmask()
417 reg_base = kona_gpio->reg_base; in bcm_kona_gpio_irq_unmask()
419 raw_spin_lock_irqsave(&kona_gpio->lock, flags); in bcm_kona_gpio_irq_unmask()
424 gpiochip_enable_irq(&kona_gpio->gpio_chip, gpio); in bcm_kona_gpio_irq_unmask()
426 raw_spin_unlock_irqrestore(&kona_gpio->lock, flags); in bcm_kona_gpio_irq_unmask()
433 unsigned gpio = d->hwirq; in bcm_kona_gpio_irq_set_type() local
439 reg_base = kona_gpio->reg_base; in bcm_kona_gpio_irq_set_type()
455 /* BCM GPIO doesn't support level triggering */ in bcm_kona_gpio_irq_set_type()
457 dev_err(kona_gpio->gpio_chip.parent, in bcm_kona_gpio_irq_set_type()
458 "Invalid BCM GPIO irq type 0x%x\n", type); in bcm_kona_gpio_irq_set_type()
459 return -EINVAL; in bcm_kona_gpio_irq_set_type()
462 raw_spin_lock_irqsave(&kona_gpio->lock, flags); in bcm_kona_gpio_irq_set_type()
464 val = readl(reg_base + GPIO_CONTROL(gpio)); in bcm_kona_gpio_irq_set_type()
467 writel(val, reg_base + GPIO_CONTROL(gpio)); in bcm_kona_gpio_irq_set_type()
469 raw_spin_unlock_irqrestore(&kona_gpio->lock, flags); in bcm_kona_gpio_irq_set_type()
479 struct bcm_kona_gpio_bank *bank = irq_desc_get_handler_data(desc); in bcm_kona_gpio_irq_handler() local
485 * For bank interrupts, we can't use chip_data to store the kona_gpio in bcm_kona_gpio_irq_handler()
487 * our pointer from the bank structure. in bcm_kona_gpio_irq_handler()
489 reg_base = bank->kona_gpio->reg_base; in bcm_kona_gpio_irq_handler()
490 bank_id = bank->id; in bcm_kona_gpio_irq_handler()
503 generic_handle_domain_irq(bank->kona_gpio->irq_domain, in bcm_kona_gpio_irq_handler()
514 unsigned int gpio = d->hwirq; in bcm_kona_gpio_irq_reqres() local
517 * We need to unlock the GPIO before any other operations are performed in bcm_kona_gpio_irq_reqres()
518 * on the relevant GPIO configuration registers in bcm_kona_gpio_irq_reqres()
520 bcm_kona_gpio_unlock_gpio(kona_gpio, gpio); in bcm_kona_gpio_irq_reqres()
522 return gpiochip_reqres_irq(&kona_gpio->gpio_chip, gpio); in bcm_kona_gpio_irq_reqres()
528 unsigned int gpio = d->hwirq; in bcm_kona_gpio_irq_relres() local
530 /* Once we no longer use it, lock the GPIO again */ in bcm_kona_gpio_irq_relres()
531 bcm_kona_gpio_lock_gpio(kona_gpio, gpio); in bcm_kona_gpio_irq_relres()
533 gpiochip_relres_irq(&kona_gpio->gpio_chip, gpio); in bcm_kona_gpio_irq_relres()
537 .name = "bcm-kona-gpio",
547 { .compatible = "brcm,kona-gpio" },
552 * This lock class tells lockdep that GPIO irqs are in a different
563 ret = irq_set_chip_data(irq, d->host_data); in bcm_kona_gpio_irq_map()
590 reg_base = kona_gpio->reg_base; in bcm_kona_gpio_reset()
592 for (i = 0; i < kona_gpio->num_bank; i++) { in bcm_kona_gpio_reset()
593 /* Unlock the entire bank first */ in bcm_kona_gpio_reset()
597 /* Now re-lock the bank */ in bcm_kona_gpio_reset()
604 struct device *dev = &pdev->dev; in bcm_kona_gpio_probe()
605 struct bcm_kona_gpio_bank *bank; in bcm_kona_gpio_probe() local
613 return -ENOMEM; in bcm_kona_gpio_probe()
615 kona_gpio->gpio_chip = template_chip; in bcm_kona_gpio_probe()
616 chip = &kona_gpio->gpio_chip; in bcm_kona_gpio_probe()
619 dev_err(dev, "Couldn't determine # GPIO banks\n"); in bcm_kona_gpio_probe()
620 return -ENOENT; in bcm_kona_gpio_probe()
622 return dev_err_probe(dev, ret, "Couldn't determine GPIO banks\n"); in bcm_kona_gpio_probe()
624 kona_gpio->num_bank = ret; in bcm_kona_gpio_probe()
626 if (kona_gpio->num_bank > GPIO_MAX_BANK_NUM) { in bcm_kona_gpio_probe()
627 dev_err(dev, "Too many GPIO banks configured (max=%d)\n", in bcm_kona_gpio_probe()
629 return -ENXIO; in bcm_kona_gpio_probe()
631 kona_gpio->banks = devm_kcalloc(dev, in bcm_kona_gpio_probe()
632 kona_gpio->num_bank, in bcm_kona_gpio_probe()
633 sizeof(*kona_gpio->banks), in bcm_kona_gpio_probe()
635 if (!kona_gpio->banks) in bcm_kona_gpio_probe()
636 return -ENOMEM; in bcm_kona_gpio_probe()
638 chip->parent = dev; in bcm_kona_gpio_probe()
639 chip->ngpio = kona_gpio->num_bank * GPIO_PER_BANK; in bcm_kona_gpio_probe()
641 kona_gpio->irq_domain = irq_domain_create_linear(dev_fwnode(dev), in bcm_kona_gpio_probe()
642 chip->ngpio, in bcm_kona_gpio_probe()
645 if (!kona_gpio->irq_domain) { in bcm_kona_gpio_probe()
647 return -ENXIO; in bcm_kona_gpio_probe()
650 kona_gpio->reg_base = devm_platform_ioremap_resource(pdev, 0); in bcm_kona_gpio_probe()
651 if (IS_ERR(kona_gpio->reg_base)) { in bcm_kona_gpio_probe()
652 ret = PTR_ERR(kona_gpio->reg_base); in bcm_kona_gpio_probe()
656 for (i = 0; i < kona_gpio->num_bank; i++) { in bcm_kona_gpio_probe()
657 bank = &kona_gpio->banks[i]; in bcm_kona_gpio_probe()
658 bank->id = i; in bcm_kona_gpio_probe()
659 bank->irq = platform_get_irq(pdev, i); in bcm_kona_gpio_probe()
660 bank->kona_gpio = kona_gpio; in bcm_kona_gpio_probe()
661 if (bank->irq < 0) { in bcm_kona_gpio_probe()
662 dev_err(dev, "Couldn't get IRQ for bank %d\n", i); in bcm_kona_gpio_probe()
663 ret = -ENOENT; in bcm_kona_gpio_probe()
668 dev_info(&pdev->dev, "Setting up Kona GPIO\n"); in bcm_kona_gpio_probe()
674 dev_err(dev, "Couldn't add GPIO chip -- %d\n", ret); in bcm_kona_gpio_probe()
677 for (i = 0; i < kona_gpio->num_bank; i++) { in bcm_kona_gpio_probe()
678 bank = &kona_gpio->banks[i]; in bcm_kona_gpio_probe()
679 irq_set_chained_handler_and_data(bank->irq, in bcm_kona_gpio_probe()
681 bank); in bcm_kona_gpio_probe()
684 raw_spin_lock_init(&kona_gpio->lock); in bcm_kona_gpio_probe()
689 irq_domain_remove(kona_gpio->irq_domain); in bcm_kona_gpio_probe()
696 .name = "bcm-kona-gpio",