All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yoshinori Sato <ysato@users.sourceforge.jp>
To: linux-sh@vger.kernel.org
Cc: "Yoshinori Sato" <ysato@users.sourceforge.jp>,
	"Damien Le Moal" <dlemoal@kernel.org>,
	"Rob Herring" <robh+dt@kernel.org>,
	"Krzysztof Kozlowski" <krzysztof.kozlowski+dt@linaro.org>,
	"Conor Dooley" <conor+dt@kernel.org>,
	"Geert Uytterhoeven" <geert+renesas@glider.be>,
	"Michael Turquette" <mturquette@baylibre.com>,
	"Stephen Boyd" <sboyd@kernel.org>,
	"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
	"Maxime Ripard" <mripard@kernel.org>,
	"Thomas Zimmermann" <tzimmermann@suse.de>,
	"David Airlie" <airlied@gmail.com>,
	"Daniel Vetter" <daniel@ffwll.ch>,
	"Thomas Gleixner" <tglx@linutronix.de>,
	"Lorenzo Pieralisi" <lpieralisi@kernel.org>,
	"Krzysztof Wilczyński" <kw@linux.com>,
	"Bjorn Helgaas" <bhelgaas@google.com>,
	"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
	"Jiri Slaby" <jirislaby@kernel.org>,
	"Magnus Damm" <magnus.damm@gmail.com>,
	"Daniel Lezcano" <daniel.lezcano@linaro.org>,
	"Rich Felker" <dalias@libc.org>,
	"John Paul Adrian Glaubitz" <glaubitz@physik.fu-berlin.de>,
	"Lee Jones" <lee@kernel.org>, "Helge Deller" <deller@gmx.de>,
	"Heiko Stuebner" <heiko@sntech.de>,
	"Jernej Skrabec" <jernej.skrabec@gmail.com>,
	"Chris Morgan" <macromorgan@hotmail.com>,
	"Yang Xiwen" <forbidden405@foxmail.com>,
	"Sebastian Reichel" <sre@kernel.org>,
	"Linus Walleij" <linus.walleij@linaro.org>,
	"Randy Dunlap" <rdunlap@infradead.org>,
	"Arnd Bergmann" <arnd@arndb.de>,
	"Vlastimil Babka" <vbabka@suse.cz>,
	"Hyeonggon Yoo" <42.hyeyoo@gmail.com>,
	"David Rientjes" <rientjes@google.com>,
	"Baoquan He" <bhe@redhat.com>,
	"Andrew Morton" <akpm@linux-foundation.org>,
	"Guenter Roeck" <linux@roeck-us.net>,
	"Stephen Rothwell" <sfr@canb.auug.org.au>,
	"Azeem Shaikh" <azeemshaikh38@gmail.com>,
	"Javier Martinez Canillas" <javierm@redhat.com>,
	"Max Filippov" <jcmvbkbc@gmail.com>,
	"Palmer Dabbelt" <palmer@rivosinc.com>,
	"Bin Meng" <bmeng@tinylab.org>,
	"Jonathan Corbet" <corbet@lwn.net>,
	"Jacky Huang" <ychuang3@nuvoton.com>,
	"Lukas Bulwahn" <lukas.bulwahn@gmail.com>,
	"Biju Das" <biju.das.jz@bp.renesas.com>,
	"Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>,
	"Sam Ravnborg" <sam@ravnborg.org>,
	"Sergey Shtylyov" <s.shtylyov@omp.ru>,
	"Michael Karcher" <kernel@mkarcher.dialup.fu-berlin.de>,
	"Laurent Pinchart" <laurent.pinchart+renesas@ideasonboard.com>,
	linux-ide@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org,
	linux-clk@vger.kernel.org, dri-devel@lists.freedesktop.org,
	linux-pci@vger.kernel.org, linux-serial@vger.kernel.org,
	linux-fbdev@vger.kernel.org
Subject: [DO NOT MERGE v6 18/37] irqchip: SH7751 external interrupt encoder with enable gate.
Date: Tue,  9 Jan 2024 17:23:15 +0900	[thread overview]
Message-ID: <09d4fd9bd3feefe852987ee023a37bd45eebe972.1704788539.git.ysato@users.sourceforge.jp> (raw)
In-Reply-To: <cover.1704788539.git.ysato@users.sourceforge.jp>

SH7751 have 15 level external interrupt.
It is typically connected to the CPU through a priority encoder
that can suppress requests.
This driver provides a way to control those hardware with irqchip.

Signed-off-by: Yoshinori Sato <ysato@users.sourceforge.jp>
---
 drivers/irqchip/Kconfig                 |   7 +
 drivers/irqchip/Makefile                |   2 +
 drivers/irqchip/irq-renesas-sh7751irl.c | 228 ++++++++++++++++++++++++
 3 files changed, 237 insertions(+)
 create mode 100644 drivers/irqchip/irq-renesas-sh7751irl.c

diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig
index 658523f65b1d..2a061c01f381 100644
--- a/drivers/irqchip/Kconfig
+++ b/drivers/irqchip/Kconfig
@@ -687,4 +687,11 @@ config RENESAS_SH7751_INTC
 	  Support for the Renesas SH7751 On-chip interrupt controller.
 	  And external interrupt encoder for some targets.
 
+config RENESAS_SH7751IRL_INTC
+	bool "Renesas SH7751 based target IRL encoder support."
+	depends on RENESAS_SH7751_INTC
+	help
+	  Support for External Interrupt encoder
+	  on the some Renesas SH7751 based target.
+
 endmenu
