Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e5c86679 authored by Max Filippov's avatar Max Filippov
Browse files

xtensa: don't use linux IRQ #0



Linux IRQ #0 is reserved for error reporting and may not be used.
Increase NR_IRQS for one additional slot and increase
irq_domain_add_legacy parameter first_irq value to 1, so that linux
IRQ #0 is not associated with hardware IRQ #0 in legacy IRQ domains.
Introduce macro XTENSA_PIC_LINUX_IRQ for static translation of xtensa
PIC hardware IRQ # to linux IRQ #. Use this macro in XTFPGA platform
data definitions.

This fixes inability to use hardware IRQ #0 in configurations that don't
use device tree and allows for non-identity mapping between linux IRQ #
and hardware IRQ #.

Cc: stable@vger.kernel.org
Signed-off-by: default avatarMax Filippov <jcmvbkbc@gmail.com>
parent 6bf28969
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -29,7 +29,8 @@ static inline void variant_irq_disable(unsigned int irq) { }
# define PLATFORM_NR_IRQS 0
#endif
#define XTENSA_NR_IRQS XCHAL_NUM_INTERRUPTS
#define NR_IRQS (XTENSA_NR_IRQS + VARIANT_NR_IRQS + PLATFORM_NR_IRQS)
#define NR_IRQS (XTENSA_NR_IRQS + VARIANT_NR_IRQS + PLATFORM_NR_IRQS + 1)
#define XTENSA_PIC_LINUX_IRQ(hwirq) ((hwirq) + 1)

#if VARIANT_NR_IRQS == 0
static inline void variant_init_irq(void) { }
+0 −5
Original line number Diff line number Diff line
@@ -34,11 +34,6 @@ asmlinkage void do_IRQ(int hwirq, struct pt_regs *regs)
{
	int irq = irq_find_mapping(NULL, hwirq);

	if (hwirq >= NR_IRQS) {
		printk(KERN_EMERG "%s: cannot handle IRQ %d\n",
				__func__, hwirq);
	}

#ifdef CONFIG_DEBUG_STACKOVERFLOW
	/* Debugging check for stack overflow: is there less than 1KB free? */
	{
+4 −2
Original line number Diff line number Diff line
@@ -24,16 +24,18 @@

/* Interrupt configuration. */

#define PLATFORM_NR_IRQS	10
#define PLATFORM_NR_IRQS	0

/* Default assignment of LX60 devices to external interrupts. */

#ifdef CONFIG_XTENSA_MX
#define DUART16552_INTNUM	XCHAL_EXTINT3_NUM
#define OETH_IRQ		XCHAL_EXTINT4_NUM
#define C67X00_IRQ		XCHAL_EXTINT8_NUM
#else
#define DUART16552_INTNUM	XCHAL_EXTINT0_NUM
#define OETH_IRQ		XCHAL_EXTINT1_NUM
#define C67X00_IRQ		XCHAL_EXTINT5_NUM
#endif

/*
@@ -63,5 +65,5 @@

#define C67X00_PADDR		(XCHAL_KIO_PADDR + 0x0D0D0000)
#define C67X00_SIZE		0x10
#define C67X00_IRQ		5

#endif /* __XTENSA_XTAVNET_HARDWARE_H */
+5 −5
Original line number Diff line number Diff line
@@ -175,8 +175,8 @@ static struct resource ethoc_res[] = {
		.flags = IORESOURCE_MEM,
	},
	[2] = { /* IRQ number */
		.start = OETH_IRQ,
		.end   = OETH_IRQ,
		.start = XTENSA_PIC_LINUX_IRQ(OETH_IRQ),
		.end   = XTENSA_PIC_LINUX_IRQ(OETH_IRQ),
		.flags = IORESOURCE_IRQ,
	},
};
@@ -213,8 +213,8 @@ static struct resource c67x00_res[] = {
		.flags = IORESOURCE_MEM,
	},
	[1] = { /* IRQ number */
		.start = C67X00_IRQ,
		.end   = C67X00_IRQ,
		.start = XTENSA_PIC_LINUX_IRQ(C67X00_IRQ),
		.end   = XTENSA_PIC_LINUX_IRQ(C67X00_IRQ),
		.flags = IORESOURCE_IRQ,
	},
};
@@ -247,7 +247,7 @@ static struct resource serial_resource = {
static struct plat_serial8250_port serial_platform_data[] = {
	[0] = {
		.mapbase	= DUART16552_PADDR,
		.irq		= DUART16552_INTNUM,
		.irq		= XTENSA_PIC_LINUX_IRQ(DUART16552_INTNUM),
		.flags		= UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
				  UPF_IOREMAP,
		.iotype		= XCHAL_HAVE_BE ? UPIO_MEM32BE : UPIO_MEM32,
+1 −1
Original line number Diff line number Diff line
@@ -142,7 +142,7 @@ static struct irq_chip xtensa_mx_irq_chip = {
int __init xtensa_mx_init_legacy(struct device_node *interrupt_parent)
{
	struct irq_domain *root_domain =
		irq_domain_add_legacy(NULL, NR_IRQS, 0, 0,
		irq_domain_add_legacy(NULL, NR_IRQS - 1, 1, 0,
				&xtensa_mx_irq_domain_ops,
				&xtensa_mx_irq_chip);
	irq_set_default_host(root_domain);
Loading