All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Måns Rullgård" <mans@mansr.com>
To: Arnd Bergmann <arnd@kernel.org>
Cc: linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org, Marc Zyngier <maz@kernel.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	Arnd Bergmann <arnd@arndb.de>,
	Marc Gonzalez <marc.w.gonzalez@free.fr>
Subject: Re: [PATCH 1/2] irqchip: remove sigma tango driver
Date: Thu, 21 Jan 2021 13:52:21 +0000	[thread overview]
Message-ID: <yw1xh7naz9be.fsf@mansr.com> (raw)
In-Reply-To: <20210120133008.2421897-2-arnd@kernel.org> (Arnd Bergmann's message of "Wed, 20 Jan 2021 14:30:07 +0100")

Arnd Bergmann <arnd@kernel.org> writes:

> From: Arnd Bergmann <arnd@arndb.de>
>
> The tango platform is getting removed, so the driver is no
> longer needed.
>
> Cc: Marc Gonzalez <marc.w.gonzalez@free.fr>
> Cc: Mans Rullgard <mans@mansr.com>
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>

Acked-by: Mans Rullgard <mans@mansr.com>

> ---
>  .../sigma,smp8642-intc.txt                    |  48 ----
>  drivers/irqchip/Kconfig                       |   5 -
>  drivers/irqchip/Makefile                      |   1 -
>  drivers/irqchip/irq-tango.c                   | 227 ------------------
>  4 files changed, 281 deletions(-)
>  delete mode 100644 Documentation/devicetree/bindings/interrupt-controller/sigma,smp8642-intc.txt
>  delete mode 100644 drivers/irqchip/irq-tango.c
>
> diff --git a/Documentation/devicetree/bindings/interrupt-controller/sigma,smp8642-intc.txt b/Documentation/devicetree/bindings/interrupt-controller/sigma,smp8642-intc.txt
> deleted file mode 100644
> index 355c18a3a4d3..000000000000
> --- a/Documentation/devicetree/bindings/interrupt-controller/sigma,smp8642-intc.txt
> +++ /dev/null
> @@ -1,48 +0,0 @@
> -Sigma Designs SMP86xx/SMP87xx secondary interrupt controller
> -
> -Required properties:
> -- compatible: should be "sigma,smp8642-intc"
>
> -- reg: physical address of MMIO region
> -- ranges: address space mapping of child nodes
> -- interrupt-controller: boolean
> -- #address-cells: should be <1>
> -- #size-cells: should be <1>
> -
> -One child node per control block with properties:
> -- reg: address of registers for this control block
> -- interrupt-controller: boolean
> -- #interrupt-cells: should be <2>, interrupt index and flags per interrupts.txt
> -- interrupts: interrupt spec of primary interrupt controller
> -
> -Example:
> -
> -interrupt-controller@6e000 {
> -	compatible = "sigma,smp8642-intc";
> -	reg = <0x6e000 0x400>;
> -	ranges = <0x0 0x6e000 0x400>;
> -	interrupt-parent = <&gic>;
> -	interrupt-controller;
> -	#address-cells = <1>;
> -	#size-cells = <1>;
> -
> -	irq0: interrupt-controller@0 {
> -		reg = <0x000 0x100>;
> -		interrupt-controller;
> -		#interrupt-cells = <2>;
> -		interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>;
> -	};
> -
> -	irq1: interrupt-controller@100 {
> -		reg = <0x100 0x100>;
> -		interrupt-controller;
> -		#interrupt-cells = <2>;
> -		interrupts = <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>;
> -	};
> -
> -	irq2: interrupt-controller@300 {
> -		reg = <0x300 0x100>;
> -		interrupt-controller;
> -		#interrupt-cells = <2>;
> -		interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>;
> -	};
> -};
>
> diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig
> index 94920a51c628..f95d114c63ed 100644
> --- a/drivers/irqchip/Kconfig
> +++ b/drivers/irqchip/Kconfig
> @@ -260,11 +260,6 @@ config ST_IRQCHIP
>  	help
>  	  Enables SysCfg Controlled IRQs on STi based platforms.
>
> -config TANGO_IRQ
> -	bool
> -	select IRQ_DOMAIN
> -	select GENERIC_IRQ_CHIP
> -
>  config TB10X_IRQC
>  	bool
>  	select IRQ_DOMAIN
> diff --git a/drivers/irqchip/Makefile b/drivers/irqchip/Makefile
> index 0ac93bfaec61..084e11774071 100644
> --- a/drivers/irqchip/Makefile
> +++ b/drivers/irqchip/Makefile
> @@ -55,7 +55,6 @@ obj-$(CONFIG_VERSATILE_FPGA_IRQ)	+= irq-versatile-fpga.o
>  obj-$(CONFIG_ARCH_NSPIRE)		+= irq-zevio.o
>  obj-$(CONFIG_ARCH_VT8500)		+= irq-vt8500.o
>  obj-$(CONFIG_ST_IRQCHIP)		+= irq-st.o
> -obj-$(CONFIG_TANGO_IRQ)			+= irq-tango.o
>  obj-$(CONFIG_TB10X_IRQC)		+= irq-tb10x.o
>  obj-$(CONFIG_TS4800_IRQ)		+= irq-ts4800.o
>  obj-$(CONFIG_XTENSA)			+= irq-xtensa-pic.o
> diff --git a/drivers/irqchip/irq-tango.c b/drivers/irqchip/irq-tango.c
> deleted file mode 100644
> index 34290f09b853..000000000000
> --- a/drivers/irqchip/irq-tango.c
> +++ /dev/null
> @@ -1,227 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0-or-later
> -/*
> - * Copyright (C) 2014 Mans Rullgard <mans@mansr.com>
> - */
> -
> -#include <linux/init.h>
> -#include <linux/irq.h>
> -#include <linux/irqchip.h>
> -#include <linux/irqchip/chained_irq.h>
> -#include <linux/ioport.h>
> -#include <linux/io.h>
> -#include <linux/of_address.h>
> -#include <linux/of_irq.h>
> -#include <linux/slab.h>
> -
> -#define IRQ0_CTL_BASE		0x0000
> -#define IRQ1_CTL_BASE		0x0100
> -#define EDGE_CTL_BASE		0x0200
> -#define IRQ2_CTL_BASE		0x0300
> -
> -#define IRQ_CTL_HI		0x18
> -#define EDGE_CTL_HI		0x20
> -
> -#define IRQ_STATUS		0x00
> -#define IRQ_RAWSTAT		0x04
> -#define IRQ_EN_SET		0x08
> -#define IRQ_EN_CLR		0x0c
> -#define IRQ_SOFT_SET		0x10
> -#define IRQ_SOFT_CLR		0x14
> -
> -#define EDGE_STATUS		0x00
> -#define EDGE_RAWSTAT		0x04
> -#define EDGE_CFG_RISE		0x08
> -#define EDGE_CFG_FALL		0x0c
> -#define EDGE_CFG_RISE_SET	0x10
> -#define EDGE_CFG_RISE_CLR	0x14
> -#define EDGE_CFG_FALL_SET	0x18
> -#define EDGE_CFG_FALL_CLR	0x1c
> -
> -struct tangox_irq_chip {
> -	void __iomem *base;
> -	unsigned long ctl;
> -};
> -
> -static inline u32 intc_readl(struct tangox_irq_chip *chip, int reg)
> -{
> -	return readl_relaxed(chip->base + reg);
> -}
> -
> -static inline void intc_writel(struct tangox_irq_chip *chip, int reg, u32 val)
> -{
> -	writel_relaxed(val, chip->base + reg);
> -}
> -
> -static void tangox_dispatch_irqs(struct irq_domain *dom, unsigned int status,
> -				 int base)
> -{
> -	unsigned int hwirq;
> -	unsigned int virq;
> -
> -	while (status) {
> -		hwirq = __ffs(status);
> -		virq = irq_find_mapping(dom, base + hwirq);
> -		if (virq)
> -			generic_handle_irq(virq);
> -		status &= ~BIT(hwirq);
> -	}
> -}
> -
> -static void tangox_irq_handler(struct irq_desc *desc)
> -{
> -	struct irq_domain *dom = irq_desc_get_handler_data(desc);
> -	struct irq_chip *host_chip = irq_desc_get_chip(desc);
> -	struct tangox_irq_chip *chip = dom->host_data;
> -	unsigned int status_lo, status_hi;
> -
> -	chained_irq_enter(host_chip, desc);
> -
> -	status_lo = intc_readl(chip, chip->ctl + IRQ_STATUS);
> -	status_hi = intc_readl(chip, chip->ctl + IRQ_CTL_HI + IRQ_STATUS);
> -
> -	tangox_dispatch_irqs(dom, status_lo, 0);
> -	tangox_dispatch_irqs(dom, status_hi, 32);
> -
> -	chained_irq_exit(host_chip, desc);
> -}
> -
> -static int tangox_irq_set_type(struct irq_data *d, unsigned int flow_type)
> -{
> -	struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
> -	struct tangox_irq_chip *chip = gc->domain->host_data;
> -	struct irq_chip_regs *regs = &gc->chip_types[0].regs;
> -
> -	switch (flow_type & IRQ_TYPE_SENSE_MASK) {
> -	case IRQ_TYPE_EDGE_RISING:
> -		intc_writel(chip, regs->type + EDGE_CFG_RISE_SET, d->mask);
> -		intc_writel(chip, regs->type + EDGE_CFG_FALL_CLR, d->mask);
> -		break;
> -
> -	case IRQ_TYPE_EDGE_FALLING:
> -		intc_writel(chip, regs->type + EDGE_CFG_RISE_CLR, d->mask);
> -		intc_writel(chip, regs->type + EDGE_CFG_FALL_SET, d->mask);
> -		break;
> -
> -	case IRQ_TYPE_LEVEL_HIGH:
> -		intc_writel(chip, regs->type + EDGE_CFG_RISE_CLR, d->mask);
> -		intc_writel(chip, regs->type + EDGE_CFG_FALL_CLR, d->mask);
> -		break;
> -
> -	case IRQ_TYPE_LEVEL_LOW:
> -		intc_writel(chip, regs->type + EDGE_CFG_RISE_SET, d->mask);
> -		intc_writel(chip, regs->type + EDGE_CFG_FALL_SET, d->mask);
> -		break;
> -
> -	default:
> -		pr_err("Invalid trigger mode %x for IRQ %d\n",
> -		       flow_type, d->irq);
> -		return -EINVAL;
> -	}
> -
> -	return irq_setup_alt_chip(d, flow_type);
> -}
> -
> -static void __init tangox_irq_init_chip(struct irq_chip_generic *gc,
> -					unsigned long ctl_offs,
> -					unsigned long edge_offs)
> -{
> -	struct tangox_irq_chip *chip = gc->domain->host_data;
> -	struct irq_chip_type *ct = gc->chip_types;
> -	unsigned long ctl_base = chip->ctl + ctl_offs;
> -	unsigned long edge_base = EDGE_CTL_BASE + edge_offs;
> -	int i;
> -
> -	gc->reg_base = chip->base;
> -	gc->unused = 0;
> -
> -	for (i = 0; i < 2; i++) {
> -		ct[i].chip.irq_ack = irq_gc_ack_set_bit;
> -		ct[i].chip.irq_mask = irq_gc_mask_disable_reg;
> -		ct[i].chip.irq_mask_ack = irq_gc_mask_disable_and_ack_set;
> -		ct[i].chip.irq_unmask = irq_gc_unmask_enable_reg;
> -		ct[i].chip.irq_set_type = tangox_irq_set_type;
> -		ct[i].chip.name = gc->domain->name;
> -
> -		ct[i].regs.enable = ctl_base + IRQ_EN_SET;
> -		ct[i].regs.disable = ctl_base + IRQ_EN_CLR;
> -		ct[i].regs.ack = edge_base + EDGE_RAWSTAT;
> -		ct[i].regs.type = edge_base;
> -	}
> -
> -	ct[0].type = IRQ_TYPE_LEVEL_MASK;
> -	ct[0].handler = handle_level_irq;
> -
> -	ct[1].type = IRQ_TYPE_EDGE_BOTH;
> -	ct[1].handler = handle_edge_irq;
> -
> -	intc_writel(chip, ct->regs.disable, 0xffffffff);
> -	intc_writel(chip, ct->regs.ack, 0xffffffff);
> -}
> -
> -static void __init tangox_irq_domain_init(struct irq_domain *dom)
> -{
> -	struct irq_chip_generic *gc;
> -	int i;
> -
> -	for (i = 0; i < 2; i++) {
> -		gc = irq_get_domain_generic_chip(dom, i * 32);
> -		tangox_irq_init_chip(gc, i * IRQ_CTL_HI, i * EDGE_CTL_HI);
> -	}
> -}
> -
> -static int __init tangox_irq_init(void __iomem *base, struct resource *baseres,
> -				  struct device_node *node)
> -{
> -	struct tangox_irq_chip *chip;
> -	struct irq_domain *dom;
> -	struct resource res;
> -	int irq;
> -	int err;
> -
> -	irq = irq_of_parse_and_map(node, 0);
> -	if (!irq)
> -		panic("%pOFn: failed to get IRQ", node);
> -
> -	err = of_address_to_resource(node, 0, &res);
> -	if (err)
> -		panic("%pOFn: failed to get address", node);
> -
> -	chip = kzalloc(sizeof(*chip), GFP_KERNEL);
> -	chip->ctl = res.start - baseres->start;
> -	chip->base = base;
> -
> -	dom = irq_domain_add_linear(node, 64, &irq_generic_chip_ops, chip);
> -	if (!dom)
> -		panic("%pOFn: failed to create irqdomain", node);
> -
> -	err = irq_alloc_domain_generic_chips(dom, 32, 2, node->name,
> -					     handle_level_irq, 0, 0, 0);
> -	if (err)
> -		panic("%pOFn: failed to allocate irqchip", node);
> -
> -	tangox_irq_domain_init(dom);
> -
> -	irq_set_chained_handler_and_data(irq, tangox_irq_handler, dom);
> -
> -	return 0;
> -}
> -
> -static int __init tangox_of_irq_init(struct device_node *node,
> -				     struct device_node *parent)
> -{
> -	struct device_node *c;
> -	struct resource res;
> -	void __iomem *base;
> -
> -	base = of_iomap(node, 0);
> -	if (!base)
> -		panic("%pOFn: of_iomap failed", node);
> -
> -	of_address_to_resource(node, 0, &res);
> -
> -	for_each_child_of_node(node, c)
> -		tangox_irq_init(base, &res, c);
> -
> -	return 0;
> -}
> -IRQCHIP_DECLARE(tangox_intc, "sigma,smp8642-intc", tangox_of_irq_init);
> -- 
>
> 2.29.2
>

-- 
Måns Rullgård

WARNING: multiple messages have this Message-ID (diff)
From: "Måns Rullgård" <mans@mansr.com>
To: Arnd Bergmann <arnd@kernel.org>
Cc: Arnd Bergmann <arnd@arndb.de>,
	Marc Gonzalez <marc.w.gonzalez@free.fr>,
	Marc Zyngier <maz@kernel.org>,
	linux-kernel@vger.kernel.org,
	Thomas Gleixner <tglx@linutronix.de>,
	linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH 1/2] irqchip: remove sigma tango driver
