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

Commit 897cfcd8 authored by Magnus Damm's avatar Magnus Damm Committed by Paul Mundt
Browse files

sh: intc - rework higlander irq code for r7780mp and r7785rp



This patch reworks the highlander irq code for r7780mp and r7785rp.
The same strategy as for the new R2D code is used here - the board
specific interrupts are now starting from HL_FPGA_IRQ_BASE. The code
for r7780rp is not touched due to lack of hardware.

Tested with CF, AX88796 on r7780mp and r7785rp. The touch switch
interrupt has also been tested on r7780mp.

Signed-off-by: default avatarMagnus Damm <damm@igel.co.jp>
Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
parent 5cbc3af5
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
#
# Makefile for the R7780RP-1 specific parts of the kernel
#
irqinit-y			:= irq-r7780rp.o
irqinit-$(CONFIG_SH_R7780MP)	:= irq-r7780mp.o
irqinit-$(CONFIG_SH_R7785RP)	:= irq-r7785rp.o
obj-y				:= setup.o irq.o $(irqinit-y)
irqinit-$(CONFIG_SH_R7780RP)	:= irq-r7780rp.o irq.o
obj-y				:= setup.o $(irqinit-y)

ifneq ($(CONFIG_SH_R7785RP),y)
obj-$(CONFIG_PUSH_SWITCH)	+= psw.o
+61 −0
Original line number Diff line number Diff line
/*
 * Renesas Solutions Highlander R7780MP Support.
 *
 * Copyright (C) 2002  Atom Create Engineering Co., Ltd.
 * Copyright (C) 2006  Paul Mundt
 * Copyright (C) 2007  Magnus Damm
 *
 * This file is subject to the terms and conditions of the GNU General Public
 * License.  See the file "COPYING" in the main directory of this archive
 * for more details.
 */
#include <linux/init.h>
#include <linux/irq.h>
#include <linux/io.h>
#include <asm/r7780rp.h>

enum {
	UNUSED = 0,

	/* board specific interrupt sources */
	AX88796,          /* Ethernet controller */
	CF,               /* Compact Flash */
	PSW,              /* Push Switch */
	EXT1,             /* EXT1n IRQ */
	EXT4,             /* EXT4n IRQ */
};

static struct intc_vect vectors[] __initdata = {
	INTC_IRQ(CF, IRQ_CF),
	INTC_IRQ(PSW, IRQ_PSW),
	INTC_IRQ(AX88796, IRQ_AX88796),
	INTC_IRQ(EXT1, IRQ_EXT1),
	INTC_IRQ(EXT4, IRQ_EXT4),
};

static struct intc_mask_reg mask_registers[] __initdata = {
	{ 0xa4000000, 0, 16, /* IRLMSK */
	  { 0, 0, 0, 0, CF, 0, 0, 0,
	    0, 0, 0, EXT4, 0, EXT1, PSW, AX88796 } },
};

static unsigned char irl2irq[HL_NR_IRL] __initdata = {
	0, IRQ_CF, 0, 0,
	0, 0, 0, 0,
	0, IRQ_EXT4, 0, IRQ_EXT1,
	0, IRQ_AX88796, IRQ_PSW,
};

static DECLARE_INTC_DESC(intc_desc, "r7780mp", vectors,
			 NULL, NULL, mask_registers, NULL, NULL);

unsigned char * __init highlander_init_irq_r7780mp(void)
{
	if ((ctrl_inw(0xa4000700) & 0xf000) == 0x2000) {
		printk(KERN_INFO "Using r7780mp interrupt controller.\n");
		register_intc_controller(&intc_desc);
		return irl2irq;
	}

	return NULL;
}
+3 −2
Original line number Diff line number Diff line
@@ -9,13 +9,14 @@
 * for more details.
 */
#include <linux/init.h>
#include <asm/io.h>
#include <asm/r7780rp.h>

void __init highlander_init_irq(void)
unsigned char * __init highlander_init_irq_r7780rp(void)
{
	int i;

	for (i = 0; i < 15; i++)
		make_r7780rp_irq(i);

	return NULL;
}
+41 −5
Original line number Diff line number Diff line
/*
 * Renesas Solutions Highlander R7780RP-1 Support.
 * Renesas Solutions Highlander R7785RP Support.
 *
 * Copyright (C) 2002  Atom Create Engineering Co., Ltd.
 * Copyright (C) 2006  Paul Mundt
 * Copyright (C) 2007  Magnus Damm
 *
 * This file is subject to the terms and conditions of the GNU General Public
 * License.  See the file "COPYING" in the main directory of this archive
 * for more details.
 */
