mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-18 00:24:58 +08:00
0fabe1021f
This change complements commits d0da7c002f7b2a93582187a9e3f73891a01d8ee4
[MIPS: DEC: Convert to new irq_chip functions] and
5359b938c0
[MIPS: DECstation I/O ASIC DMA
interrupt handling fix] and implements automatic handling of the two
classes of DMA interrupts the I/O ASIC implements, informational and
errors.
Informational DMA interrupts do not stop the transfer and use the
`handle_edge_irq' handler that clears the request right away so that
another request may be recorded while the previous is being handled.
DMA error interrupts stop the transfer and require a corrective action
before DMA can be reenabled. Therefore they use the `handle_fasteoi_irq'
handler that only clears the request on the way out. Because MIPS
processor interrupt inputs, one of which the I/O ASIC's interrupt
controller is cascaded to, are level-triggered it is recommended that
error DMA interrupt action handlers are registered with the IRQF_ONESHOT
flag set so that they are run with the interrupt line masked.
This change removes the export of clear_ioasic_dma_irq that now does not
have to be called by device drivers to clear interrupts explicitly
anymore. Originally these interrupts were cleared in the .end handler of
the `irq_chip' structure, before it was removed.
Signed-off-by: Maciej W. Rozycki <macro@linux-mips.org>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/5874/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
39 lines
862 B
C
39 lines
862 B
C
/*
|
|
* include/asm-mips/dec/ioasic.h
|
|
*
|
|
* DEC I/O ASIC access operations.
|
|
*
|
|
* Copyright (C) 2000, 2002, 2003 Maciej W. Rozycki
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version
|
|
* 2 of the License, or (at your option) any later version.
|
|
*/
|
|
|
|
#ifndef __ASM_DEC_IOASIC_H
|
|
#define __ASM_DEC_IOASIC_H
|
|
|
|
#include <linux/spinlock.h>
|
|
#include <linux/types.h>
|
|
|
|
extern spinlock_t ioasic_ssr_lock;
|
|
|
|
extern volatile u32 *ioasic_base;
|
|
|
|
static inline void ioasic_write(unsigned int reg, u32 v)
|
|
{
|
|
ioasic_base[reg / 4] = v;
|
|
}
|
|
|
|
static inline u32 ioasic_read(unsigned int reg)
|
|
{
|
|
return ioasic_base[reg / 4];
|
|
}
|
|
|
|
extern void init_ioasic_irqs(int base);
|
|
|
|
extern int dec_ioasic_clocksource_init(void);
|
|
|
|
#endif /* __ASM_DEC_IOASIC_H */
|