linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v4 0/7] ARM: mediatek: Add support for interrupt polarity
@ 2014-10-23 15:53 Yingjoe Chen
  2014-10-23 15:53 ` [PATCH v4 1/7] irqdomain: Fix irq_domain_alloc_irqs return check Yingjoe Chen
                   ` (7 more replies)
  0 siblings, 8 replies; 12+ messages in thread
From: Yingjoe Chen @ 2014-10-23 15:53 UTC (permalink / raw)
  To: Rob Herring, Jiang Liu, Marc Zyngier, Matthias Brugger, arm
  Cc: Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala, Russell King,
	Thomas Gleixner, Jason Cooper, Benjamin Herrenschmidt,
	Yingjoe Chen, Grant Likely, Hans de Goede, Boris BREZILLON,
	devicetree, linux-kernel, linux-arm-kernel, Olof Johansson,
	Arnd Bergmann, srv_heupstream, yingjoe.chen, hc.yen, eddie.huang,
	nathan.chung, yh.chen

This series is 4th version of interrupt polarity support for MediaTek SoCs.
This is based on Jiang's hierarchy irqdomain v2 [1] and my mediatek SoC
basic support [2].

This version addressed comments from previous discussion[3]. I removed
arm,hierarchy-irq-domain property. When GIC is probed by DT, it will
support hierarchy irqdomain. I still keep the first patch because this is
still base on hierarchy irqdomain v2.

In Jiang's version of irq_create_of_mapping, if irqdomain is hierarchy, it
will not perform irq_find_mapping check and set_type. The outermost
irqdomain need to take care of that. Because we will have several different
outermost irqdomain in different ARM SoCs, this cause code duplication. I
moved them back to irq_create_of_mapping. Since Jiang's changes are not
merged yet, maybe that patch should be merged there.

Simplified block diagram for interrupt on my system:

    +-------+      +-------+
 ---| SYSIRQ|------|ARM GIC|
 ---|       |------|       |
 ---|       |------|       |
 ---|       |------|       |
 ---|       |------|       |
    +-------+      +-------+

In device tree, interrupt-parent for other devices is sysirq, child of gic.
This describe HW better and allow device to specify polarity as it is sent
by the device.

When using hierarchy irq domain, gic will use irq_domain_add_linear to
create irqdomain and all interrupt numbers must come from device tree. My
/proc/interrupts looks like this now:

# cat /proc/interrupts
           CPU0
 16:       1862  MT_SYSIRQ 113  mtk_timer
 17:         67  MT_SYSIRQ  54  mtk-uart

Changes in v3:
 - Discussion in [3]
 - First implementation using hierarchy irqdomain

[1] http://lists.infradead.org/pipermail/linux-arm-kernel/2014-September/290832.html
[2] http://lists.infradead.org/pipermail/linux-arm-kernel/2014-September/284553.html
[3] http://lists.infradead.org/pipermail/linux-arm-kernel/2014-October/293766.html

Yingjoe Chen (7):
  irqdomain: Fix irq_domain_alloc_irqs return check.
  irqdomain: Add back xlate and set_type for hierarchy irq domain
  genirq: Add more helper functions to support stacked irq_chip
  irqchip: gic: Support hierarchy irq domain.
  ARM: mediatek: Add sysirq interrupt polarity support
  ARM: mediatek: Add sysirq in mt6589/mt8135/mt8127 dtsi
  dt-bindings: add bindings for mediatek sysirq

 .../bindings/arm/mediatek/mediatek,sysirq.txt      |  26 ++++
 arch/arm/boot/dts/mt6589.dtsi                      |  14 +-
 arch/arm/boot/dts/mt8127.dtsi                      |  14 +-
 arch/arm/boot/dts/mt8135.dtsi                      |  14 +-
 drivers/irqchip/Kconfig                            |   1 +
 drivers/irqchip/Makefile                           |   1 +
 drivers/irqchip/irq-gic.c                          |  54 +++++--
 drivers/irqchip/irq-mtk-sysirq.c                   | 168 +++++++++++++++++++++
 include/linux/irq.h                                |   6 +
 kernel/irq/chip.c                                  |  28 ++++
 kernel/irq/irqdomain.c                             |  31 ++--
 11 files changed, 332 insertions(+), 25 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/arm/mediatek/mediatek,sysirq.txt
 create mode 100644 drivers/irqchip/irq-mtk-sysirq.c

-- 
1.8.1.1.dirty


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v4 1/7] irqdomain: Fix irq_domain_alloc_irqs return check.
  2014-10-23 15:53 [PATCH v4 0/7] ARM: mediatek: Add support for interrupt polarity Yingjoe Chen
@ 2014-10-23 15:53 ` Yingjoe Chen
  2014-10-23 15:53 ` [PATCH v4 2/7] irqdomain: Add back xlate and set_type for hierarchy irq domain Yingjoe Chen
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Yingjoe Chen @ 2014-10-23 15:53 UTC (permalink / raw)
  To: Rob Herring, Jiang Liu, Marc Zyngier, Matthias Brugger, arm
  Cc: Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala, Russell King,
	Thomas Gleixner, Jason Cooper, Benjamin Herrenschmidt,
	Yingjoe Chen, Grant Likely, Hans de Goede, Boris BREZILLON,
	devicetree, linux-kernel, linux-arm-kernel, Olof Johansson,
	Arnd Bergmann, srv_heupstream, yingjoe.chen, hc.yen, eddie.huang,
	nathan.chung, yh.chen

Change virq type from unsigned int to int. Otherwise the return value
check for irq_domain_alloc_irqs will always pass.

Signed-off-by: Yingjoe Chen <yingjoe.chen@mediatek.com>
---
 kernel/irq/irqdomain.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c
index 584be46..dd8d3ab 100644
--- a/kernel/irq/irqdomain.c
+++ b/kernel/irq/irqdomain.c
@@ -469,7 +469,7 @@ unsigned int irq_create_of_mapping(struct of_phandle_args *irq_data)
 	struct irq_domain *domain;
 	irq_hw_number_t hwirq;
 	unsigned int type = IRQ_TYPE_NONE;
