Skip to content

Commit 6e40262

Browse files
committed
genirq: Move IRQ_MASKED to core
Keep status in sync until all users are fixed. Signed-off-by: Thomas Gleixner <[email protected]>
1 parent 2a0d6fb commit 6e40262

File tree

7 files changed

+41
-13
lines changed

7 files changed

+41
-13
lines changed

include/linux/irq.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,11 @@ typedef void (*irq_flow_handler_t)(unsigned int irq,
5757
#define IRQ_WAITING 0x00000400 /* DEPRECATED */
5858
#define IRQ_DISABLED 0x00000800 /* DEPRECATED */
5959
#define IRQ_PENDING 0x00001000 /* DEPRECATED */
60+
#define IRQ_MASKED 0x00002000 /* DEPRECATED */
6061
#endif
6162

6263

6364
#define IRQ_LEVEL 0x00004000 /* IRQ level triggered */
64-
#define IRQ_MASKED 0x00008000 /* IRQ masked - shouldn't be seen again */
6565
#define IRQ_PER_CPU 0x00010000 /* IRQ is per CPU */
6666
#define IRQ_NOPROBE 0x00020000 /* IRQ is not valid for probing */
6767
#define IRQ_NOREQUEST 0x00040000 /* IRQ cannot be requested */

kernel/irq/chip.c

+20-8
Original file line numberDiff line numberDiff line change
@@ -176,14 +176,26 @@ static void irq_state_set_disabled(struct irq_desc *desc)
176176
irq_compat_set_disabled(desc);
177177
}
178178

179+
static void irq_state_clr_masked(struct irq_desc *desc)
180+
{
181+
desc->istate &= ~IRQS_MASKED;
182+
irq_compat_clr_masked(desc);
183+
}
184+
185+
static void irq_state_set_masked(struct irq_desc *desc)
186+
{
187+
desc->istate |= IRQS_MASKED;
188+
irq_compat_set_masked(desc);
189+
}
190+
179191
int irq_startup(struct irq_desc *desc)
180192
{
181193
irq_state_clr_disabled(desc);
182194
desc->depth = 0;
183195

184196
if (desc->irq_data.chip->irq_startup) {
185197
int ret = desc->irq_data.chip->irq_startup(&desc->irq_data);
186-
desc->status &= ~IRQ_MASKED;
198+
irq_state_clr_masked(desc);
187199
return ret;
188200
}
189201

@@ -201,7 +213,7 @@ void irq_shutdown(struct irq_desc *desc)
201213
desc->irq_data.chip->irq_disable(&desc->irq_data);
202214
else
203215
desc->irq_data.chip->irq_mask(&desc->irq_data);
204-
desc->status |= IRQ_MASKED;
216+
irq_state_set_masked(desc);
205217
}
206218

207219
void irq_enable(struct irq_desc *desc)
@@ -211,16 +223,16 @@ void irq_enable(struct irq_desc *desc)
211223
desc->irq_data.chip->irq_enable(&desc->irq_data);
212224
else
213225
desc->irq_data.chip->irq_unmask(&desc->irq_data);
214-
desc->status &= ~IRQ_MASKED;
226+
irq_state_clr_masked(desc);
215227
}
216228

217229
void irq_disable(struct irq_desc *desc)
218230
{
219231
irq_state_set_disabled(desc);
220232
if (desc->irq_data.chip->irq_disable) {
221233
desc->irq_data.chip->irq_disable(&desc->irq_data);
222-
desc->status |= IRQ_MASKED;
223234
}
235+
irq_state_set_masked(desc);
224236
}
225237

226238
#ifndef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED
@@ -352,22 +364,22 @@ static inline void mask_ack_irq(struct irq_desc *desc)
352364
if (desc->irq_data.chip->irq_ack)
353365
desc->irq_data.chip->irq_ack(&desc->irq_data);
354366
}
355-
desc->status |= IRQ_MASKED;
367+
irq_state_set_masked(desc);
356368
}
357369

358370
static inline void mask_irq(struct irq_desc *desc)
359371
{
360372
if (desc->irq_data.chip->irq_mask) {
361373
desc->irq_data.chip->irq_mask(&desc->irq_data);
362-
desc->status |= IRQ_MASKED;
374+
irq_state_set_masked(desc);
363375
}
364376
}
365377

366378
static inline void unmask_irq(struct irq_desc *desc)
367379
{
368380
if (desc->irq_data.chip->irq_unmask) {
369381
desc->irq_data.chip->irq_unmask(&desc->irq_data);
370-
desc->status &= ~IRQ_MASKED;
382+
irq_state_clr_masked(desc);
371383
}
372384
}
373385

