提交 1ccb4e61 编写于 作者: T Thomas Gleixner

genirq: Wrap the remaning IRQ_* flags

Use wrappers to keep them away from the core code.
Signed-off-by: NThomas Gleixner <tglx@linutronix.de>
上级 876dbd4c
...@@ -45,7 +45,7 @@ unsigned long probe_irq_on(void) ...@@ -45,7 +45,7 @@ unsigned long probe_irq_on(void)
*/ */
for_each_irq_desc_reverse(i, desc) { for_each_irq_desc_reverse(i, desc) {
raw_spin_lock_irq(&desc->lock); raw_spin_lock_irq(&desc->lock);
if (!desc->action && !(desc->status & IRQ_NOPROBE)) { if (!desc->action && irq_settings_can_probe(desc)) {
/* /*
* An old-style architecture might still have * An old-style architecture might still have
* the handle_bad_irq handler there: * the handle_bad_irq handler there:
...@@ -74,7 +74,7 @@ unsigned long probe_irq_on(void) ...@@ -74,7 +74,7 @@ unsigned long probe_irq_on(void)
*/ */
for_each_irq_desc_reverse(i, desc) { for_each_irq_desc_reverse(i, desc) {
raw_spin_lock_irq(&desc->lock); raw_spin_lock_irq(&desc->lock);
if (!desc->action && !(desc->status & IRQ_NOPROBE)) { if (!desc->action && irq_settings_can_probe(desc)) {
desc->istate |= IRQS_AUTODETECT | IRQS_WAITING; desc->istate |= IRQS_AUTODETECT | IRQS_WAITING;
if (irq_startup(desc)) { if (irq_startup(desc)) {
irq_compat_set_pending(desc); irq_compat_set_pending(desc);
......
...@@ -674,7 +674,8 @@ __set_irq_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained, ...@@ -674,7 +674,8 @@ __set_irq_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained,
desc->name = name; desc->name = name;
if (handle != handle_bad_irq && is_chained) { if (handle != handle_bad_irq && is_chained) {
desc->status |= IRQ_NOREQUEST | IRQ_NOPROBE; irq_settings_set_noprobe(desc);
irq_settings_set_norequest(desc);
irq_startup(desc); irq_startup(desc);
} }
raw_spin_unlock_irqrestore(&desc->lock, flags); raw_spin_unlock_irqrestore(&desc->lock, flags);
......
...@@ -103,7 +103,7 @@ void irq_set_thread_affinity(struct irq_desc *desc) ...@@ -103,7 +103,7 @@ void irq_set_thread_affinity(struct irq_desc *desc)
#ifdef CONFIG_GENERIC_PENDING_IRQ #ifdef CONFIG_GENERIC_PENDING_IRQ
static inline bool irq_can_move_pcntxt(struct irq_desc *desc) static inline bool irq_can_move_pcntxt(struct irq_desc *desc)
{ {
return desc->status & IRQ_MOVE_PCNTXT; return irq_settings_can_move_pcntxt(desc);
} }
static inline bool irq_move_pending(struct irq_desc *desc) static inline bool irq_move_pending(struct irq_desc *desc)
{ {
...@@ -411,7 +411,7 @@ void __enable_irq(struct irq_desc *desc, unsigned int irq, bool resume) ...@@ -411,7 +411,7 @@ void __enable_irq(struct irq_desc *desc, unsigned int irq, bool resume)
if (desc->istate & IRQS_SUSPENDED) if (desc->istate & IRQS_SUSPENDED)
goto err_out; goto err_out;
/* Prevent probing on this irq: */ /* Prevent probing on this irq: */
desc->status |= IRQ_NOPROBE; irq_settings_set_noprobe(desc);
irq_enable(desc); irq_enable(desc);
check_irq_resend(desc, irq); check_irq_resend(desc, irq);
/* fall-through */ /* fall-through */
...@@ -526,7 +526,7 @@ int can_request_irq(unsigned int irq, unsigned long irqflags) ...@@ -526,7 +526,7 @@ int can_request_irq(unsigned int irq, unsigned long irqflags)
if (!desc) if (!desc)
return 0; return 0;
if (desc->status & IRQ_NOREQUEST) if (!irq_settings_can_request(desc))
return 0; return 0;
raw_spin_lock_irqsave(&desc->lock, flags); raw_spin_lock_irqsave(&desc->lock, flags);
...@@ -820,7 +820,7 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new) ...@@ -820,7 +820,7 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
* Check whether the interrupt nests into another interrupt * Check whether the interrupt nests into another interrupt
* thread. * thread.
*/ */
nested = desc->status & IRQ_NESTED_THREAD; nested = irq_settings_is_nested_thread(desc);
if (nested) { if (nested) {
if (!new->thread_fn) if (!new->thread_fn)
return -EINVAL; return -EINVAL;
...@@ -917,7 +917,7 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new) ...@@ -917,7 +917,7 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
if (new->flags & IRQF_ONESHOT) if (new->flags & IRQF_ONESHOT)
desc->istate |= IRQS_ONESHOT; desc->istate |= IRQS_ONESHOT;
if (!(desc->status & IRQ_NOAUTOEN)) if (irq_settings_can_autoenable(desc))
irq_startup(desc); irq_startup(desc);
else else
/* Undo nested disables: */ /* Undo nested disables: */
...@@ -1217,7 +1217,7 @@ int request_threaded_irq(unsigned int irq, irq_handler_t handler, ...@@ -1217,7 +1217,7 @@ int request_threaded_irq(unsigned int irq, irq_handler_t handler,
if (!desc) if (!desc)
return -EINVAL; return -EINVAL;
if (desc->status & IRQ_NOREQUEST) if (!irq_settings_can_request(desc))
return -EINVAL; return -EINVAL;
if (!handler) { if (!handler) {
...@@ -1292,7 +1292,7 @@ int request_any_context_irq(unsigned int irq, irq_handler_t handler, ...@@ -1292,7 +1292,7 @@ int request_any_context_irq(unsigned int irq, irq_handler_t handler,
if (!desc) if (!desc)
return -EINVAL; return -EINVAL;
if (desc->status & IRQ_NESTED_THREAD) { if (irq_settings_is_nested_thread(desc)) {
ret = request_threaded_irq(irq, NULL, handler, ret = request_threaded_irq(irq, NULL, handler,
flags, name, dev_id); flags, name, dev_id);
return !ret ? IRQC_IS_NESTED : ret; return !ret ? IRQC_IS_NESTED : ret;
......
...@@ -6,7 +6,12 @@ enum { ...@@ -6,7 +6,12 @@ enum {
_IRQ_DEFAULT_INIT_FLAGS = IRQ_DEFAULT_INIT_FLAGS, _IRQ_DEFAULT_INIT_FLAGS = IRQ_DEFAULT_INIT_FLAGS,
_IRQ_PER_CPU = IRQ_PER_CPU, _IRQ_PER_CPU = IRQ_PER_CPU,
_IRQ_LEVEL = IRQ_LEVEL, _IRQ_LEVEL = IRQ_LEVEL,
_IRQ_NOPROBE = IRQ_NOPROBE,
_IRQ_NOREQUEST = IRQ_NOREQUEST,
_IRQ_NOAUTOEN = IRQ_NOAUTOEN,
_IRQ_MOVE_PCNTXT = IRQ_MOVE_PCNTXT,
_IRQ_NO_BALANCING = IRQ_NO_BALANCING, _IRQ_NO_BALANCING = IRQ_NO_BALANCING,
_IRQ_NESTED_THREAD = IRQ_NESTED_THREAD,
_IRQF_MODIFY_MASK = IRQF_MODIFY_MASK, _IRQF_MODIFY_MASK = IRQF_MODIFY_MASK,
}; };
...@@ -34,6 +39,14 @@ enum { ...@@ -34,6 +39,14 @@ enum {
#define IRQ_AFFINITY_SET GOT_YOU_MORON #define IRQ_AFFINITY_SET GOT_YOU_MORON
#undef IRQ_LEVEL #undef IRQ_LEVEL
#define IRQ_LEVEL GOT_YOU_MORON #define IRQ_LEVEL GOT_YOU_MORON
#undef IRQ_NOPROBE
#define IRQ_NOPROBE GOT_YOU_MORON
#undef IRQ_NOREQUEST
#define IRQ_NOREQUEST GOT_YOU_MORON
#undef IRQ_NOAUTOEN
#define IRQ_NOAUTOEN GOT_YOU_MORON
#undef IRQ_NESTED_THREAD
#define IRQ_NESTED_THREAD GOT_YOU_MORON
#undef IRQF_MODIFY_MASK #undef IRQF_MODIFY_MASK
#define IRQF_MODIFY_MASK GOT_YOU_MORON #define IRQF_MODIFY_MASK GOT_YOU_MORON
...@@ -90,3 +103,48 @@ static inline void irq_settings_set_level(struct irq_desc *desc) ...@@ -90,3 +103,48 @@ static inline void irq_settings_set_level(struct irq_desc *desc)
{ {
desc->status |= _IRQ_LEVEL; desc->status |= _IRQ_LEVEL;
} }
static inline bool irq_settings_can_request(struct irq_desc *desc)
{
return !(desc->status & _IRQ_NOREQUEST);
}
static inline void irq_settings_clr_norequest(struct irq_desc *desc)
{
desc->status &= ~_IRQ_NOREQUEST;
}
static inline void irq_settings_set_norequest(struct irq_desc *desc)
{
desc->status |= _IRQ_NOREQUEST;
}
static inline bool irq_settings_can_probe(struct irq_desc *desc)
{
return !(desc->status & _IRQ_NOPROBE);
}
static inline void irq_settings_clr_noprobe(struct irq_desc *desc)
{
desc->status &= ~_IRQ_NOPROBE;
}
static inline void irq_settings_set_noprobe(struct irq_desc *desc)
{
desc->status |= _IRQ_NOPROBE;
}
static inline bool irq_settings_can_move_pcntxt(struct irq_desc *desc)
{
return desc->status & _IRQ_MOVE_PCNTXT;
}
static inline bool irq_settings_can_autoenable(struct irq_desc *desc)
{
return !(desc->status & _IRQ_NOAUTOEN);
}
static inline bool irq_settings_is_nested_thread(struct irq_desc *desc)
{
return desc->status & _IRQ_NESTED_THREAD;
}
...@@ -68,8 +68,7 @@ static int try_one_irq(int irq, struct irq_desc *desc, bool force) ...@@ -68,8 +68,7 @@ static int try_one_irq(int irq, struct irq_desc *desc, bool force)
raw_spin_lock(&desc->lock); raw_spin_lock(&desc->lock);
/* PER_CPU and nested thread interrupts are never polled */ /* PER_CPU and nested thread interrupts are never polled */
if (irq_settings_is_per_cpu(desc) || if (irq_settings_is_per_cpu(desc) || irq_settings_is_nested_thread(desc))
(desc->status & IRQ_NESTED_THREAD))
goto out; goto out;
/* /*
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册