Commit 9b64efa8 authored by Marc Zyngier's avatar Marc Zyngier
Browse files

Merge branch 'irq/ipi-as-irq', remote-tracking branches 'origin/irq/dw' and...


Merge branch 'irq/ipi-as-irq', remote-tracking branches 'origin/irq/dw' and 'origin/irq/owl' into irq/irqchip-next

Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
Loading
Loading
Loading
Loading
+65 −0
Original line number Diff line number Diff line
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/interrupt-controller/actions,owl-sirq.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: Actions Semi Owl SoCs SIRQ interrupt controller

maintainers:
  - Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
  - Cristian Ciocaltea <cristian.ciocaltea@gmail.com>

description: |
  This interrupt controller is found in the Actions Semi Owl SoCs (S500, S700
  and S900) and provides support for handling up to 3 external interrupt lines.

properties:
  compatible:
    enum:
      - actions,s500-sirq
      - actions,s700-sirq
      - actions,s900-sirq

  reg:
    maxItems: 1

  interrupt-controller: true

  '#interrupt-cells':
    const: 2
    description:
      The first cell is the input IRQ number, between 0 and 2, while the second
      cell is the trigger type as defined in interrupt.txt in this directory.

  'interrupts':
    description: |
      Contains the GIC SPI IRQs mapped to the external interrupt lines.
      They shall be specified sequentially from output 0 to 2.
    minItems: 3
    maxItems: 3

required:
  - compatible
  - reg
  - interrupt-controller
  - '#interrupt-cells'
  - 'interrupts'

additionalProperties: false

examples:
  - |
    #include <dt-bindings/interrupt-controller/arm-gic.h>

    sirq: interrupt-controller@b01b0200 {
      compatible = "actions,s500-sirq";
      reg = <0xb01b0200 0x4>;
      interrupt-controller;
      #interrupt-cells = <2>;
      interrupts = <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>, /* SIRQ0 */
                   <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>, /* SIRQ1 */
                   <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>; /* SIRQ2 */
    };

...
+13 −1
Original line number Diff line number Diff line
@@ -2,7 +2,8 @@ Synopsys DesignWare APB interrupt controller (dw_apb_ictl)

Synopsys DesignWare provides interrupt controller IP for APB known as
dw_apb_ictl. The IP is used as secondary interrupt controller in some SoCs with
APB bus, e.g. Marvell Armada 1500.
APB bus, e.g. Marvell Armada 1500. It can also be used as primary interrupt
controller in some SoCs, e.g. Hisilicon SD5203.

Required properties:
- compatible: shall be "snps,dw-apb-ictl"
@@ -10,6 +11,8 @@ Required properties:
  region starting with ENABLE_LOW register
- interrupt-controller: identifies the node as an interrupt controller
- #interrupt-cells: number of cells to encode an interrupt-specifier, shall be 1

Additional required property when it's used as secondary interrupt controller:
- interrupts: interrupt reference to primary interrupt controller

The interrupt sources map to the corresponding bits in the interrupt
@@ -21,6 +24,7 @@ registers, i.e.
- (optional) fast interrupts start at 64.

Example:
	/* dw_apb_ictl is used as secondary interrupt controller */
	aic: interrupt-controller@3000 {
		compatible = "snps,dw-apb-ictl";
		reg = <0x3000 0xc00>;
@@ -29,3 +33,11 @@ Example:
		interrupt-parent = <&gic>;
		interrupts = <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>;
	};

	/* dw_apb_ictl is used as primary interrupt controller */
	vic: interrupt-controller@10130000 {
		compatible = "snps,dw-apb-ictl";
		reg = <0x10130000 0x1000>;
		interrupt-controller;
		#interrupt-cells = <1>;
	};