Date: Thu, 21 Jan 2021 13:52:21 +0000	[thread overview]
Message-ID: <yw1xh7naz9be.fsf@mansr.com> (raw)
In-Reply-To: <20210120133008.2421897-2-arnd@kernel.org> (Arnd Bergmann's message of "Wed, 20 Jan 2021 14:30:07 +0100")

Arnd Bergmann <arnd@kernel.org> writes:

> From: Arnd Bergmann <arnd@arndb.de>
>
> The tango platform is getting removed, so the driver is no
> longer needed.
>
> Cc: Marc Gonzalez <marc.w.gonzalez@free.fr>
> Cc: Mans Rullgard <mans@mansr.com>
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>

Acked-by: Mans Rullgard <mans@mansr.com>

> ---
>  .../sigma,smp8642-intc.txt                    |  48 ----
>  drivers/irqchip/Kconfig                       |   5 -
>  drivers/irqchip/Makefile                      |   1 -
>  drivers/irqchip/irq-tango.c                   | 227 ------------------
>  4 files changed, 281 deletions(-)
>  delete mode 100644 Documentation/devicetree/bindings/interrupt-controller/sigma,smp8642-intc.txt
>  delete mode 100644 drivers/irqchip/irq-tango.c
>
> diff --git a/Documentation/devicetree/bindings/interrupt-controller/sigma,smp8642-intc.txt b/Documentation/devicetree/bindings/interrupt-controller/sigma,smp8642-intc.txt
> deleted file mode 100644
> index 355c18a3a4d3..000000000000
> --- a/Documentation/devicetree/bindings/interrupt-controller/sigma,smp8642-intc.txt
> +++ /dev/null
> @@ -1,48 +0,0 @@
> -Sigma Designs SMP86xx/SMP87xx secondary interrupt controller
> -
> -Required properties:
> -- compatible: should be "sigma,smp8642-intc"
>
> -- reg: physical address of MMIO region
> -- ranges: address space mapping of child nodes
> -- interrupt-controller: boolean
> -- #address-cells: should be <1>
> -- #size-cells: should be <1>
> -
> -One child node per control block with properties:
> -- reg: address of registers for this control block
> -- interrupt-controller: boolean
> -- #interrupt-cells: should be <2>, interrupt index and flags per interrupts.txt
> -- interrupts: interrupt spec of primary interrupt controller
> -
> -Example:
> -
> -interrupt-controller@6e000 {
> -	compatible = "sigma,smp8642-intc";
> -	reg = <0x6e000 0x400>;
> -	ranges = <0x0 0x6e000 0x400>;
> -	interrupt-parent = <&gic>;
> -	interrupt-controller;
> -	#address-cells = <1>;
> -	#size-cells = <1>;
> -
> -	irq0: interrupt-controller@0 {
> -		reg = <0x000 0x100>;
> -		interrupt-controller;
> -		#interrupt-cells = <2>;
> -		interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>;
> -	};
> -
> -	irq1: interrupt-controller@100 {
> -		reg = <0x100 0x100>;
> -		interrupt-controller;
> -		#interrupt-cells = <2>;
> -		interrupts = <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>;
> -	};
> -
> -	irq2: interrupt-controller@300 {
> -		reg = <0x300 0x100>;
> -		interrupt-controller;
> -		#interrupt-cells = <2>;
> -		interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>;
> -	};
> -};
>
> diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig
> index 94920a51c628..f95d114c63ed 100644
> --- a/drivers/irqchip/Kconfig
> +++ b/drivers/irqchip/Kconfig
> @@ -260,11 +260,6 @@ config ST_IRQCHIP
>  	help
>  	  Enables SysCfg Controlled IRQs on STi based platforms.
>
> -config TANGO_IRQ
> -	bool
> -	select IRQ_DOMAIN
> -	select GENERIC_IRQ_CHIP
> -
>  config TB10X_IRQC
>  	bool
>  	select IRQ_DOMAIN
> diff --git a/drivers/irqchip/Makefile b/drivers/irqchip/Makefile
> index 0ac93bfaec61..084e11774071 100644
> --- a/drivers/irqchip/Makefile
> +++ b/drivers/irqchip/Makefile
> @@ -55,7 +55,6 @@ obj-$(CONFIG_VERSATILE_FPGA_IRQ)	+= irq-versatile-fpga.o
>  obj-$(CONFIG_ARCH_NSPIRE)		+= irq-zevio.o
>  obj-$(CONFIG_ARCH_VT8500)		+= irq-vt8500.o
>  obj-$(CONFIG_ST_IRQCHIP)		+= irq-st.o
> -obj-$(CONFIG_TANGO_IRQ)			+= irq-tango.o
>  obj-$(CONFIG_TB10X_IRQC)		+= irq-tb10x.o
>  obj-$(CONFIG_TS4800_IRQ)		+= irq-ts4800.o
>  obj-$(CONFIG_XTENSA)			+= irq-xtensa-pic.o
> diff --git a/drivers/irqchip/irq-tango.c b/drivers/irqchip/irq-tango.c
> deleted file mode 100644
> index 34290f09b853..000000000000
> --- a/drivers/irqchip/irq-tango.c
> +++ /dev/null
> @@ -1,227 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0-or-later
> -/*
> - * Copyright (C) 2014 Mans Rullgard <mans@mansr.com>
> - */
> -
> -#include <linux/init.h>
> -#include <linux/irq.h>
> -#include <linux/irqchip.h>
> -#include <linux/irqchip/chained_irq.h>
> -#include <linux/ioport.h>
> -#include <linux/io.h>
> -#include <linux/of_address.h>
> -#include <linux/of_irq.h>
> -#include <linux/slab.h>
> -
> -#define IRQ0_CTL_BASE		0x0000
> -#define IRQ1_CTL_BASE		0x0100
> -#define EDGE_CTL_BASE		0x0200
> -#define IRQ2_CTL_BASE		0x0300
> -
> -#define IRQ_CTL_HI		0x18
> -#define EDGE_CTL_HI		0x20
> -
> -#define IRQ_STATUS		0x00
> -#define IRQ_RAWSTAT		0x04
> -#define IRQ_EN_SET		0x08
> -#define IRQ_EN_CLR		0x0c
> -#define IRQ_SOFT_SET		0x10
> -#define IRQ_SOFT_CLR		0x14
> -
> -#define EDGE_STATUS		0x00
> -#define EDGE_RAWSTAT		0x04
> -#define EDGE_CFG_RISE		0x08
> -#define EDGE_CFG_FALL		0x0c
> -#define EDGE_CFG_RISE_SET	0x10
> -#define EDGE_CFG_RISE_CLR	0x14
> -#define EDGE_CFG_FALL_SET	0x18
> -#define EDGE_CFG_FALL_CLR	0x1c
> -
> -struct tangox_irq_chip {
> -	void __iomem *base;
> -	unsigned long ctl;
> -};
> -
> -static inline u32 intc_readl(struct tangox_irq_chip *chip, int reg)
> -{
> -	return readl_relaxed(chip->base + reg);
> -}
> -
> -static inline void intc_writel(struct tangox_irq_chip *chip, int reg, u32 val)
> -{
> -	writel_relaxed(val, chip->base + reg);
> -}
> -
> -static void tangox_dispatch_irqs(struct irq_domain *dom, unsigned int status,
> -				 int base)
> -{
> -	unsigned int hwirq;
> -	unsigned int virq;
> -
> -	while (status) {
> -		hwirq = __ffs(status);
> -		virq = irq_find_mapping(dom, base + hwirq);
> -		if (virq)
> -			generic_handle_irq(virq);
> -		status &= ~BIT(hwirq);
> -	}
> -}
> -
> -static void tangox_irq_handler(struct irq_desc *desc)
> -{
> -	struct irq_domain *dom = irq_desc_get_handler_data(desc);
> -	struct irq_chip *host_chip = irq_desc_get_chip(desc);
> -	struct tangox_irq_chip *chip = dom->host_data;
> -	unsigned int status_lo, status_hi;
> -
> -	chained_irq_enter(host_chip, desc);
> -
> -	status_lo = intc_readl(chip, chip->ctl + IRQ_STATUS);
> -	status_hi = intc_readl(chip, chip->ctl + IRQ_CTL_HI + IRQ_STATUS);
> -
> -	tangox_dispatch_irqs(dom, status_lo, 0);
> -	tangox_dispatch_irqs(dom, status_hi, 32);
> -
> -	chained_irq_exit(host_chip, desc);
> -}
> -
> -static int tangox_irq_set_type(struct irq_data *d, unsigned int flow_type)
> -{
> -	struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
> -	struct tangox_irq_chip *chip = gc->domain->host_data;
> -	struct irq_chip_regs *regs = &gc->chip_types[0].regs;
> -
> -	switch (flow_type & IRQ_TYPE_SENSE_MASK) {
> -	case IRQ_TYPE_EDGE_RISING:
> -		intc_writel(chip, regs->type + EDGE_CFG_RISE_SET, d->mask);
> -		intc_writel(chip, regs->type + EDGE_CFG_FALL_CLR, d->mask);
> -		break;
> -
> -	case IRQ_TYPE_EDGE_FALLING:
> -		intc_writel(chip, regs->type + EDGE_CFG_RISE_CLR, d->mask);
> -		intc_writel(chip, regs->type + EDGE_CFG_FALL_SET, d->mask);
> -		break;
> -
> -	case IRQ_TYPE_LEVEL_HIGH:
> -		intc_writel(chip, regs->type + EDGE_CFG_RISE_CLR, d->mask);
> -		intc_writel(chip, regs->type + EDGE_CFG_FALL_CLR, d->mask);
> -		break;
> -
> -	case IRQ_TYPE_LEVEL_LOW:
> -		intc_writel(chip, regs->type + EDGE_CFG_RISE_SET, d->mask);
> -		intc_writel(chip, regs->type + EDGE_CFG_FALL_SET, d->mask);
> -		break;
> -
> -	default:
> -		pr_err("Invalid trigger mode %x for IRQ %d\n",
> -		       flow_type, d->irq);
> -		return -EINVAL;
> -	}
> -
> -	return irq_setup_alt_chip(d, flow_type);
> -}
> -
> -static void __init tangox_irq_init_chip(struct irq_chip_generic *gc,
> -					unsigned long ctl_offs,
> -					unsigned long edge_offs)
> -{
> -	struct tangox_irq_chip *chip = gc->domain->host_data;
> -	struct irq_chip_type *ct = gc->chip_types;
> -	unsigned long ctl_base = chip->ctl + ctl_offs;
> -	unsigned long edge_base = EDGE_CTL_BASE + edge_offs;
> -	int i;
> -
> -	gc->reg_base = chip->base;
> -	gc->unused = 0;
> -
> -	for (i = 0; i < 2; i++) {
> -		ct[i].chip.irq_ack = irq_gc_ack_set_bit;
> -		ct[i].chip.irq_mask = irq_gc_mask_disable_reg;
> -		ct[i].chip.irq_mask_ack = irq_gc_mask_disable_and_ack_set;
> -		ct[i].chip.irq_unmask = irq_gc_unmask_enable_reg;
> -		ct[i].chip.irq_set_type = tangox_irq_set_type;
> -		ct[i].chip.name = gc->domain->name;
> -
> -		ct[i].regs.enable = ctl_base + IRQ_EN_SET;
> -		ct[i].regs.disable = ctl_base + IRQ_EN_CLR;
> -		ct[i].regs.ack = edge_base + EDGE_RAWSTAT;
> -		ct[i].regs.type = edge_base;
> -	}
> -
> -	ct[0].type = IRQ_TYPE_LEVEL_MASK;
> -	ct[0].handler = handle_level_irq;
> -
> -	ct[1].type = IRQ_TYPE_EDGE_BOTH;
> -	ct[1].handler = handle_edge_irq;
> -
> -	intc_writel(chip, ct->regs.disable, 0xffffffff);
> -	intc_writel(chip, ct->regs.ack, 0xffffffff);
> -}
> -
> -static void __init tangox_irq_domain_init(struct irq_domain *dom)
> -{
> -	struct irq_chip_generic *gc;
> -	int i;
> -
> -	for (i = 0; i < 2; i++) {
> -		gc = irq_get_domain_generic_chip(dom, i * 32);
> -		tangox_irq_init_chip(gc, i * IRQ_CTL_HI, i * EDGE_CTL_HI);
> -	}
> -}
> -
> -static int __init tangox_irq_init(void __iomem *base, struct resource *baseres,
> -				  struct device_node *node)
> -{
> -	struct tangox_irq_chip *chip;
> -	struct irq_domain *dom;
> -	struct resource res;
> -	int irq;
> -	int err;
> -
> -	irq = irq_of_parse_and_map(node, 0);
> -	if (!irq)
> -		panic("%pOFn: failed to get IRQ", node);
> -
> -	err = of_address_to_resource(node, 0, &res);
> -	if (err)
> -		panic("%pOFn: failed to get address", node);
> -
> -	chip = kzalloc(sizeof(*chip), GFP_KERNEL);
> -	chip->ctl = res.start - baseres->start;
> -	chip->base = base;
> -
> -	dom = irq_domain_add_linear(node, 64, &irq_generic_chip_ops, chip);
> -	if (!dom)
> -		panic("%pOFn: failed to create irqdomain", node);
> -
> -	err = irq_alloc_domain_generic_chips(dom, 32, 2, node->name,
> -					     handle_level_irq, 0, 0, 0);
> -	if (err)
> -		panic("%pOFn: failed to allocate irqchip", node);
> -
> -	tangox_irq_domain_init(dom);
> -
> -	irq_set_chained_handler_and_data(irq, tangox_irq_handler, dom);
> -
> -	return 0;
> -}
> -
> -static int __init tangox_of_irq_init(struct device_node *node,
> -				     struct device_node *parent)
> -{
> -	struct device_node *c;
> -	struct resource res;
> -	void __iomem *base;
> -
> -	base = of_iomap(node, 0);
> -	if (!base)
> -		panic("%pOFn: of_iomap failed", node);
> -
> -	of_address_to_resource(node, 0, &res);
> -
> -	for_each_child_of_node(node, c)
> -		tangox_irq_init(base, &res, c);
> -
> -	return 0;
> -}
> -IRQCHIP_DECLARE(tangox_intc, "sigma,smp8642-intc", tangox_of_irq_init);
> -- 
>
> 2.29.2
>

-- 
Måns Rullgård

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  reply	other threads:[~2021-01-21 13:55 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-01-20 13:30 [PATCH 0/2] irqchip: Remove obsolete drivers Arnd Bergmann
2021-01-20 13:30 ` Arnd Bergmann
2021-01-20 13:30 ` [PATCH 1/2] irqchip: remove sigma tango driver Arnd Bergmann
2021-01-20 13:30   ` Arnd Bergmann
2021-01-21 13:52   ` Måns Rullgård [this message]
2021-01-21 13:52     ` Måns Rullgård
2021-01-20 13:30 ` [PATCH 2/2] irqchip: remove sirfsoc driver Arnd Bergmann
2021-01-20 13:30   ` Arnd Bergmann
2021-01-20 21:24   ` Barry Song
2021-01-20 21:24     ` Barry Song
2021-01-21 20:34 ` [PATCH 0/2] irqchip: Remove obsolete drivers Marc Zyngier
2021-01-21 20:34   ` Marc Zyngier

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=yw1xh7naz9be.fsf@mansr.com \
    --to=mans@mansr.com \
    --cc=arnd@arndb.de \
    --cc=arnd@kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=marc.w.gonzalez@free.fr \
    --cc=maz@kernel.org \
    --cc=tglx@linutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.