* [PATCH v3 0/2] Add support for AST2700 INTC driver @ 2024-10-09 11:58 Kevin Chen 2024-10-09 11:58 ` [PATCH v3 1/2] dt-bindings: interrupt-controller: Add support for ASPEED AST27XX INTC Kevin Chen 2024-10-09 11:58 ` [PATCH v3 2/2] irqchip/aspeed-intc: Add support for " Kevin Chen 0 siblings, 2 replies; 18+ messages in thread From: Kevin Chen @ 2024-10-09 11:58 UTC (permalink / raw) To: tglx, robh, krzk+dt, conor+dt, joel, andrew, kevin_chen, linux-kernel, devicetree, linux-arm-kernel, linux-aspeed --- v3: aspeed,ast2700-intc.yaml: - Change reg with maxIntems:10 only. - Change interrupt with maxIntems:10 only. - Add description of INT0 and INTC1. - Fix the indentation. drivers/irqchip/irq-aspeed-intc.c: - Change to use CONFIG_ARCH_ASPEED. - Fix indentation. - Remove irq_domain name assignment. - Check all irq numbers first, and set chained. Kevin Chen (2): dt-bindings: interrupt-controller: Add support for ASPEED AST27XX INTC irqchip/aspeed-intc: Add support for AST27XX INTC .../aspeed,ast2700-intc.yaml | 87 +++++++++++ drivers/irqchip/Makefile | 1 + drivers/irqchip/irq-aspeed-intc.c | 139 ++++++++++++++++++ 3 files changed, 227 insertions(+) create mode 100644 Documentation/devicetree/bindings/interrupt-controller/aspeed,ast2700-intc.yaml create mode 100644 drivers/irqchip/irq-aspeed-intc.c -- 2.34.1 ^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v3 1/2] dt-bindings: interrupt-controller: Add support for ASPEED AST27XX INTC 2024-10-09 11:58 [PATCH v3 0/2] Add support for AST2700 INTC driver Kevin Chen @ 2024-10-09 11:58 ` Kevin Chen 2024-10-09 12:56 ` Markus Elfring 2024-10-09 21:11 ` Rob Herring 2024-10-09 11:58 ` [PATCH v3 2/2] irqchip/aspeed-intc: Add support for " Kevin Chen 1 sibling, 2 replies; 18+ messages in thread From: Kevin Chen @ 2024-10-09 11:58 UTC (permalink / raw) To: tglx, robh, krzk+dt, conor+dt, joel, andrew, kevin_chen, linux-kernel, devicetree, linux-arm-kernel, linux-aspeed The ASPEED AST27XX interrupt controller(INTC) contain second level and third level interrupt controller. INTC0: The second level INTC, which used to assert GIC(#192~#197) if interrupt in INTC1 asserted. There are 6 GIC interrupt number(#192~#197) used in one INTC0. INTC1_x: The third level INTC, which used to assert GIC(#192~#197) if interrupt in INTC1 asserted. There are 6 GIC interrupt number(#192~#197) used in one INTC0. Signed-off-by: Kevin Chen <kevin_chen@aspeedtech.com> --- .../aspeed,ast2700-intc.yaml | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 Documentation/devicetree/bindings/interrupt-controller/aspeed,ast2700-intc.yaml diff --git a/Documentation/devicetree/bindings/interrupt-controller/aspeed,ast2700-intc.yaml b/Documentation/devicetree/bindings/interrupt-controller/aspeed,ast2700-intc.yaml new file mode 100644 index 000000000000..650a1f6e1177 --- /dev/null +++ b/Documentation/devicetree/bindings/interrupt-controller/aspeed,ast2700-intc.yaml @@ -0,0 +1,87 @@ +# SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/interrupt-controller/aspeed,ast2700-intc.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Aspeed AST2700 Interrupt Controller + +description: + This interrupt controller hardware is second level interrupt controller that + is hooked to a parent interrupt controller. It's useful to combine multiple + interrupt sources into 1 interrupt to parent interrupt controller. + +maintainers: + - Kevin Chen <kevin_chen@aspeedtech.com> + +properties: + compatible: + enum: + - aspeed,ast2700-intc-ic + + reg: + maxItems: 1 + + interrupt-controller: true + + '#interrupt-cells': + const: 2 + + interrupts: + maxItems: 10 + description: + Depend to which INTC0 or INTC1 used. + INTC0 and INTC1 are two kinds of interrupt controller with enable and raw + status registers for use. + INTC0 is used to assert GIC if interrupt in INTC1 asserted. + INTC1 is used to assert INTC0 if interrupt of modules asserted. + +-----+ +-------+ +---------+---module0 + | GIC |---| INTC0 |--+--| INTC1_0 |---module2 + | | | | | | |---... + +-----+ +-------+ | +---------+---module31 + | + | +---------+---module0 + +---| INTC1_1 |---module2 + | | |---... + | +---------+---module31 + ... + | +---------+---module0 + +---| INTC1_5 |---module2 + | |---... + +---------+---module31 + + +required: + - compatible + - reg + - interrupt-controller + - '#interrupt-cells' + - interrupts + +additionalProperties: false + +examples: + - | + #include <dt-bindings/interrupt-controller/arm-gic.h> + + bus { + #address-cells = <2>; + #size-cells = <2>; + + interrupt-controller@12101b00 { + compatible = "aspeed,ast2700-intc-ic"; + reg = <0 0x12101b00 0 0x10>; + #interrupt-cells = <2>; + interrupt-controller; + interrupts = <GIC_SPI 192 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 193 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 194 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 195 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 196 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 197 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 198 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 199 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 200 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 201 IRQ_TYPE_LEVEL_HIGH>; + }; + }; -- 2.34.1 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH v3 1/2] dt-bindings: interrupt-controller: Add support for ASPEED AST27XX INTC 2024-10-09 11:58 ` [PATCH v3 1/2] dt-bindings: interrupt-controller: Add support for ASPEED AST27XX INTC Kevin Chen @ 2024-10-09 12:56 ` Markus Elfring 2024-10-09 21:11 ` Rob Herring 1 sibling, 0 replies; 18+ messages in thread From: Markus Elfring @ 2024-10-09 12:56 UTC (permalink / raw) To: Kevin Chen, linux-aspeed, linux-arm-kernel, devicetree, Andrew Jeffery, Conor Dooley, Joel Stanley, Krzysztof Kozlowski, Rob Herring, Thomas Gleixner Cc: LKML > The ASPEED AST27XX interrupt controller(INTC) contain second level and … contains? … in INTC1 asserted. There are 6 GIC interrupt number(#192~#197) used in … numbers? Regards, Markus ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v3 1/2] dt-bindings: interrupt-controller: Add support for ASPEED AST27XX INTC 2024-10-09 11:58 ` [PATCH v3 1/2] dt-bindings: interrupt-controller: Add support for ASPEED AST27XX INTC Kevin Chen 2024-10-09 12:56 ` Markus Elfring @ 2024-10-09 21:11 ` Rob Herring 2024-10-11 10:02 ` Kevin Chen 1 sibling, 1 reply; 18+ messages in thread From: Rob Herring @ 2024-10-09 21:11 UTC (permalink / raw) To: Kevin Chen Cc: tglx, krzk+dt, conor+dt, joel, andrew, linux-kernel, devicetree, linux-arm-kernel, linux-aspeed On Wed, Oct 09, 2024 at 07:58:12PM +0800, Kevin Chen wrote: > The ASPEED AST27XX interrupt controller(INTC) contain second level and > third level interrupt controller. > > INTC0: > The second level INTC, which used to assert GIC(#192~#197) if interrupt > in INTC1 asserted. There are 6 GIC interrupt number(#192~#197) used in > one INTC0. > > INTC1_x: > The third level INTC, which used to assert GIC(#192~#197) if interrupt in > INTC1 asserted. There are 6 GIC interrupt number(#192~#197) used in one INTC0. > > Signed-off-by: Kevin Chen <kevin_chen@aspeedtech.com> > --- > .../aspeed,ast2700-intc.yaml | 87 +++++++++++++++++++ > 1 file changed, 87 insertions(+) > create mode 100644 Documentation/devicetree/bindings/interrupt-controller/aspeed,ast2700-intc.yaml > > diff --git a/Documentation/devicetree/bindings/interrupt-controller/aspeed,ast2700-intc.yaml b/Documentation/devicetree/bindings/interrupt-controller/aspeed,ast2700-intc.yaml > new file mode 100644 > index 000000000000..650a1f6e1177 > --- /dev/null > +++ b/Documentation/devicetree/bindings/interrupt-controller/aspeed,ast2700-intc.yaml > @@ -0,0 +1,87 @@ > +# SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/interrupt-controller/aspeed,ast2700-intc.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Aspeed AST2700 Interrupt Controller > + > +description: > + This interrupt controller hardware is second level interrupt controller that > + is hooked to a parent interrupt controller. It's useful to combine multiple > + interrupt sources into 1 interrupt to parent interrupt controller. > + > +maintainers: > + - Kevin Chen <kevin_chen@aspeedtech.com> > + > +properties: > + compatible: > + enum: > + - aspeed,ast2700-intc-ic > + > + reg: > + maxItems: 1 > + > + interrupt-controller: true > + > + '#interrupt-cells': > + const: 2 Describe the meaning of the cells here. > + > + interrupts: > + maxItems: 10 > + description: You need '|' to preserve formatting. > + Depend to which INTC0 or INTC1 used. > + INTC0 and INTC1 are two kinds of interrupt controller with enable and raw > + status registers for use. > + INTC0 is used to assert GIC if interrupt in INTC1 asserted. > + INTC1 is used to assert INTC0 if interrupt of modules asserted. > + +-----+ +-------+ +---------+---module0 > + | GIC |---| INTC0 |--+--| INTC1_0 |---module2 > + | | | | | | |---... > + +-----+ +-------+ | +---------+---module31 > + | > + | +---------+---module0 > + +---| INTC1_1 |---module2 > + | | |---... > + | +---------+---module31 > + ... > + | +---------+---module0 > + +---| INTC1_5 |---module2 > + | |---... > + +---------+---module31 > + > + > +required: > + - compatible > + - reg > + - interrupt-controller > + - '#interrupt-cells' > + - interrupts > + > +additionalProperties: false > + > +examples: > + - | > + #include <dt-bindings/interrupt-controller/arm-gic.h> > + > + bus { > + #address-cells = <2>; > + #size-cells = <2>; > + > + interrupt-controller@12101b00 { > + compatible = "aspeed,ast2700-intc-ic"; > + reg = <0 0x12101b00 0 0x10>; > + #interrupt-cells = <2>; > + interrupt-controller; > + interrupts = <GIC_SPI 192 IRQ_TYPE_LEVEL_HIGH>, > + <GIC_SPI 193 IRQ_TYPE_LEVEL_HIGH>, > + <GIC_SPI 194 IRQ_TYPE_LEVEL_HIGH>, > + <GIC_SPI 195 IRQ_TYPE_LEVEL_HIGH>, > + <GIC_SPI 196 IRQ_TYPE_LEVEL_HIGH>, > + <GIC_SPI 197 IRQ_TYPE_LEVEL_HIGH>, > + <GIC_SPI 198 IRQ_TYPE_LEVEL_HIGH>, > + <GIC_SPI 199 IRQ_TYPE_LEVEL_HIGH>, > + <GIC_SPI 200 IRQ_TYPE_LEVEL_HIGH>, > + <GIC_SPI 201 IRQ_TYPE_LEVEL_HIGH>; > + }; > + }; > -- > 2.34.1 > ^ permalink raw reply [flat|nested] 18+ messages in thread
* RE: [PATCH v3 1/2] dt-bindings: interrupt-controller: Add support for ASPEED AST27XX INTC 2024-10-09 21:11 ` Rob Herring @ 2024-10-11 10:02 ` Kevin Chen 0 siblings, 0 replies; 18+ messages in thread From: Kevin Chen @ 2024-10-11 10:02 UTC (permalink / raw) To: Rob Herring Cc: tglx@linutronix.de, krzk+dt@kernel.org, conor+dt@kernel.org, joel@jms.id.au, andrew@codeconstruct.com.au, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-aspeed@lists.ozlabs.org, BMC-SW > > The ASPEED AST27XX interrupt controller(INTC) contain second level and > > third level interrupt controller. > > > > INTC0: > > The second level INTC, which used to assert GIC(#192~#197) if > > interrupt in INTC1 asserted. There are 6 GIC interrupt > > number(#192~#197) used in one INTC0. > > > > INTC1_x: > > The third level INTC, which used to assert GIC(#192~#197) if interrupt > > in > > INTC1 asserted. There are 6 GIC interrupt number(#192~#197) used in one > INTC0. > > > > Signed-off-by: Kevin Chen <kevin_chen@aspeedtech.com> > > --- > > .../aspeed,ast2700-intc.yaml | 87 > +++++++++++++++++++ > > 1 file changed, 87 insertions(+) > > create mode 100644 > > Documentation/devicetree/bindings/interrupt-controller/aspeed,ast2700- > > intc.yaml > > > > diff --git > > a/Documentation/devicetree/bindings/interrupt-controller/aspeed,ast270 > > 0-intc.yaml > > b/Documentation/devicetree/bindings/interrupt-controller/aspeed,ast270 > > 0-intc.yaml > > new file mode 100644 > > index 000000000000..650a1f6e1177 > > --- /dev/null > > +++ b/Documentation/devicetree/bindings/interrupt-controller/aspeed,as > > +++ t2700-intc.yaml > > @@ -0,0 +1,87 @@ > > +# SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause %YAML 1.2 > > +--- > > +$id: > > +http://devicetree.org/schemas/interrupt-controller/aspeed,ast2700-int > > +c.yaml# > > +$schema: http://devicetree.org/meta-schemas/core.yaml# > > + > > +title: Aspeed AST2700 Interrupt Controller > > + > > +description: > > + This interrupt controller hardware is second level interrupt > > +controller that > > + is hooked to a parent interrupt controller. It's useful to combine > > +multiple > > + interrupt sources into 1 interrupt to parent interrupt controller. > > + > > +maintainers: > > + - Kevin Chen <kevin_chen@aspeedtech.com> > > + > > +properties: > > + compatible: > > + enum: > > + - aspeed,ast2700-intc-ic > > + > > + reg: > > + maxItems: 1 > > + > > + interrupt-controller: true > > + > > + '#interrupt-cells': > > + const: 2 > > Describe the meaning of the cells here. I would change to the following code + '#interrupt-cells': + const: 2 + description: + The first cell is the IRQ number, the second cell is the trigger + type as defined in interrupt.txt in this directory. > > > + > > + interrupts: > > + maxItems: 10 > > + description: > > You need '|' to preserve formatting. OK. Thanks > > > + Depend to which INTC0 or INTC1 used. > > + INTC0 and INTC1 are two kinds of interrupt controller with enable > and raw > > + status registers for use. > > + INTC0 is used to assert GIC if interrupt in INTC1 asserted. > > + INTC1 is used to assert INTC0 if interrupt of modules asserted. > > + +-----+ +-------+ +---------+---module0 > > + | GIC |---| INTC0 |--+--| INTC1_0 |---module2 > > + | | | | | | |---... > > + +-----+ +-------+ | +---------+---module31 > > + | > > + | +---------+---module0 > > + +---| INTC1_1 |---module2 > > + | | |---... > > + | +---------+---module31 > > + ... > > + | +---------+---module0 > > + +---| INTC1_5 |---module2 > > + | |---... > > + +---------+---module31 > > + > > + > > +required: > > + - compatible > > + - reg > > + - interrupt-controller > > + - '#interrupt-cells' > > + - interrupts > > + > > +additionalProperties: false > > + > > +examples: > > + - | > > + #include <dt-bindings/interrupt-controller/arm-gic.h> > > + > > + bus { > > + #address-cells = <2>; > > + #size-cells = <2>; > > + > > + interrupt-controller@12101b00 { > > + compatible = "aspeed,ast2700-intc-ic"; > > + reg = <0 0x12101b00 0 0x10>; > > + #interrupt-cells = <2>; > > + interrupt-controller; > > + interrupts = <GIC_SPI 192 IRQ_TYPE_LEVEL_HIGH>, > > + <GIC_SPI 193 IRQ_TYPE_LEVEL_HIGH>, > > + <GIC_SPI 194 IRQ_TYPE_LEVEL_HIGH>, > > + <GIC_SPI 195 IRQ_TYPE_LEVEL_HIGH>, > > + <GIC_SPI 196 IRQ_TYPE_LEVEL_HIGH>, > > + <GIC_SPI 197 IRQ_TYPE_LEVEL_HIGH>, > > + <GIC_SPI 198 IRQ_TYPE_LEVEL_HIGH>, > > + <GIC_SPI 199 IRQ_TYPE_LEVEL_HIGH>, > > + <GIC_SPI 200 IRQ_TYPE_LEVEL_HIGH>, > > + <GIC_SPI 201 IRQ_TYPE_LEVEL_HIGH>; > > + }; > > + }; > > -- > > 2.34.1 > > ^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v3 2/2] irqchip/aspeed-intc: Add support for AST27XX INTC 2024-10-09 11:58 [PATCH v3 0/2] Add support for AST2700 INTC driver Kevin Chen 2024-10-09 11:58 ` [PATCH v3 1/2] dt-bindings: interrupt-controller: Add support for ASPEED AST27XX INTC Kevin Chen @ 2024-10-09 11:58 ` Kevin Chen 2024-10-09 12:32 ` Markus Elfring 2024-10-11 13:06 ` [PATCH v3 " Dan Carpenter 1 sibling, 2 replies; 18+ messages in thread From: Kevin Chen @ 2024-10-09 11:58 UTC (permalink / raw) To: tglx, robh, krzk+dt, conor+dt, joel, andrew, kevin_chen, linux-kernel, devicetree, linux-arm-kernel, linux-aspeed Support for the Aspeed Interrupt Controller found on Aspeed Silicon SoCs, such as the AST2700, which is arm64 architecture. To support ASPEED interrupt controller(INTC) maps the internal interrupt sources of the AST27XX device to an parent interrupt controller. --- drivers/irqchip/Makefile | 1 + drivers/irqchip/irq-aspeed-intc.c | 139 ++++++++++++++++++++++++++++++ 2 files changed, 140 insertions(+) create mode 100644 drivers/irqchip/irq-aspeed-intc.c diff --git a/drivers/irqchip/Makefile b/drivers/irqchip/Makefile index e3679ec2b9f7..086911bf4db6 100644 --- a/drivers/irqchip/Makefile +++ b/drivers/irqchip/Makefile @@ -84,6 +84,7 @@ obj-$(CONFIG_MVEBU_SEI) += irq-mvebu-sei.o obj-$(CONFIG_LS_EXTIRQ) += irq-ls-extirq.o obj-$(CONFIG_LS_SCFG_MSI) += irq-ls-scfg-msi.o obj-$(CONFIG_ARCH_ASPEED) += irq-aspeed-vic.o irq-aspeed-i2c-ic.o irq-aspeed-scu-ic.o +obj-$(CONFIG_ARCH_ASPEED) += irq-aspeed-intc.o obj-$(CONFIG_STM32MP_EXTI) += irq-stm32mp-exti.o obj-$(CONFIG_STM32_EXTI) += irq-stm32-exti.o obj-$(CONFIG_QCOM_IRQ_COMBINER) += qcom-irq-combiner.o diff --git a/drivers/irqchip/irq-aspeed-intc.c b/drivers/irqchip/irq-aspeed-intc.c new file mode 100644 index 000000000000..ef1c095ad09e --- /dev/null +++ b/drivers/irqchip/irq-aspeed-intc.c @@ -0,0 +1,139 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Aspeed Interrupt Controller. + * + * Copyright (C) 2023 ASPEED Technology Inc. + */ + +#include <linux/bitops.h> +#include <linux/irq.h> +#include <linux/irqchip.h> +#include <linux/irqchip/chained_irq.h> +#include <linux/irqdomain.h> +#include <linux/of_address.h> +#include <linux/of_irq.h> +#include <linux/io.h> +#include <linux/spinlock.h> + +#define INTC_INT_ENABLE_REG 0x00 +#define INTC_INT_STATUS_REG 0x04 +#define IRQS_PER_WORD 32 + +struct aspeed_intc_ic { + void __iomem *base; + raw_spinlock_t gic_lock; + raw_spinlock_t intc_lock; + struct irq_domain *irq_domain; +}; + +static void aspeed_intc_ic_irq_handler(struct irq_desc *desc) +{ + struct aspeed_intc_ic *intc_ic = irq_desc_get_handler_data(desc); + struct irq_chip *chip = irq_desc_get_chip(desc); + unsigned long bit, status; + + chained_irq_enter(chip, desc); + + scoped_guard(raw_spinlock, &intc_ic->gic_lock) { + status = readl(intc_ic->base + INTC_INT_STATUS_REG); + for_each_set_bit(bit, &status, IRQS_PER_WORD) { + generic_handle_domain_irq(intc_ic->irq_domain, bit); + writel(BIT(bit), intc_ic->base + INTC_INT_STATUS_REG); + } + } + + chained_irq_exit(chip, desc); +} + +static void aspeed_intc_irq_mask(struct irq_data *data) +{ + struct aspeed_intc_ic *intc_ic = irq_data_get_irq_chip_data(data); + unsigned int mask = readl(intc_ic->base + INTC_INT_ENABLE_REG) & ~BIT(data->hwirq); + + guard(raw_spinlock)(&intc_ic->intc_lock); + writel(mask, intc_ic->base + INTC_INT_ENABLE_REG); +} + +static void aspeed_intc_irq_unmask(struct irq_data *data) +{ + struct aspeed_intc_ic *intc_ic = irq_data_get_irq_chip_data(data); + unsigned int unmask = readl(intc_ic->base + INTC_INT_ENABLE_REG) | BIT(data->hwirq); + + guard(raw_spinlock)(&intc_ic->intc_lock); + writel(unmask, intc_ic->base + INTC_INT_ENABLE_REG); +} + +static struct irq_chip aspeed_intc_chip = { + .name = "ASPEED INTC", + .irq_mask = aspeed_intc_irq_mask, + .irq_unmask = aspeed_intc_irq_unmask, +}; + +static int aspeed_intc_ic_map_irq_domain(struct irq_domain *domain, unsigned int irq, + irq_hw_number_t hwirq) +{ + irq_set_chip_and_handler(irq, &aspeed_intc_chip, handle_level_irq); + irq_set_chip_data(irq, domain->host_data); + + return 0; +} + +static const struct irq_domain_ops aspeed_intc_ic_irq_domain_ops = { + .map = aspeed_intc_ic_map_irq_domain, +}; + +static int __init aspeed_intc_ic_of_init(struct device_node *node, + struct device_node *parent) +{ + struct aspeed_intc_ic *intc_ic; + int ret = 0; + int irq, i; + + intc_ic = kzalloc(sizeof(*intc_ic), GFP_KERNEL); + if (!intc_ic) + return -ENOMEM; + + intc_ic->base = of_iomap(node, 0); + if (!intc_ic->base) { + pr_err("Failed to iomap intc_ic base\n"); + ret = -ENOMEM; + goto err_free_ic; + } + writel(0xffffffff, intc_ic->base + INTC_INT_STATUS_REG); + writel(0x0, intc_ic->base + INTC_INT_ENABLE_REG); + + intc_ic->irq_domain = irq_domain_add_linear(node, 32, + &aspeed_intc_ic_irq_domain_ops, intc_ic); + if (!intc_ic->irq_domain) { + ret = -ENOMEM; + goto err_iounmap; + } + + raw_spin_lock_init(&intc_ic->gic_lock); + raw_spin_lock_init(&intc_ic->intc_lock); + + /* Check all the irq numbers valid. If not, unmaps all the base and frees the data. */ + for (i = 0; i < of_irq_count(node); i++) { + irq = irq_of_parse_and_map(node, i); + if (!irq) { + pr_err("Failed to get irq number\n"); + ret = -EINVAL; + goto err_iounmap; + } + } + + for (i = 0; i < of_irq_count(node); i++) { + irq = irq_of_parse_and_map(node, i); + irq_set_chained_handler_and_data(irq, aspeed_intc_ic_irq_handler, intc_ic); + } + + return 0; + +err_iounmap: + iounmap(intc_ic->base); +err_free_ic: + kfree(intc_ic); + return ret; +} + +IRQCHIP_DECLARE(ast2700_intc_ic, "aspeed,ast2700-intc-ic", aspeed_intc_ic_of_init); -- 2.34.1 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH v3 2/2] irqchip/aspeed-intc: Add support for AST27XX INTC 2024-10-09 11:58 ` [PATCH v3 2/2] irqchip/aspeed-intc: Add support for " Kevin Chen @ 2024-10-09 12:32 ` Markus Elfring 2024-10-11 10:06 ` Kevin Chen 2024-10-15 21:42 ` Thomas Gleixner 2024-10-11 13:06 ` [PATCH v3 " Dan Carpenter 1 sibling, 2 replies; 18+ messages in thread From: Markus Elfring @ 2024-10-09 12:32 UTC (permalink / raw) To: Kevin Chen, linux-aspeed, linux-arm-kernel, devicetree, Andrew Jeffery, Conor Dooley, Joel Stanley, Krzysztof Kozlowski, Rob Herring, Thomas Gleixner Cc: LKML, kernel-janitors … > To support ASPEED interrupt controller(INTC) maps the internal interrupt > sources of the AST27XX device to an parent interrupt controller. > --- * I miss your tag “Signed-off-by”. https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/process/submitting-patches.rst?h=v6.12-rc2#n396 * How do you think about to choose an additional imperative wording for an improved change description? https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/process/submitting-patches.rst?h=v6.12-rc2#n94 … > +++ b/drivers/irqchip/irq-aspeed-intc.c > @@ -0,0 +1,139 @@ … > +static void aspeed_intc_ic_irq_handler(struct irq_desc *desc) +{ > + struct aspeed_intc_ic *intc_ic = irq_desc_get_handler_data(desc); > + struct irq_chip *chip = irq_desc_get_chip(desc); > + unsigned long bit, status; I suggest to reduce the scopes for three local variables. > + > + chained_irq_enter(chip, desc); Would you become interested to collaborate with another scoped guard for this programming interface? https://elixir.bootlin.com/linux/v6.12-rc2/source/include/linux/irqchip/chained_irq.h#L13 > + > + scoped_guard(raw_spinlock, &intc_ic->gic_lock) { > + status = readl(intc_ic->base + INTC_INT_STATUS_REG); > + for_each_set_bit(bit, &status, IRQS_PER_WORD) { > + generic_handle_domain_irq(intc_ic->irq_domain, bit); > + writel(BIT(bit), intc_ic->base + INTC_INT_STATUS_REG); > + } > + } > + > + chained_irq_exit(chip, desc); > +} Regards, Markus ^ permalink raw reply [flat|nested] 18+ messages in thread
* RE: [PATCH v3 2/2] irqchip/aspeed-intc: Add support for AST27XX INTC 2024-10-09 12:32 ` Markus Elfring @ 2024-10-11 10:06 ` Kevin Chen 2024-10-11 15:34 ` Markus Elfring 2024-10-15 21:42 ` Thomas Gleixner 1 sibling, 1 reply; 18+ messages in thread From: Kevin Chen @ 2024-10-11 10:06 UTC (permalink / raw) To: Markus Elfring, linux-aspeed@lists.ozlabs.org, linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org, Andrew Jeffery, Conor Dooley, Joel Stanley, Krzysztof Kozlowski, Rob Herring, Thomas Gleixner, BMC-SW Cc: LKML, kernel-janitors@vger.kernel.org Hi Markus, Thank you for your review. Could you check the message below. Thanks a lot. > > … > > To support ASPEED interrupt controller(INTC) maps the internal > > interrupt sources of the AST27XX device to an parent interrupt controller. > > --- > > * I miss your tag “Signed-off-by”. > > https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Docume > ntation/process/submitting-patches.rst?h=v6.12-rc2#n396 > > * How do you think about to choose an additional imperative wording > for an improved change description? > > https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Docume > ntation/process/submitting-patches.rst?h=v6.12-rc2#n94 > > > … > > +++ b/drivers/irqchip/irq-aspeed-intc.c > > @@ -0,0 +1,139 @@ > … > > +static void aspeed_intc_ic_irq_handler(struct irq_desc *desc) > +{ > > + struct aspeed_intc_ic *intc_ic = irq_desc_get_handler_data(desc); > > + struct irq_chip *chip = irq_desc_get_chip(desc); > > + unsigned long bit, status; > > I suggest to reduce the scopes for three local variables. May I check the scopes of bit and status usage? Variables of bit and status are used in for_each_set_bit. How could I reduce the scopes? > > > > + > > + chained_irq_enter(chip, desc); > > Would you become interested to collaborate with another scoped guard for > this programming interface? > https://elixir.bootlin.com/linux/v6.12-rc2/source/include/linux/irqchip/chained > _irq.h#L13 Maybe like the change in the following? diff --git a/drivers/irqchip/irq-aspeed-intc.c b/drivers/irqchip/irq-aspeed-intc.c index ef1c095ad09e..54d1881c56c6 100644 --- a/drivers/irqchip/irq-aspeed-intc.c +++ b/drivers/irqchip/irq-aspeed-intc.c @@ -32,7 +32,7 @@ static void aspeed_intc_ic_irq_handler(struct irq_desc *desc) struct irq_chip *chip = irq_desc_get_chip(desc); unsigned long bit, status; - chained_irq_enter(chip, desc); + guard(chained_irq)(desc); scoped_guard(raw_spinlock, &intc_ic->gic_lock) { status = readl(intc_ic->base + INTC_INT_STATUS_REG); @@ -41,8 +41,6 @@ static void aspeed_intc_ic_irq_handler(struct irq_desc *desc) writel(BIT(bit), intc_ic->base + INTC_INT_STATUS_REG); } } - - chained_irq_exit(chip, desc); } static void aspeed_intc_irq_mask(struct irq_data *data) diff --git a/include/linux/irqchip/chained_irq.h b/include/linux/irqchip/chained_irq.h index dd8b3c476666..399a4ae30205 100644 --- a/include/linux/irqchip/chained_irq.h +++ b/include/linux/irqchip/chained_irq.h @@ -38,4 +38,5 @@ static inline void chained_irq_exit(struct irq_chip *chip, chip->irq_unmask(&desc->irq_data); } +DEFINE_GUARD (chained_irq, struct irq_desc * , chained_irq_exit ( _T ->irq_data.chip, _T ), chained_irq_enter (_T->irq_data.chip, _T)) #endif /* __IRQCHIP_CHAINED_IRQ_H */ > > > > + > > + scoped_guard(raw_spinlock, &intc_ic->gic_lock) { > > + status = readl(intc_ic->base + INTC_INT_STATUS_REG); > > + for_each_set_bit(bit, &status, IRQS_PER_WORD) { > > + generic_handle_domain_irq(intc_ic->irq_domain, bit); > > + writel(BIT(bit), intc_ic->base + INTC_INT_STATUS_REG); > > + } > > + } > > + > > + chained_irq_exit(chip, desc); > > +} > > > Regards, > Markus ^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH v3 2/2] irqchip/aspeed-intc: Add support for AST27XX INTC 2024-10-11 10:06 ` Kevin Chen @ 2024-10-11 15:34 ` Markus Elfring 2024-10-14 2:00 ` Kevin Chen 0 siblings, 1 reply; 18+ messages in thread From: Markus Elfring @ 2024-10-11 15:34 UTC (permalink / raw) To: Kevin Chen, linux-aspeed, linux-arm-kernel, devicetree, Andrew Jeffery, Conor Dooley, Joel Stanley, Krzysztof Kozlowski, Rob Herring, Thomas Gleixner, BMC-SW Cc: LKML, kernel-janitors >> … >>> +++ b/drivers/irqchip/irq-aspeed-intc.c >>> @@ -0,0 +1,139 @@ >> … >>> +static void aspeed_intc_ic_irq_handler(struct irq_desc *desc) >> +{ >>> + struct aspeed_intc_ic *intc_ic = irq_desc_get_handler_data(desc); >>> + struct irq_chip *chip = irq_desc_get_chip(desc); >>> + unsigned long bit, status; >> >> I suggest to reduce the scopes for three local variables. > May I check the scopes of bit and status usage? > Variables of bit and status are used in for_each_set_bit. > How could I reduce the scopes? I propose to move selected variable definitions into corresponding compound statements (by using extra curly brackets). https://refactoring.com/catalog/reduceScopeOfVariable.html >> Would you become interested to collaborate with another scoped guard for >> this programming interface? >> https://elixir.bootlin.com/linux/v6.12-rc2/source/include/linux/irqchip/chained >> _irq.h#L13 > > Maybe like the change in the following? > > diff --git a/drivers/irqchip/irq-aspeed-intc.c b/drivers/irqchip/irq-aspeed-intc.c > index ef1c095ad09e..54d1881c56c6 100644 > --- a/drivers/irqchip/irq-aspeed-intc.c > +++ b/drivers/irqchip/irq-aspeed-intc.c > @@ -32,7 +32,7 @@ static void aspeed_intc_ic_irq_handler(struct irq_desc *desc) > struct irq_chip *chip = irq_desc_get_chip(desc); > unsigned long bit, status; > > - chained_irq_enter(chip, desc); > + guard(chained_irq)(desc); > > scoped_guard(raw_spinlock, &intc_ic->gic_lock) { > status = readl(intc_ic->base + INTC_INT_STATUS_REG); Perhaps. > @@ -41,8 +41,6 @@ static void aspeed_intc_ic_irq_handler(struct irq_desc *desc) > writel(BIT(bit), intc_ic->base + INTC_INT_STATUS_REG); > } > } > - > - chained_irq_exit(chip, desc); > } … Probably, yes. … > +++ b/include/linux/irqchip/chained_irq.h > @@ -38,4 +38,5 @@ static inline void chained_irq_exit(struct irq_chip *chip, > chip->irq_unmask(&desc->irq_data); > } > > +DEFINE_GUARD (chained_irq, struct irq_desc * , chained_irq_exit ( _T ->irq_data.chip, _T ), chained_irq_enter (_T->irq_data.chip, _T)) … * Such a macro call looks promising. Would you like to omit any space characters before open parentheses? * Would you like to support scoped guard variants accordingly? Regards, Markus ^ permalink raw reply [flat|nested] 18+ messages in thread
* RE: [PATCH v3 2/2] irqchip/aspeed-intc: Add support for AST27XX INTC 2024-10-11 15:34 ` Markus Elfring @ 2024-10-14 2:00 ` Kevin Chen 2024-10-14 13:10 ` Markus Elfring 0 siblings, 1 reply; 18+ messages in thread From: Kevin Chen @ 2024-10-14 2:00 UTC (permalink / raw) To: Markus Elfring, linux-aspeed@lists.ozlabs.org, linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org, Andrew Jeffery, Conor Dooley, Joel Stanley, Krzysztof Kozlowski, Rob Herring, Thomas Gleixner, BMC-SW Cc: LKML, kernel-janitors@vger.kernel.org > >> … > >>> +++ b/drivers/irqchip/irq-aspeed-intc.c > >>> @@ -0,0 +1,139 @@ > >> … > >>> +static void aspeed_intc_ic_irq_handler(struct irq_desc *desc) > >> +{ > >>> + struct aspeed_intc_ic *intc_ic = irq_desc_get_handler_data(desc); > >>> + struct irq_chip *chip = irq_desc_get_chip(desc); > >>> + unsigned long bit, status; > >> > >> I suggest to reduce the scopes for three local variables. > > May I check the scopes of bit and status usage? > > Variables of bit and status are used in for_each_set_bit. > > How could I reduce the scopes? > > I propose to move selected variable definitions into corresponding compound > statements (by using extra curly brackets). > https://refactoring.com/catalog/reduceScopeOfVariable.html OK. I moved these two local variables into scoped_guard. +static void aspeed_intc_ic_irq_handler(struct irq_desc *desc) +{ + struct aspeed_intc_ic *intc_ic = irq_desc_get_handler_data(desc); + + guard(chained_irq)(desc); + scoped_guard(raw_spinlock, &intc_ic->gic_lock) { + unsigned long bit, status; + + status = readl(intc_ic->base + INTC_INT_STATUS_REG); + for_each_set_bit(bit, &status, IRQS_PER_WORD) { + generic_handle_domain_irq(intc_ic->irq_domain, bit); + writel(BIT(bit), intc_ic->base + INTC_INT_STATUS_REG); + } + } +} > > > >> Would you become interested to collaborate with another scoped guard > >> for this programming interface? > >> https://elixir.bootlin.com/linux/v6.12-rc2/source/include/linux/irqch > >> ip/chained > >> _irq.h#L13 > > > > Maybe like the change in the following? > > > > diff --git a/drivers/irqchip/irq-aspeed-intc.c > > b/drivers/irqchip/irq-aspeed-intc.c > > index ef1c095ad09e..54d1881c56c6 100644 > > --- a/drivers/irqchip/irq-aspeed-intc.c > > +++ b/drivers/irqchip/irq-aspeed-intc.c > > @@ -32,7 +32,7 @@ static void aspeed_intc_ic_irq_handler(struct irq_desc > *desc) > > struct irq_chip *chip = irq_desc_get_chip(desc); > > unsigned long bit, status; > > > > - chained_irq_enter(chip, desc); > > + guard(chained_irq)(desc); > > > > scoped_guard(raw_spinlock, &intc_ic->gic_lock) { > > status = readl(intc_ic->base + INTC_INT_STATUS_REG); > > Perhaps. > > > > @@ -41,8 +41,6 @@ static void aspeed_intc_ic_irq_handler(struct irq_desc > *desc) > > writel(BIT(bit), intc_ic->base + > INTC_INT_STATUS_REG); > > } > > } > > - > > - chained_irq_exit(chip, desc); > > } > … > > Probably, yes. > > > … > > +++ b/include/linux/irqchip/chained_irq.h > > @@ -38,4 +38,5 @@ static inline void chained_irq_exit(struct irq_chip *chip, > > chip->irq_unmask(&desc->irq_data); > > } > > > > +DEFINE_GUARD (chained_irq, struct irq_desc * , chained_irq_exit ( _T > > +->irq_data.chip, _T ), chained_irq_enter (_T->irq_data.chip, _T)) > … > > * Such a macro call looks promising. > Would you like to omit any space characters before open parentheses? OK. Fixed. diff --git a/include/linux/irqchip/chained_irq.h b/include/linux/irqchip/chained_irq.h index dd8b3c476666..7ee29e478152 100644 --- a/include/linux/irqchip/chained_irq.h +++ b/include/linux/irqchip/chained_irq.h @@ -38,4 +38,6 @@ static inline void chained_irq_exit(struct irq_chip *chip, chip->irq_unmask(&desc->irq_data); } +DEFINE_GUARD(chained_irq, struct irq_desc *, chained_irq_exit((_T->irq_data.chip), (_T)), + chained_irq_enter((_T->irq_data.chip), (_T))) > > * Would you like to support scoped guard variants accordingly? Do you mean that I need to change the MACRO name for this usage? > > > Regards, > Markus ^ permalink raw reply related [flat|nested] 18+ messages in thread
* RE: [PATCH v3 2/2] irqchip/aspeed-intc: Add support for AST27XX INTC 2024-10-14 2:00 ` Kevin Chen @ 2024-10-14 13:10 ` Markus Elfring 2024-10-15 10:19 ` Kevin Chen 0 siblings, 1 reply; 18+ messages in thread From: Markus Elfring @ 2024-10-14 13:10 UTC (permalink / raw) To: Kevin Chen, linux-aspeed, linux-arm-kernel, devicetree Cc: Andrew Jeffery, Conor Dooley, Joel Stanley, Krzysztof Kozlowski, Rob Herring, Thomas Gleixner, kernel-janitors, LKML, BMC-SW > > I propose to move selected variable definitions into corresponding compound > > statements (by using extra curly brackets). > > https://refactoring.com/catalog/reduceScopeOfVariable.html > OK. I moved these two local variables into scoped_guard. Will development interests grow for further refactorings? > +static void aspeed_intc_ic_irq_handler(struct irq_desc *desc) > +{ > + struct aspeed_intc_ic *intc_ic = irq_desc_get_handler_data(desc); Another update candidate (for scope reduction)? > + > + guard(chained_irq)(desc); Using another macro call “scoped_guard(…) { … }”? > + scoped_guard(raw_spinlock, &intc_ic->gic_lock) { Would you like to reconsider the proposed macro mixture once more? > + unsigned long bit, status; … … > +++ b/include/linux/irqchip/chained_irq.h > @@ -38,4 +38,6 @@ static inline void chained_irq_exit(struct irq_chip *chip, > chip->irq_unmask(&desc->irq_data); > } > > +DEFINE_GUARD(chained_irq, struct irq_desc *, chained_irq_exit((_T->irq_data.chip), (_T)), > + chained_irq_enter((_T->irq_data.chip), (_T))) Would you like to add a #include directive in this header file accordingly? Regards, Markus ^ permalink raw reply [flat|nested] 18+ messages in thread
* RE: [PATCH v3 2/2] irqchip/aspeed-intc: Add support for AST27XX INTC 2024-10-14 13:10 ` Markus Elfring @ 2024-10-15 10:19 ` Kevin Chen 2024-10-15 15:07 ` Markus Elfring 0 siblings, 1 reply; 18+ messages in thread From: Kevin Chen @ 2024-10-15 10:19 UTC (permalink / raw) To: Markus Elfring, linux-aspeed@lists.ozlabs.org, linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org Cc: Andrew Jeffery, Conor Dooley, Joel Stanley, Krzysztof Kozlowski, Rob Herring, Thomas Gleixner, kernel-janitors@vger.kernel.org, LKML, BMC-SW > > > > I propose to move selected variable definitions into corresponding > > > compound statements (by using extra curly brackets). > > > https://refactoring.com/catalog/reduceScopeOfVariable.html > > OK. I moved these two local variables into scoped_guard. > > Will development interests grow for further refactorings? Do you have any example for this refactorings? > > > > +static void aspeed_intc_ic_irq_handler(struct irq_desc *desc) { > > + struct aspeed_intc_ic *intc_ic = > > +irq_desc_get_handler_data(desc); > > Another update candidate (for scope reduction)? Variable of intc_ic used in "scoped_guard(raw_spinlock, &intc_ic->gic_lock) {". Or, how can I reduce the scope of intc_ic? > > > > + > > + guard(chained_irq)(desc); > > Using another macro call “scoped_guard(…) { … }”? Is it necessary to use scoped_guard(...) {...}? In the end of aspeed_intc_ic_irq_handler, chained_irq_exit would be called as destructor. Only one reason I thought is that the chained_irq_exit is needed to be called in the middle of aspeed_intc_ic_irq_handler. > > > > + scoped_guard(raw_spinlock, &intc_ic->gic_lock) { > > Would you like to reconsider the proposed macro mixture once more? Could I check the reason for once more? > > > > + unsigned long bit, status; > … > > … > > +++ b/include/linux/irqchip/chained_irq.h > > @@ -38,4 +38,6 @@ static inline void chained_irq_exit(struct irq_chip *chip, > > chip->irq_unmask(&desc->irq_data); > > } > > > > +DEFINE_GUARD(chained_irq, struct irq_desc *, > chained_irq_exit((_T->irq_data.chip), (_T)), > > + chained_irq_enter((_T->irq_data.chip), (_T))) > > Would you like to add a #include directive in this header file accordingly? Can you give me an example? > > Regards, > Markus ^ permalink raw reply [flat|nested] 18+ messages in thread
* RE: [PATCH v3 2/2] irqchip/aspeed-intc: Add support for AST27XX INTC 2024-10-15 10:19 ` Kevin Chen @ 2024-10-15 15:07 ` Markus Elfring 0 siblings, 0 replies; 18+ messages in thread From: Markus Elfring @ 2024-10-15 15:07 UTC (permalink / raw) To: Kevin Chen, linux-arm-kernel, devicetree, linux-aspeed Cc: Andrew Jeffery, Conor Dooley, Joel Stanley, Krzysztof Kozlowski, Rob Herring, Thomas Gleixner, LKML, BMC-SW, kernel-janitors … > > > +static void aspeed_intc_ic_irq_handler(struct irq_desc *desc) { … > > > + guard(chained_irq)(desc); > > > > Using another macro call “scoped_guard(…) { … }”? > Is it necessary to use scoped_guard(...) {...}? It depends on corresponding case disintions. > > > + scoped_guard(raw_spinlock, &intc_ic->gic_lock) { > > > > Would you like to reconsider the proposed macro mixture once more? > Could I check the reason for once more? Coding style concerns …? > > > +++ b/include/linux/irqchip/chained_irq.h > > > @@ -38,4 +38,6 @@ static inline void chained_irq_exit(struct irq_chip *chip, > > > chip->irq_unmask(&desc->irq_data); > > > } > > > > > > +DEFINE_GUARD(chained_irq, struct irq_desc *, > > chained_irq_exit((_T->irq_data.chip), (_T)), > > > + chained_irq_enter((_T->irq_data.chip), (_T))) > > > > Would you like to add a #include directive in this header file accordingly? > Can you give me an example? See also: https://elixir.bootlin.com/linux/v6.12-rc3/source/include/linux/device.h#L33 Regards, Markus ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v3 2/2] irqchip/aspeed-intc: Add support for AST27XX INTC 2024-10-09 12:32 ` Markus Elfring 2024-10-11 10:06 ` Kevin Chen @ 2024-10-15 21:42 ` Thomas Gleixner 2024-10-16 0:31 ` Kevin Chen 2024-10-16 9:54 ` [v3 " Markus Elfring 1 sibling, 2 replies; 18+ messages in thread From: Thomas Gleixner @ 2024-10-15 21:42 UTC (permalink / raw) To: Markus Elfring, Kevin Chen, linux-aspeed, linux-arm-kernel, devicetree, Andrew Jeffery, Conor Dooley, Joel Stanley, Krzysztof Kozlowski, Rob Herring Cc: LKML, kernel-janitors On Wed, Oct 09 2024 at 14:32, Markus Elfring wrote: >> + >> + chained_irq_enter(chip, desc); > > Would you become interested to collaborate with another scoped guard > for this programming interface? Collaborate in which way? What are you collaborating on? You are merely asking people to do work which you think is useful. You can do that, but that does not make it useful. Making a guard variant of chained_irq_enter/exit needs some thought and a general plan for cleaning the whole chained irq usage up. It's on the cleanup list already with quite some other items. We are not adhoc adding a guard variant because guards are hip right now. And no this does not need a scoped variant ever. guards are not the panacea for everything. > https://elixir.bootlin.com/linux/v6.12-rc2/source/include/linux/irqchip/chained_irq.h#L13 Please refrain from these silly links. People know to find the functions on their own. Kevin, please update the change log, add your SOB and move the local variables (unsigned long bit, status;) into the scoped_guard() zone. Leave chained_irq_enter/exit() alone and resubmit. Thanks, tglx ^ permalink raw reply [flat|nested] 18+ messages in thread
* RE: [PATCH v3 2/2] irqchip/aspeed-intc: Add support for AST27XX INTC 2024-10-15 21:42 ` Thomas Gleixner @ 2024-10-16 0:31 ` Kevin Chen 2024-10-16 9:54 ` [v3 " Markus Elfring 1 sibling, 0 replies; 18+ messages in thread From: Kevin Chen @ 2024-10-16 0:31 UTC (permalink / raw) To: Thomas Gleixner, Markus Elfring, linux-aspeed@lists.ozlabs.org, linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org, Andrew Jeffery, Conor Dooley, Joel Stanley, Krzysztof Kozlowski, Rob Herring Cc: LKML, kernel-janitors@vger.kernel.org > >> + > >> + chained_irq_enter(chip, desc); > > > > Would you become interested to collaborate with another scoped guard > > for this programming interface? > > Collaborate in which way? What are you collaborating on? > > You are merely asking people to do work which you think is useful. You can do > that, but that does not make it useful. > > Making a guard variant of chained_irq_enter/exit needs some thought and a > general plan for cleaning the whole chained irq usage up. It's on the cleanup > list already with quite some other items. > > We are not adhoc adding a guard variant because guards are hip right now. > And no this does not need a scoped variant ever. > > guards are not the panacea for everything. > > > https://elixir.bootlin.com/linux/v6.12-rc2/source/include/linux/irqchi > > p/chained_irq.h#L13 > > Please refrain from these silly links. People know to find the functions on their > own. > > Kevin, please update the change log, add your SOB and move the local > variables (unsigned long bit, status;) into the scoped_guard() zone. OK. I will do this change. > > Leave chained_irq_enter/exit() alone and resubmit. OK. I will send the v4 patch with chained_irq_enter/exit() alone. Thanks a lot. > > Thanks, > > tglx ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [v3 2/2] irqchip/aspeed-intc: Add support for AST27XX INTC 2024-10-15 21:42 ` Thomas Gleixner 2024-10-16 0:31 ` Kevin Chen @ 2024-10-16 9:54 ` Markus Elfring 1 sibling, 0 replies; 18+ messages in thread From: Markus Elfring @ 2024-10-16 9:54 UTC (permalink / raw) To: Thomas Gleixner, Kevin Chen, linux-aspeed, linux-arm-kernel, devicetree, Andrew Jeffery, Conor Dooley, Joel Stanley, Krzysztof Kozlowski, Rob Herring Cc: LKML, kernel-janitors > Making a guard variant of chained_irq_enter/exit needs some thought and > a general plan for cleaning the whole chained irq usage up. It's on the > cleanup list already with quite some other items. I became also curious how API usage will evolve further here. > We are not adhoc adding a guard variant because guards are hip right now. Application interests are growing, aren't they? > And no this does not need a scoped variant ever. There are subsystems which seem to prefer such a programming interface occasionally. > guards are not the panacea for everything. Their usage might become more popular. Regards, Markus ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v3 2/2] irqchip/aspeed-intc: Add support for AST27XX INTC 2024-10-09 11:58 ` [PATCH v3 2/2] irqchip/aspeed-intc: Add support for " Kevin Chen 2024-10-09 12:32 ` Markus Elfring @ 2024-10-11 13:06 ` Dan Carpenter 2024-10-14 0:17 ` Kevin Chen 1 sibling, 1 reply; 18+ messages in thread From: Dan Carpenter @ 2024-10-11 13:06 UTC (permalink / raw) To: Kevin Chen Cc: tglx, robh, krzk+dt, conor+dt, joel, andrew, linux-kernel, devicetree, linux-arm-kernel, linux-aspeed On Wed, Oct 09, 2024 at 07:58:13PM +0800, Kevin Chen wrote: > +static int __init aspeed_intc_ic_of_init(struct device_node *node, > + struct device_node *parent) > +{ > + struct aspeed_intc_ic *intc_ic; > + int ret = 0; > + int irq, i; > + > + intc_ic = kzalloc(sizeof(*intc_ic), GFP_KERNEL); > + if (!intc_ic) > + return -ENOMEM; > + > + intc_ic->base = of_iomap(node, 0); > + if (!intc_ic->base) { > + pr_err("Failed to iomap intc_ic base\n"); > + ret = -ENOMEM; > + goto err_free_ic; > + } > + writel(0xffffffff, intc_ic->base + INTC_INT_STATUS_REG); > + writel(0x0, intc_ic->base + INTC_INT_ENABLE_REG); > + > + intc_ic->irq_domain = irq_domain_add_linear(node, 32, > + &aspeed_intc_ic_irq_domain_ops, intc_ic); > + if (!intc_ic->irq_domain) { > + ret = -ENOMEM; > + goto err_iounmap; > + } > + > + raw_spin_lock_init(&intc_ic->gic_lock); > + raw_spin_lock_init(&intc_ic->intc_lock); > + > + /* Check all the irq numbers valid. If not, unmaps all the base and frees the data. */ > + for (i = 0; i < of_irq_count(node); i++) { > + irq = irq_of_parse_and_map(node, i); > + if (!irq) { > + pr_err("Failed to get irq number\n"); > + ret = -EINVAL; > + goto err_iounmap; > + } > + } > + > + for (i = 0; i < of_irq_count(node); i++) { > + irq = irq_of_parse_and_map(node, i); > + irq_set_chained_handler_and_data(irq, aspeed_intc_ic_irq_handler, intc_ic); There is an extra tab on this line. regards, dan carpenter > + } > + > + return 0; ^ permalink raw reply [flat|nested] 18+ messages in thread
* RE: [PATCH v3 2/2] irqchip/aspeed-intc: Add support for AST27XX INTC 2024-10-11 13:06 ` [PATCH v3 " Dan Carpenter @ 2024-10-14 0:17 ` Kevin Chen 0 siblings, 0 replies; 18+ messages in thread From: Kevin Chen @ 2024-10-14 0:17 UTC (permalink / raw) To: Dan Carpenter Cc: tglx@linutronix.de, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, joel@jms.id.au, andrew@codeconstruct.com.au, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-aspeed@lists.ozlabs.org, BMC-SW > > +static int __init aspeed_intc_ic_of_init(struct device_node *node, > > + struct device_node *parent) > > +{ > > + struct aspeed_intc_ic *intc_ic; > > + int ret = 0; > > + int irq, i; > > + > > + intc_ic = kzalloc(sizeof(*intc_ic), GFP_KERNEL); > > + if (!intc_ic) > > + return -ENOMEM; > > + > > + intc_ic->base = of_iomap(node, 0); > > + if (!intc_ic->base) { > > + pr_err("Failed to iomap intc_ic base\n"); > > + ret = -ENOMEM; > > + goto err_free_ic; > > + } > > + writel(0xffffffff, intc_ic->base + INTC_INT_STATUS_REG); > > + writel(0x0, intc_ic->base + INTC_INT_ENABLE_REG); > > + > > + intc_ic->irq_domain = irq_domain_add_linear(node, 32, > > + &aspeed_intc_ic_irq_domain_ops, intc_ic); > > + if (!intc_ic->irq_domain) { > > + ret = -ENOMEM; > > + goto err_iounmap; > > + } > > + > > + raw_spin_lock_init(&intc_ic->gic_lock); > > + raw_spin_lock_init(&intc_ic->intc_lock); > > + > > + /* Check all the irq numbers valid. If not, unmaps all the base and frees > the data. */ > > + for (i = 0; i < of_irq_count(node); i++) { > > + irq = irq_of_parse_and_map(node, i); > > + if (!irq) { > > + pr_err("Failed to get irq number\n"); > > + ret = -EINVAL; > > + goto err_iounmap; > > + } > > + } > > + > > + for (i = 0; i < of_irq_count(node); i++) { > > + irq = irq_of_parse_and_map(node, i); > > + irq_set_chained_handler_and_data(irq, > aspeed_intc_ic_irq_handler, intc_ic); > > There is an extra tab on this line. OK. Fixed. Thanks a lot. > > regards, > dan carpenter > > > + } > > + > > + return 0; > ^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2024-10-16 9:55 UTC | newest] Thread overview: 18+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-10-09 11:58 [PATCH v3 0/2] Add support for AST2700 INTC driver Kevin Chen 2024-10-09 11:58 ` [PATCH v3 1/2] dt-bindings: interrupt-controller: Add support for ASPEED AST27XX INTC Kevin Chen 2024-10-09 12:56 ` Markus Elfring 2024-10-09 21:11 ` Rob Herring 2024-10-11 10:02 ` Kevin Chen 2024-10-09 11:58 ` [PATCH v3 2/2] irqchip/aspeed-intc: Add support for " Kevin Chen 2024-10-09 12:32 ` Markus Elfring 2024-10-11 10:06 ` Kevin Chen 2024-10-11 15:34 ` Markus Elfring 2024-10-14 2:00 ` Kevin Chen 2024-10-14 13:10 ` Markus Elfring 2024-10-15 10:19 ` Kevin Chen 2024-10-15 15:07 ` Markus Elfring 2024-10-15 21:42 ` Thomas Gleixner 2024-10-16 0:31 ` Kevin Chen 2024-10-16 9:54 ` [v3 " Markus Elfring 2024-10-11 13:06 ` [PATCH v3 " Dan Carpenter 2024-10-14 0:17 ` Kevin Chen
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).