On Wed, Jul 11, 2001 at 01:16:56PM +0100, Phil Thompson wrote:
> Is there any documentation around that describes how to move from interrupt
> code based on old-irq.c to the new code? Or any other hints or suggestions.
First disable CONFIG_ROTTEN_IRQ if you were using that and enable
CONFIG_NEW_IRQ. You'll probably have to hack arch/mips/config.in to do
that.
Next you have to rewrite your systems irq code. You'll have to provide
an init_IRQ() function to initialize the interrupt system. As the
absolute minimum it'll have to do something like:
set_except_vector(0, myasmirqhandler);
init_generic_irq();
and initialize the entries for all interrupts used by your system in the
irq_desc array like:
for (i = 0; i < NUM_MY_INTS; i++) {
irq_desc[i].status = IRQ_DISABLED;
irq_desc[i].action = 0;
irq_desc[i].depth = 1;
irq_desc[i].handler = handler;
}
where handler is a pointer to struct like this one:
static struct hw_interrupt_type ip22_my_irq_type = {
"My interrupt controller",
startup_my_irq,
shutdown_my_irq,
enable_my_irq,
disable_my_irq,
mask_and_ack_my_irq,
end_my_irq,
NULL
};
All that's left now is to write the function references in above struct
initialization:
static void enable_my_irq(unsigned int irq)
{
/* enable the interrupt in the controller */
}
static unsigned int startup_my_irq(unsigned int irq)
{
enable_my_irq(irq);
return 0; /* Never anything pending */
}
static void disable_my_irq(unsigned int irq)
{
/* Disable function in the interrupt controller */
}
static void shutdown_my_irq(unsigned int irq)
{
/*
* Disable interrupt in the interrupt controller. Often this function
* is identical to disable_my_irq.
*/
}
static void mask_and_ack_my_irq(unsigned int irq)
{
/*
* Mask and acknowledge interrupt. Often this function is identical
* to disable_my_irq. Exception is for example the i8259 PICs.
*/
}
static void end_my_irq (unsigned int irq)
{
if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
enable_my_irq(irq);
}
Take a look at arch/mips/sgi/indy_int.c but there are more examples.
The plan is to nuke old-irq.c early in 2.5; at the same time also something
like arch/{i386,mips}/kernel/irq.c will become kernel/irq.c.
Ralf
|