mirror of https://gitee.com/openkylin/linux.git
x86: io-apic - get rid of __DO_ACTION macro
Replace __DO_ACTION macro with io_apic_modify_irq function. This allow us to 'grep' definitions being hided by __DO_ACTION macro: __unmask_IO_APIC_irq __mask_IO_APIC_irq __mask_and_edge_IO_APIC_irq __unmask_and_level_IO_APIC_irq Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com> Acked-by: Yinghai Lu <yhlu.kernel@gmail.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
ba374c9bae
commit
87783be4c2
|
@ -643,65 +643,66 @@ static void __init replace_pin_at_irq(unsigned int irq,
|
|||
add_pin_to_irq(irq, newapic, newpin);
|
||||
}
|
||||
|
||||
#define __DO_ACTION(R, ACTION_ENABLE, ACTION_DISABLE, FINAL) \
|
||||
\
|
||||
{ \
|
||||
int pin; \
|
||||
struct irq_cfg *cfg; \
|
||||
struct irq_pin_list *entry; \
|
||||
\
|
||||
cfg = irq_cfg(irq); \
|
||||
entry = cfg->irq_2_pin; \
|
||||
for (;;) { \
|
||||
unsigned int reg; \
|
||||
if (!entry) \
|
||||
break; \
|
||||
pin = entry->pin; \
|
||||
reg = io_apic_read(entry->apic, 0x10 + R + pin*2); \
|
||||
reg ACTION_DISABLE; \
|
||||
reg ACTION_ENABLE; \
|
||||
io_apic_modify(entry->apic, 0x10 + R + pin*2, reg); \
|
||||
FINAL; \
|
||||
if (!entry->next) \
|
||||
break; \
|
||||
entry = entry->next; \
|
||||
} \
|
||||
static inline void io_apic_modify_irq(unsigned int irq,
|
||||
int mask_and, int mask_or,
|
||||
void (*final)(struct irq_pin_list *entry))
|
||||
{
|
||||
int pin;
|
||||
struct irq_cfg *cfg;
|
||||
struct irq_pin_list *entry;
|
||||
|
||||
cfg = irq_cfg(irq);
|
||||
for (entry = cfg->irq_2_pin; entry != NULL; entry = entry->next) {
|
||||
unsigned int reg;
|
||||
pin = entry->pin;
|
||||
reg = io_apic_read(entry->apic, 0x10 + pin * 2);
|
||||
reg &= mask_and;
|
||||
reg |= mask_or;
|
||||
io_apic_modify(entry->apic, 0x10 + pin * 2, reg);
|
||||
if (final)
|
||||
final(entry);
|
||||
}
|
||||
}
|
||||
|
||||
#define DO_ACTION(name,R, ACTION_ENABLE, ACTION_DISABLE, FINAL) \
|
||||
\
|
||||
static void name##_IO_APIC_irq (unsigned int irq) \
|
||||
__DO_ACTION(R, ACTION_ENABLE, ACTION_DISABLE, FINAL)
|
||||
|
||||
/* mask = 0 */
|
||||
DO_ACTION(__unmask, 0, |= 0, &= ~IO_APIC_REDIR_MASKED, )
|
||||
static void __unmask_IO_APIC_irq(unsigned int irq)
|
||||
{
|
||||
io_apic_modify_irq(irq, ~IO_APIC_REDIR_MASKED, 0, NULL);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
/*
|
||||
* Synchronize the IO-APIC and the CPU by doing
|
||||
* a dummy read from the IO-APIC
|
||||
*/
|
||||
static inline void io_apic_sync(unsigned int apic)
|
||||
void io_apic_sync(struct irq_pin_list *entry)
|
||||
{
|
||||
struct io_apic __iomem *io_apic = io_apic_base(apic);
|
||||
/*
|
||||
* Synchronize the IO-APIC and the CPU by doing
|
||||
* a dummy read from the IO-APIC
|
||||
*/
|
||||
struct io_apic __iomem *io_apic;
|
||||
io_apic = io_apic_base(entry->apic);
|
||||
readl(&io_apic->data);
|
||||
}
|
||||
|
||||
/* mask = 1 */
|
||||
DO_ACTION(__mask, 0, |= IO_APIC_REDIR_MASKED, &= ~0, io_apic_sync(entry->apic))
|
||||
static void __mask_IO_APIC_irq(unsigned int irq)
|
||||
{
|
||||
io_apic_modify_irq(irq, ~0, IO_APIC_REDIR_MASKED, &io_apic_sync);
|
||||
}
|
||||
#else /* CONFIG_X86_32 */
|
||||
static void __mask_IO_APIC_irq(unsigned int irq)
|
||||
{
|
||||
io_apic_modify_irq(irq, ~0, IO_APIC_REDIR_MASKED, NULL);
|
||||
}
|
||||
|
||||
#else
|
||||
static void __mask_and_edge_IO_APIC_irq(unsigned int irq)
|
||||
{
|
||||
io_apic_modify_irq(irq, ~IO_APIC_REDIR_LEVEL_TRIGGER,
|
||||
IO_APIC_REDIR_MASKED, NULL);
|
||||
}
|
||||
|
||||
/* mask = 1 */
|
||||
DO_ACTION(__mask, 0, |= IO_APIC_REDIR_MASKED, &= ~0, )
|
||||
|
||||
/* mask = 1, trigger = 0 */
|
||||
DO_ACTION(__mask_and_edge, 0, |= IO_APIC_REDIR_MASKED, &= ~IO_APIC_REDIR_LEVEL_TRIGGER, )
|
||||
|
||||
/* mask = 0, trigger = 1 */
|
||||
DO_ACTION(__unmask_and_level, 0, |= IO_APIC_REDIR_LEVEL_TRIGGER, &= ~IO_APIC_REDIR_MASKED, )
|
||||
|
||||
#endif
|
||||
static void __unmask_and_level_IO_APIC_irq(unsigned int irq)
|
||||
{
|
||||
io_apic_modify_irq(irq, ~IO_APIC_REDIR_MASKED,
|
||||
IO_APIC_REDIR_LEVEL_TRIGGER, NULL);
|
||||
}
|
||||
#endif /* CONFIG_X86_32 */
|
||||
|
||||
static void mask_IO_APIC_irq (unsigned int irq)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue