mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
sh: intc - convert board specific r2d code
This patch converts the board specific interrupt code for r2d to make use of intc. While at it we improve the Kconfig to avoid confusion. - Two sets of interrupt tables exist - one for R2D-1 and one for R2D-PLUS. - R2D-1 and R2D-PLUS use the same irq constants. - R2D-1 has AX88796 support, R2D-PLUS does not hook up that IRQ. - R2D-PLUS has KEY support, R2D-1 does not hook up that IRQ. - The number and order of IRQ values are disconnected from register bits. - Interrupt sources now start from IRQ 100. - The machvec demux function converts from irlm IRQ 0-14 to IRQ 100++. Tested on R2D-1 and R2D-PLUS boards. Version 2 adds CONFIG_RTS7751R2D_1 and CONFIG_RTS7751R2D_PLUS together with intc structured as __initdata. Signed-off-by: Magnus Damm <damm@igel.co.jp> Signed-off-by: Paul Mundt <lethal@linux-sh.org>
This commit is contained in:
parent
73505b445d
commit
2eeec85638
@ -2,10 +2,28 @@ if SH_RTS7751R2D
|
||||
|
||||
menu "RTS7751R2D options"
|
||||
|
||||
config RTS7751R2D_REV11
|
||||
bool "RTS7751R2D Rev. 1.1 board support"
|
||||
choice
|
||||
prompt "R2D Board Revision"
|
||||
default RTS7751R2D_PLUS
|
||||
|
||||
config RTS7751R2D_PLUS
|
||||
bool "R2D-PLUS"
|
||||
help
|
||||
Selecting this option will support version rev. 1.1.
|
||||
Selecting this option will configure the kernel for R2D-PLUS.
|
||||
|
||||
R2D-PLUS is the smaller of the two R2D board versions, equipped
|
||||
with a single PCI slot.
|
||||
|
||||
config RTS7751R2D_1
|
||||
bool "R2D-1"
|
||||
help
|
||||
Selecting this option will configure the kernel for R2D-1.
|
||||
|
||||
R2D-1 is the larger of the two R2D board versions, equipped
|
||||
with two PCI slots.
|
||||
|
||||
endchoice
|
||||
|
||||
endmenu
|
||||
|
||||
endif
|
||||
|
@ -1,9 +1,10 @@
|
||||
/*
|
||||
* linux/arch/sh/boards/renesas/rts7751r2d/irq.c
|
||||
*
|
||||
* Copyright (C) 2007 Magnus Damm
|
||||
* Copyright (C) 2000 Kazumoto Kojima
|
||||
*
|
||||
* Renesas Technology Sales RTS7751R2D Support.
|
||||
* Renesas Technology Sales RTS7751R2D Support, R2D-PLUS and R2D-1.
|
||||
*
|
||||
* Modified for RTS7751R2D by
|
||||
* Atom Create Engineering Co., Ltd. 2002.
|
||||
@ -16,67 +17,141 @@
|
||||
#include <asm/voyagergx.h>
|
||||
#include <asm/rts7751r2d.h>
|
||||
|
||||
#if defined(CONFIG_RTS7751R2D_REV11)
|
||||
static int mask_pos[] = {11, 9, 8, 12, 10, 6, 5, 4, 7, 14, 13, 0, 0, 0, 0};
|
||||
#else
|
||||
static int mask_pos[] = {6, 11, 9, 8, 12, 10, 5, 4, 7, 14, 13, 0, 0, 0, 0};
|
||||
#endif
|
||||
#define R2D_NR_IRL 13
|
||||
|
||||
static void enable_rts7751r2d_irq(unsigned int irq)
|
||||
{
|
||||
/* Set priority in IPR back to original value */
|
||||
ctrl_outw(ctrl_inw(IRLCNTR1) | (1 << mask_pos[irq]), IRLCNTR1);
|
||||
}
|
||||
enum {
|
||||
UNUSED = 0,
|
||||
|
||||
static void disable_rts7751r2d_irq(unsigned int irq)
|
||||
{
|
||||
/* Set the priority in IPR to 0 */
|
||||
ctrl_outw(ctrl_inw(IRLCNTR1) & (0xffff ^ (1 << mask_pos[irq])),
|
||||
IRLCNTR1);
|
||||
}
|
||||
/* board specific interrupt sources (R2D-1 and R2D-PLUS) */
|
||||
EXT, /* EXT_INT0-3 */
|
||||
RTC_T, RTC_A, /* Real Time Clock */
|
||||
AX88796, /* Ethernet controller (R2D-1 board) */
|
||||
KEY, /* Key input (R2D-PLUS board) */
|
||||
SDCARD, /* SD Card */
|
||||
CF_CD, CF_IDE, /* CF Card Detect + CF IDE */
|
||||
SM501, /* SM501 aka Voyager */
|
||||
PCI_INTD_RTL8139, /* Ethernet controller */
|
||||
PCI_INTC_PCI1520, /* Cardbus/PCMCIA bridge */
|
||||
PCI_INTB_RTL8139, /* Ethernet controller with HUB (R2D-PLUS board) */
|
||||
PCI_INTB_SLOT, /* PCI Slot 3.3v (R2D-1 board) */
|
||||
PCI_INTA_SLOT, /* PCI Slot 3.3v */
|
||||
TP, /* Touch Panel */
|
||||
};
|
||||
|
||||
#ifdef CONFIG_RTS7751R2D_1
|
||||
|
||||
/* Vectors for R2D-1 */
|
||||
static struct intc_vect vectors_r2d_1[] __initdata = {
|
||||
INTC_IRQ(EXT, IRQ_EXT),
|
||||
INTC_IRQ(RTC_T, IRQ_RTC_T), INTC_IRQ(RTC_A, IRQ_RTC_A),
|
||||
INTC_IRQ(AX88796, IRQ_AX88796), INTC_IRQ(SDCARD, IRQ_SDCARD),
|
||||
INTC_IRQ(CF_CD, IRQ_CF_CD), INTC_IRQ(CF_IDE, IRQ_CF_IDE), /* ng */
|
||||
INTC_IRQ(SM501, IRQ_VOYAGER),
|
||||
INTC_IRQ(PCI_INTD_RTL8139, IRQ_PCI_INTD),
|
||||
INTC_IRQ(PCI_INTC_PCI1520, IRQ_PCI_INTC),
|
||||
INTC_IRQ(PCI_INTB_SLOT, IRQ_PCI_INTB),
|
||||
INTC_IRQ(PCI_INTA_SLOT, IRQ_PCI_INTA),
|
||||
INTC_IRQ(TP, IRQ_TP),
|
||||
};
|
||||
|
||||
/* IRLMSK mask register layout for R2D-1 */
|
||||
static struct intc_mask_reg mask_registers_r2d_1[] __initdata = {
|
||||
{ 0xa4000000, 0, 16, /* IRLMSK */
|
||||
{ TP, PCI_INTA_SLOT, PCI_INTB_SLOT,
|
||||
PCI_INTC_PCI1520, PCI_INTD_RTL8139,
|
||||
SM501, CF_IDE, CF_CD, SDCARD, AX88796,
|
||||
RTC_A, RTC_T, 0, 0, 0, EXT } },
|
||||
};
|
||||
|
||||
/* IRLn to IRQ table for R2D-1 */
|
||||
static unsigned char irl2irq_r2d_1[R2D_NR_IRL] __initdata = {
|
||||
IRQ_PCI_INTD, IRQ_CF_IDE, IRQ_CF_CD, IRQ_PCI_INTC,
|
||||
IRQ_VOYAGER, IRQ_AX88796, IRQ_RTC_A, IRQ_RTC_T,
|
||||
IRQ_SDCARD, IRQ_PCI_INTA, IRQ_PCI_INTB, IRQ_EXT,
|
||||
IRQ_TP,
|
||||
};
|
||||
|
||||
static __initdata DECLARE_INTC_DESC(intc_desc_r2d_1, "r2d-1",
|
||||
vectors_r2d_1, NULL, NULL,
|
||||
mask_registers_r2d_1, NULL, NULL);
|
||||
|
||||
#endif /* CONFIG_RTS7751R2D_1 */
|
||||
|
||||
#ifdef CONFIG_RTS7751R2D_PLUS
|
||||
|
||||
/* Vectors for R2D-PLUS */
|
||||
static struct intc_vect vectors_r2d_plus[] __initdata = {
|
||||
INTC_IRQ(EXT, IRQ_EXT),
|
||||
INTC_IRQ(RTC_T, IRQ_RTC_T), INTC_IRQ(RTC_A, IRQ_RTC_A),
|
||||
INTC_IRQ(KEY, IRQ_KEY), INTC_IRQ(SDCARD, IRQ_SDCARD),
|
||||
INTC_IRQ(CF_CD, IRQ_CF_CD), INTC_IRQ(CF_IDE, IRQ_CF_IDE),
|
||||
INTC_IRQ(SM501, IRQ_VOYAGER),
|
||||
INTC_IRQ(PCI_INTD_RTL8139, IRQ_PCI_INTD),
|
||||
INTC_IRQ(PCI_INTC_PCI1520, IRQ_PCI_INTC),
|
||||
INTC_IRQ(PCI_INTB_RTL8139, IRQ_PCI_INTB),
|
||||
INTC_IRQ(PCI_INTA_SLOT, IRQ_PCI_INTA),
|
||||
INTC_IRQ(TP, IRQ_TP),
|
||||
};
|
||||
|
||||
/* IRLMSK mask register layout for R2D-PLUS */
|
||||
static struct intc_mask_reg mask_registers_r2d_plus[] __initdata = {
|
||||
{ 0xa4000000, 0, 16, /* IRLMSK */
|
||||
{ TP, PCI_INTA_SLOT, PCI_INTB_RTL8139,
|
||||
PCI_INTC_PCI1520, PCI_INTD_RTL8139,
|
||||
SM501, CF_IDE, CF_CD, SDCARD, KEY,
|
||||
RTC_A, RTC_T, 0, 0, 0, EXT } },
|
||||
};
|
||||
|
||||
/* IRLn to IRQ table for R2D-PLUS */
|
||||
static unsigned char irl2irq_r2d_plus[R2D_NR_IRL] __initdata = {
|
||||
IRQ_PCI_INTD, IRQ_CF_IDE, IRQ_CF_CD, IRQ_PCI_INTC,
|
||||
IRQ_VOYAGER, IRQ_KEY, IRQ_RTC_A, IRQ_RTC_T,
|
||||
IRQ_SDCARD, IRQ_PCI_INTA, IRQ_PCI_INTB, IRQ_EXT,
|
||||
IRQ_TP,
|
||||
};
|
||||
|
||||
static __initdata DECLARE_INTC_DESC(intc_desc_r2d_plus, "r2d-plus",
|
||||
vectors_r2d_plus, NULL, NULL,
|
||||
mask_registers_r2d_plus, NULL, NULL);
|
||||
|
||||
#endif /* CONFIG_RTS7751R2D_PLUS */
|
||||
|
||||
static unsigned char irl2irq[R2D_NR_IRL];
|
||||
|
||||
int rts7751r2d_irq_demux(int irq)
|
||||
{
|
||||
return irq;
|
||||
}
|
||||
if (irq >= R2D_NR_IRL || !irl2irq[irq])
|
||||
return irq;
|
||||
|
||||
static struct irq_chip rts7751r2d_irq_chip __read_mostly = {
|
||||
.name = "rts7751r2d",
|
||||
.mask = disable_rts7751r2d_irq,
|
||||
.unmask = enable_rts7751r2d_irq,
|
||||
.mask_ack = disable_rts7751r2d_irq,
|
||||
};
|
||||
return irl2irq[irq];
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize IRQ setting
|
||||
*/
|
||||
void __init init_rts7751r2d_IRQ(void)
|
||||
{
|
||||
int i;
|
||||
struct intc_desc *d;
|
||||
|
||||
/* IRL0=KEY Input
|
||||
* IRL1=Ethernet
|
||||
* IRL2=CF Card
|
||||
* IRL3=CF Card Insert
|
||||
* IRL4=PCMCIA
|
||||
* IRL5=VOYAGER
|
||||
* IRL6=RTC Alarm
|
||||
* IRL7=RTC Timer
|
||||
* IRL8=SD Card
|
||||
* IRL9=PCI Slot #1
|
||||
* IRL10=PCI Slot #2
|
||||
* IRL11=Extention #0
|
||||
* IRL12=Extention #1
|
||||
* IRL13=Extention #2
|
||||
* IRL14=Extention #3
|
||||
*/
|
||||
|
||||
for (i=0; i<15; i++) {
|
||||
disable_irq_nosync(i);
|
||||
set_irq_chip_and_handler_name(i, &rts7751r2d_irq_chip,
|
||||
handle_level_irq, "level");
|
||||
enable_rts7751r2d_irq(i);
|
||||
switch (ctrl_inw(PA_BVERREG)) {
|
||||
#ifdef CONFIG_RTS7751R2D_PLUS
|
||||
case 0x10:
|
||||
printk(KERN_INFO "Using R2D-PLUS interrupt controller.\n");
|
||||
d = &intc_desc_r2d_plus;
|
||||
memcpy(irl2irq, irl2irq_r2d_plus, R2D_NR_IRL);
|
||||
break;
|
||||
#endif
|
||||
#ifdef CONFIG_RTS7751R2D_1
|
||||
case 0x11:
|
||||
printk(KERN_INFO "Using R2D-1 interrupt controller.\n");
|
||||
d = &intc_desc_r2d_1;
|
||||
memcpy(irl2irq, irl2irq_r2d_1, R2D_NR_IRL);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
register_intc_controller(d);
|
||||
setup_voyagergx_irq();
|
||||
}
|
||||
|
@ -54,11 +54,7 @@ static struct resource cf_ide_resources[] = {
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[2] = {
|
||||
#ifdef CONFIG_RTS7751R2D_REV11
|
||||
.start = 1,
|
||||
#else
|
||||
.start = 2,
|
||||
#endif
|
||||
.start = IRQ_CF_IDE,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
@ -147,7 +143,7 @@ static int __init rts7751r2d_devices_setup(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (ctrl_inw(PA_BVERREG) == 0x10) { /* only working on R2D-PLUS */
|
||||
if (ctrl_inw(PA_BVERREG) == 0x10) { /* R2D-PLUS */
|
||||
ret = platform_device_register(&cf_ide_device);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
@ -19,10 +19,10 @@
|
||||
#include "pci-sh4.h"
|
||||
|
||||
static u8 rts7751r2d_irq_tab[] __initdata = {
|
||||
IRQ_PCISLOT1,
|
||||
IRQ_PCISLOT2,
|
||||
IRQ_PCMCIA,
|
||||
IRQ_PCIETH,
|
||||
IRQ_PCI_INTA,
|
||||
IRQ_PCI_INTB,
|
||||
IRQ_PCI_INTC,
|
||||
IRQ_PCI_INTD,
|
||||
};
|
||||
|
||||
int __init pcibios_map_platform_irq(struct pci_dev *pdev, u8 slot, u8 pin)
|
||||
|
@ -9,7 +9,7 @@
|
||||
* Renesas Technology Sales RTS7751R2D support
|
||||
*/
|
||||
|
||||
/* Box specific addresses. */
|
||||
/* Board specific addresses. */
|
||||
|
||||
#define PA_BCR 0xa4000000 /* FPGA */
|
||||
#define PA_IRLMON 0xa4000002 /* Interrupt Status control */
|
||||
@ -20,19 +20,19 @@
|
||||
#define PA_RTCCE 0xa400000c /* RTC(9701) Enable control */
|
||||
#define PA_PCICD 0xa400000e /* PCI Extention detect control */
|
||||
#define PA_VOYAGERRTS 0xa4000020 /* VOYAGER Reset control */
|
||||
#if defined(CONFIG_RTS7751R2D_REV11)
|
||||
#define PA_AXRST 0xa4000022 /* AX_LAN Reset control */
|
||||
#define PA_CFRST 0xa4000024 /* CF Reset control */
|
||||
#define PA_ADMRTS 0xa4000026 /* SD Reset control */
|
||||
#define PA_EXTRST 0xa4000028 /* Extention Reset control */
|
||||
#define PA_CFCDINTCLR 0xa400002a /* CF Insert Interrupt clear */
|
||||
#else
|
||||
#define PA_CFRST 0xa4000022 /* CF Reset control */
|
||||
#define PA_ADMRTS 0xa4000024 /* SD Reset control */
|
||||
#define PA_EXTRST 0xa4000026 /* Extention Reset control */
|
||||
#define PA_CFCDINTCLR 0xa4000028 /* CF Insert Interrupt clear */
|
||||
#define PA_KEYCTLCLR 0xa400002a /* Key Interrupt clear */
|
||||
#endif
|
||||
|
||||
#define PA_R2D1_AXRST 0xa4000022 /* AX_LAN Reset control */
|
||||
#define PA_R2D1_CFRST 0xa4000024 /* CF Reset control */
|
||||
#define PA_R2D1_ADMRTS 0xa4000026 /* SD Reset control */
|
||||
#define PA_R2D1_EXTRST 0xa4000028 /* Extention Reset control */
|
||||
#define PA_R2D1_CFCDINTCLR 0xa400002a /* CF Insert Interrupt clear */
|
||||
|
||||
#define PA_R2DPLUS_CFRST 0xa4000022 /* CF Reset control */
|
||||
#define PA_R2DPLUS_ADMRTS 0xa4000024 /* SD Reset control */
|
||||
#define PA_R2DPLUS_EXTRST 0xa4000026 /* Extention Reset control */
|
||||
#define PA_R2DPLUS_CFCDINTCLR 0xa4000028 /* CF Insert Interrupt clear */
|
||||
#define PA_R2DPLUS_KEYCTLCLR 0xa400002a /* Key Interrupt clear */
|
||||
|
||||
#define PA_POWOFF 0xa4000030 /* Board Power OFF control */
|
||||
#define PA_VERREG 0xa4000032 /* FPGA Version Register */
|
||||
#define PA_INPORT 0xa4000034 /* KEY Input Port control */
|
||||
@ -46,27 +46,22 @@
|
||||
|
||||
#define IRLCNTR1 (PA_BCR + 0) /* Interrupt Control Register1 */
|
||||
|
||||
#if defined(CONFIG_RTS7751R2D_REV11)
|
||||
#define IRQ_PCIETH 0 /* PCI Ethernet IRQ */
|
||||
#define IRQ_CFCARD 1 /* CF Card IRQ */
|
||||
#define IRQ_CFINST 2 /* CF Card Insert IRQ */
|
||||
#define IRQ_PCMCIA 3 /* PCMCIA IRQ */
|
||||
#define IRQ_VOYAGER 4 /* VOYAGER IRQ */
|
||||
#define IRQ_ONETH 5 /* On board Ethernet IRQ */
|
||||
#else
|
||||
#define IRQ_KEYIN 0 /* Key Input IRQ */
|
||||
#define IRQ_PCIETH 1 /* PCI Ethernet IRQ */
|
||||
#define IRQ_CFCARD 2 /* CF Card IRQ */
|
||||
#define IRQ_CFINST 3 /* CF Card Insert IRQ */
|
||||
#define IRQ_PCMCIA 4 /* PCMCIA IRQ */
|
||||
#define IRQ_VOYAGER 5 /* VOYAGER IRQ */
|
||||
#endif
|
||||
#define IRQ_RTCALM 6 /* RTC Alarm IRQ */
|
||||
#define IRQ_RTCTIME 7 /* RTC Timer IRQ */
|
||||
#define IRQ_SDCARD 8 /* SD Card IRQ */
|
||||
#define IRQ_PCISLOT1 9 /* PCI Slot #1 IRQ */
|
||||
#define IRQ_PCISLOT2 10 /* PCI Slot #2 IRQ */
|
||||
#define IRQ_EXTENTION 11 /* EXTn IRQ */
|
||||
#define R2D_FPGA_IRQ_BASE 100
|
||||
|
||||
#define IRQ_VOYAGER (R2D_FPGA_IRQ_BASE + 0)
|
||||
#define IRQ_EXT (R2D_FPGA_IRQ_BASE + 1)
|
||||
#define IRQ_TP (R2D_FPGA_IRQ_BASE + 2)
|
||||
#define IRQ_RTC_T (R2D_FPGA_IRQ_BASE + 3)
|
||||
#define IRQ_RTC_A (R2D_FPGA_IRQ_BASE + 4)
|
||||
#define IRQ_SDCARD (R2D_FPGA_IRQ_BASE + 5)
|
||||
#define IRQ_CF_CD (R2D_FPGA_IRQ_BASE + 6)
|
||||
#define IRQ_CF_IDE (R2D_FPGA_IRQ_BASE + 7)
|
||||
#define IRQ_AX88796 (R2D_FPGA_IRQ_BASE + 8)
|
||||
#define IRQ_KEY (R2D_FPGA_IRQ_BASE + 9)
|
||||
#define IRQ_PCI_INTA (R2D_FPGA_IRQ_BASE + 10)
|
||||
#define IRQ_PCI_INTB (R2D_FPGA_IRQ_BASE + 11)
|
||||
#define IRQ_PCI_INTC (R2D_FPGA_IRQ_BASE + 12)
|
||||
#define IRQ_PCI_INTD (R2D_FPGA_IRQ_BASE + 13)
|
||||
|
||||
/* arch/sh/boards/renesas/rts7751r2d/irq.c */
|
||||
void init_rts7751r2d_IRQ(void);
|
||||
|
Loading…
Reference in New Issue
Block a user