#include <linux/init.h>
#include <asm/io.h>
#include <linux/irq.h>
#include <linux/io.h>
#include <asm/r7780rp.h>

void __init highlander_init_irq(void)
enum {
	UNUSED = 0,

	/* board specific interrupt sources */
	AX88796,          /* Ethernet controller */
	CF,               /* Compact Flash */
};

static struct intc_vect vectors[] __initdata = {
	INTC_IRQ(CF, IRQ_CF),
	INTC_IRQ(AX88796, IRQ_AX88796),
};

static struct intc_mask_reg mask_registers[] __initdata = {
	{ 0xa4000010, 0, 16, /* IRLMCR1 */
	  { 0, 0, 0, 0, CF, AX88796, 0, 0,
	    0, 0, 0, 0, 0, 0, 0, 0 } },
};

static unsigned char irl2irq[HL_NR_IRL] __initdata = {
	0, IRQ_CF, 0, 0,
	0, 0, 0, 0,
	0, 0, IRQ_AX88796, 0,
	0, 0, 0,
};

static DECLARE_INTC_DESC(intc_desc, "r7785rp", vectors,
			 NULL, NULL, mask_registers, NULL, NULL);

unsigned char * __init highlander_init_irq_r7785rp(void)
{
	if ((ctrl_inw(0xa4000158) & 0xf000) != 0x1000)
		return NULL;

	printk(KERN_INFO "Using r7785rp interrupt controller.\n");

	ctrl_outw(0x0000, PA_IRLSSR1);	/* FPGA IRLSSR1(CF_CD clear) */

	/* Setup the FPGA IRL */
@@ -24,6 +60,6 @@ void __init highlander_init_irq(void)
	ctrl_outw(0x4321, PA_IRLPRE);	/* FPGA IRLE */
	ctrl_outw(0x0000, PA_IRLPRF);	/* FPGA IRLF */

	make_r7780rp_irq(1);	/* CF card */
	make_r7780rp_irq(10);	/* On-board ethernet */
	register_intc_controller(&intc_desc);
	return irl2irq;
}
+44 −10
Original line number Diff line number Diff line
@@ -31,8 +31,8 @@ static struct resource r8a66597_usb_host_resources[] = {
	},
	[1] = {
		.name	= "r8a66597_hcd",
		.start	= 11,		/* irq number */
		.end	= 11,
		.start	= IRQ_EXT1,		/* irq number */
		.end	= IRQ_EXT1,
		.flags	= IORESOURCE_IRQ,
	},
};
@@ -57,8 +57,8 @@ static struct resource m66592_usb_peripheral_resources[] = {
	},
	[1] = {
		.name	= "m66592_udc",
		.start	= 9,		/* irq number */
		.end	= 9,
		.start	= IRQ_EXT4,		/* irq number */
		.end	= IRQ_EXT4,
		.flags	= IORESOURCE_IRQ,
	},
};
@@ -86,11 +86,7 @@ static struct resource cf_ide_resources[] = {
		.flags	= IORESOURCE_MEM,
	},
	[2] = {
#ifdef CONFIG_SH_R7780RP
		.start	= 4,
#else
		.start	= 1,
#endif
		.start	= IRQ_CF,
		.flags	= IORESOURCE_IRQ,
	},
};
@@ -225,12 +221,50 @@ static void __init highlander_setup(char **cmdline_p)
	pm_power_off = r7780rp_power_off;
}

static unsigned char irl2irq[HL_NR_IRL];

int highlander_irq_demux(int irq)
{
	if (irq >= HL_NR_IRL || !irl2irq[irq])
		return irq;

	return irl2irq[irq];
}

void __init highlander_init_irq(void)
{
	unsigned char *ucp = NULL;

	do {
#ifdef CONFIG_SH_R7780MP
		ucp = highlander_init_irq_r7780mp();
		if (ucp)
			break;
#endif
#ifdef CONFIG_SH_R7785RP
		ucp = highlander_init_irq_r7785rp();
		if (ucp)
			break;
#endif
#ifdef CONFIG_SH_R7780RP
		highlander_init_irq_r7780rp();
		ucp = irl2irq;
		break;
#endif
	} while (0);

	if (ucp) {
		plat_irq_setup_pins(IRQ_MODE_IRL3210);
		memcpy(irl2irq, ucp, HL_NR_IRL);
	}
}

/*
 * The Machine Vector
 */
static struct sh_machine_vector mv_highlander __initmv = {
	.mv_name		= "Highlander",
	.mv_nr_irqs		= 109,
	.mv_setup		= highlander_setup,
	.mv_init_irq		= highlander_init_irq,
	.mv_irq_demux		= highlander_irq_demux,
};
Loading