Message ID | 1598886558-16546-5-git-send-email-grzegorz.jaszczyk@linaro.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Add TI PRUSS Local Interrupt Controller IRQChip driver | expand |
On Mon, 31 Aug 2020 16:09:17 +0100, Grzegorz Jaszczyk <grzegorz.jaszczyk@linaro.org> wrote: > > From: David Lechner <david@lechnology.com> > > This implements the irq_get_irqchip_state and irq_set_irqchip_state > callbacks for the TI PRUSS INTC driver. The set callback can be used > by drivers to "kick" a PRU by injecting a PRU system event. > > Example: > irq_set_irqchip_state(irq, IRQCHIP_STATE_PENDING, true); > Please drop this "example", it brings nothing without the full context. This patch just implements a standard callback. Thanks, M.
On Sat, 12 Sep 2020 at 11:49, Marc Zyngier <maz@kernel.org> wrote: > > On Mon, 31 Aug 2020 16:09:17 +0100, > Grzegorz Jaszczyk <grzegorz.jaszczyk@linaro.org> wrote: > > > > From: David Lechner <david@lechnology.com> > > > > This implements the irq_get_irqchip_state and irq_set_irqchip_state > > callbacks for the TI PRUSS INTC driver. The set callback can be used > > by drivers to "kick" a PRU by injecting a PRU system event. > > > > Example: > > irq_set_irqchip_state(irq, IRQCHIP_STATE_PENDING, true); > > > > Please drop this "example", it brings nothing without the full > context. This patch just implements a standard callback. > Ok. Thank you for your review, Grzegorz
diff --git a/drivers/irqchip/irq-pruss-intc.c b/drivers/irqchip/irq-pruss-intc.c index 1a72591..15f0407 100644 --- a/drivers/irqchip/irq-pruss-intc.c +++ b/drivers/irqchip/irq-pruss-intc.c @@ -9,6 +9,7 @@ * Copyright (C) 2019 David Lechner <david@lechnology.com> */ +#include <linux/interrupt.h> #include <linux/irq.h> #include <linux/irqchip/chained_irq.h> #include <linux/irqdomain.h> @@ -319,6 +320,43 @@ static void pruss_intc_irq_relres(struct irq_data *data) module_put(THIS_MODULE); } +static int pruss_intc_irq_get_irqchip_state(struct irq_data *data, + enum irqchip_irq_state which, + bool *state) +{ + struct pruss_intc *intc = irq_data_get_irq_chip_data(data); + u32 reg, mask, srsr; + + if (which != IRQCHIP_STATE_PENDING) + return -EINVAL; + + reg = PRU_INTC_SRSR(data->hwirq / 32); + mask = BIT(data->hwirq % 32); + + srsr = pruss_intc_read_reg(intc, reg); + + *state = !!(srsr & mask); + + return 0; +} + +static int pruss_intc_irq_set_irqchip_state(struct irq_data *data, + enum irqchip_irq_state which, + bool state) +{ + struct pruss_intc *intc = irq_data_get_irq_chip_data(data); + + if (which != IRQCHIP_STATE_PENDING) + return -EINVAL; + + if (state) + pruss_intc_write_reg(intc, PRU_INTC_SISR, data->hwirq); + else + pruss_intc_write_reg(intc, PRU_INTC_SICR, data->hwirq); + + return 0; +} + static struct irq_chip pruss_irqchip = { .name = "pruss-intc", .irq_ack = pruss_intc_irq_ack, @@ -326,6 +364,8 @@ static struct irq_chip pruss_irqchip = { .irq_unmask = pruss_intc_irq_unmask, .irq_request_resources = pruss_intc_irq_reqres, .irq_release_resources = pruss_intc_irq_relres, + .irq_get_irqchip_state = pruss_intc_irq_get_irqchip_state, + .irq_set_irqchip_state = pruss_intc_irq_set_irqchip_state, }; static int pruss_intc_validate_mapping(struct pruss_intc *intc, int event,