diff --git a/drivers/irqchip/Makefile b/drivers/irqchip/Makefile
index 26c91d075e25..91df16726b1f 100644
--- a/drivers/irqchip/Makefile
+++ b/drivers/irqchip/Makefile
@@ -121,3 +121,5 @@ obj-$(CONFIG_APPLE_AIC)			+= irq-apple-aic.o
 obj-$(CONFIG_MCHP_EIC)			+= irq-mchp-eic.o
 obj-$(CONFIG_SUNPLUS_SP7021_INTC)	+= irq-sp7021-intc.o
 obj-$(CONFIG_RENESAS_SH7751_INTC)	+= irq-renesas-sh7751.o
+obj-$(CONFIG_RENESAS_SH7751IRL_INTC)	+= irq-renesas-sh7751irl.o
+
diff --git a/drivers/irqchip/irq-renesas-sh7751irl.c b/drivers/irqchip/irq-renesas-sh7751irl.c
new file mode 100644
index 000000000000..88303429ef64
--- /dev/null
+++ b/drivers/irqchip/irq-renesas-sh7751irl.c
@@ -0,0 +1,228 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * SH7751 based board external interrupt level encoder driver
+ * (Renesas RTS7751R2D / IO DATA DEVICE LANDISK, USL-5P)
+ *
+ * Copyright (C) 2023 Yoshinori Sato
+ */
+
+#include <linux/err.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/irqdomain.h>
+#include <linux/irq.h>
+#include <linux/irqchip.h>
+#include <linux/of.h>
+#include <linux/of_irq.h>
+#include <linux/of_address.h>
+#include <linux/slab.h>
+#include <linux/bitops.h>
+
+struct sh7751irl_intc_priv {
+	struct irq_domain *irq_domain;
+	void __iomem	  *base;
+	unsigned int	  width;
+	bool		  invert;
+	u32		  enable_bit[NR_IRL];
+};
+
+static inline unsigned long get_reg(void __iomem *addr, unsigned int w)
+{
+	switch (w) {
+	case 8:
+		return __raw_readb(addr);
+	case 16:
+		return __raw_readw(addr);
+	case 32:
+		return __raw_readl(addr);
+	default:
+		/* The size is checked when reading the properties. */
+		pr_err("%s: Invalid width %d", __FILE__, w);
+		return 0;
+	}
+}
+
+static inline void set_reg(void __iomem *addr, unsigned int w, unsigned long val)
+{
+	switch (w) {
+	case 8:
+		__raw_writeb(val, addr);
+		break;
+	case 16:
+		__raw_writew(val, addr);
+		break;
+	case 32:
+		__raw_writel(val, addr);
+		break;
+	default:
+		pr_err("%s: Invalid width %d", __FILE__, w);
+	}
+}
+
+static inline struct sh7751irl_intc_priv *irq_data_to_priv(struct irq_data *data)
+{
+	return data->domain->host_data;
+}
+
+static void irl_endisable(struct irq_data *data, unsigned int enable)
+{
+	struct sh7751irl_intc_priv *priv;
+	unsigned long val;
+	unsigned int irl;
+
+	priv = irq_data_to_priv(data);
+	irl = irqd_to_hwirq(data) - IRL_BASE_IRQ;
+
+	if (irl < NR_IRL && priv->enable_bit[irl] < priv->width) {
+		if (priv->invert)
+			enable = !enable;
+
+		val = get_reg(priv->base, priv->width);
+		if (enable)
+			set_bit(priv->enable_bit[irl], &val);
+		else
+			clear_bit(priv->enable_bit[irl], &val);
+		set_reg(priv->base, priv->width, val);
+	} else {
+		pr_err("%s: Invalid register define in IRL %u", __FILE__, irl);
+	}
+}
+
+static void sh7751irl_intc_disable_irq(struct irq_data *data)
+{
+	irl_endisable(data, 0);
+}
+
+static void sh7751irl_intc_enable_irq(struct irq_data *data)
+{
+	irl_endisable(data, 1);
+}
+
+static struct irq_chip sh7751irl_intc_chip = {
+	.name		= "SH7751IRL-INTC",
+	.irq_enable	= sh7751irl_intc_enable_irq,
+	.irq_disable	= sh7751irl_intc_disable_irq,
+};
+
+static int sh7751irl_intc_map(struct irq_domain *h, unsigned int virq,
+			       irq_hw_number_t hw_irq_num)
+{
+	irq_set_chip_and_handler(virq, &sh7751irl_intc_chip, handle_level_irq);
+	irq_get_irq_data(virq)->chip_data = h->host_data;
+	irq_modify_status(virq, IRQ_NOREQUEST, IRQ_NOPROBE);
+	return 0;
+}
+
+static int sh7751irl_intc_translate(struct irq_domain *domain,
+			       struct irq_fwspec *fwspec, unsigned long *hwirq,
+			       unsigned int *type)
+{
+	if (fwspec->param[0] > NR_IRL)
+		return -EINVAL;
+
+	switch (fwspec->param_count) {
+	case 2:
+		*type = fwspec->param[1];
+		fallthrough;
+	case 1:
+		*hwirq = fwspec->param[0] + IRL_BASE_IRQ;
+		break;
+	default:
+		return -EINVAL;
+	}
+	return 0;
+}
+
+static const struct irq_domain_ops sh7751irl_intc_domain_ops = {
+	.map = sh7751irl_intc_map,
+	.translate = sh7751irl_intc_translate,
+};
+
+static int __init load_irq_bit(struct device_node *node, struct sh7751irl_intc_priv *priv)
+{
+	struct property *enable_map;
+	const __be32 *p;
+	u32 nr_bits;
+	u32 irl;
+	int ret;
+
+	/* Fill in unused */
+	memset(priv->enable_bit, ~0, sizeof(priv->enable_bit));
+
+	enable_map = of_find_property(node, "renesas,enable-bit", &nr_bits);
+	if (IS_ERR(enable_map))
+		return PTR_ERR(enable_map);
+
+	nr_bits /= sizeof(u32);
+	/* 2words per entry. */
+	if (nr_bits % 2)
+		return -EINVAL;
+	nr_bits /= 2;
+	if (nr_bits > NR_IRL)
+		return -EINVAL;
+
+	ret = nr_bits;
+	p = NULL;
+	for (; nr_bits > 0; nr_bits--) {
+		/* 1st word - IRL */
+		p = of_prop_next_u32(enable_map, p, &irl);
+		if (!p || irl > NR_IRL)
+			return -EINVAL;
+		/* 2nd word - enable bit index */
+		p = of_prop_next_u32(enable_map, p, &priv->enable_bit[irl]);
+		if (priv->enable_bit[irl] >= priv->width)
+			return -EINVAL;
+	}
+	return ret;
+}
+
+static int __init sh7751irl_init(struct device_node *node, struct device_node *parent)
+{
+	struct sh7751irl_intc_priv *priv;
+	struct resource res;
+	struct irq_domain *d;
+	void __iomem *base;
+	int ret = 0;
+
+	if (of_address_to_resource(node, 0, &res))
+		return -EINVAL;
+	if (resource_size(&res) > 4)
+		return -EINVAL;
+
+	base = ioremap(res.start, resource_size(&res));
+	if (!base)
+		return -EINVAL;
+
+	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
+	if (!priv)
+		return -ENOMEM;
+
+	priv->base = base;
+	priv->width = 8 << resource_size(&res);
+
+	priv->invert = of_property_read_bool(node, "renesas,set-to-disable");
+
+	ret = load_irq_bit(node, priv);
+	if (ret < 0) {
+		pr_err("%pOFP: Invalid register define.\n", node);
+		goto error;
+	}
+
+	d = irq_domain_add_tree(node, &sh7751irl_intc_domain_ops, priv);
+	if (d == NULL) {
+		pr_err("%pOFP: cannot initialize irq domain\n", node);
+		ret = -ENOMEM;
+		goto error;
+	}
+
+	priv->irq_domain = d;
+	irq_domain_update_bus_token(d, DOMAIN_BUS_WIRED);
+	pr_info("%pOFP: SH7751 External Interrupt encoder (input=%d)", node, ret);
+	return 0;
+error:
+	kfree(priv);
+	return ret;
+}
+
+IRQCHIP_DECLARE(renesas_sh7751_irl, "renesas,sh7751-irl-ext", sh7751irl_init);
-- 
2.39.2


