mirror of
https://github.com/torvalds/linux.git
synced 2024-12-27 05:11:48 +00:00
189e91f5f5
The defines and typedefs (hw_interrupt_type, no_irq_type, irq_desc_t) have been kept around for migration reasons. After more than two years it's time to remove them finally. This patch cleans up one of the remaining users. When all such patches hit mainline we can remove the defines and typedefs finally. Impact: cleanup Convert the last remaining users to struct irq_chip and remove the define. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: Hirokazu Takata <takata@linux-m32r.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
156 lines
3.6 KiB
C
156 lines
3.6 KiB
C
/*
|
|
* linux/arch/m32r/platforms/m32104ut/setup.c
|
|
*
|
|
* Setup routines for M32104UT Board
|
|
*
|
|
* Copyright (c) 2002-2005 Hiroyuki Kondo, Hirokazu Takata,
|
|
* Hitoshi Yamamoto, Mamoru Sakugawa,
|
|
* Naoto Sugai, Hayato Fujiwara
|
|
*/
|
|
|
|
#include <linux/irq.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/init.h>
|
|
#include <linux/device.h>
|
|
|
|
#include <asm/system.h>
|
|
#include <asm/m32r.h>
|
|
#include <asm/io.h>
|
|
|
|
#define irq2port(x) (M32R_ICU_CR1_PORTL + ((x - 1) * sizeof(unsigned long)))
|
|
|
|
icu_data_t icu_data[NR_IRQS];
|
|
|
|
static void disable_m32104ut_irq(unsigned int irq)
|
|
{
|
|
unsigned long port, data;
|
|
|
|
port = irq2port(irq);
|
|
data = icu_data[irq].icucr|M32R_ICUCR_ILEVEL7;
|
|
outl(data, port);
|
|
}
|
|
|
|
static void enable_m32104ut_irq(unsigned int irq)
|
|
{
|
|
unsigned long port, data;
|
|
|
|
port = irq2port(irq);
|
|
data = icu_data[irq].icucr|M32R_ICUCR_IEN|M32R_ICUCR_ILEVEL6;
|
|
outl(data, port);
|
|
}
|
|
|
|
static void mask_and_ack_m32104ut(unsigned int irq)
|
|
{
|
|
disable_m32104ut_irq(irq);
|
|
}
|
|
|
|
static void end_m32104ut_irq(unsigned int irq)
|
|
{
|
|
enable_m32104ut_irq(irq);
|
|
}
|
|
|
|
static unsigned int startup_m32104ut_irq(unsigned int irq)
|
|
{
|
|
enable_m32104ut_irq(irq);
|
|
return (0);
|
|
}
|
|
|
|
static void shutdown_m32104ut_irq(unsigned int irq)
|
|
{
|
|
unsigned long port;
|
|
|
|
port = irq2port(irq);
|
|
outl(M32R_ICUCR_ILEVEL7, port);
|
|
}
|
|
|
|
static struct irq_chip m32104ut_irq_type =
|
|
{
|
|
.typename = "M32104UT-IRQ",
|
|
.startup = startup_m32104ut_irq,
|
|
.shutdown = shutdown_m32104ut_irq,
|
|
.enable = enable_m32104ut_irq,
|
|
.disable = disable_m32104ut_irq,
|
|
.ack = mask_and_ack_m32104ut,
|
|
.end = end_m32104ut_irq
|
|
};
|
|
|
|
void __init init_IRQ(void)
|
|
{
|
|
static int once = 0;
|
|
|
|
if (once)
|
|
return;
|
|
else
|
|
once++;
|
|
|
|
#if defined(CONFIG_SMC91X)
|
|
/* INT#0: LAN controller on M32104UT-LAN (SMC91C111)*/
|
|
irq_desc[M32R_IRQ_INT0].status = IRQ_DISABLED;
|
|
irq_desc[M32R_IRQ_INT0].chip = &m32104ut_irq_type;
|
|
irq_desc[M32R_IRQ_INT0].action = 0;
|
|
irq_desc[M32R_IRQ_INT0].depth = 1;
|
|
icu_data[M32R_IRQ_INT0].icucr = M32R_ICUCR_IEN | M32R_ICUCR_ISMOD11; /* "H" level sense */
|
|
disable_m32104ut_irq(M32R_IRQ_INT0);
|
|
#endif /* CONFIG_SMC91X */
|
|
|
|
/* MFT2 : system timer */
|
|
irq_desc[M32R_IRQ_MFT2].status = IRQ_DISABLED;
|
|
irq_desc[M32R_IRQ_MFT2].chip = &m32104ut_irq_type;
|
|
irq_desc[M32R_IRQ_MFT2].action = 0;
|
|
irq_desc[M32R_IRQ_MFT2].depth = 1;
|
|
icu_data[M32R_IRQ_MFT2].icucr = M32R_ICUCR_IEN;
|
|
disable_m32104ut_irq(M32R_IRQ_MFT2);
|
|
|
|
#ifdef CONFIG_SERIAL_M32R_SIO
|
|
/* SIO0_R : uart receive data */
|
|
irq_desc[M32R_IRQ_SIO0_R].status = IRQ_DISABLED;
|
|
irq_desc[M32R_IRQ_SIO0_R].chip = &m32104ut_irq_type;
|
|
irq_desc[M32R_IRQ_SIO0_R].action = 0;
|
|
irq_desc[M32R_IRQ_SIO0_R].depth = 1;
|
|
icu_data[M32R_IRQ_SIO0_R].icucr = M32R_ICUCR_IEN;
|
|
disable_m32104ut_irq(M32R_IRQ_SIO0_R);
|
|
|
|
/* SIO0_S : uart send data */
|
|
irq_desc[M32R_IRQ_SIO0_S].status = IRQ_DISABLED;
|
|
irq_desc[M32R_IRQ_SIO0_S].chip = &m32104ut_irq_type;
|
|
irq_desc[M32R_IRQ_SIO0_S].action = 0;
|
|
irq_desc[M32R_IRQ_SIO0_S].depth = 1;
|
|
icu_data[M32R_IRQ_SIO0_S].icucr = M32R_ICUCR_IEN;
|
|
disable_m32104ut_irq(M32R_IRQ_SIO0_S);
|
|
#endif /* CONFIG_SERIAL_M32R_SIO */
|
|
}
|
|
|
|
#if defined(CONFIG_SMC91X)
|
|
|
|
#define LAN_IOSTART 0x300
|
|
#define LAN_IOEND 0x320
|
|
static struct resource smc91x_resources[] = {
|
|
[0] = {
|
|
.start = (LAN_IOSTART),
|
|
.end = (LAN_IOEND),
|
|
.flags = IORESOURCE_MEM,
|
|
},
|
|
[1] = {
|
|
.start = M32R_IRQ_INT0,
|
|
.end = M32R_IRQ_INT0,
|
|
.flags = IORESOURCE_IRQ,
|
|
}
|
|
};
|
|
|
|
static struct platform_device smc91x_device = {
|
|
.name = "smc91x",
|
|
.id = 0,
|
|
.num_resources = ARRAY_SIZE(smc91x_resources),
|
|
.resource = smc91x_resources,
|
|
};
|
|
#endif
|
|
|
|
static int __init platform_init(void)
|
|
{
|
|
#if defined(CONFIG_SMC91X)
|
|
platform_device_register(&smc91x_device);
|
|
#endif
|
|
return 0;
|
|
}
|
|
arch_initcall(platform_init);
|