Skip to content

Commit

Permalink
genirq: Provide compat handling for chip->disable()/shutdown()
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Thomas Gleixner committed Oct 4, 2010
1 parent c5f7563 commit bc310dd
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 22 deletions.
6 changes: 3 additions & 3 deletions kernel/irq/autoprobe.c
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ unsigned long probe_irq_on(void)
/* It triggered already - consider it spurious. */
if (!(status & IRQ_WAITING)) {
desc->status = status & ~IRQ_AUTODETECT;
desc->irq_data.chip->shutdown(i);
desc->irq_data.chip->irq_shutdown(&desc->irq_data);
} else
if (i < 32)
mask |= 1 << i;
Expand Down Expand Up @@ -137,7 +137,7 @@ unsigned int probe_irq_mask(unsigned long val)
mask |= 1 << i;

desc->status = status & ~IRQ_AUTODETECT;
desc->irq_data.chip->shutdown(i);
desc->irq_data.chip->irq_shutdown(&desc->irq_data);
}
raw_spin_unlock_irq(&desc->lock);
}
Expand Down Expand Up @@ -181,7 +181,7 @@ int probe_irq_off(unsigned long val)
nr_of_irqs++;
}
desc->status = status & ~IRQ_AUTODETECT;
desc->irq_data.chip->shutdown(i);
desc->irq_data.chip->irq_shutdown(&desc->irq_data);
}
raw_spin_unlock_irq(&desc->lock);
}
Expand Down
37 changes: 27 additions & 10 deletions kernel/irq/chip.c
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,7 @@ static void default_enable(struct irq_data *data)
/*
* default disable function
*/
static void default_disable(unsigned int irq)
static void default_disable(struct irq_data *data)
{
}

Expand All @@ -316,9 +316,9 @@ static unsigned int default_startup(unsigned int irq)
/*
* default shutdown function
*/
static void default_shutdown(unsigned int irq)
static void default_shutdown(struct irq_data *data)
{
struct irq_desc *desc = irq_to_desc(irq);
struct irq_desc *desc = irq_data_to_desc(data);

desc->irq_data.chip->irq_mask(&desc->irq_data);
desc->status |= IRQ_MASKED;
Expand Down Expand Up @@ -355,6 +355,16 @@ static void compat_irq_enable(struct irq_data *data)
data->chip->enable(data->irq);
}

static void compat_irq_disable(struct irq_data *data)
{
data->chip->disable(data->irq);
}

static void compat_irq_shutdown(struct irq_data *data)
{
data->chip->shutdown(data->irq);
}

static void compat_bus_lock(struct irq_data *data)
{
data->chip->bus_lock(data->irq);
Expand All @@ -376,28 +386,35 @@ void irq_chip_set_defaults(struct irq_chip *chip)
*/
if (chip->enable)
chip->irq_enable = compat_irq_enable;
if (chip->disable)
chip->irq_disable = compat_irq_disable;
if (chip->shutdown)
chip->irq_shutdown = compat_irq_shutdown;

/*
* The real defaults
*/
if (!chip->irq_enable)
chip->irq_enable = default_enable;
if (!chip->disable)
chip->disable = default_disable;
if (!chip->irq_disable)
chip->irq_disable = default_disable;
if (!chip->startup)
chip->startup = default_startup;
/*
* We use chip->disable, when the user provided its own. When
* we have default_disable set for chip->disable, then we need
* We use chip->irq_disable, when the user provided its own. When
* we have default_disable set for chip->irq_disable, then we need
* to use default_shutdown, otherwise the irq line is not
* disabled on free_irq():
*/
if (!chip->shutdown)
chip->shutdown = chip->disable != default_disable ?
chip->disable : default_shutdown;
if (!chip->irq_shutdown)
chip->irq_shutdown = chip->irq_disable != default_disable ?
chip->irq_disable : default_shutdown;
if (!chip->end)
chip->end = dummy_irq_chip.end;

/*
* Now fix up the remaining compat handlers
*/
if (chip->bus_lock)
chip->irq_bus_lock = compat_bus_lock;
if (chip->bus_sync_unlock)
Expand Down
4 changes: 0 additions & 4 deletions kernel/irq/handle.c
Original file line number Diff line number Diff line change
Expand Up @@ -327,8 +327,6 @@ struct irq_chip no_irq_chip = {
.irq_disable = noop,
.irq_ack = ack_bad,
.startup = compat_noop_ret,
.shutdown = compat_noop,
.disable = compat_noop,
.end = compat_noop,
};

Expand All @@ -346,8 +344,6 @@ struct irq_chip dummy_irq_chip = {
.irq_mask = noop,
.irq_unmask = noop,
.startup = compat_noop_ret,
.shutdown = compat_noop,
.disable = compat_noop,
.end = compat_noop,
};

Expand Down
8 changes: 4 additions & 4 deletions kernel/irq/manage.c
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@ void __disable_irq(struct irq_desc *desc, unsigned int irq, bool suspend)

if (!desc->depth++) {
desc->status |= IRQ_DISABLED;
desc->irq_data.chip->disable(irq);
desc->irq_data.chip->irq_disable(&desc->irq_data);
}
}

Expand Down Expand Up @@ -919,10 +919,10 @@ static struct irqaction *__free_irq(unsigned int irq, void *dev_id)
/* If this was the last handler, shut down the IRQ line: */
if (!desc->action) {
desc->status |= IRQ_DISABLED;
if (desc->irq_data.chip->shutdown)
desc->irq_data.chip->shutdown(irq);
if (desc->irq_data.chip->irq_shutdown)
desc->irq_data.chip->irq_shutdown(&desc->irq_data);
else
desc->irq_data.chip->disable(irq);
desc->irq_data.chip->irq_disable(&desc->irq_data);
}

#ifdef CONFIG_SMP
Expand Down
2 changes: 1 addition & 1 deletion kernel/irq/spurious.c
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,7 @@ void note_interrupt(unsigned int irq, struct irq_desc *desc,
printk(KERN_EMERG "Disabling IRQ #%d\n", irq);
desc->status |= IRQ_DISABLED | IRQ_SPURIOUS_DISABLED;
desc->depth++;
desc->irq_data.chip->disable(irq);
desc->irq_data.chip->irq_disable(&desc->irq_data);

mod_timer(&poll_spurious_irq_timer,
jiffies + POLL_SPURIOUS_IRQ_INTERVAL);
Expand Down

0 comments on commit bc310dd

Please sign in to comment.