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

Commit 99f04c8f authored by Alexander Shiyan's avatar Alexander Shiyan Committed by Olof Johansson
Browse files

ARM: clps711x: Implement usage "MULTI_IRQ_HANDLER" kernel option for a platform

parent 0d8be81c
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -371,6 +371,7 @@ config ARCH_CLPS711X
	select COMMON_CLK
	select CPU_ARM720T
	select GENERIC_CLOCKEVENTS
	select MULTI_IRQ_HANDLER
	select NEED_MACH_MEMORY_H
	select SPARSE_IRQ
	help
+1 −0
Original line number Diff line number Diff line
@@ -75,6 +75,7 @@ MACHINE_START(AUTCPU12, "autronix autcpu12")
	.init_irq	= clps711x_init_irq,
	.timer		= &clps711x_timer,
	.init_machine	= autcpu12_init,
	.handle_irq	= clps711x_handle_irq,
	.restart	= clps711x_restart,
MACHINE_END
+1 −0
Original line number Diff line number Diff line
@@ -142,5 +142,6 @@ MACHINE_START(CDB89712, "Cirrus-CDB89712")
	.init_irq	= clps711x_init_irq,
	.timer		= &clps711x_timer,
	.init_machine	= cdb89712_init,
	.handle_irq	= clps711x_handle_irq,
	.restart	= clps711x_restart,
MACHINE_END
+1 −2
Original line number Diff line number Diff line
@@ -33,7 +33,6 @@ fixup_clep7312(struct tag *tags, char **cmdline, struct meminfo *mi)
	mi->bank[0].size = 0x01000000;
}


MACHINE_START(CLEP7212, "Cirrus Logic 7212/7312")
	/* Maintainer: Nobody */
	.atag_offset	= 0x0100,
@@ -42,6 +41,6 @@ MACHINE_START(CLEP7212, "Cirrus Logic 7212/7312")
	.map_io		= clps711x_map_io,
	.init_irq	= clps711x_init_irq,
	.timer		= &clps711x_timer,
	.handle_irq	= clps711x_handle_irq,
	.restart	= clps711x_restart,
MACHINE_END
+41 −4
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@
#include <linux/clockchips.h>
#include <linux/clk-provider.h>

#include <asm/exception.h>
#include <asm/mach/map.h>
#include <asm/mach/time.h>
#include <asm/system_misc.h>
@@ -134,13 +135,11 @@ static struct irq_chip int2_chip = {
	.irq_unmask	= int2_unmask,
};

struct clps711x_irqdesc {
static struct {
	int			nr;
	struct irq_chip		*chip;
	irq_flow_handler_t	handle;
};

static struct clps711x_irqdesc clps711x_irqdescs[] __initdata = {
} clps711x_irqdescs[] __initdata = {
	{ IRQ_CSINT,	&int1_chip,	handle_fasteoi_irq,	},
	{ IRQ_EINT1,	&int1_chip,	handle_level_irq,	},
	{ IRQ_EINT2,	&int1_chip,	handle_level_irq,	},
@@ -191,6 +190,44 @@ void __init clps711x_init_irq(void)
	}
}

inline u32 fls16(u32 x)
{
	u32 r = 15;

	if (!(x & 0xff00)) {
		x <<= 8;
		r -= 8;
	}
	if (!(x & 0xf000)) {
		x <<= 4;
		r -= 4;
	}
	if (!(x & 0xc000)) {
		x <<= 2;
		r -= 2;
	}
	if (!(x & 0x8000))
		r--;

	return r;
}

asmlinkage void __exception_irq_entry clps711x_handle_irq(struct pt_regs *regs)
{
	u32 irqstat;
	void __iomem *base = CLPS711X_VIRT_BASE;

	irqstat = readl_relaxed(base + INTSR1) & readl_relaxed(base + INTMR1);
	if (irqstat) {
		handle_IRQ(fls16(irqstat), regs);
		return;
	}

	irqstat = readl_relaxed(base + INTSR2) & readl_relaxed(base + INTMR2);
	if (likely(irqstat))
		handle_IRQ(fls16(irqstat) + 16, regs);
}

static void clps711x_clockevent_set_mode(enum clock_event_mode mode,
					 struct clock_event_device *evt)
{
Loading