WARNING: multiple messages have this Message-ID (diff)
From: Yoshinori Sato <ysato@users.sourceforge.jp>
To: linux-sh@vger.kernel.org
Cc: "Krzysztof Wilczyński" <kw@linux.com>,
	linux-fbdev@vger.kernel.org, "Rich Felker" <dalias@libc.org>,
	"Geert Uytterhoeven" <geert+renesas@glider.be>,
	"Bin Meng" <bmeng@tinylab.org>,
	"Michael Turquette" <mturquette@baylibre.com>,
	linux-pci@vger.kernel.org, "Jacky Huang" <ychuang3@nuvoton.com>,
	"Palmer Dabbelt" <palmer@rivosinc.com>,
	linux-kernel@vger.kernel.org, "Max Filippov" <jcmvbkbc@gmail.com>,
	"Lee Jones" <lee@kernel.org>,
	"Krzysztof Kozlowski" <krzysztof.kozlowski+dt@linaro.org>,
	"Hyeonggon Yoo" <42.hyeyoo@gmail.com>,
	"Jiri Slaby" <jirislaby@kernel.org>,
	linux-clk@vger.kernel.org,
	"Stephen Rothwell" <sfr@canb.auug.org.au>,
	"Laurent Pinchart" <laurent.pinchart+renesas@ideasonboard.com>,
	"Yoshinori Sato" <ysato@users.sourceforge.jp>,
	"Jonathan Corbet" <corbet@lwn.net>,
	"Helge Deller" <deller@gmx.de>,
	"Daniel Lezcano" <daniel.lezcano@linaro.org>,
	"Magnus Damm" <magnus.damm@gmail.com>,
	"Javier Martinez Canillas" <javierm@redhat.com>,
	"Jernej Skrabec" <jernej.skrabec@gmail.com>,
	linux-serial@vger.kernel.org,
	"David Rientjes" <rientjes@google.com>,
	"Lukas Bulwahn" <lukas.bulwahn@gmail.com>,
	"Lorenzo Pieralisi" <lpieralisi@kernel.org>,
	"Guenter Roeck" <linux@roeck-us.net>,
	devicetree@vger.kernel.org, "Conor Dooley" <conor+dt@kernel.org>,
	"Arnd Bergmann" <arnd@arndb.de>,
	"Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>,
	"Maxime Ripard" <mripard@kernel.org>,
	"Sam Ravnborg" <sam@ravnborg.org>,
	"Rob Herring" <robh+dt@kernel.org>,
	dri-devel@lists.freedesktop.org,
	"Chris Morgan" <macromorgan@hotmail.com>,
	"John Paul Adrian Glaubitz" <glaubitz@physik.fu-berlin.de>,
	"Bjorn Helgaas" <bhelgaas@google.com>,
	"Thomas Gleixner" <tglx@linutronix.de>,
	"Vlastimil Babka" <vbabka@suse.cz>,
	"Yang Xiwen" <forbidden405@foxmail.com>,
	"Sergey Shtylyov" <s.shtylyov@omp.ru>,
	"Baoquan He" <bhe@redhat.com>,
	linux-ide@vger.kernel.org, "Stephen Boyd" <sboyd@kernel.org>,
	"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
	"Randy Dunlap" <rdunlap@infradead.org>,
	"Biju Das" <biju.das.jz@bp.renesas.com>,
	"Sebastian Reichel" <sre@kernel.org>,
	"Azeem Shaikh" <azeemshaikh38@gmail.com>,
	linux-renesas-soc@vger.kernel.org,
	"Damien Le Moal" <dlemoal@kernel.org>,
	"Thomas Zimmermann" <tzimmermann@suse.de>,
	"Michael Karcher" <kernel@mkarcher.dialup.fu-berlin.de>,
	"Andrew Morton" <akpm@linux-foundation.org>