+2 −0
Original line number Diff line number Diff line
@@ -1525,6 +1525,7 @@ F: Documentation/devicetree/bindings/arm/actions.yaml
F:	Documentation/devicetree/bindings/clock/actions,owl-cmu.txt
F:	Documentation/devicetree/bindings/dma/owl-dma.txt
F:	Documentation/devicetree/bindings/i2c/i2c-owl.txt
F:	Documentation/devicetree/bindings/interrupt-controller/actions,owl-sirq.yaml
F:	Documentation/devicetree/bindings/mmc/owl-mmc.yaml
F:	Documentation/devicetree/bindings/pinctrl/actions,s900-pinctrl.txt
F:	Documentation/devicetree/bindings/power/actions,owl-sps.txt
@@ -1536,6 +1537,7 @@ F: drivers/clk/actions/
F:	drivers/clocksource/timer-owl*
F:	drivers/dma/owl-dma.c
F:	drivers/i2c/busses/i2c-owl.c
F:	drivers/irqchip/irq-owl-sirq.c
F:	drivers/mmc/host/owl-mmc.c
F:	drivers/pinctrl/actions/*
F:	drivers/soc/actions/
+17 −13
Original line number Diff line number Diff line
@@ -85,7 +85,6 @@ static int nr_ipi __read_mostly = NR_IPI;
static struct irq_desc *ipi_desc[MAX_IPI] __read_mostly;

static void ipi_setup(int cpu);
static void ipi_teardown(int cpu);

static DECLARE_COMPLETION(cpu_running);

@@ -236,6 +235,17 @@ int platform_can_hotplug_cpu(unsigned int cpu)
	return cpu != 0;
}

static void ipi_teardown(int cpu)
{
	int i;

	if (WARN_ON_ONCE(!ipi_irq_base))
		return;

	for (i = 0; i < nr_ipi; i++)
		disable_percpu_irq(ipi_irq_base + i);
}

/*
 * __cpu_disable runs on the processor to be shutdown.
 */
@@ -531,7 +541,12 @@ void show_ipi_list(struct seq_file *p, int prec)
	unsigned int cpu, i;

	for (i = 0; i < NR_IPI; i++) {
		unsigned int irq = irq_desc_get_irq(ipi_desc[i]);
		unsigned int irq;

		if (!ipi_desc[i])
			continue;

		irq = irq_desc_get_irq(ipi_desc[i]);
		seq_printf(p, "%*s%u: ", prec - 1, "IPI", i);

		for_each_online_cpu(cpu)
@@ -707,17 +722,6 @@ static void ipi_setup(int cpu)
		enable_percpu_irq(ipi_irq_base + i, 0);
}

static void ipi_teardown(int cpu)
{
	int i;

	if (WARN_ON_ONCE(!ipi_irq_base))
		return;

	for (i = 0; i < nr_ipi; i++)
		disable_percpu_irq(ipi_irq_base + i);
}

void __init set_smp_ipi_range(int ipi_base, int n)
{
	int i;
+3 −1
Original line number Diff line number Diff line
@@ -82,9 +82,9 @@ static int nr_ipi __read_mostly = NR_IPI;
static struct irq_desc *ipi_desc[NR_IPI] __read_mostly;

static void ipi_setup(int cpu);
static void ipi_teardown(int cpu);

#ifdef CONFIG_HOTPLUG_CPU
static void ipi_teardown(int cpu);
static int op_cpu_kill(unsigned int cpu);
#else
static inline int op_cpu_kill(unsigned int cpu)
@@ -964,6 +964,7 @@ static void ipi_setup(int cpu)
		enable_percpu_irq(ipi_irq_base + i, 0);
}

#ifdef CONFIG_HOTPLUG_CPU
static void ipi_teardown(int cpu)
{
	int i;
@@ -974,6 +975,7 @@ static void ipi_teardown(int cpu)
	for (i = 0; i < nr_ipi; i++)
		disable_percpu_irq(ipi_irq_base + i);
}
#endif

void __init set_smp_ipi_range(int ipi_base, int n)
{
Loading