-	unsigned int virq;
+	int virq;
 
 	domain = irq_data->np ? irq_find_host(irq_data->np) : irq_default_domain;
 	if (!domain) {
-- 
1.8.1.1.dirty


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v4 2/7] irqdomain: Add back xlate and set_type for hierarchy irq domain
  2014-10-23 15:53 [PATCH v4 0/7] ARM: mediatek: Add support for interrupt polarity Yingjoe Chen
  2014-10-23 15:53 ` [PATCH v4 1/7] irqdomain: Fix irq_domain_alloc_irqs return check Yingjoe Chen
@ 2014-10-23 15:53 ` Yingjoe Chen
  2014-10-23 15:53 ` [PATCH v4 3/7] genirq: Add more helper functions to support stacked irq_chip Yingjoe Chen
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Yingjoe Chen @ 2014-10-23 15:53 UTC (permalink / raw)
  To: Rob Herring, Jiang Liu, Marc Zyngier, Matthias Brugger, arm
  Cc: Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala, Russell King,
	Thomas Gleixner, Jason Cooper, Benjamin Herrenschmidt,
	Yingjoe Chen, Grant Likely, Hans de Goede, Boris BREZILLON,
	devicetree, linux-kernel, linux-arm-kernel, Olof Johansson,
	Arnd Bergmann, srv_heupstream, yingjoe.chen, hc.yen, eddie.huang,
	nathan.chung, yh.chen

Move xlate and set_type out to common code for hierarchy irq domain.
Withouth this common code, all outermost irq domain will have to duplicate
these function.

Signed-off-by: Yingjoe Chen <yingjoe.chen@mediatek.com>
---
 kernel/irq/irqdomain.c | 29 ++++++++++++++++++++---------
 1 file changed, 20 insertions(+), 9 deletions(-)

diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c
index dd8d3ab..b3288e8 100644
--- a/kernel/irq/irqdomain.c
+++ b/kernel/irq/irqdomain.c
@@ -478,11 +478,6 @@ unsigned int irq_create_of_mapping(struct of_phandle_args *irq_data)
 		return 0;
 	}
 
-	if (irq_domain_is_hierarchy(domain)) {
-		virq = irq_domain_alloc_irqs(domain, 1, NUMA_NO_NODE, irq_data);
-		return virq <= 0 ? 0 : virq;
-	}
-
 	/* If domain has no translation, then we assume interrupt line */
 	if (domain->ops->xlate == NULL)
 		hwirq = irq_data->args[0];
@@ -492,10 +487,26 @@ unsigned int irq_create_of_mapping(struct of_phandle_args *irq_data)
 			return 0;
 	}
 
-	/* Create mapping */
-	virq = irq_create_mapping(domain, hwirq);
-	if (!virq)
-		return virq;
+	if (irq_domain_is_hierarchy(domain)) {
+		if (domain->ops->xlate) {
+			/*
+			 * If we've already configured this interrupt,
+			 * don't do it again, or hell will break loose.
+			 */
+			virq = irq_find_mapping(domain, hwirq);
+			if (virq)
+				return virq;
+		}
+
+		virq = irq_domain_alloc_irqs(domain, 1, NUMA_NO_NODE, irq_data);
+		if (virq <= 0)
+			return 0;
+	} else {
+		/* Create mapping */
+		virq = irq_create_mapping(domain, hwirq);
+		if (!virq)
+			return virq;
+	}
 
 	/* Set type if specified and different than the current one */
 	if (type != IRQ_TYPE_NONE &&
-- 
1.8.1.1.dirty


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v4 3/7] genirq: Add more helper functions to support stacked irq_chip
  2014-10-23 15:53 [PATCH v4 0/7] ARM: mediatek: Add support for interrupt polarity Yingjoe Chen
  2014-10-23 15:53 ` [PATCH v4 1/7] irqdomain: Fix irq_domain_alloc_irqs return check Yingjoe Chen
  2014-10-23 15:53 ` [PATCH v4 2/7] irqdomain: Add back xlate and set_type for hierarchy irq domain Yingjoe Chen
@ 2014-10-23 15:53 ` Yingjoe Chen
  2014-10-23 15:53 ` [PATCH v4 4/7] irqchip: gic: Support hierarchy irq domain Yingjoe Chen
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Yingjoe Chen @ 2014-10-23 15:53 UTC (permalink / raw)
  To: Rob Herring, Jiang Liu, Marc Zyngier, Matthias Brugger, arm
  Cc: Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala, Russell King,
	Thomas Gleixner, Jason Cooper, Benjamin Herrenschmidt,
	Yingjoe Chen, Grant Likely, Hans de Goede, Boris BREZILLON,
	devicetree, linux-kernel, linux-arm-kernel, Olof Johansson,
	Arnd Bergmann, srv_heupstream, yingjoe.chen, hc.yen, eddie.huang,
	nathan.chung, yh.chen

Add more helper function for stacked irq_chip to just call parent's
function.

Signed-off-by: Yingjoe Chen <yingjoe.chen@mediatek.com>
---
 include/linux/irq.h |  6 ++++++
 kernel/irq/chip.c   | 28 ++++++++++++++++++++++++++++
 2 files changed, 34 insertions(+)

diff --git a/include/linux/irq.h b/include/linux/irq.h
index 07abf5a..071b1e8 100644
--- a/include/linux/irq.h
+++ b/include/linux/irq.h
@@ -437,6 +437,12 @@ extern void handle_nested_irq(unsigned int irq);
 
 #ifdef	CONFIG_IRQ_DOMAIN_HIERARCHY
 extern void irq_chip_ack_parent(struct irq_data *data);
+extern void irq_chip_mask_parent(struct irq_data *data);
+extern void irq_chip_unmask_parent(struct irq_data *data);
+extern void irq_chip_eoi_parent(struct irq_data *data);
+extern int irq_chip_set_affinity_parent(struct irq_data *data,
+					const struct cpumask *dest,
+					bool force);
 extern int irq_chip_retrigger_hierarchy(struct irq_data *data);
 #endif
 
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
index 58ed9ed..0ecc270 100644
--- a/kernel/irq/chip.c
+++ b/kernel/irq/chip.c
@@ -829,6 +829,34 @@ void irq_chip_ack_parent(struct irq_data *data)
 	data->chip->irq_ack(data);
 }
 
+void irq_chip_mask_parent(struct irq_data *data)
+{
+	data = data->parent_data;
+	data->chip->irq_mask(data);
+}
+
+void irq_chip_unmask_parent(struct irq_data *data)
+{
+	data = data->parent_data;
+	data->chip->irq_unmask(data);
+}
+
+void irq_chip_eoi_parent(struct irq_data *data)
+{
+	data = data->parent_data;
+	data->chip->irq_eoi(data);
+}
+
+int irq_chip_set_affinity_parent(struct irq_data *data,
+				 const struct cpumask *dest, bool force)
+{
+	data = data->parent_data;
+	if (data->chip->irq_set_affinity)
+		return data->chip->irq_set_affinity(data, dest, force);
+
+	return -ENOSYS;
+}
+
 int irq_chip_retrigger_hierarchy(struct irq_data *data)
 {
 	for (data = data->parent_data; data; data = data->parent_data)
-- 
1.8.1.1.dirty


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v4 4/7] irqchip: gic: Support hierarchy irq domain.
  2014-10-23 15:53 [PATCH v4 0/7] ARM: mediatek: Add support for interrupt polarity Yingjoe Chen
                   ` (2 preceding siblings ...)
  2014-10-23 15:53 ` [PATCH v4 3/7] genirq: Add more helper functions to support stacked irq_chip Yingjoe Chen
@ 2014-10-23 15:53 ` Yingjoe Chen
  2014-10-24  6:50   ` Yingjoe Chen
  2014-10-23 15:53 ` [PATCH v4 5/7] ARM: mediatek: Add sysirq interrupt polarity support Yingjoe Chen
                   ` (3 subsequent siblings)
  7 siblings, 1 reply; 12+ messages in thread
From: Yingjoe Chen @ 2014-10-23 15:53 UTC (permalink / raw)
  To: Rob Herring, Jiang Liu, Marc Zyngier, Matthias Brugger, arm
  Cc: Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala, Russell King,
	Thomas Gleixner, Jason Cooper, Benjamin Herrenschmidt,
	Yingjoe Chen, Grant Likely, Hans de Goede, Boris BREZILLON,
	devicetree, linux-kernel, linux-arm-kernel, Olof Johansson,
	Arnd Bergmann, srv_heupstream, yingjoe.chen, hc.yen, eddie.huang,
	nathan.chung, yh.chen

Add support to use gic as a parent for stacked irq domain.

Signed-off-by: Yingjoe Chen <yingjoe.chen@mediatek.com>
---
 drivers/irqchip/Kconfig   |  1 +
 drivers/irqchip/irq-gic.c | 54 +++++++++++++++++++++++++++++++++++++++--------
 2 files changed, 46 insertions(+), 9 deletions(-)

diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig
index b8632bf..2a48e0a 100644
--- a/drivers/irqchip/Kconfig
+++ b/drivers/irqchip/Kconfig
@@ -5,6 +5,7 @@ config IRQCHIP
 config ARM_GIC
 	bool
 	select IRQ_DOMAIN
+	select IRQ_DOMAIN_HIERARCHY
 	select MULTI_IRQ_HANDLER
 
 config GIC_NON_BANKED
diff --git a/drivers/irqchip/irq-gic.c b/drivers/irqchip/irq-gic.c
index dda6dbc..1933cea 100644
--- a/drivers/irqchip/irq-gic.c
+++ b/drivers/irqchip/irq-gic.c
@@ -767,19 +767,17 @@ void __init gic_init_physaddr(struct device_node *node)
 static int gic_irq_domain_map(struct irq_domain *d, unsigned int irq,
 				irq_hw_number_t hw)
 {
+	irq_domain_set_hwirq_and_chip(d, irq, hw, &gic_chip, d->host_data);
 	if (hw < 32) {
 		irq_set_percpu_devid(irq);
-		irq_set_chip_and_handler(irq, &gic_chip,
-					 handle_percpu_devid_irq);
+		irq_set_handler(irq, handle_percpu_devid_irq);
 		set_irq_flags(irq, IRQF_VALID | IRQF_NOAUTOEN);
 	} else {
-		irq_set_chip_and_handler(irq, &gic_chip,
-					 handle_fasteoi_irq);
+		irq_set_handler(irq, handle_fasteoi_irq);
 		set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
 
 		gic_routable_irq_domain_ops->map(d, irq, hw);
 	}
-	irq_set_chip_data(irq, d->host_data);
 	return 0;
 }
 
@@ -795,8 +793,6 @@ static int gic_irq_domain_xlate(struct irq_domain *d,
 {
 	unsigned long ret = 0;
 
-	if (d->of_node != controller)
-		return -EINVAL;
 	if (intsize < 3)
 		return -EINVAL;
 
@@ -839,6 +835,42 @@ static struct notifier_block gic_cpu_notifier = {
 };
 #endif
 
+static int gic_irq_domain_alloc(struct irq_domain *domain, unsigned int virq,
+				unsigned int nr_irqs, void *arg)
+{
+	int i, ret;
+	irq_hw_number_t hwirq;
+	unsigned int type = IRQ_TYPE_NONE;
+	struct of_phandle_args *irq_data = arg;
+
+	ret = gic_irq_domain_xlate(domain, irq_data->np, irq_data->args,
+				   irq_data->args_count, &hwirq, &type);
+	if (ret)
+		return ret;
+
+	for (i = 0; i < nr_irqs; i++)
+		gic_irq_domain_map(domain, virq+i, hwirq+i);
+
+	return 0;
+}
+
+static void gic_irq_domain_free(struct irq_domain *domain, unsigned int virq,
+				unsigned int nr_irqs)
+{
+	int i;
+
+	for (i = 0; i < nr_irqs; i++) {
+		irq_set_handler(virq + i, NULL);
+		irq_domain_set_hwirq_and_chip(domain, virq + i, 0, NULL, NULL);
+	}
+}
+
+static const struct irq_domain_ops gic_irq_domain_hierarchy_ops = {
+	.xlate = gic_irq_domain_xlate,
+	.alloc = gic_irq_domain_alloc,
+	.free = gic_irq_domain_free,
+};
+
 static const struct irq_domain_ops gic_irq_domain_ops = {
 	.map = gic_irq_domain_map,
 	.unmap = gic_irq_domain_unmap,
@@ -952,8 +984,7 @@ void __init gic_init_bases(unsigned int gic_nr, int irq_start,
 
 	gic_irqs -= hwirq_base; /* calculate # of irqs to allocate */
 
-	if (of_property_read_u32(node, "arm,routable-irqs",
-				 &nr_routable_irqs)) {
+	if (!node) {
 		irq_base = irq_alloc_descs(irq_start, 16, gic_irqs,
 					   numa_node_id());
 		if (IS_ERR_VALUE(irq_base)) {
@@ -964,6 +995,11 @@ void __init gic_init_bases(unsigned int gic_nr, int irq_start,
 
 		gic->domain = irq_domain_add_legacy(node, gic_irqs, irq_base,
 					hwirq_base, &gic_irq_domain_ops, gic);
+	} else if (of_property_read_u32(node, "arm,routable-irqs",
+				 &nr_routable_irqs)) {
+		gic->domain = irq_domain_add_linear(node, gic_irqs,
+						&gic_irq_domain_hierarchy_ops,
+						gic);
 	} else {
 		gic->domain = irq_domain_add_linear(node, nr_routable_irqs,
 						    &gic_irq_domain_ops,
-- 
1.8.1.1.dirty


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v4 5/7] ARM: mediatek: Add sysirq interrupt polarity support
  2014-10-23 15:53 [PATCH v4 0/7] ARM: mediatek: Add support for interrupt polarity Yingjoe Chen
                   ` (3 preceding siblings ...)
  2014-10-23 15:53 ` [PATCH v4 4/7] irqchip: gic: Support hierarchy irq domain Yingjoe Chen
@ 2014-10-23 15:53 ` Yingjoe Chen
  2014-10-23 15:53 ` [PATCH v4 6/7] ARM: mediatek: Add sysirq in mt6589/mt8135/mt8127 dtsi Yingjoe Chen
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Yingjoe Chen @ 2014-10-23 15:53 UTC (permalink / raw)
  To: Rob Herring, Jiang Liu, Marc Zyngier, Matthias Brugger, arm
  Cc: Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala, Russell King,
	Thomas Gleixner, Jason Cooper, Benjamin Herrenschmidt,
	Yingjoe Chen, Grant Likely, Hans de Goede, Boris BREZILLON,
	devicetree, linux-kernel, linux-arm-kernel, Olof Johansson,
	Arnd Bergmann, srv_heupstream, yingjoe.chen, hc.yen, eddie.huang,
	nathan.chung, yh.chen

Mediatek SoCs have interrupt polarity in sysirq which allows
to swap the polarity for given interrupts. Add this support
using hierarchy irq domain.

Signed-off-by: Yingjoe Chen <yingjoe.chen@mediatek.com>
---
 drivers/irqchip/Makefile         |   1 +
 drivers/irqchip/irq-mtk-sysirq.c | 168 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 169 insertions(+)
 create mode 100644 drivers/irqchip/irq-mtk-sysirq.c

diff --git a/drivers/irqchip/Makefile b/drivers/irqchip/Makefile
index 73052ba..5a4dd73 100644
--- a/drivers/irqchip/Makefile
+++ b/drivers/irqchip/Makefile
@@ -34,3 +34,4 @@ obj-$(CONFIG_XTENSA)			+= irq-xtensa-pic.o
 obj-$(CONFIG_XTENSA_MX)			+= irq-xtensa-mx.o
 obj-$(CONFIG_IRQ_CROSSBAR)		+= irq-crossbar.o
 obj-$(CONFIG_BRCMSTB_L2_IRQ)		+= irq-brcmstb-l2.o
+obj-$(CONFIG_ARCH_MEDIATEK)		+= irq-mtk-sysirq.o
diff --git a/drivers/irqchip/irq-mtk-sysirq.c b/drivers/irqchip/irq-mtk-sysirq.c
new file mode 100644
index 0000000..4403bcf
--- /dev/null
+++ b/drivers/irqchip/irq-mtk-sysirq.c
@@ -0,0 +1,168 @@
+/*
+ * Copyright (c) 2014 MediaTek Inc.
+ * Author: Joe.C <yingjoe.chen@mediatek.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/irq.h>
+#include <linux/irqdomain.h>
+#include <linux/of.h>
+#include <linux/of_irq.h>
+#include <linux/of_address.h>
+#include <linux/io.h>
+#include <linux/slab.h>
+#include <linux/spinlock.h>
+
+#include "irqchip.h"
+
+#define MT6577_SYS_INTPOL_NUM	(224)
+
+struct mtk_sysirq_chip_data {
+	spinlock_t lock;
+	void __iomem *intpol_base;
+};
+
+static int mtk_sysirq_set_type(struct irq_data *data, unsigned int type)
+{
+	irq_hw_number_t hwirq = data->hwirq;
+	struct mtk_sysirq_chip_data *chip_data = data->chip_data;
+	u32 offset, reg_index, value;
+	unsigned long flags;
+	int ret;
+
+	offset = hwirq & 0x1f;
+	reg_index = hwirq >> 5;
+
+	spin_lock_irqsave(&chip_data->lock, flags);
+	value = readl_relaxed(chip_data->intpol_base + reg_index * 4);
+	if (type == IRQ_TYPE_LEVEL_LOW || type == IRQ_TYPE_EDGE_FALLING) {
+		if (type == IRQ_TYPE_LEVEL_LOW)
+			type = IRQ_TYPE_LEVEL_HIGH;
+		else
+			type = IRQ_TYPE_EDGE_RISING;
+		value |= (1 << offset);
+	} else
+		value &= ~(1 << offset);
+	writel(value, chip_data->intpol_base + reg_index * 4);
+
+	data = data->parent_data;
+	ret = data->chip->irq_set_type(data, type);
+	spin_unlock_irqrestore(&chip_data->lock, flags);
+	return ret;
+}
+
+static struct irq_chip mtk_sysirq_chip = {
+	.name			= "MT_SYSIRQ",
+	.irq_mask		= irq_chip_mask_parent,
+	.irq_unmask		= irq_chip_unmask_parent,
+	.irq_eoi		= irq_chip_eoi_parent,
+	.irq_set_type		= mtk_sysirq_set_type,
+	.irq_retrigger		= irq_chip_retrigger_hierarchy,
+	.irq_set_affinity	= irq_chip_set_affinity_parent,
+};
+
+static int mtk_sysirq_domain_xlate(struct irq_domain *d,
+				   struct device_node *controller,
+				   const u32 *intspec, unsigned int intsize,
+				   unsigned long *out_hwirq,
+				   unsigned int *out_type)
+{
+	if (intsize < 3)
+		return -EINVAL;
+
+	/* sysirq doesn't support PPI */
+	if (intspec[0])
+		return -EINVAL;
+
+	*out_hwirq = intspec[1];
+	*out_type = intspec[2] & IRQ_TYPE_SENSE_MASK;
+	return 0;
+}
+
+static int mtk_sysirq_domain_alloc(struct irq_domain *domain, unsigned int virq,
+				   unsigned int nr_irqs, void *arg)
+{
+	int i;
+	irq_hw_number_t hwirq;
+	struct of_phandle_args *irq_data = arg;
+
+	if (irq_data->args_count < 3)
+		return -EINVAL;
+
+	hwirq = irq_data->args[1];
+	for (i = 0; i < nr_irqs; i++)
+		irq_domain_set_hwirq_and_chip(domain, virq + i, hwirq + i,
+					      &mtk_sysirq_chip,
+					      domain->host_data);
+
+	return irq_domain_alloc_irqs_parent(domain, virq, nr_irqs, arg);
+}
+
+static void mtk_sysirq_domain_free(struct irq_domain *domain, unsigned int virq,
+				   unsigned int nr_irqs)
+{
+	int i;
+
+	for (i = 0; i < nr_irqs; i++) {
+		irq_set_handler(virq + i, NULL);
+		irq_domain_set_hwirq_and_chip(domain, virq + i, 0, NULL, NULL);
+	}
+	irq_domain_free_irqs_parent(domain, virq, nr_irqs);
+}
+
+static struct irq_domain_ops sysirq_domain_ops = {
+	.xlate = mtk_sysirq_domain_xlate,
+	.alloc = mtk_sysirq_domain_alloc,
+	.free = mtk_sysirq_domain_free,
+};
+
+static int __init mtk_sysirq_of_init(struct device_node *node,
+				     struct device_node *parent)
+{
+	struct irq_domain *domain, *domain_parent;
+	struct mtk_sysirq_chip_data *chip_data;
+	int ret = 0;
+
+	domain_parent = irq_find_host(parent);
+	if (!domain_parent) {
+		pr_err("mtk_sysirq: interrupt-parent not found\n");
+		return -EINVAL;
+	}
+
+	chip_data = kzalloc(sizeof(*chip_data), GFP_KERNEL);
+	if (!chip_data)
+		return -ENOMEM;
+
+	chip_data->intpol_base = of_io_request_and_map(node, 0, "intpol");
+	if (!chip_data->intpol_base) {
+		pr_err("mtk_sysirq: unable to map sysirq register\n");
+		ret = -ENOMEM;
+		goto out_free;
+	}
+
+	domain = irq_domain_add_linear(node, MT6577_SYS_INTPOL_NUM,
+				       &sysirq_domain_ops, chip_data);
+	if (!domain) {
+		ret = -ENOMEM;
+		goto out_unmap;
+	}
+	domain->parent = domain_parent;
+	spin_lock_init(&chip_data->lock);
+
+	return 0;
+
+out_unmap:
+	iounmap(chip_data->intpol_base);
+out_free:
+	kfree(chip_data);
+	return ret;
+}
+IRQCHIP_DECLARE(mtk_sysirq, "mediatek,mt6577-sysirq", mtk_sysirq_of_init);
-- 
1.8.1.1.dirty


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v4 6/7] ARM: mediatek: Add sysirq in mt6589/mt8135/mt8127 dtsi
  2014-10-23 15:53 [PATCH v4 0/7] ARM: mediatek: Add support for interrupt polarity Yingjoe Chen
                   ` (4 preceding siblings ...)
  2014-10-23 15:53 ` [PATCH v4 5/7] ARM: mediatek: Add sysirq interrupt polarity support Yingjoe Chen
@ 2014-10-23 15:53 ` Yingjoe Chen
  2014-10-23 15:53 ` [PATCH v4 7/7] dt-bindings: add bindings for mediatek sysirq Yingjoe Chen
  2014-10-24 14:59 ` [PATCH v4 0/7] ARM: mediatek: Add support for interrupt polarity Matthias Brugger
  7 siblings, 0 replies; 12+ messages in thread
