[MIPS] IRQ cleanups
This is a big irq cleanup patch. * Use set_irq_chip() to register irq_chip. * Initialize .mask, .unmask, .mask_ack field. Functions for these method are already exist in most case. * Do not initialize .startup, .shutdown, .enable, .disable fields if default routines provided by irq_chip_set_defaults() were suitable. * Remove redundant irq_desc initializations. * Remove unnecessary local_irq_save/local_irq_restore, spin_lock. With this cleanup, it would be easy to switch to slightly lightwait irq flow handlers (handle_level_irq(), etc.) instead of __do_IRQ(). Though whole this patch is quite large, changes in each irq_chip are not quite simple. Please review and test on your platform. Thanks. Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp> Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Цей коміт міститься в:

зафіксовано
Ralf Baechle

джерело
c87b6ebaea
коміт
1603b5aca4
@@ -95,16 +95,11 @@ static irqreturn_t ip22_eisa_intr(int irq, void *dev_id)
|
||||
|
||||
static void enable_eisa1_irq(unsigned int irq)
|
||||
{
|
||||
unsigned long flags;
|
||||
u8 mask;
|
||||
|
||||
local_irq_save(flags);
|
||||
|
||||
mask = inb(EISA_INT1_MASK);
|
||||
mask &= ~((u8) (1 << irq));
|
||||
outb(mask, EISA_INT1_MASK);
|
||||
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
static unsigned int startup_eisa1_irq(unsigned int irq)
|
||||
@@ -130,8 +125,6 @@ static void disable_eisa1_irq(unsigned int irq)
|
||||
outb(mask, EISA_INT1_MASK);
|
||||
}
|
||||
|
||||
#define shutdown_eisa1_irq disable_eisa1_irq
|
||||
|
||||
static void mask_and_ack_eisa1_irq(unsigned int irq)
|
||||
{
|
||||
disable_eisa1_irq(irq);
|
||||
@@ -148,25 +141,20 @@ static void end_eisa1_irq(unsigned int irq)
|
||||
static struct irq_chip ip22_eisa1_irq_type = {
|
||||
.typename = "IP22 EISA",
|
||||
.startup = startup_eisa1_irq,
|
||||
.shutdown = shutdown_eisa1_irq,
|
||||
.enable = enable_eisa1_irq,
|
||||
.disable = disable_eisa1_irq,
|
||||
.ack = mask_and_ack_eisa1_irq,
|
||||
.mask = disable_eisa1_irq,
|
||||
.mask_ack = mask_and_ack_eisa1_irq,
|
||||
.unmask = enable_eisa1_irq,
|
||||
.end = end_eisa1_irq,
|
||||
};
|
||||
|
||||
static void enable_eisa2_irq(unsigned int irq)
|
||||
{
|
||||
unsigned long flags;
|
||||
u8 mask;
|
||||
|
||||
local_irq_save(flags);
|
||||
|
||||
mask = inb(EISA_INT2_MASK);
|
||||
mask &= ~((u8) (1 << (irq - 8)));
|
||||
outb(mask, EISA_INT2_MASK);
|
||||
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
static unsigned int startup_eisa2_irq(unsigned int irq)
|
||||
@@ -192,8 +180,6 @@ static void disable_eisa2_irq(unsigned int irq)
|
||||
outb(mask, EISA_INT2_MASK);
|
||||
}
|
||||
|
||||
#define shutdown_eisa2_irq disable_eisa2_irq
|
||||
|
||||
static void mask_and_ack_eisa2_irq(unsigned int irq)
|
||||
{
|
||||
disable_eisa2_irq(irq);
|
||||
@@ -210,10 +196,10 @@ static void end_eisa2_irq(unsigned int irq)
|
||||
static struct irq_chip ip22_eisa2_irq_type = {
|
||||
.typename = "IP22 EISA",
|
||||
.startup = startup_eisa2_irq,
|
||||
.shutdown = shutdown_eisa2_irq,
|
||||
.enable = enable_eisa2_irq,
|
||||
.disable = disable_eisa2_irq,
|
||||
.ack = mask_and_ack_eisa2_irq,
|
||||
.mask = disable_eisa2_irq,
|
||||
.mask_ack = mask_and_ack_eisa2_irq,
|
||||
.unmask = enable_eisa2_irq,
|
||||
.end = end_eisa2_irq,
|
||||
};
|
||||
|
||||
@@ -275,13 +261,10 @@ int __init ip22_eisa_init(void)
|
||||
outb(0, EISA_DMA2_WRITE_SINGLE);
|
||||
|
||||
for (i = SGINT_EISA; i < (SGINT_EISA + EISA_MAX_IRQ); i++) {
|
||||
irq_desc[i].status = IRQ_DISABLED;
|
||||
irq_desc[i].action = 0;
|
||||
irq_desc[i].depth = 1;
|
||||
if (i < (SGINT_EISA + 8))
|
||||
irq_desc[i].chip = &ip22_eisa1_irq_type;
|
||||
set_irq_chip(i, &ip22_eisa1_irq_type);
|
||||
else
|
||||
irq_desc[i].chip = &ip22_eisa2_irq_type;
|
||||
set_irq_chip(i, &ip22_eisa2_irq_type);
|
||||
}
|
||||
|
||||
/* Cannot use request_irq because of kmalloc not being ready at such
|
||||
|
@@ -40,34 +40,17 @@ extern int ip22_eisa_init(void);
|
||||
|
||||
static void enable_local0_irq(unsigned int irq)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
local_irq_save(flags);
|
||||
/* don't allow mappable interrupt to be enabled from setup_irq,
|
||||
* we have our own way to do so */
|
||||
if (irq != SGI_MAP_0_IRQ)
|
||||
sgint->imask0 |= (1 << (irq - SGINT_LOCAL0));
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
static unsigned int startup_local0_irq(unsigned int irq)
|
||||
{
|
||||
enable_local0_irq(irq);
|
||||
return 0; /* Never anything pending */
|
||||
}
|
||||
|
||||
static void disable_local0_irq(unsigned int irq)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
local_irq_save(flags);
|
||||
sgint->imask0 &= ~(1 << (irq - SGINT_LOCAL0));
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
#define shutdown_local0_irq disable_local0_irq
|
||||
#define mask_and_ack_local0_irq disable_local0_irq
|
||||
|
||||
static void end_local0_irq (unsigned int irq)
|
||||
{
|
||||
if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
|
||||
@@ -76,44 +59,26 @@ static void end_local0_irq (unsigned int irq)
|
||||
|
||||
static struct irq_chip ip22_local0_irq_type = {
|
||||
.typename = "IP22 local 0",
|
||||
.startup = startup_local0_irq,
|
||||
.shutdown = shutdown_local0_irq,
|
||||
.enable = enable_local0_irq,
|
||||
.disable = disable_local0_irq,
|
||||
.ack = mask_and_ack_local0_irq,
|
||||
.ack = disable_local0_irq,
|
||||
.mask = disable_local0_irq,
|
||||
.mask_ack = disable_local0_irq,
|
||||
.unmask = enable_local0_irq,
|
||||
.end = end_local0_irq,
|
||||
};
|
||||
|
||||
static void enable_local1_irq(unsigned int irq)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
local_irq_save(flags);
|
||||
/* don't allow mappable interrupt to be enabled from setup_irq,
|
||||
* we have our own way to do so */
|
||||
if (irq != SGI_MAP_1_IRQ)
|
||||
sgint->imask1 |= (1 << (irq - SGINT_LOCAL1));
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
static unsigned int startup_local1_irq(unsigned int irq)
|
||||
{
|
||||
enable_local1_irq(irq);
|
||||
return 0; /* Never anything pending */
|
||||
}
|
||||
|
||||
void disable_local1_irq(unsigned int irq)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
local_irq_save(flags);
|
||||
sgint->imask1 &= ~(1 << (irq - SGINT_LOCAL1));
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
#define shutdown_local1_irq disable_local1_irq
|
||||
#define mask_and_ack_local1_irq disable_local1_irq
|
||||
|
||||
static void end_local1_irq (unsigned int irq)
|
||||
{
|
||||
if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
|
||||
@@ -122,44 +87,26 @@ static void end_local1_irq (unsigned int irq)
|
||||
|
||||
static struct irq_chip ip22_local1_irq_type = {
|
||||
.typename = "IP22 local 1",
|
||||
.startup = startup_local1_irq,
|
||||
.shutdown = shutdown_local1_irq,
|
||||
.enable = enable_local1_irq,
|
||||
.disable = disable_local1_irq,
|
||||
.ack = mask_and_ack_local1_irq,
|
||||
.ack = disable_local1_irq,
|
||||
.mask = disable_local1_irq,
|
||||
.mask_ack = disable_local1_irq,
|
||||
.unmask = enable_local1_irq,
|
||||
.end = end_local1_irq,
|
||||
};
|
||||
|
||||
static void enable_local2_irq(unsigned int irq)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
local_irq_save(flags);
|
||||
sgint->imask0 |= (1 << (SGI_MAP_0_IRQ - SGINT_LOCAL0));
|
||||
sgint->cmeimask0 |= (1 << (irq - SGINT_LOCAL2));
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
static unsigned int startup_local2_irq(unsigned int irq)
|
||||
{
|
||||
enable_local2_irq(irq);
|
||||
return 0; /* Never anything pending */
|
||||
}
|
||||
|
||||
void disable_local2_irq(unsigned int irq)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
local_irq_save(flags);
|
||||
sgint->cmeimask0 &= ~(1 << (irq - SGINT_LOCAL2));
|
||||
if (!sgint->cmeimask0)
|
||||
sgint->imask0 &= ~(1 << (SGI_MAP_0_IRQ - SGINT_LOCAL0));
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
#define shutdown_local2_irq disable_local2_irq
|
||||
#define mask_and_ack_local2_irq disable_local2_irq
|
||||
|
||||
static void end_local2_irq (unsigned int irq)
|
||||
{
|
||||
if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
|
||||
@@ -168,44 +115,26 @@ static void end_local2_irq (unsigned int irq)
|
||||
|
||||
static struct irq_chip ip22_local2_irq_type = {
|
||||
.typename = "IP22 local 2",
|
||||
.startup = startup_local2_irq,
|
||||
.shutdown = shutdown_local2_irq,
|
||||
.enable = enable_local2_irq,
|
||||
.disable = disable_local2_irq,
|
||||
.ack = mask_and_ack_local2_irq,
|
||||
.ack = disable_local2_irq,
|
||||
.mask = disable_local2_irq,
|
||||
.mask_ack = disable_local2_irq,
|
||||
.unmask = enable_local2_irq,
|
||||
.end = end_local2_irq,
|
||||
};
|
||||
|
||||
static void enable_local3_irq(unsigned int irq)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
local_irq_save(flags);
|
||||
sgint->imask1 |= (1 << (SGI_MAP_1_IRQ - SGINT_LOCAL1));
|
||||
sgint->cmeimask1 |= (1 << (irq - SGINT_LOCAL3));
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
static unsigned int startup_local3_irq(unsigned int irq)
|
||||
{
|
||||
enable_local3_irq(irq);
|
||||
return 0; /* Never anything pending */
|
||||
}
|
||||
|
||||
void disable_local3_irq(unsigned int irq)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
local_irq_save(flags);
|
||||
sgint->cmeimask1 &= ~(1 << (irq - SGINT_LOCAL3));
|
||||
if (!sgint->cmeimask1)
|
||||
sgint->imask1 &= ~(1 << (SGI_MAP_1_IRQ - SGINT_LOCAL1));
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
#define shutdown_local3_irq disable_local3_irq
|
||||
#define mask_and_ack_local3_irq disable_local3_irq
|
||||
|
||||
static void end_local3_irq (unsigned int irq)
|
||||
{
|
||||
if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
|
||||
@@ -214,11 +143,10 @@ static void end_local3_irq (unsigned int irq)
|
||||
|
||||
static struct irq_chip ip22_local3_irq_type = {
|
||||
.typename = "IP22 local 3",
|
||||
.startup = startup_local3_irq,
|
||||
.shutdown = shutdown_local3_irq,
|
||||
.enable = enable_local3_irq,
|
||||
.disable = disable_local3_irq,
|
||||
.ack = mask_and_ack_local3_irq,
|
||||
.ack = disable_local3_irq,
|
||||
.mask = disable_local3_irq,
|
||||
.mask_ack = disable_local3_irq,
|
||||
.unmask = enable_local3_irq,
|
||||
.end = end_local3_irq,
|
||||
};
|
||||
|
||||
@@ -430,10 +358,7 @@ void __init arch_init_irq(void)
|
||||
else
|
||||
handler = &ip22_local3_irq_type;
|
||||
|
||||
irq_desc[i].status = IRQ_DISABLED;
|
||||
irq_desc[i].action = 0;
|
||||
irq_desc[i].depth = 1;
|
||||
irq_desc[i].chip = handler;
|
||||
set_irq_chip(i, handler);
|
||||
}
|
||||
|
||||
/* vector handler. this register the IRQ as non-sharable */
|
||||
|
Посилання в новій задачі
Заблокувати користувача