···11+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)22+%YAML 1.233+---44+$id: http://devicetree.org/schemas/interrupt-controller/actions,owl-sirq.yaml#55+$schema: http://devicetree.org/meta-schemas/core.yaml#66+77+title: Actions Semi Owl SoCs SIRQ interrupt controller88+99+maintainers:1010+ - Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>1111+ - Cristian Ciocaltea <cristian.ciocaltea@gmail.com>1212+1313+description: |1414+ This interrupt controller is found in the Actions Semi Owl SoCs (S500, S7001515+ and S900) and provides support for handling up to 3 external interrupt lines.1616+1717+properties:1818+ compatible:1919+ enum:2020+ - actions,s500-sirq2121+ - actions,s700-sirq2222+ - actions,s900-sirq2323+2424+ reg:2525+ maxItems: 12626+2727+ interrupt-controller: true2828+2929+ '#interrupt-cells':3030+ const: 23131+ description:3232+ The first cell is the input IRQ number, between 0 and 2, while the second3333+ cell is the trigger type as defined in interrupt.txt in this directory.3434+3535+ 'interrupts':3636+ description: |3737+ Contains the GIC SPI IRQs mapped to the external interrupt lines.3838+ They shall be specified sequentially from output 0 to 2.3939+ minItems: 34040+ maxItems: 34141+4242+required:4343+ - compatible4444+ - reg4545+ - interrupt-controller4646+ - '#interrupt-cells'4747+ - 'interrupts'4848+4949+additionalProperties: false5050+5151+examples:5252+ - |5353+ #include <dt-bindings/interrupt-controller/arm-gic.h>5454+5555+ sirq: interrupt-controller@b01b0200 {5656+ compatible = "actions,s500-sirq";5757+ reg = <0xb01b0200 0x4>;5858+ interrupt-controller;5959+ #interrupt-cells = <2>;6060+ interrupts = <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>, /* SIRQ0 */6161+ <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>, /* SIRQ1 */6262+ <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>; /* SIRQ2 */6363+ };6464+6565+...
···2233Synopsys DesignWare provides interrupt controller IP for APB known as44dw_apb_ictl. The IP is used as secondary interrupt controller in some SoCs with55-APB bus, e.g. Marvell Armada 1500.55+APB bus, e.g. Marvell Armada 1500. It can also be used as primary interrupt66+controller in some SoCs, e.g. Hisilicon SD5203.6778Required properties:89- compatible: shall be "snps,dw-apb-ictl"···1110 region starting with ENABLE_LOW register1211- interrupt-controller: identifies the node as an interrupt controller1312- #interrupt-cells: number of cells to encode an interrupt-specifier, shall be 11313+1414+Additional required property when it's used as secondary interrupt controller:1415- interrupts: interrupt reference to primary interrupt controller15161617The interrupt sources map to the corresponding bits in the interrupt···2421- (optional) fast interrupts start at 64.25222623Example:2424+ /* dw_apb_ictl is used as secondary interrupt controller */2725 aic: interrupt-controller@3000 {2826 compatible = "snps,dw-apb-ictl";2927 reg = <0x3000 0xc00>;···3228 #interrupt-cells = <1>;3329 interrupt-parent = <&gic>;3430 interrupts = <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>;3131+ };3232+3333+ /* dw_apb_ictl is used as primary interrupt controller */3434+ vic: interrupt-controller@10130000 {3535+ compatible = "snps,dw-apb-ictl";3636+ reg = <0x10130000 0x1000>;3737+ interrupt-controller;3838+ #interrupt-cells = <1>;3539 };
···8585static struct irq_desc *ipi_desc[MAX_IPI] __read_mostly;86868787static void ipi_setup(int cpu);8888-static void ipi_teardown(int cpu);89889089static DECLARE_COMPLETION(cpu_running);9190···233234 * of clock tick interrupts.234235 */235236 return cpu != 0;237237+}238238+239239+static void ipi_teardown(int cpu)240240+{241241+ int i;242242+243243+ if (WARN_ON_ONCE(!ipi_irq_base))244244+ return;245245+246246+ for (i = 0; i < nr_ipi; i++)247247+ disable_percpu_irq(ipi_irq_base + i);236248}237249238250/*···541531 unsigned int cpu, i;542532543533 for (i = 0; i < NR_IPI; i++) {544544- unsigned int irq = irq_desc_get_irq(ipi_desc[i]);534534+ unsigned int irq;535535+536536+ if (!ipi_desc[i])537537+ continue;538538+539539+ irq = irq_desc_get_irq(ipi_desc[i]);545540 seq_printf(p, "%*s%u: ", prec - 1, "IPI", i);546541547542 for_each_online_cpu(cpu)···720705721706 for (i = 0; i < nr_ipi; i++)722707 enable_percpu_irq(ipi_irq_base + i, 0);723723-}724724-725725-static void ipi_teardown(int cpu)726726-{727727- int i;728728-729729- if (WARN_ON_ONCE(!ipi_irq_base))730730- return;731731-732732- for (i = 0; i < nr_ipi; i++)733733- disable_percpu_irq(ipi_irq_base + i);734708}735709736710void __init set_smp_ipi_range(int ipi_base, int n)
+3-1
arch/arm64/kernel/smp.c
···8282static struct irq_desc *ipi_desc[NR_IPI] __read_mostly;83838484static void ipi_setup(int cpu);8585-static void ipi_teardown(int cpu);86858786#ifdef CONFIG_HOTPLUG_CPU8787+static void ipi_teardown(int cpu);8888static int op_cpu_kill(unsigned int cpu);8989#else9090static inline int op_cpu_kill(unsigned int cpu)···964964 enable_percpu_irq(ipi_irq_base + i, 0);965965}966966967967+#ifdef CONFIG_HOTPLUG_CPU967968static void ipi_teardown(int cpu)968969{969970 int i;···975974 for (i = 0; i < nr_ipi; i++)976975 disable_percpu_irq(ipi_irq_base + i);977976}977977+#endif978978979979void __init set_smp_ipi_range(int ipi_base, int n)980980{