Commit f8822657 authored by Thomas Gleixner's avatar Thomas Gleixner

genirq: Provide advanced irq chip functions

The low level irq chip functions want access to irq_desc->irq_data.
Provide new functions which hand down irq_data instead of the irq
number so these functions avoid to call irq_to_desc() which is a radix
tree lookup in case of sparse irq.

This provides all the old functions except one: end(). end() is a
relict of __do_IRQ() and will just go away with the __do_IRQ() code.

The replacement for set_affinity() has an extra argument "bool
force". The reason for this is to notify the low level code, that the
move has to be done right away and cannot be delayed until the next
interrupt happens. That's necessary to handle the irq fixup on cpu
unplug in the generic code.
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Cc: Peter Zijlstra <peterz@infradead.org>
LKML-Reference: <20100927121841.742126604@linutronix.de>
Reviewed-by: default avatarH. Peter Anvin <hpa@zytor.com>
Reviewed-by: default avatarIngo Molnar <mingo@elte.hu>
parent 6b8ff312
...@@ -118,23 +118,38 @@ struct irq_data { ...@@ -118,23 +118,38 @@ struct irq_data {
* struct irq_chip - hardware interrupt chip descriptor * struct irq_chip - hardware interrupt chip descriptor
* *
* @name: name for /proc/interrupts * @name: name for /proc/interrupts
* @startup: start up the interrupt (defaults to ->enable if NULL) * @startup: deprecated, replaced by irq_startup
* @shutdown: shut down the interrupt (defaults to ->disable if NULL) * @shutdown: deprecated, replaced by irq_shutdown
* @enable: enable the interrupt (defaults to chip->unmask if NULL) * @enable: deprecated, replaced by irq_enable
* @disable: disable the interrupt * @disable: deprecated, replaced by irq_disable
* @ack: start of a new interrupt * @ack: deprecated, replaced by irq_ack
* @mask: mask an interrupt source * @mask: deprecated, replaced by irq_mask
* @mask_ack: ack and mask an interrupt source * @mask_ack: deprecated, replaced by irq_mask_ack
* @unmask: unmask an interrupt source * @unmask: deprecated, replaced by irq_unmask
* @eoi: end of interrupt - chip level * @eoi: deprecated, replaced by irq_eoi
* @end: end of interrupt - flow level * @end: deprecated, will go away with __do_IRQ()
* @set_affinity: set the CPU affinity on SMP machines * @set_affinity: deprecated, replaced by irq_set_affinity
* @retrigger: resend an IRQ to the CPU * @retrigger: deprecated, replaced by irq_retrigger
* @set_type: set the flow type (IRQ_TYPE_LEVEL/etc.) of an IRQ * @set_type: deprecated, replaced by irq_set_type
* @set_wake: enable/disable power-management wake-on of an IRQ * @set_wake: deprecated, replaced by irq_wake
* @bus_lock: deprecated, replaced by irq_bus_lock
* @bus_sync_unlock: deprecated, replaced by irq_bus_sync_unlock
* *
* @bus_lock: function to lock access to slow bus (i2c) chips * @irq_startup: start up the interrupt (defaults to ->enable if NULL)
* @bus_sync_unlock: function to sync and unlock slow bus (i2c) chips * @irq_shutdown: shut down the interrupt (defaults to ->disable if NULL)
* @irq_enable: enable the interrupt (defaults to chip->unmask if NULL)
* @irq_disable: disable the interrupt
* @irq_ack: start of a new interrupt
* @irq_mask: mask an interrupt source
* @irq_mask_ack: ack and mask an interrupt source
* @irq_unmask: unmask an interrupt source
* @irq_eoi: end of interrupt
* @irq_set_affinity: set the CPU affinity on SMP machines
* @irq_retrigger: resend an IRQ to the CPU
* @irq_set_type: set the flow type (IRQ_TYPE_LEVEL/etc.) of an IRQ
* @irq_set_wake: enable/disable power-management wake-on of an IRQ
* @irq_bus_lock: function to lock access to slow bus (i2c) chips
* @irq_bus_sync_unlock:function to sync and unlock slow bus (i2c) chips
* *
* @release: release function solely used by UML * @release: release function solely used by UML
*/ */
...@@ -161,6 +176,25 @@ struct irq_chip { ...@@ -161,6 +176,25 @@ struct irq_chip {
void (*bus_lock)(unsigned int irq); void (*bus_lock)(unsigned int irq);
void (*bus_sync_unlock)(unsigned int irq); void (*bus_sync_unlock)(unsigned int irq);
unsigned int (*irq_startup)(struct irq_data *data);
void (*irq_shutdown)(struct irq_data *data);
void (*irq_enable)(struct irq_data *data);
void (*irq_disable)(struct irq_data *data);
void (*irq_ack)(struct irq_data *data);
void (*irq_mask)(struct irq_data *data);
void (*irq_mask_ack)(struct irq_data *data);
void (*irq_unmask)(struct irq_data *data);
void (*irq_eoi)(struct irq_data *data);
int (*irq_set_affinity)(struct irq_data *data, const struct cpumask *dest, bool force);
int (*irq_retrigger)(struct irq_data *data);
int (*irq_set_type)(struct irq_data *data, unsigned int flow_type);
int (*irq_set_wake)(struct irq_data *data, unsigned int on);
void (*irq_bus_lock)(struct irq_data *data);
void (*irq_bus_sync_unlock)(struct irq_data *data);
/* Currently used only by UML, might disappear one day.*/ /* Currently used only by UML, might disappear one day.*/
#ifdef CONFIG_IRQ_RELEASE_METHOD #ifdef CONFIG_IRQ_RELEASE_METHOD
void (*release)(unsigned int irq, void *dev_id); void (*release)(unsigned int irq, void *dev_id);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment