diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2010-09-27 08:45:02 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2010-10-04 06:43:43 -0400 |
commit | bc310dda41be6439364c8f3b9fe7c9d743d22b1c (patch) | |
tree | 86a8b4da3d9e81aad104b61023858813454b0f35 /kernel/irq | |
parent | c5f756344c390f629243b4a28c2bd198fdfd7ee9 (diff) |
genirq: Provide compat handling for chip->disable()/shutdown()
Wrap the old chip functions disable() and shutdown() until the
migration is complete and the old chip functions are removed.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Peter Zijlstra <peterz@infradead.org>
LKML-Reference: <20100927121842.532070631@linutronix.de>
Reviewed-by: H. Peter Anvin <hpa@zytor.com>
Reviewed-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel/irq')
-rw-r--r-- | kernel/irq/autoprobe.c | 6 | ||||
-rw-r--r-- | kernel/irq/chip.c | 37 | ||||
-rw-r--r-- | kernel/irq/handle.c | 4 | ||||
-rw-r--r-- | kernel/irq/manage.c | 8 | ||||
-rw-r--r-- | kernel/irq/spurious.c | 2 |
5 files changed, 35 insertions, 22 deletions
diff --git a/kernel/irq/autoprobe.c b/kernel/irq/autoprobe.c index f9bf9b228033..95806a45be78 100644 --- a/kernel/irq/autoprobe.c +++ b/kernel/irq/autoprobe.c | |||
@@ -98,7 +98,7 @@ unsigned long probe_irq_on(void) | |||
98 | /* It triggered already - consider it spurious. */ | 98 | /* It triggered already - consider it spurious. */ |
99 | if (!(status & IRQ_WAITING)) { | 99 | if (!(status & IRQ_WAITING)) { |
100 | desc->status = status & ~IRQ_AUTODETECT; | 100 | desc->status = status & ~IRQ_AUTODETECT; |
101 | desc->irq_data.chip->shutdown(i); | 101 | desc->irq_data.chip->irq_shutdown(&desc->irq_data); |
102 | } else | 102 | } else |
103 | if (i < 32) | 103 | if (i < 32) |
104 | mask |= 1 << i; | 104 | mask |= 1 << i; |
@@ -137,7 +137,7 @@ unsigned int probe_irq_mask(unsigned long val) | |||
137 | mask |= 1 << i; | 137 | mask |= 1 << i; |
138 | 138 | ||
139 | desc->status = status & ~IRQ_AUTODETECT; | 139 | desc->status = status & ~IRQ_AUTODETECT; |
140 | desc->irq_data.chip->shutdown(i); | 140 | desc->irq_data.chip->irq_shutdown(&desc->irq_data); |
141 | } | 141 | } |
142 | raw_spin_unlock_irq(&desc->lock); | 142 | raw_spin_unlock_irq(&desc->lock); |
143 | } | 143 | } |
@@ -181,7 +181,7 @@ int probe_irq_off(unsigned long val) | |||
181 | nr_of_irqs++; | 181 | nr_of_irqs++; |
182 | } | 182 | } |
183 | desc->status = status & ~IRQ_AUTODETECT; | 183 | desc->status = status & ~IRQ_AUTODETECT; |
184 | desc->irq_data.chip->shutdown(i); | 184 | desc->irq_data.chip->irq_shutdown(&desc->irq_data); |
185 | } | 185 | } |
186 | raw_spin_unlock_irq(&desc->lock); | 186 | raw_spin_unlock_irq(&desc->lock); |
187 | } | 187 | } |
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index a95b47831269..b8a47f0a26cc 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c | |||
@@ -298,7 +298,7 @@ static void default_enable(struct irq_data *data) | |||
298 | /* | 298 | /* |
299 | * default disable function | 299 | * default disable function |
300 | */ | 300 | */ |
301 | static void default_disable(unsigned int irq) | 301 | static void default_disable(struct irq_data *data) |
302 | { | 302 | { |
303 | } | 303 | } |
304 | 304 | ||
@@ -316,9 +316,9 @@ static unsigned int default_startup(unsigned int irq) | |||
316 | /* | 316 | /* |
317 | * default shutdown function | 317 | * default shutdown function |
318 | */ | 318 | */ |
319 | static void default_shutdown(unsigned int irq) | 319 | static void default_shutdown(struct irq_data *data) |
320 | { | 320 | { |
321 | struct irq_desc *desc = irq_to_desc(irq); | 321 | struct irq_desc *desc = irq_data_to_desc(data); |
322 | 322 | ||
323 | desc->irq_data.chip->irq_mask(&desc->irq_data); | 323 | desc->irq_data.chip->irq_mask(&desc->irq_data); |
324 | desc->status |= IRQ_MASKED; | 324 | desc->status |= IRQ_MASKED; |
@@ -355,6 +355,16 @@ static void compat_irq_enable(struct irq_data *data) | |||
355 | data->chip->enable(data->irq); | 355 | data->chip->enable(data->irq); |
356 | } | 356 | } |
357 | 357 | ||
358 | static void compat_irq_disable(struct irq_data *data) | ||
359 | { | ||
360 | data->chip->disable(data->irq); | ||
361 | } | ||
362 | |||
363 | static void compat_irq_shutdown(struct irq_data *data) | ||
364 | { | ||
365 | data->chip->shutdown(data->irq); | ||
366 | } | ||
367 | |||
358 | static void compat_bus_lock(struct irq_data *data) | 368 | static void compat_bus_lock(struct irq_data *data) |
359 | { | 369 | { |
360 | data->chip->bus_lock(data->irq); | 370 | data->chip->bus_lock(data->irq); |
@@ -376,28 +386,35 @@ void irq_chip_set_defaults(struct irq_chip *chip) | |||
376 | */ | 386 | */ |
377 | if (chip->enable) | 387 | if (chip->enable) |
378 | chip->irq_enable = compat_irq_enable; | 388 | chip->irq_enable = compat_irq_enable; |
389 | if (chip->disable) | ||
390 | chip->irq_disable = compat_irq_disable; | ||
391 | if (chip->shutdown) | ||
392 | chip->irq_shutdown = compat_irq_shutdown; | ||
379 | 393 | ||
380 | /* | 394 | /* |
381 | * The real defaults | 395 | * The real defaults |
382 | */ | 396 | */ |
383 | if (!chip->irq_enable) | 397 | if (!chip->irq_enable) |
384 | chip->irq_enable = default_enable; | 398 | chip->irq_enable = default_enable; |
385 | if (!chip->disable) | 399 | if (!chip->irq_disable) |
386 | chip->disable = default_disable; | 400 | chip->irq_disable = default_disable; |
387 | if (!chip->startup) | 401 | if (!chip->startup) |
388 | chip->startup = default_startup; | 402 | chip->startup = default_startup; |
389 | /* | 403 | /* |
390 | * We use chip->disable, when the user provided its own. When | 404 | * We use chip->irq_disable, when the user provided its own. When |
391 | * we have default_disable set for chip->disable, then we need | 405 | * we have default_disable set for chip->irq_disable, then we need |
392 | * to use default_shutdown, otherwise the irq line is not | 406 | * to use default_shutdown, otherwise the irq line is not |
393 | * disabled on free_irq(): | 407 | * disabled on free_irq(): |
394 | */ | 408 | */ |
395 | if (!chip->shutdown) | 409 | if (!chip->irq_shutdown) |
396 | chip->shutdown = chip->disable != default_disable ? | 410 | chip->irq_shutdown = chip->irq_disable != default_disable ? |
397 | chip->disable : default_shutdown; | 411 | chip->irq_disable : default_shutdown; |
398 | if (!chip->end) | 412 | if (!chip->end) |
399 | chip->end = dummy_irq_chip.end; | 413 | chip->end = dummy_irq_chip.end; |
400 | 414 | ||
415 | /* | ||
416 | * Now fix up the remaining compat handlers | ||
417 | */ | ||
401 | if (chip->bus_lock) | 418 | if (chip->bus_lock) |
402 | chip->irq_bus_lock = compat_bus_lock; | 419 | chip->irq_bus_lock = compat_bus_lock; |
403 | if (chip->bus_sync_unlock) | 420 | if (chip->bus_sync_unlock) |
diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c index ac8c749dfee5..60e25c46eb55 100644 --- a/kernel/irq/handle.c +++ b/kernel/irq/handle.c | |||
@@ -327,8 +327,6 @@ struct irq_chip no_irq_chip = { | |||
327 | .irq_disable = noop, | 327 | .irq_disable = noop, |
328 | .irq_ack = ack_bad, | 328 | .irq_ack = ack_bad, |
329 | .startup = compat_noop_ret, | 329 | .startup = compat_noop_ret, |
330 | .shutdown = compat_noop, | ||
331 | .disable = compat_noop, | ||
332 | .end = compat_noop, | 330 | .end = compat_noop, |
333 | }; | 331 | }; |
334 | 332 | ||
@@ -346,8 +344,6 @@ struct irq_chip dummy_irq_chip = { | |||
346 | .irq_mask = noop, | 344 | .irq_mask = noop, |
347 | .irq_unmask = noop, | 345 | .irq_unmask = noop, |
348 | .startup = compat_noop_ret, | 346 | .startup = compat_noop_ret, |
349 | .shutdown = compat_noop, | ||
350 | .disable = compat_noop, | ||
351 | .end = compat_noop, | 347 | .end = compat_noop, |
352 | }; | 348 | }; |
353 | 349 | ||
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index b3986bce64ff..f3f36f6af9a1 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
@@ -223,7 +223,7 @@ void __disable_irq(struct irq_desc *desc, unsigned int irq, bool suspend) | |||
223 | 223 | ||
224 | if (!desc->depth++) { | 224 | if (!desc->depth++) { |
225 | desc->status |= IRQ_DISABLED; | 225 | desc->status |= IRQ_DISABLED; |
226 | desc->irq_data.chip->disable(irq); | 226 | desc->irq_data.chip->irq_disable(&desc->irq_data); |
227 | } | 227 | } |
228 | } | 228 | } |
229 | 229 | ||
@@ -919,10 +919,10 @@ static struct irqaction *__free_irq(unsigned int irq, void *dev_id) | |||
919 | /* If this was the last handler, shut down the IRQ line: */ | 919 | /* If this was the last handler, shut down the IRQ line: */ |
920 | if (!desc->action) { | 920 | if (!desc->action) { |
921 | desc->status |= IRQ_DISABLED; | 921 | desc->status |= IRQ_DISABLED; |
922 | if (desc->irq_data.chip->shutdown) | 922 | if (desc->irq_data.chip->irq_shutdown) |
923 | desc->irq_data.chip->shutdown(irq); | 923 | desc->irq_data.chip->irq_shutdown(&desc->irq_data); |
924 | else | 924 | else |
925 | desc->irq_data.chip->disable(irq); | 925 | desc->irq_data.chip->irq_disable(&desc->irq_data); |
926 | } | 926 | } |
927 | 927 | ||
928 | #ifdef CONFIG_SMP | 928 | #ifdef CONFIG_SMP |
diff --git a/kernel/irq/spurious.c b/kernel/irq/spurious.c index 36c2c9289e2b..9ee704d3a23c 100644 --- a/kernel/irq/spurious.c +++ b/kernel/irq/spurious.c | |||
@@ -254,7 +254,7 @@ void note_interrupt(unsigned int irq, struct irq_desc *desc, | |||
254 | printk(KERN_EMERG "Disabling IRQ #%d\n", irq); | 254 | printk(KERN_EMERG "Disabling IRQ #%d\n", irq); |
255 | desc->status |= IRQ_DISABLED | IRQ_SPURIOUS_DISABLED; | 255 | desc->status |= IRQ_DISABLED | IRQ_SPURIOUS_DISABLED; |
256 | desc->depth++; | 256 | desc->depth++; |
257 | desc->irq_data.chip->disable(irq); | 257 | desc->irq_data.chip->irq_disable(&desc->irq_data); |
258 | 258 | ||
259 | mod_timer(&poll_spurious_irq_timer, | 259 | mod_timer(&poll_spurious_irq_timer, |
260 | jiffies + POLL_SPURIOUS_IRQ_INTERVAL); | 260 | jiffies + POLL_SPURIOUS_IRQ_INTERVAL); |