Subject: [DO NOT MERGE v6 18/37] irqchip: SH7751 external interrupt encoder with enable gate.
Date: Tue,  9 Jan 2024 17:23:15 +0900	[thread overview]
Message-ID: <09d4fd9bd3feefe852987ee023a37bd45eebe972.1704788539.git.ysato@users.sourceforge.jp> (raw)
In-Reply-To: <cover.1704788539.git.ysato@users.sourceforge.jp>

SH7751 have 15 level external interrupt.
It is typically connected to the CPU through a priority encoder
that can suppress requests.
This driver provides a way to control those hardware with irqchip.

Signed-off-by: Yoshinori Sato <ysato@users.sourceforge.jp>
---
 drivers/irqchip/Kconfig                 |   7 +
 drivers/irqchip/Makefile                |   2 +
 drivers/irqchip/irq-renesas-sh7751irl.c | 228 ++++++++++++++++++++++++
 3 files changed, 237 insertions(+)
 create mode 100644 drivers/irqchip/irq-renesas-sh7751irl.c

diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig
index 658523f65b1d..2a061c01f381 100644
--- a/drivers/irqchip/Kconfig
+++ b/drivers/irqchip/Kconfig
@@ -687,4 +687,11 @@ config RENESAS_SH7751_INTC
 	  Support for the Renesas SH7751 On-chip interrupt controller.
 	  And external interrupt encoder for some targets.
 
+config RENESAS_SH7751IRL_INTC
+	bool "Renesas SH7751 based target IRL encoder support."
+	depends on RENESAS_SH7751_INTC
+	help
+	  Support for External Interrupt encoder
+	  on the some Renesas SH7751 based target.
+
 endmenu
diff --git a/drivers/irqchip/Makefile b/drivers/irqchip/Makefile
index 26c91d075e25..91df16726b1f 100644
--- a/drivers/irqchip/Makefile
+++ b/drivers/irqchip/Makefile
@@ -121,3 +121,5 @@ obj-$(CONFIG_APPLE_AIC)			+= irq-apple-aic.o
 obj-$(CONFIG_MCHP_EIC)			+= irq-mchp-eic.o
 obj-$(CONFIG_SUNPLUS_SP7021_INTC)	+= irq-sp7021-intc.o
 obj-$(CONFIG_RENESAS_SH7751_INTC)	+= irq-renesas-sh7751.o
+obj-$(CONFIG_RENESAS_SH7751IRL_INTC)	+= irq-renesas-sh7751irl.o
+
diff --git a/drivers/irqchip/irq-renesas-sh7751irl.c b/drivers/irqchip/irq-renesas-sh7751irl.c
new file mode 100644
index 000000000000..88303429ef64
--- /dev/null
+++ b/drivers/irqchip/irq-renesas-sh7751irl.c
@@ -0,0 +1,228 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * SH7751 based board external interrupt level encoder driver
+ * (Renesas RTS7751R2D / IO DATA DEVICE LANDISK, USL-5P)
+ *
+ * Copyright (C) 2023 Yoshinori Sato
+ */
+
+#include <linux/err.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/irqdomain.h>
+#include <linux/irq.h>
+#include <linux/irqchip.h>
+#include <linux/of.h>
+#include <linux/of_irq.h>
+#include <linux/of_address.h>
+#include <linux/slab.h>
+#include <linux/bitops.h>
+
+struct sh7751irl_intc_priv {
+	struct irq_domain *irq_domain;
+	void __iomem	  *base;
+	unsigned int	  width;
+	bool		  invert;
+	u32		  enable_bit[NR_IRL];
+};
+
+static inline unsigned long get_reg(void __iomem *addr, unsigned int w)
+{
+	switch (w) {
+	case 8:
+		return __raw_readb(addr);
+	case 16:
+		return __raw_readw(addr);
+	case 32:
+		return __raw_readl(addr);
+	default:
+		/* The size is checked when reading the properties. */
+		pr_err("%s: Invalid width %d", __FILE__, w);
+		return 0;
+	}
+}
+
+static inline void set_reg(void __iomem *addr, unsigned int w, unsigned long val)
+{
+	switch (w) {
+	case 8:
+		__raw_writeb(val, addr);
+		break;
+	case 16:
+		__raw_writew(val, addr);
+		break;
+	case 32:
+		__raw_writel(val, addr);
+		break;
+	default:
+		pr_err("%s: Invalid width %d", __FILE__, w);
+	}
+}
+
+static inline struct sh7751irl_intc_priv *irq_data_to_priv(struct irq_data *data)
+{
+	return data->domain->host_data;
+}
+
+static void irl_endisable(struct irq_data *data, unsigned int enable)
+{
+	struct sh7751irl_intc_priv *priv;
+	unsigned long val;
+	unsigned int irl;
+
+	priv = irq_data_to_priv(data);
+	irl = irqd_to_hwirq(data) - IRL_BASE_IRQ;
+
+	if (irl < NR_IRL && priv->enable_bit[irl] < priv->width) {
+		if (priv->invert)
+			enable = !enable;
+
+		val = get_reg(priv->base, priv->width);
+		if (enable)
+			set_bit(priv->enable_bit[irl], &val);
+		else
+			clear_bit(priv->enable_bit[irl], &val);
+		set_reg(priv->base, priv->width, val);
+	} else {
+		pr_err("%s: Invalid register define in IRL %u", __FILE__, irl);
+	}
+}
+
+static void sh7751irl_intc_disable_irq(struct irq_data *data)
+{
+	irl_endisable(data, 0);
+}
+
+static void sh7751irl_intc_enable_irq(struct irq_data *data)
+{
+	irl_endisable(data, 1);
+}
+
+static struct irq_chip sh7751irl_intc_chip = {
+	.name		= "SH7751IRL-INTC",
+	.irq_enable	= sh7751irl_intc_enable_irq,
+	.irq_disable	= sh7751irl_intc_disable_irq,
+};
+
+static int sh7751irl_intc_map(struct irq_domain *h, unsigned int virq,
+			       irq_hw_number_t hw_irq_num)
+{
+	irq_set_chip_and_handler(virq, &sh7751irl_intc_chip, handle_level_irq);
+	irq_get_irq_data(virq)->chip_data = h->host_data;
+	irq_modify_status(virq, IRQ_NOREQUEST, IRQ_NOPROBE);
+	return 0;
+}
+
+static int sh7751irl_intc_translate(struct irq_domain *domain,
+			       struct irq_fwspec *fwspec, unsigned long *hwirq,
+			       unsigned int *type)
+{
+	if (fwspec->param[0] > NR_IRL)
+		return -EINVAL;
+
+	switch (fwspec->param_count) {
+	case 2:
+		*type = fwspec->param[1];
+		fallthrough;
+	case 1:
+		*hwirq = fwspec->param[0] + IRL_BASE_IRQ;
+		break;
+	default:
+		return -EINVAL;
+	}
+	return 0;
+}
+
+static const struct irq_domain_ops sh7751irl_intc_domain_ops = {
+	.map = sh7751irl_intc_map,
+	.translate = sh7751irl_intc_translate,
+};
+
+static int __init load_irq_bit(struct device_node *node, struct sh7751irl_intc_priv *priv)
+{
+	struct property *enable_map;
+	const __be32 *p;
+	u32 nr_bits;
+	u32 irl;
+	int ret;
+
+	/* Fill in unused */
+	memset(priv->enable_bit, ~0, sizeof(priv->enable_bit));
+
+	enable_map = of_find_property(node, "renesas,enable-bit", &nr_bits);
+	if (IS_ERR(enable_map))
+		return PTR_ERR(enable_map);
+
+	nr_bits /= sizeof(u32);
+	/* 2words per entry. */
+	if (nr_bits % 2)
+		return -EINVAL;
+	nr_bits /= 2;
+	if (nr_bits > NR_IRL)
+		return -EINVAL;
+
+	ret = nr_bits;
+	p = NULL;
+	for (; nr_bits > 0; nr_bits--) {
+		/* 1st word - IRL */
+		p = of_prop_next_u32(enable_map, p, &irl);
+		if (!p || irl > NR_IRL)
+			return -EINVAL;
+		/* 2nd word - enable bit index */
+		p = of_prop_next_u32(enable_map, p, &priv->enable_bit[irl]);
+		if (priv->enable_bit[irl] >= priv->width)
+			return -EINVAL;
+	}
+	return ret;
+}
+
+static int __init sh7751irl_init(struct device_node *node, struct device_node *parent)
+{
+	struct sh7751irl_intc_priv *priv;
+	struct resource res;
+	struct irq_domain *d;
+	void __iomem *base;
+	int ret = 0;
+
+	if (of_address_to_resource(node, 0, &res))
+		return -EINVAL;
+	if (resource_size(&res) > 4)
+		return -EINVAL;
+
+	base = ioremap(res.start, resource_size(&res));
+	if (!base)
+		return -EINVAL;
+
+	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
+	if (!priv)
+		return -ENOMEM;
+
+	priv->base = base;
+	priv->width = 8 << resource_size(&res);
+
+	priv->invert = of_property_read_bool(node, "renesas,set-to-disable");
+
+	ret = load_irq_bit(node, priv);
+	if (ret < 0) {
+		pr_err("%pOFP: Invalid register define.\n", node);
+		goto error;
+	}
+
+	d = irq_domain_add_tree(node, &sh7751irl_intc_domain_ops, priv);
+	if (d == NULL) {
+		pr_err("%pOFP: cannot initialize irq domain\n", node);
+		ret = -ENOMEM;
+		goto error;
+	}
+
+	priv->irq_domain = d;
+	irq_domain_update_bus_token(d, DOMAIN_BUS_WIRED);
+	pr_info("%pOFP: SH7751 External Interrupt encoder (input=%d)", node, ret);
+	return 0;
+error:
+	kfree(priv);
+	return ret;
+}
+
+IRQCHIP_DECLARE(renesas_sh7751_irl, "renesas,sh7751-irl-ext", sh7751irl_init);
-- 
2.39.2


  parent reply	other threads:[~2024-01-09  8:24 UTC|newest]

