diff options
| -rw-r--r-- | include/linux/irq.h | 8 | ||||
| -rw-r--r-- | kernel/irq/internals.h | 2 | ||||
| -rw-r--r-- | kernel/irq/manage.c | 4 | ||||
| -rw-r--r-- | kernel/irq/pm.c | 2 | 
4 files changed, 11 insertions, 5 deletions
diff --git a/include/linux/irq.h b/include/linux/irq.h index ef6b66dc9d0..94c8f5bb548 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h @@ -168,6 +168,8 @@ struct irq_data {   * IRQD_PER_CPU			- Interrupt is per cpu   * IRQD_AFFINITY_SET		- Interrupt affinity was set   * IRQD_LEVEL			- Interrupt is level triggered + * IRQD_WAKEUP_STATE		- Interrupt is configured for wakeup + *				  from suspend   */  enum {  	IRQD_TRIGGER_MASK		= 0xf, @@ -176,6 +178,7 @@ enum {  	IRQD_PER_CPU			= (1 << 11),  	IRQD_AFFINITY_SET		= (1 << 12),  	IRQD_LEVEL			= (1 << 13), +	IRQD_WAKEUP_STATE		= (1 << 14),  };  static inline bool irqd_is_setaffinity_pending(struct irq_data *d) @@ -217,6 +220,11 @@ static inline bool irqd_is_level_type(struct irq_data *d)  	return d->state_use_accessors & IRQD_LEVEL;  } +static inline bool irqd_is_wakeup_set(struct irq_data *d) +{ +	return d->state_use_accessors & IRQD_WAKEUP_STATE; +} +  /**   * struct irq_chip - hardware interrupt chip descriptor   * diff --git a/kernel/irq/internals.h b/kernel/irq/internals.h index 1d500fbde0d..5e2366da9f3 100644 --- a/kernel/irq/internals.h +++ b/kernel/irq/internals.h @@ -46,7 +46,6 @@ enum {   * IRQS_PENDING			- irq is pending and replayed later   * IRQS_MASKED			- irq is masked   * IRQS_SUSPENDED		- irq is suspended - * IRQS_WAKEUP			- irq triggers system wakeup from suspend   */  enum {  	IRQS_AUTODETECT		= 0x00000001, @@ -60,7 +59,6 @@ enum {  	IRQS_PENDING		= 0x00000200,  	IRQS_MASKED		= 0x00000400,  	IRQS_SUSPENDED		= 0x00000800, -	IRQS_WAKEUP		= 0x00001000,  };  #include "compat.h" diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 50809c79c7a..ea6add6036b 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -492,7 +492,7 @@ int irq_set_irq_wake(unsigned int irq, unsigned int on)  			if (ret)  				desc->wake_depth = 0;  			else -				desc->istate |= IRQS_WAKEUP; +				irqd_set(&desc->irq_data, IRQD_WAKEUP_STATE);  		}  	} else {  		if (desc->wake_depth == 0) { @@ -502,7 +502,7 @@ int irq_set_irq_wake(unsigned int irq, unsigned int on)  			if (ret)  				desc->wake_depth = 1;  			else -				desc->istate &= ~IRQS_WAKEUP; +				irqd_clear(&desc->irq_data, IRQD_WAKEUP_STATE);  		}  	} diff --git a/kernel/irq/pm.c b/kernel/irq/pm.c index f39383d8672..1329f0eff49 100644 --- a/kernel/irq/pm.c +++ b/kernel/irq/pm.c @@ -69,7 +69,7 @@ int check_wakeup_irqs(void)  	int irq;  	for_each_irq_desc(irq, desc) -		if ((desc->istate & IRQS_WAKEUP) && +		if (irqd_is_wakeup_set(&desc->irq_data) &&  		    (desc->istate & IRQS_PENDING))  			return -EBUSY;  |