From: Yingjoe Chen @ 2014-10-23 15:53 UTC (permalink / raw)
  To: Rob Herring, Jiang Liu, Marc Zyngier, Matthias Brugger, arm
  Cc: Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala, Russell King,
	Thomas Gleixner, Jason Cooper, Benjamin Herrenschmidt,
	Yingjoe Chen, Grant Likely, Hans de Goede, Boris BREZILLON,
	devicetree, linux-kernel, linux-arm-kernel, Olof Johansson,
	Arnd Bergmann, srv_heupstream, yingjoe.chen, hc.yen, eddie.huang,
	nathan.chung, yh.chen

Add sysirq settings for mt6589/mt8135/mt8127
This also correct timer interrupt flag. The old flag setting
works because boot loader already set polarity for timer
interrupt. Without intpol support, the setting was not changed
so gic can get the irq correctly.

Signed-off-by: Yingjoe Chen <yingjoe.chen@mediatek.com>
---
 arch/arm/boot/dts/mt6589.dtsi | 13 +++++++++++--
 arch/arm/boot/dts/mt8127.dtsi | 13 +++++++++++--
 arch/arm/boot/dts/mt8135.dtsi | 13 +++++++++++--
 3 files changed, 33 insertions(+), 6 deletions(-)

diff --git a/arch/arm/boot/dts/mt6589.dtsi b/arch/arm/boot/dts/mt6589.dtsi
index e3c7600..e7e7ddf 100644
--- a/arch/arm/boot/dts/mt6589.dtsi
+++ b/arch/arm/boot/dts/mt6589.dtsi
@@ -19,7 +19,7 @@
 
 / {
 	compatible = "mediatek,mt6589";
-	interrupt-parent = <&gic>;
+	interrupt-parent = <&sysirq>;
 
 	cpus {
 		#address-cells = <1>;
@@ -76,15 +76,24 @@
 		timer: timer@10008000 {
 			compatible = "mediatek,mt6577-timer";
 			reg = <0x10008000 0x80>;
-			interrupts = <GIC_SPI 113 IRQ_TYPE_EDGE_RISING>;
+			interrupts = <GIC_SPI 113 IRQ_TYPE_LEVEL_LOW>;
 			clocks = <&system_clk>, <&rtc_clk>;
 			clock-names = "system-clk", "rtc-clk";
 		};
 
+		sysirq: interrupt-controller@10200100 {
+			compatible = "mediatek,mt6589-sysirq", "mediatek,mt6577-sysirq";
+			interrupt-controller;
+			#interrupt-cells = <3>;
+			interrupt-parent = <&gic>;
+			reg = <0 0x10200100 0 0x1c>;
+		};
+
 		gic: interrupt-controller@10211000 {
 			compatible = "arm,cortex-a7-gic";
 			interrupt-controller;
 			#interrupt-cells = <3>;
+			interrupt-parent = <&gic>;
 			reg = <0x10211000 0x1000>,
 			      <0x10212000 0x1000>,
 			      <0x10214000 0x2000>,
diff --git a/arch/arm/boot/dts/mt8127.dtsi b/arch/arm/boot/dts/mt8127.dtsi
index 65d279d..adc6f2d 100644
--- a/arch/arm/boot/dts/mt8127.dtsi
+++ b/arch/arm/boot/dts/mt8127.dtsi
@@ -18,7 +18,7 @@
 
 / {
 	compatible = "mediatek,mt8127";
-	interrupt-parent = <&gic>;
+	interrupt-parent = <&sysirq>;
 
 	cpus {
 		#address-cells = <1>;
@@ -81,15 +81,24 @@
 		timer: timer@10008000 {
 			compatible = "mediatek,mt8127-timer", "mediatek,mt6577-timer";
 			reg = <0 0x10008000 0 0x80>;
-			interrupts = <GIC_SPI 112 IRQ_TYPE_LEVEL_HIGH>;
+			interrupts = <GIC_SPI 112 IRQ_TYPE_LEVEL_LOW>;
 			clocks = <&system_clk>, <&rtc_clk>;
 			clock-names = "system-clk", "rtc-clk";
 		};
 
+		sysirq: interrupt-controller@10200100 {
+			compatible = "mediatek,mt8127-sysirq", "mediatek,mt6577-sysirq";
+			interrupt-controller;
+			#interrupt-cells = <3>;
+			interrupt-parent = <&gic>;
+			reg = <0 0x10200100 0 0x1c>;
+		};
+
 		gic: interrupt-controller@10211000 {
 			compatible = "arm,cortex-a7-gic";
 			interrupt-controller;
 			#interrupt-cells = <3>;
+			interrupt-parent = <&gic>;
 			reg = <0 0x10211000 0 0x1000>,
 			      <0 0x10212000 0 0x1000>,
 			      <0 0x10214000 0 0x2000>,
diff --git a/arch/arm/boot/dts/mt8135.dtsi b/arch/arm/boot/dts/mt8135.dtsi
index f89a4f5..9627320 100644
--- a/arch/arm/boot/dts/mt8135.dtsi
+++ b/arch/arm/boot/dts/mt8135.dtsi
@@ -18,7 +18,7 @@
 
 / {
 	compatible = "mediatek,mt8135";
-	interrupt-parent = <&gic>;
+	interrupt-parent = <&sysirq>;
 
 	cpu-map {
 		cluster0 {
@@ -103,15 +103,24 @@
 		timer: timer@10008000 {
 			compatible = "mediatek,mt8135-timer", "mediatek,mt6577-timer";
 			reg = <0 0x10008000 0 0x80>;
-			interrupts = <GIC_SPI 113 IRQ_TYPE_LEVEL_HIGH>;
+			interrupts = <GIC_SPI 113 IRQ_TYPE_LEVEL_LOW>;
 			clocks = <&system_clk>, <&rtc_clk>;
 			clock-names = "system-clk", "rtc-clk";
 		};
 
+		sysirq: interrupt-controller@10200030 {
+			compatible = "mediatek,mt8135-sysirq", "mediatek,mt6577-sysirq";
+			interrupt-controller;
+			#interrupt-cells = <3>;
+			interrupt-parent = <&gic>;
+			reg = <0 0x10200030 0 0x1c>;
+		};
+
 		gic: interrupt-controller@10211000 {
 			compatible = "arm,cortex-a15-gic";
 			interrupt-controller;
 			#interrupt-cells = <3>;
+			interrupt-parent = <&gic>;
 			reg = <0 0x10211000 0 0x1000>,
 			      <0 0x10212000 0 0x1000>,
 			      <0 0x10214000 0 0x2000>,
-- 
1.8.1.1.dirty


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v4 7/7] dt-bindings: add bindings for mediatek sysirq
  2014-10-23 15:53 [PATCH v4 0/7] ARM: mediatek: Add support for interrupt polarity Yingjoe Chen
                   ` (5 preceding siblings ...)
  2014-10-23 15:53 ` [PATCH v4 6/7] ARM: mediatek: Add sysirq in mt6589/mt8135/mt8127 dtsi Yingjoe Chen
@ 2014-10-23 15:53 ` Yingjoe Chen
  2014-10-24 14:59 ` [PATCH v4 0/7] ARM: mediatek: Add support for interrupt polarity Matthias Brugger
  7 siblings, 0 replies; 12+ messages in thread
From: Yingjoe Chen @ 2014-10-23 15:53 UTC (permalink / raw)
  To: Rob Herring, Jiang Liu, Marc Zyngier, Matthias Brugger, arm
  Cc: Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala, Russell King,
	Thomas Gleixner, Jason Cooper, Benjamin Herrenschmidt,
	Yingjoe Chen, Grant Likely, Hans de Goede, Boris BREZILLON,
	devicetree, linux-kernel, linux-arm-kernel, Olof Johansson,
	Arnd Bergmann, srv_heupstream, yingjoe.chen, hc.yen, eddie.huang,
	nathan.chung, yh.chen

Add binding documentation for Mediatek SoC SYSIRQ.

Signed-off-by: Yingjoe Chen <yingjoe.chen@mediatek.com>
---
 .../bindings/arm/mediatek/mediatek,sysirq.txt      | 26 ++++++++++++++++++++++
 1 file changed, 26 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/arm/mediatek/mediatek,sysirq.txt

diff --git a/Documentation/devicetree/bindings/arm/mediatek/mediatek,sysirq.txt b/Documentation/devicetree/bindings/arm/mediatek/mediatek,sysirq.txt
new file mode 100644
index 0000000..8669536
--- /dev/null
+++ b/Documentation/devicetree/bindings/arm/mediatek/mediatek,sysirq.txt
@@ -0,0 +1,26 @@
+Mediatek 65xx/81xx sysirq
+
+Mediatek SOCs sysirq support controllable irq inverter for each GIC SPI
+interrupt.
+
+Required properties:
+- compatible: should be one of:
+	"mediatek,mt8135-sysirq"
+	"mediatek,mt8127-sysirq"
+	"mediatek,mt6589-sysirq"
+	"mediatek,mt6582-sysirq"
+	"mediatek,mt6577-sysirq"
+- interrupt-controller : Identifies the node as an interrupt controller
+- #interrupt-cells : Must use the same cells/format as parent controller.
+- interrupt-parent: phandle of irq domain parent for sysirq.
+- reg: Physical base address of the intpol registers and length of memory
+  mapped region.
+
+Example:
+	sysirq: interrupt-controller@10200100 {
+		compatible = "mediatek,mt6589-sysirq", "mediatek,mt6577-sysirq";
+		interrupt-controller;
+		#interrupt-cells = <3>;
+		interrupt-parent = <&gic>;
+		reg = <0 0x10200100 0 0x1c>;
+	};
-- 
1.8.1.1.dirty


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH v4 4/7] irqchip: gic: Support hierarchy irq domain.
  2014-10-23 15:53 ` [PATCH v4 4/7] irqchip: gic: Support hierarchy irq domain Yingjoe Chen
@ 2014-10-24  6:50   ` Yingjoe Chen
  0 siblings, 0 replies; 12+ messages in thread
From: Yingjoe Chen @ 2014-10-24  6:50 UTC (permalink / raw)
  To: Rob Herring, Jiang Liu, Marc Zyngier, arm, Matthias Brugger
  Cc: Mark Rutland, Benjamin Herrenschmidt, yingjoe.chen,
	Boris BREZILLON, Russell King, Arnd Bergmann, yh.chen,
	nathan.chung, Grant Likely, devicetree, Jason Cooper, Pawel Moll,
	Ian Campbell, Hans de Goede, Thomas Gleixner, eddie.huang,
	linux-arm-kernel, srv_heupstream, hc.yen, linux-kernel,
	Kumar Gala, Olof Johansson



Sorry, I missed Marc's patch while working on this version and that did
address something I missed in my version. I'd like to replace 4/7 with
this one.

Joe.C

==========================================
Add support to use gic as a parent for stacked irq domain.

Signed-off-by: Yingjoe Chen <yingjoe.chen@mediatek.com>
---
 drivers/irqchip/Kconfig   |  1 +
 drivers/irqchip/irq-gic.c | 89 +++++++++++++++++++++++++++++++++--------------
 2 files changed, 64 insertions(+), 26 deletions(-)

diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig
index b8632bf..2a48e0a 100644
--- a/drivers/irqchip/Kconfig
+++ b/drivers/irqchip/Kconfig
@@ -5,6 +5,7 @@ config IRQCHIP
 config ARM_GIC
 	bool
 	select IRQ_DOMAIN
+	select IRQ_DOMAIN_HIERARCHY
 	select MULTI_IRQ_HANDLER
 
 config GIC_NON_BANKED
diff --git a/drivers/irqchip/irq-gic.c b/drivers/irqchip/irq-gic.c
index dda6dbc..8eaedf5 100644
--- a/drivers/irqchip/irq-gic.c
+++ b/drivers/irqchip/irq-gic.c
@@ -767,19 +767,17 @@ void __init gic_init_physaddr(struct device_node *node)
 static int gic_irq_domain_map(struct irq_domain *d, unsigned int irq,
 				irq_hw_number_t hw)
 {
+	irq_domain_set_hwirq_and_chip(d, irq, hw, &gic_chip, d->host_data);
 	if (hw < 32) {
 		irq_set_percpu_devid(irq);
-		irq_set_chip_and_handler(irq, &gic_chip,
-					 handle_percpu_devid_irq);
+		irq_set_handler(irq, handle_percpu_devid_irq);
 		set_irq_flags(irq, IRQF_VALID | IRQF_NOAUTOEN);
 	} else {
-		irq_set_chip_and_handler(irq, &gic_chip,
-					 handle_fasteoi_irq);
+		irq_set_handler(irq, handle_fasteoi_irq);
 		set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
 
 		gic_routable_irq_domain_ops->map(d, irq, hw);
 	}
-	irq_set_chip_data(irq, d->host_data);
 	return 0;
 }
 
@@ -795,8 +793,6 @@ static int gic_irq_domain_xlate(struct irq_domain *d,
 {
 	unsigned long ret = 0;
 
-	if (d->of_node != controller)
-		return -EINVAL;
 	if (intsize < 3)
 		return -EINVAL;
 
@@ -839,6 +835,42 @@ static struct notifier_block gic_cpu_notifier = {
 };
 #endif
 
+static int gic_irq_domain_alloc(struct irq_domain *domain, unsigned int virq,
+				unsigned int nr_irqs, void *arg)
+{
+	int i, ret;
+	irq_hw_number_t hwirq;
+	unsigned int type = IRQ_TYPE_NONE;
+	struct of_phandle_args *irq_data = arg;
+
+	ret = gic_irq_domain_xlate(domain, irq_data->np, irq_data->args,
+				   irq_data->args_count, &hwirq, &type);
+	if (ret)
+		return ret;
+
+	for (i = 0; i < nr_irqs; i++)
+		gic_irq_domain_map(domain, virq+i, hwirq+i);
+
+	return 0;
+}
+
+static void gic_irq_domain_free(struct irq_domain *domain, unsigned int virq,
+				unsigned int nr_irqs)
+{
+	int i;
+
+	for (i = 0; i < nr_irqs; i++) {
+		irq_set_handler(virq + i, NULL);
+		irq_domain_set_hwirq_and_chip(domain, virq + i, 0, NULL, NULL);
+	}
+}
+
+static const struct irq_domain_ops gic_irq_domain_hierarchy_ops = {
+	.xlate = gic_irq_domain_xlate,
+	.alloc = gic_irq_domain_alloc,
+	.free = gic_irq_domain_free,
+};
+
 static const struct irq_domain_ops gic_irq_domain_ops = {
 	.map = gic_irq_domain_map,
 	.unmap = gic_irq_domain_unmap,
@@ -929,18 +961,6 @@ void __init gic_init_bases(unsigned int gic_nr, int irq_start,
 		gic_cpu_map[i] = 0xff;
 
 	/*
-	 * For primary GICs, skip over SGIs.
-	 * For secondary GICs, skip over PPIs, too.
-	 */
-	if (gic_nr == 0 && (irq_start & 31) > 0) {
-		hwirq_base = 16;
-		if (irq_start != -1)
-			irq_start = (irq_start & ~31) + 16;
-	} else {
-		hwirq_base = 32;
-	}
-
-	/*
 	 * Find out how many interrupts are supported.
 	 * The GIC only supports up to 1020 interrupt sources.
 	 */
@@ -950,10 +970,31 @@ void __init gic_init_bases(unsigned int gic_nr, int irq_start,
 		gic_irqs = 1020;
 	gic->gic_irqs = gic_irqs;
 
-	gic_irqs -= hwirq_base; /* calculate # of irqs to allocate */
+	if (node) {		/* DT case */
+		const struct irq_domain_ops *ops = &gic_irq_domain_hierarchy_ops;
+
+		if (!of_property_read_u32(node, "arm,routable-irqs",
+					  &nr_routable_irqs)) {
+			ops = &gic_irq_domain_ops;
+			gic_irqs = nr_routable_irqs;
+		}
+
+		gic->domain = irq_domain_add_linear(node, gic_irqs, ops, gic);
+	} else {		/* Non-DT case */
+		/*
+		 * For primary GICs, skip over SGIs.
+		 * For secondary GICs, skip over PPIs, too.
+		 */
+		if (gic_nr == 0 && (irq_start & 31) > 0) {
+			hwirq_base = 16;
+			if (irq_start != -1)
+				irq_start = (irq_start & ~31) + 16;
+		} else {
+			hwirq_base = 32;
+		}
+
+		gic_irqs -= hwirq_base; /* calculate # of irqs to allocate */
 
-	if (of_property_read_u32(node, "arm,routable-irqs",
-				 &nr_routable_irqs)) {
 		irq_base = irq_alloc_descs(irq_start, 16, gic_irqs,
 					   numa_node_id());
 		if (IS_ERR_VALUE(irq_base)) {
@@ -964,10 +1005,6 @@ void __init gic_init_bases(unsigned int gic_nr, int irq_start,
 
 		gic->domain = irq_domain_add_legacy(node, gic_irqs, irq_base,
 					hwirq_base, &gic_irq_domain_ops, gic);
-	} else {
-		gic->domain = irq_domain_add_linear(node, nr_routable_irqs,
-						    &gic_irq_domain_ops,
-						    gic);
 	}
 
 	if (WARN_ON(!gic->domain))
-- 
1.8.1.1.dirty



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH v4 0/7] ARM: mediatek: Add support for interrupt polarity
  2014-10-23 15:53 [PATCH v4 0/7] ARM: mediatek: Add support for interrupt polarity Yingjoe Chen
                   ` (6 preceding siblings ...)
  2014-10-23 15:53 ` [PATCH v4 7/7] dt-bindings: add bindings for mediatek sysirq Yingjoe Chen
@ 2014-10-24 14:59 ` Matthias Brugger
  2014-10-24 15:06   ` Yingjoe Chen
  7 siblings, 1 reply; 12+ messages in thread
From: Matthias Brugger @ 2014-10-24 14:59 UTC (permalink / raw)
  To: Yingjoe Chen
  Cc: Rob Herring, Jiang Liu, Marc Zyngier, arm, Pawel Moll,
	Mark Rutland, Ian Campbell, Kumar Gala, Russell King,
	Thomas Gleixner, Jason Cooper, Benjamin Herrenschmidt,
	Grant Likely, Hans de Goede, Boris BREZILLON, devicetree,
	linux-kernel, linux-arm-kernel, Olof Johansson, Arnd Bergmann,
	srv_heupstream, Yingjoe Chen, Hsien-Chun Yen, huang eddie,
	Nathan Chung, Yuhau Chen

Hi Joe,

2014-10-23 17:53 GMT+02:00 Yingjoe Chen <yingjoe.chen@mediatek.com>:
> This series is 4th version of interrupt polarity support for MediaTek SoCs.
> This is based on Jiang's hierarchy irqdomain v2 [1] and my mediatek SoC
> basic support [2].
>
> This version addressed comments from previous discussion[3]. I removed
> arm,hierarchy-irq-domain property. When GIC is probed by DT, it will
> support hierarchy irqdomain. I still keep the first patch because this is
> still base on hierarchy irqdomain v2.

Is this set based on v3.17-rc1?
Is it based on one of Jiangs trees [0]?

I tried to use your patch set with v3.18-rc1 using Jiangs tree but the
kernel crashed on mt6589 with a null-pointer exception [1]. A test
with mt6592 didn't work either.

It would be convenient if you rebase your patches to v3.18-rc1.

Thanks,
Matthias

[0] https://github.com/jiangliu/linux
[1] http://pastebin.com/3F1pVaM9

>
> In Jiang's version of irq_create_of_mapping, if irqdomain is hierarchy, it
> will not perform irq_find_mapping check and set_type. The outermost
> irqdomain need to take care of that. Because we will have several different
> outermost irqdomain in different ARM SoCs, this cause code duplication. I
> moved them back to irq_create_of_mapping. Since Jiang's changes are not
> merged yet, maybe that patch should be merged there.
>
> Simplified block diagram for interrupt on my system:
>
>     +-------+      +-------+
>  ---| SYSIRQ|------|ARM GIC|
>  ---|       |------|       |
>  ---|       |------|       |
>  ---|       |------|       |
>  ---|       |------|       |
>     +-------+      +-------+
>
> In device tree, interrupt-parent for other devices is sysirq, child of gic.
> This describe HW better and allow device to specify polarity as it is sent
> by the device.
>
> When using hierarchy irq domain, gic will use irq_domain_add_linear to
> create irqdomain and all interrupt numbers must come from device tree. My
> /proc/interrupts looks like this now:
>
> # cat /proc/interrupts
>            CPU0
>  16:       1862  MT_SYSIRQ 113  mtk_timer
>  17:         67  MT_SYSIRQ  54  mtk-uart
>
> Changes in v3:
>  - Discussion in [3]
>  - First implementation using hierarchy irqdomain
>
> [1] http://lists.infradead.org/pipermail/linux-arm-kernel/2014-September/290832.html
> [2] http://lists.infradead.org/pipermail/linux-arm-kernel/2014-September/284553.html
> [3] http://lists.infradead.org/pipermail/linux-arm-kernel/2014-October/293766.html
>
> Yingjoe Chen (7):
>   irqdomain: Fix irq_domain_alloc_irqs return check.
>   irqdomain: Add back xlate and set_type for hierarchy irq domain
>   genirq: Add more helper functions to support stacked irq_chip
>   irqchip: gic: Support hierarchy irq domain.
>   ARM: mediatek: Add sysirq interrupt polarity support
>   ARM: mediatek: Add sysirq in mt6589/mt8135/mt8127 dtsi
>   dt-bindings: add bindings for mediatek sysirq
>
>  .../bindings/arm/mediatek/mediatek,sysirq.txt      |  26 ++++
>  arch/arm/boot/dts/mt6589.dtsi                      |  14 +-
>  arch/arm/boot/dts/mt8127.dtsi                      |  14 +-
>  arch/arm/boot/dts/mt8135.dtsi                      |  14 +-
>  drivers/irqchip/Kconfig                            |   1 +
>  drivers/irqchip/Makefile                           |   1 +
>  drivers/irqchip/irq-gic.c                          |  54 +++++--
>  drivers/irqchip/irq-mtk-sysirq.c                   | 168 +++++++++++++++++++++
>  include/linux/irq.h                                |   6 +
>  kernel/irq/chip.c                                  |  28 ++++
>  kernel/irq/irqdomain.c                             |  31 ++--
>  11 files changed, 332 insertions(+), 25 deletions(-)
>  create mode 100644 Documentation/devicetree/bindings/arm/mediatek/mediatek,sysirq.txt
>  create mode 100644 drivers/irqchip/irq-mtk-sysirq.c
>
> --
> 1.8.1.1.dirty
>



-- 
motzblog.wordpress.com

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v4 0/7] ARM: mediatek: Add support for interrupt polarity
  2014-10-24 14:59 ` [PATCH v4 0/7] ARM: mediatek: Add support for interrupt polarity Matthias Brugger
@ 2014-10-24 15:06   ` Yingjoe Chen
  2014-10-27  7:44     ` Yingjoe Chen
  0 siblings, 1 reply; 12+ messages in thread
From: Yingjoe Chen @ 2014-10-24 15:06 UTC (permalink / raw)
  To: Matthias Brugger
  Cc: Rob Herring, Jiang Liu, Marc Zyngier, arm, Pawel Moll,
	Mark Rutland, Ian Campbell, Kumar Gala, Russell King,
	Thomas Gleixner, Jason Cooper, Benjamin Herrenschmidt,
	Grant Likely, Hans de Goede, Boris BREZILLON, devicetree,
	linux-kernel, linux-arm-kernel, Olof Johansson, Arnd Bergmann,
	srv_heupstream, Yingjoe Chen, Hsien-Chun Yen, huang eddie,
	Nathan Chung, Yuhau Chen

On Fri, 2014-10-24 at 16:59 +0200, Matthias Brugger wrote:
> Hi Joe,
> 
> 2014-10-23 17:53 GMT+02:00 Yingjoe Chen <yingjoe.chen@mediatek.com>:
> > This series is 4th version of interrupt polarity support for MediaTek SoCs.
> > This is based on Jiang's hierarchy irqdomain v2 [1] and my mediatek SoC
> > basic support [2].
> >
> > This version addressed comments from previous discussion[3]. I removed
> > arm,hierarchy-irq-domain property. When GIC is probed by DT, it will
> > support hierarchy irqdomain. I still keep the first patch because this is
> > still base on hierarchy irqdomain v2.
> 
> Is this set based on v3.17-rc1?
> Is it based on one of Jiangs trees [0]?
> 
> I tried to use your patch set with v3.18-rc1 using Jiangs tree but the
> kernel crashed on mt6589 with a null-pointer exception [1]. A test
> with mt6592 didn't work either.
> 
> It would be convenient if you rebase your patches to v3.18-rc1.

It is based on Jiang's tree[0], which is based on v3.17-rc1. So yes,
this series is still on v3.17-rc1.

All I need from Jiang's series are the first 2 patches, I'll bring them
to v3.18-rc1 to test next week.

Joe.C

[0] https://github.com/jiangliu/linux.git irqdomain/p2v2



> 
> Thanks,
> Matthias
> 
> [0] https://github.com/jiangliu/linux
> [1] http://pastebin.com/3F1pVaM9
> 
> >
> > In Jiang's version of irq_create_of_mapping, if irqdomain is hierarchy, it
> > will not perform irq_find_mapping check and set_type. The outermost
> > irqdomain need to take care of that. Because we will have several different
> > outermost irqdomain in different ARM SoCs, this cause code duplication. I
> > moved them back to irq_create_of_mapping. Since Jiang's changes are not
> > merged yet, maybe that patch should be merged there.
> >
> > Simplified block diagram for interrupt on my system:
> >
> >     +-------+      +-------+
> >  ---| SYSIRQ|------|ARM GIC|
> >  ---|       |------|       |
> >  ---|       |------|       |
> >  ---|       |------|       |
> >  ---|       |------|       |
> >     +-------+      +-------+
> >
> > In device tree, interrupt-parent for other devices is sysirq, child of gic.
> > This describe HW better and allow device to specify polarity as it is sent
> > by the device.
> >
> > When using hierarchy irq domain, gic will use irq_domain_add_linear to
> > create irqdomain and all interrupt numbers must come from device tree. My
> > /proc/interrupts looks like this now:
> >
> > # cat /proc/interrupts
> >            CPU0
> >  16:       1862  MT_SYSIRQ 113  mtk_timer
> >  17:         67  MT_SYSIRQ  54  mtk-uart
> >
> > Changes in v3:
> >  - Discussion in [3]
> >  - First implementation using hierarchy irqdomain
> >
> > [1] http://lists.infradead.org/pipermail/linux-arm-kernel/2014-September/290832.html
> > [2] http://lists.infradead.org/pipermail/linux-arm-kernel/2014-September/284553.html
> > [3] http://lists.infradead.org/pipermail/linux-arm-kernel/2014-October/293766.html
> >
> > Yingjoe Chen (7):
> >   irqdomain: Fix irq_domain_alloc_irqs return check.
> >   irqdomain: Add back xlate and set_type for hierarchy irq domain
> >   genirq: Add more helper functions to support stacked irq_chip
> >   irqchip: gic: Support hierarchy irq domain.
> >   ARM: mediatek: Add sysirq interrupt polarity support
> >   ARM: mediatek: Add sysirq in mt6589/mt8135/mt8127 dtsi
> >   dt-bindings: add bindings for mediatek sysirq
> >
> >  .../bindings/arm/mediatek/mediatek,sysirq.txt      |  26 ++++
> >  arch/arm/boot/dts/mt6589.dtsi                      |  14 +-
> >  arch/arm/boot/dts/mt8127.dtsi                      |  14 +-
> >  arch/arm/boot/dts/mt8135.dtsi                      |  14 +-
> >  drivers/irqchip/Kconfig                            |   1 +
> >  drivers/irqchip/Makefile                           |   1 +
> >  drivers/irqchip/irq-gic.c                          |  54 +++++--
> >  drivers/irqchip/irq-mtk-sysirq.c                   | 168 +++++++++++++++++++++
> >  include/linux/irq.h                                |   6 +
> >  kernel/irq/chip.c                                  |  28 ++++
> >  kernel/irq/irqdomain.c                             |  31 ++--
> >  11 files changed, 332 insertions(+), 25 deletions(-)
> >  create mode 100644 Documentation/devicetree/bindings/arm/mediatek/mediatek,sysirq.txt
> >  create mode 100644 drivers/irqchip/irq-mtk-sysirq.c
> >
> > --
> > 1.8.1.1.dirty
> >
> 
> 
> 




^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v4 0/7] ARM: mediatek: Add support for interrupt polarity
  2014-10-24 15:06   ` Yingjoe Chen
@ 2014-10-27  7:44     ` Yingjoe Chen
  0 siblings, 0 replies; 12+ messages in thread
From: Yingjoe Chen @ 2014-10-27  7:44 UTC (permalink / raw)
  To: Matthias Brugger
  Cc: Rob Herring, Jiang Liu, Marc Zyngier, arm, Pawel Moll,
	Mark Rutland, Ian Campbell, Kumar Gala, Russell King,
	Thomas Gleixner, Jason Cooper, Benjamin Herrenschmidt,
	Grant Likely, Hans de Goede, Boris BREZILLON, devicetree,
	linux-kernel, linux-arm-kernel, Olof Johansson, Arnd Bergmann,
	srv_heupstream, Yingjoe Chen, Hsien-Chun Yen, huang eddie,
	Nathan Chung, Yuhau Chen


Hi Matthias,

On Fri, 2014-10-24 at 23:06 +0800, Yingjoe Chen wrote:
> On Fri, 2014-10-24 at 16:59 +0200, Matthias Brugger wrote:
> > Hi Joe,
> > 
> > 2014-10-23 17:53 GMT+02:00 Yingjoe Chen <yingjoe.chen@mediatek.com>:
> > > This series is 4th version of interrupt polarity support for MediaTek SoCs.
> > > This is based on Jiang's hierarchy irqdomain v2 [1] and my mediatek SoC
> > > basic support [2].
> > >
> > > This version addressed comments from previous discussion[3]. I removed
> > > arm,hierarchy-irq-domain property. When GIC is probed by DT, it will
> > > support hierarchy irqdomain. I still keep the first patch because this is
> > > still base on hierarchy irqdomain v2.
> > 
> > Is this set based on v3.17-rc1?
> > Is it based on one of Jiangs trees [0]?
> > 
> > I tried to use your patch set with v3.18-rc1 using Jiangs tree but the
> > kernel crashed on mt6589 with a null-pointer exception [1]. A test
> > with mt6592 didn't work either.
> > 
> > It would be convenient if you rebase your patches to v3.18-rc1.
> 
> It is based on Jiang's tree[0], which is based on v3.17-rc1. So yes,
> this series is still on v3.17-rc1.
> 
> All I need from Jiang's series are the first 2 patches, I'll bring them
> to v3.18-rc1 to test next week.

I cherry-pick/rebase my series with Jiang's 2 patches to v3.18-rc1,
there are 2 conflicts but they are quite easy to fix so I won't repost
this series now. I tested it on mt8127 with Eddie's uart patch and it
boot to shell successfully.

About crash on mt6589, I made a mistake in mt6589.dtsi. Please help to
test with the following change:

--- a/arch/arm/boot/dts/mt6589.dtsi
+++ b/arch/arm/boot/dts/mt6589.dtsi
@@ -86,7 +86,7 @@
                        interrupt-controller;
                        #interrupt-cells = <3>;
                        interrupt-parent = <&gic>;
-                       reg = <0 0x10200100 0 0x1c>;
+                       reg = <0x10200100 0x1c>;

Joe.C



^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2014-10-27  7:44 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-10-23 15:53 [PATCH v4 0/7] ARM: mediatek: Add support for interrupt polarity Yingjoe Chen
2014-10-23 15:53 ` [PATCH v4 1/7] irqdomain: Fix irq_domain_alloc_irqs return check Yingjoe Chen
2014-10-23 15:53 ` [PATCH v4 2/7] irqdomain: Add back xlate and set_type for hierarchy irq domain Yingjoe Chen
2014-10-23 15:53 ` [PATCH v4 3/7] genirq: Add more helper functions to support stacked irq_chip Yingjoe Chen
2014-10-23 15:53 ` [PATCH v4 4/7] irqchip: gic: Support hierarchy irq domain Yingjoe Chen
2014-10-24  6:50   ` Yingjoe Chen
2014-10-23 15:53 ` [PATCH v4 5/7] ARM: mediatek: Add sysirq interrupt polarity support Yingjoe Chen
2014-10-23 15:53 ` [PATCH v4 6/7] ARM: mediatek: Add sysirq in mt6589/mt8135/mt8127 dtsi Yingjoe Chen
2014-10-23 15:53 ` [PATCH v4 7/7] dt-bindings: add bindings for mediatek sysirq Yingjoe Chen
2014-10-24 14:59 ` [PATCH v4 0/7] ARM: mediatek: Add support for interrupt polarity Matthias Brugger
2014-10-24 15:06   ` Yingjoe Chen
2014-10-27  7:44     ` Yingjoe 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).