Thread overview: 138+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-01-09  8:22 [DO NOT MERGE v6 00/37] Device Tree support for SH7751 based board Yoshinori Sato
2024-01-09  8:22 ` Yoshinori Sato
2024-01-09  8:22 ` [DO NOT MERGE v6 01/37] sh: passing FDT address to kernel startup Yoshinori Sato
2024-01-09  8:22   ` Yoshinori Sato
2024-01-15 14:03   ` Geert Uytterhoeven
2024-01-15 14:03     ` Geert Uytterhoeven
2024-01-09  8:22 ` [DO NOT MERGE v6 02/37] sh: Kconfig unified OF supported targets Yoshinori Sato
2024-01-09  8:22   ` Yoshinori Sato
2024-02-26 16:21   ` Geert Uytterhoeven
2024-01-09  8:23 ` [DO NOT MERGE v6 03/37] sh: Enable OF support for build and configuration Yoshinori Sato
2024-01-09  8:23   ` Yoshinori Sato
2024-01-09  8:23 ` [DO NOT MERGE v6 04/37] dt-bindings: interrupt-controller: Add header for Renesas SH3/4 INTC Yoshinori Sato
2024-01-09  8:23   ` Yoshinori Sato
2024-01-09 18:41   ` Krzysztof Kozlowski
2024-01-09 18:41     ` Krzysztof Kozlowski
2024-01-09  8:23 ` [DO NOT MERGE v6 05/37] sh: GENERIC_IRQ_CHIP support for CONFIG_OF=y Yoshinori Sato
2024-01-09  8:23   ` Yoshinori Sato
2024-01-09  8:23 ` [DO NOT MERGE v6 06/37] sh: kernel/setup Update DT support Yoshinori Sato
2024-01-09  8:23   ` Yoshinori Sato
2024-01-09  8:23 ` [DO NOT MERGE v6 07/37] sh: Fix COMMON_CLK support in CONFIG_OF=y Yoshinori Sato
2024-01-09  8:23   ` Yoshinori Sato
2024-01-09  8:23 ` [DO NOT MERGE v6 08/37] clocksource: sh_tmu: CLOCKSOURCE support Yoshinori Sato
2024-01-09  8:23   ` Yoshinori Sato
2024-02-26 16:54   ` Geert Uytterhoeven
2024-01-09  8:23 ` [DO NOT MERGE v6 09/37] dt-bindings: timer: renesas,tmu: add renesas,tmu-sh7750 Yoshinori Sato
2024-01-09  8:23   ` [DO NOT MERGE v6 09/37] dt-bindings: timer: renesas, tmu: add renesas, tmu-sh7750 Yoshinori Sato
2024-01-15 13:59   ` [DO NOT MERGE v6 09/37] dt-bindings: timer: renesas,tmu: add renesas,tmu-sh7750 Geert Uytterhoeven
2024-01-15 13:59     ` [DO NOT MERGE v6 09/37] dt-bindings: timer: renesas, tmu: add renesas, tmu-sh7750 Geert Uytterhoeven
2024-01-09  8:23 ` [DO NOT MERGE v6 10/37] sh: Common PCI Framework driver support Yoshinori Sato
2024-01-09  8:23   ` Yoshinori Sato
2024-01-09  8:23 ` [DO NOT MERGE v6 11/37] pci: pci-sh7751: Add SH7751 PCI driver Yoshinori Sato
2024-01-09  8:23   ` Yoshinori Sato
2024-01-09  8:23 ` [DO NOT MERGE v6 12/37] dt-bindings: pci: pci-sh7751: Add SH7751 PCI Yoshinori Sato
2024-01-09  8:23   ` Yoshinori Sato
2024-01-09 12:42   ` Linus Walleij
2024-01-09 12:42     ` Linus Walleij
2024-01-09 17:31     ` Rob Herring
2024-01-09 17:31       ` Rob Herring
2024-01-09  8:23 ` [DO NOT MERGE v6 13/37] dt-bindings: clock: sh7750-cpg: Add renesas,sh7750-cpg header Yoshinori Sato
2024-01-09  8:23   ` [DO NOT MERGE v6 13/37] dt-bindings: clock: sh7750-cpg: Add renesas, sh7750-cpg header Yoshinori Sato
2024-02-27 16:47   ` [DO NOT MERGE v6 13/37] dt-bindings: clock: sh7750-cpg: Add renesas,sh7750-cpg header Geert Uytterhoeven
2024-01-09  8:23 ` [DO NOT MERGE v6 14/37] clk: Compatible with narrow registers Yoshinori Sato
2024-01-09  8:23   ` Yoshinori Sato
2024-02-27 15:41   ` Geert Uytterhoeven
2024-01-09  8:23 ` [DO NOT MERGE v6 15/37] clk: renesas: Add SH7750/7751 CPG Driver Yoshinori Sato
2024-01-09  8:23   ` Yoshinori Sato
2024-02-27 16:34   ` Geert Uytterhoeven
2024-01-09  8:23 ` [DO NOT MERGE v6 16/37] irqchip: Add SH7751 INTC driver Yoshinori Sato
2024-01-09  8:23   ` Yoshinori Sato
2024-01-09  8:23 ` [DO NOT MERGE v6 17/37] dt-bindings: interrupt-controller: renesas,sh7751-intc: Add json-schema Yoshinori Sato
2024-01-09  8:23   ` [DO NOT MERGE v6 17/37] dt-bindings: interrupt-controller: renesas, sh7751-intc: " Yoshinori Sato
2024-01-09 12:30   ` [DO NOT MERGE v6 17/37] dt-bindings: interrupt-controller: renesas,sh7751-intc: " Linus Walleij
2024-01-09 12:30     ` Linus Walleij
2024-01-17  9:46     ` [DO NOT MERGE v6 17/37] dt-bindings: interrupt-controller: renesas, sh7751-intc: " Yoshinori Sato
2024-01-17  9:46       ` [DO NOT MERGE v6 17/37] dt-bindings: interrupt-controller: renesas,sh7751-intc: " Yoshinori Sato
2024-01-17 10:06       ` Geert Uytterhoeven
2024-01-17 10:06         ` Geert Uytterhoeven
2024-01-09  8:23 ` Yoshinori Sato [this message]
2024-01-09  8:23   ` [DO NOT MERGE v6 18/37] irqchip: SH7751 external interrupt encoder with enable gate Yoshinori Sato
2024-01-09  8:23 ` [DO NOT MERGE v6 19/37] dt-bindings: interrupt-controller: renesas,sh7751-irl-ext: Add json-schema Yoshinori Sato
2024-01-09  8:23   ` [DO NOT MERGE v6 19/37] dt-bindings: interrupt-controller: renesas, sh7751-irl-ext: " Yoshinori Sato
2024-01-09 16:29   ` [DO NOT MERGE v6 19/37] dt-bindings: interrupt-controller: renesas,sh7751-irl-ext: " Rob Herring
2024-01-09 16:29     ` Rob Herring
2024-01-09 17:18   ` Rob Herring
2024-01-09 17:18     ` Rob Herring
2024-01-09  8:23 ` [DO NOT MERGE v6 20/37] serial: sh-sci: fix SH4 OF support Yoshinori Sato
2024-01-09  8:23   ` Yoshinori Sato
2024-01-09  8:23 ` [DO NOT MERGE v6 21/37] dt-bindings: serial: renesas,scif: Add scif-sh7751 Yoshinori Sato
2024-01-09  8:23   ` [DO NOT MERGE v6 21/37] dt-bindings: serial: renesas, scif: " Yoshinori Sato
2024-01-15  9:29   ` [DO NOT MERGE v6 21/37] dt-bindings: serial: renesas,scif: " Geert Uytterhoeven
2024-01-15  9:29     ` [DO NOT MERGE v6 21/37] dt-bindings: serial: renesas, scif: " Geert Uytterhoeven
2024-01-09  8:23 ` [DO NOT MERGE v6 22/37] dt-bindings: display: smi,sm501: SMI SM501 binding json-schema Yoshinori Sato
2024-01-09  8:23   ` [DO NOT MERGE v6 22/37] dt-bindings: display: smi, sm501: " Yoshinori Sato
2024-01-15  9:52   ` [DO NOT MERGE v6 22/37] dt-bindings: display: smi,sm501: " Geert Uytterhoeven
2024-01-15  9:52     ` Geert Uytterhoeven
2024-01-09  8:23 ` [DO NOT MERGE v6 23/37] mfd: sm501: Convert platform_data to OF property Yoshinori Sato
2024-01-09  8:23   ` Yoshinori Sato
2024-01-11 11:35   ` Lee Jones
2024-01-11 11:35     ` Lee Jones
2024-01-09  8:23 ` [DO NOT MERGE v6 24/37] dt-binding: sh: cpus: Add SH CPUs json-schema Yoshinori Sato
2024-01-09  8:23   ` Yoshinori Sato
2024-01-09 18:00   ` Conor Dooley
2024-01-09 18:00     ` Conor Dooley
2024-01-09  8:23 ` [DO NOT MERGE v6 25/37] dt-bindings: vendor-prefixes: Add iodata Yoshinori Sato
2024-01-09  8:23   ` Yoshinori Sato
2024-01-09 18:03   ` Conor Dooley
2024-01-09 18:03     ` Conor Dooley
2024-01-15 14:02   ` Geert Uytterhoeven
2024-01-15 14:02     ` Geert Uytterhoeven
2024-01-09  8:23 ` [DO NOT MERGE v6 26/37] dt-bindings: vendor-prefixes: Add smi Yoshinori Sato
2024-01-09  8:23   ` Yoshinori Sato
2024-01-09 18:05   ` Conor Dooley
2024-01-09 18:05     ` Conor Dooley
2024-01-10 11:23     ` Geert Uytterhoeven
2024-01-10 11:23       ` Geert Uytterhoeven
2024-01-10 14:28       ` Guenter Roeck
2024-01-10 14:28         ` Guenter Roeck
2024-01-10 16:11       ` Conor Dooley
2024-01-10 16:11         ` Conor Dooley
2024-01-11 14:59         ` Rob Herring
2024-01-11 14:59           ` Rob Herring
2024-01-09 21:40   ` Uwe Kleine-König
2024-01-09 21:40     ` Uwe Kleine-König
2024-01-09  8:23 ` [DO NOT MERGE v6 27/37] dt-bindings: ata: ata-generic: Add new targets Yoshinori Sato
2024-01-09  8:23   ` Yoshinori Sato
2024-01-09 18:07   ` Conor Dooley
2024-01-09 18:07     ` Conor Dooley
2024-01-09 18:09     ` Conor Dooley
2024-01-09 18:09       ` Conor Dooley
2024-01-10  2:06   ` Damien Le Moal
2024-01-10  2:06     ` Damien Le Moal
2024-01-10  7:19     ` Krzysztof Kozlowski
2024-01-10  7:19       ` Krzysztof Kozlowski
2024-01-10  7:25       ` Damien Le Moal
2024-01-10  7:25         ` Damien Le Moal
2024-01-09  8:23 ` [DO NOT MERGE v6 28/37] dt-bindings: soc: renesas: sh: Add SH7751 based target Yoshinori Sato
2024-01-09  8:23   ` Yoshinori Sato
2024-02-27 15:58   ` Geert Uytterhoeven
2024-01-09  8:23 ` [DO NOT MERGE v6 29/37] sh: SH7751R SoC Internal peripheral definition dtsi Yoshinori Sato
2024-01-09  8:23   ` Yoshinori Sato
2024-01-09  8:23 ` [DO NOT MERGE v6 30/37] sh: add RTS7751R2D Plus DTS Yoshinori Sato
2024-01-09  8:23   ` Yoshinori Sato
2024-01-09  8:23 ` [DO NOT MERGE v6 31/37] sh: Add IO DATA LANDISK dts Yoshinori Sato
2024-01-09  8:23   ` Yoshinori Sato
2024-01-09  8:23 ` [DO NOT MERGE v6 32/37] sh: Add IO DATA USL-5P dts Yoshinori Sato
2024-01-09  8:23   ` Yoshinori Sato
2024-01-09  8:23 ` [DO NOT MERGE v6 33/37] sh: j2_mimas_v2.dts update Yoshinori Sato
2024-01-09  8:23   ` Yoshinori Sato
2024-02-27 16:07   ` Geert Uytterhoeven
2024-01-09  8:23 ` [DO NOT MERGE v6 34/37] sh: Add dtbs target support Yoshinori Sato
2024-01-09  8:23   ` Yoshinori Sato
2024-02-27 18:48   ` Geert Uytterhoeven
2024-01-09  8:23 ` [DO NOT MERGE v6 35/37] sh: RTS7751R2D Plus OF defconfig Yoshinori Sato
2024-01-09  8:23   ` Yoshinori Sato
2024-01-09  8:23 ` [DO NOT MERGE v6 36/37] sh: LANDISK " Yoshinori Sato
2024-01-09  8:23   ` Yoshinori Sato
2024-01-09  8:23 ` [DO NOT MERGE v6 37/37] sh: j2_defconfig: update Yoshinori Sato
2024-01-09  8:23   ` Yoshinori Sato

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=09d4fd9bd3feefe852987ee023a37bd45eebe972.1704788539.git.ysato@users.sourceforge.jp \
    --to=ysato@users.sourceforge.jp \
    --cc=42.hyeyoo@gmail.com \
    --cc=airlied@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=arnd@arndb.de \
    --cc=azeemshaikh38@gmail.com \
    --cc=bhe@redhat.com \
    --cc=bhelgaas@google.com \
    --cc=biju.das.jz@bp.renesas.com \
    --cc=bmeng@tinylab.org \
    --cc=conor+dt@kernel.org \
    --cc=corbet@lwn.net \
    --cc=dalias@libc.org \
    --cc=daniel.lezcano@linaro.org \
    --cc=daniel@ffwll.ch \
    --cc=deller@gmx.de \
    --cc=devicetree@vger.kernel.org \
    --cc=dlemoal@kernel.org \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=forbidden405@foxmail.com \
    --cc=geert+renesas@glider.be \
    --cc=glaubitz@physik.fu-berlin.de \
    --cc=gregkh@linuxfoundation.org \
    --cc=heiko@sntech.de \
    --cc=javierm@redhat.com \
    --cc=jcmvbkbc@gmail.com \
    --cc=jernej.skrabec@gmail.com \
    --cc=jirislaby@kernel.org \
    --cc=kernel@mkarcher.dialup.fu-berlin.de \
    --cc=krzysztof.kozlowski+dt@linaro.org \
    --cc=kw@linux.com \
    --cc=laurent.pinchart+renesas@ideasonboard.com \
    --cc=lee@kernel.org \
    --cc=linus.walleij@linaro.org \
    --cc=linux-clk@vger.kernel.org \
    --cc=linux-fbdev@vger.kernel.org \
    --cc=linux-ide@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=linux-renesas-soc@vger.kernel.org \
    --cc=linux-serial@vger.kernel.org \
    --cc=linux-sh@vger.kernel.org \
    --cc=linux@roeck-us.net \
    --cc=lpieralisi@kernel.org \
    --cc=lukas.bulwahn@gmail.com \
    --cc=maarten.lankhorst@linux.intel.com \
    --cc=macromorgan@hotmail.com \
    --cc=magnus.damm@gmail.com \
    --cc=mripard@kernel.org \
    --cc=mturquette@baylibre.com \
    --cc=palmer@rivosinc.com \
    --cc=rdunlap@infradead.org \
    --cc=rientjes@google.com \
    --cc=robh+dt@kernel.org \
    --cc=s.shtylyov@omp.ru \
    --cc=sam@ravnborg.org \
    --cc=sboyd@kernel.org \
    --cc=sfr@canb.auug.org.au \
    --cc=sre@kernel.org \
    --cc=tglx@linutronix.de \
    --cc=tzimmermann@suse.de \
    --cc=u.kleine-koenig@pengutronix.de \
    --cc=vbabka@suse.cz \
    --cc=ychuang3@nuvoton.com \
    /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.