@@ -583,7 +595,7 @@ handle_edge_irq(unsigned int irq, struct irq_desc *desc)
583595
*/
584596
if (unlikely(desc->istate & IRQS_PENDING)) {
585597
if (!(desc->istate & IRQS_DISABLED) &&
586-
(desc->status & IRQ_MASKED))
598+
(desc->istate & IRQS_MASKED))
587599
unmask_irq(desc);
588600
}
589601

kernel/irq/compat.h

+11
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,23 @@ static inline void irq_compat_clr_pending(struct irq_desc *desc)
2828
{
2929
desc->status &= ~IRQ_PENDING;
3030
}
31+
static inline void irq_compat_set_masked(struct irq_desc *desc)
32+
{
33+
desc->status |= IRQ_MASKED;
34+
}
35+
36+
static inline void irq_compat_clr_masked(struct irq_desc *desc)
37+
{
38+
desc->status &= ~IRQ_MASKED;
39+
}
3140
#else
3241
static inline void irq_compat_set_progress(struct irq_desc *desc) { }
3342
static inline void irq_compat_clr_progress(struct irq_desc *desc) { }
3443
static inline void irq_compat_set_disabled(struct irq_desc *desc) { }
3544
static inline void irq_compat_clr_disabled(struct irq_desc *desc) { }
3645
static inline void irq_compat_set_pending(struct irq_desc *desc) { }
3746
static inline void irq_compat_clr_pending(struct irq_desc *desc) { }
47+
static inline void irq_compat_set_masked(struct irq_desc *desc) { }
48+
static inline void irq_compat_clr_masked(struct irq_desc *desc) { }
3849
#endif
3950

kernel/irq/internals.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ enum {
4747
* IRQS_WAITING - irq is waiting
4848
* IRQS_DISABLED - irq is disabled
4949
* IRQS_PENDING - irq is pending and replayed later
50+
* IRQS_MASKED - irq is masked
5051
*/
5152
enum {
5253
IRQS_AUTODETECT = 0x00000001,
@@ -58,6 +59,7 @@ enum {
5859
IRQS_WAITING = 0x00000080,
5960
IRQS_DISABLED = 0x00000100,
6061
IRQS_PENDING = 0x00000200,
62+
IRQS_MASKED = 0x00000400,
6163
};
6264

6365
#define irq_data_to_desc(data) container_of(data, struct irq_desc, irq_data)
@@ -142,7 +144,6 @@ static inline void print_irq_desc(unsigned int irq, struct irq_desc *desc)
142144
}
143145

144146
P(IRQ_LEVEL);
145-
P(IRQ_MASKED);
146147
#ifdef CONFIG_IRQ_PER_CPU
147148
P(IRQ_PER_CPU);
148149
#endif
@@ -156,6 +157,7 @@ static inline void print_irq_desc(unsigned int irq, struct irq_desc *desc)
156157
PS(IRQS_WAITING);
157158
PS(IRQS_DISABLED);
158159
PS(IRQS_PENDING);
160+
PS(IRQS_MASKED);
159161
}
160162

161163
#undef P

kernel/irq/manage.c

+3-2
Original file line numberDiff line numberDiff line change
@@ -646,8 +646,9 @@ static void irq_finalize_oneshot(unsigned int irq, struct irq_desc *desc)
646646
goto again;
647647
}
648648

649-
if (!(desc->istate & IRQS_DISABLED) && (desc->status & IRQ_MASKED)) {
650-
desc->status &= ~IRQ_MASKED;
649+
if (!(desc->istate & IRQS_DISABLED) && (desc->istate & IRQS_MASKED)) {
650+
irq_compat_clr_masked(desc);
651+
desc->istate &= ~IRQS_MASKED;
651652
desc->irq_data.chip->irq_unmask(&desc->irq_data);
652653
}
653654
raw_spin_unlock_irq(&desc->lock);

kernel/irq/migration.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ void move_native_irq(int irq)
6969
* threaded interrupt with ONESHOT set, we can end up with an
7070
* interrupt storm.
7171
*/
72-
masked = desc->status & IRQ_MASKED;
72+
masked = desc->istate & IRQS_MASKED;
7373
if (!masked)
7474
desc->irq_data.chip->irq_mask(&desc->irq_data);
7575
move_masked_irq(irq);

kernel/irq/settings.h

+2
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,5 @@ enum {
1616
#define IRQ_DISABLED GOT_YOU_MORON
1717
#undef IRQ_PENDING
1818
#define IRQ_PENDING GOT_YOU_MORON
19+
#undef IRQ_MASKED
20+
#define IRQ_MASKED GOT_YOU_MORON

0 commit comments

Comments
 (0)