mirror of
https://github.com/torvalds/linux.git
synced 2024-12-17 00:21:32 +00:00
gliolib: set hooks in gpiochip_set_irq_hooks()
Centralize setting the irq_request/release_resources callbacks in one function since we'll be adding more callbacks to that. Also fix the removal of the callback overrides: this should only be done if we actually installed our own callback there. Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
This commit is contained in:
parent
4e6b823867
commit
ca620f2de1
@ -1826,6 +1826,17 @@ static void gpiochip_irq_relres(struct irq_data *d)
|
|||||||
gpiochip_relres_irq(chip, d->hwirq);
|
gpiochip_relres_irq(chip, d->hwirq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void gpiochip_set_irq_hooks(struct gpio_chip *gpiochip)
|
||||||
|
{
|
||||||
|
struct irq_chip *irqchip = gpiochip->irq.chip;
|
||||||
|
|
||||||
|
if (!irqchip->irq_request_resources &&
|
||||||
|
!irqchip->irq_release_resources) {
|
||||||
|
irqchip->irq_request_resources = gpiochip_irq_reqres;
|
||||||
|
irqchip->irq_release_resources = gpiochip_irq_relres;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gpiochip_add_irqchip() - adds an IRQ chip to a GPIO chip
|
* gpiochip_add_irqchip() - adds an IRQ chip to a GPIO chip
|
||||||
* @gpiochip: the GPIO chip to add the IRQ chip to
|
* @gpiochip: the GPIO chip to add the IRQ chip to
|
||||||
@ -1884,16 +1895,6 @@ static int gpiochip_add_irqchip(struct gpio_chip *gpiochip,
|
|||||||
if (!gpiochip->irq.domain)
|
if (!gpiochip->irq.domain)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
/*
|
|
||||||
* It is possible for a driver to override this, but only if the
|
|
||||||
* alternative functions are both implemented.
|
|
||||||
*/
|
|
||||||
if (!irqchip->irq_request_resources &&
|
|
||||||
!irqchip->irq_release_resources) {
|
|
||||||
irqchip->irq_request_resources = gpiochip_irq_reqres;
|
|
||||||
irqchip->irq_release_resources = gpiochip_irq_relres;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gpiochip->irq.parent_handler) {
|
if (gpiochip->irq.parent_handler) {
|
||||||
void *data = gpiochip->irq.parent_handler_data ?: gpiochip;
|
void *data = gpiochip->irq.parent_handler_data ?: gpiochip;
|
||||||
|
|
||||||
@ -1909,6 +1910,8 @@ static int gpiochip_add_irqchip(struct gpio_chip *gpiochip,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gpiochip_set_irq_hooks(gpiochip);
|
||||||
|
|
||||||
acpi_gpiochip_request_interrupts(gpiochip);
|
acpi_gpiochip_request_interrupts(gpiochip);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -1922,11 +1925,12 @@ static int gpiochip_add_irqchip(struct gpio_chip *gpiochip,
|
|||||||
*/
|
*/
|
||||||
static void gpiochip_irqchip_remove(struct gpio_chip *gpiochip)
|
static void gpiochip_irqchip_remove(struct gpio_chip *gpiochip)
|
||||||
{
|
{
|
||||||
|
struct irq_chip *irqchip = gpiochip->irq.chip;
|
||||||
unsigned int offset;
|
unsigned int offset;
|
||||||
|
|
||||||
acpi_gpiochip_free_interrupts(gpiochip);
|
acpi_gpiochip_free_interrupts(gpiochip);
|
||||||
|
|
||||||
if (gpiochip->irq.chip && gpiochip->irq.parent_handler) {
|
if (irqchip && gpiochip->irq.parent_handler) {
|
||||||
struct gpio_irq_chip *irq = &gpiochip->irq;
|
struct gpio_irq_chip *irq = &gpiochip->irq;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
@ -1950,11 +1954,12 @@ static void gpiochip_irqchip_remove(struct gpio_chip *gpiochip)
|
|||||||
irq_domain_remove(gpiochip->irq.domain);
|
irq_domain_remove(gpiochip->irq.domain);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gpiochip->irq.chip) {
|
if (irqchip &&
|
||||||
gpiochip->irq.chip->irq_request_resources = NULL;
|
irqchip->irq_request_resources == gpiochip_irq_reqres) {
|
||||||
gpiochip->irq.chip->irq_release_resources = NULL;
|
irqchip->irq_request_resources = NULL;
|
||||||
gpiochip->irq.chip = NULL;
|
irqchip->irq_release_resources = NULL;
|
||||||
}
|
}
|
||||||
|
gpiochip->irq.chip = NULL;
|
||||||
|
|
||||||
gpiochip_irqchip_free_valid_mask(gpiochip);
|
gpiochip_irqchip_free_valid_mask(gpiochip);
|
||||||
}
|
}
|
||||||
@ -2043,15 +2048,7 @@ int gpiochip_irqchip_add_key(struct gpio_chip *gpiochip,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
gpiochip_set_irq_hooks(gpiochip);
|
||||||
* It is possible for a driver to override this, but only if the
|
|
||||||
* alternative functions are both implemented.
|
|
||||||
*/
|
|
||||||
if (!irqchip->irq_request_resources &&
|
|
||||||
!irqchip->irq_release_resources) {
|
|
||||||
irqchip->irq_request_resources = gpiochip_irq_reqres;
|
|
||||||
irqchip->irq_release_resources = gpiochip_irq_relres;
|
|
||||||
}
|
|
||||||
|
|
||||||
acpi_gpiochip_request_interrupts(gpiochip);
|
acpi_gpiochip_request_interrupts(gpiochip);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user