diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/irq.h | 59 |
1 files changed, 55 insertions, 4 deletions
diff --git a/include/linux/irq.h b/include/linux/irq.h index 5d876c9b3a3d..b3741c83774c 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h | |||
| @@ -135,7 +135,7 @@ struct msi_desc; | |||
| 135 | * struct irq_data - per irq and irq chip data passed down to chip functions | 135 | * struct irq_data - per irq and irq chip data passed down to chip functions |
| 136 | * @irq: interrupt number | 136 | * @irq: interrupt number |
| 137 | * @node: node index useful for balancing | 137 | * @node: node index useful for balancing |
| 138 | * @state_use_accessor: status information for irq chip functions. | 138 | * @state_use_accessors: status information for irq chip functions. |
| 139 | * Use accessor functions to deal with it | 139 | * Use accessor functions to deal with it |
| 140 | * @chip: low level interrupt hardware access | 140 | * @chip: low level interrupt hardware access |
| 141 | * @handler_data: per-IRQ data for the irq_chip methods | 141 | * @handler_data: per-IRQ data for the irq_chip methods |
| @@ -174,6 +174,9 @@ struct irq_data { | |||
| 174 | * from suspend | 174 | * from suspend |
| 175 | * IRDQ_MOVE_PCNTXT - Interrupt can be moved in process | 175 | * IRDQ_MOVE_PCNTXT - Interrupt can be moved in process |
| 176 | * context | 176 | * context |
| 177 | * IRQD_IRQ_DISABLED - Disabled state of the interrupt | ||
| 178 | * IRQD_IRQ_MASKED - Masked state of the interrupt | ||
| 179 | * IRQD_IRQ_INPROGRESS - In progress state of the interrupt | ||
| 177 | */ | 180 | */ |
| 178 | enum { | 181 | enum { |
| 179 | IRQD_TRIGGER_MASK = 0xf, | 182 | IRQD_TRIGGER_MASK = 0xf, |
| @@ -184,6 +187,9 @@ enum { | |||
| 184 | IRQD_LEVEL = (1 << 13), | 187 | IRQD_LEVEL = (1 << 13), |
| 185 | IRQD_WAKEUP_STATE = (1 << 14), | 188 | IRQD_WAKEUP_STATE = (1 << 14), |
| 186 | IRQD_MOVE_PCNTXT = (1 << 15), | 189 | IRQD_MOVE_PCNTXT = (1 << 15), |
| 190 | IRQD_IRQ_DISABLED = (1 << 16), | ||
| 191 | IRQD_IRQ_MASKED = (1 << 17), | ||
| 192 | IRQD_IRQ_INPROGRESS = (1 << 18), | ||
| 187 | }; | 193 | }; |
| 188 | 194 | ||
| 189 | static inline bool irqd_is_setaffinity_pending(struct irq_data *d) | 195 | static inline bool irqd_is_setaffinity_pending(struct irq_data *d) |
| @@ -206,6 +212,11 @@ static inline bool irqd_affinity_was_set(struct irq_data *d) | |||
| 206 | return d->state_use_accessors & IRQD_AFFINITY_SET; | 212 | return d->state_use_accessors & IRQD_AFFINITY_SET; |
| 207 | } | 213 | } |
| 208 | 214 | ||
| 215 | static inline void irqd_mark_affinity_was_set(struct irq_data *d) | ||
| 216 | { | ||
| 217 | d->state_use_accessors |= IRQD_AFFINITY_SET; | ||
| 218 | } | ||
| 219 | |||
| 209 | static inline u32 irqd_get_trigger_type(struct irq_data *d) | 220 | static inline u32 irqd_get_trigger_type(struct irq_data *d) |
| 210 | { | 221 | { |
| 211 | return d->state_use_accessors & IRQD_TRIGGER_MASK; | 222 | return d->state_use_accessors & IRQD_TRIGGER_MASK; |
| @@ -235,6 +246,36 @@ static inline bool irqd_can_move_in_process_context(struct irq_data *d) | |||
| 235 | return d->state_use_accessors & IRQD_MOVE_PCNTXT; | 246 | return d->state_use_accessors & IRQD_MOVE_PCNTXT; |
| 236 | } | 247 | } |
| 237 | 248 | ||
| 249 | static inline bool irqd_irq_disabled(struct irq_data *d) | ||
| 250 | { | ||
| 251 | return d->state_use_accessors & IRQD_IRQ_DISABLED; | ||
| 252 | } | ||
| 253 | |||
| 254 | static inline bool irqd_irq_masked(struct irq_data *d) | ||
| 255 | { | ||
| 256 | return d->state_use_accessors & IRQD_IRQ_MASKED; | ||
| 257 | } | ||
| 258 | |||
| 259 | static inline bool irqd_irq_inprogress(struct irq_data *d) | ||
| 260 | { | ||
| 261 | return d->state_use_accessors & IRQD_IRQ_INPROGRESS; | ||
| 262 | } | ||
| 263 | |||
| 264 | /* | ||
| 265 | * Functions for chained handlers which can be enabled/disabled by the | ||
| 266 | * standard disable_irq/enable_irq calls. Must be called with | ||
| 267 | * irq_desc->lock held. | ||
| 268 | */ | ||
| 269 | static inline void irqd_set_chained_irq_inprogress(struct irq_data *d) | ||
| 270 | { | ||
| 271 | d->state_use_accessors |= IRQD_IRQ_INPROGRESS; | ||
| 272 | } | ||
| 273 | |||
| 274 | static inline void irqd_clr_chained_irq_inprogress(struct irq_data *d) | ||
| 275 | { | ||
| 276 | d->state_use_accessors &= ~IRQD_IRQ_INPROGRESS; | ||
| 277 | } | ||
| 278 | |||
| 238 | /** | 279 | /** |
| 239 | * struct irq_chip - hardware interrupt chip descriptor | 280 | * struct irq_chip - hardware interrupt chip descriptor |
| 240 | * | 281 | * |
| @@ -271,6 +312,8 @@ static inline bool irqd_can_move_in_process_context(struct irq_data *d) | |||
| 271 | * @irq_set_wake: enable/disable power-management wake-on of an IRQ | 312 | * @irq_set_wake: enable/disable power-management wake-on of an IRQ |
| 272 | * @irq_bus_lock: function to lock access to slow bus (i2c) chips | 313 | * @irq_bus_lock: function to lock access to slow bus (i2c) chips |
| 273 | * @irq_bus_sync_unlock:function to sync and unlock slow bus (i2c) chips | 314 | * @irq_bus_sync_unlock:function to sync and unlock slow bus (i2c) chips |
| 315 | * @irq_cpu_online: configure an interrupt source for a secondary CPU | ||
| 316 | * @irq_cpu_offline: un-configure an interrupt source for a secondary CPU | ||
| 274 | * @irq_print_chip: optional to print special chip info in show_interrupts | 317 | * @irq_print_chip: optional to print special chip info in show_interrupts |
| 275 | * @flags: chip specific flags | 318 | * @flags: chip specific flags |
| 276 | * | 319 | * |
| @@ -319,6 +362,9 @@ struct irq_chip { | |||
| 319 | void (*irq_bus_lock)(struct irq_data *data); | 362 | void (*irq_bus_lock)(struct irq_data *data); |
| 320 | void (*irq_bus_sync_unlock)(struct irq_data *data); | 363 | void (*irq_bus_sync_unlock)(struct irq_data *data); |
| 321 | 364 | ||
| 365 | void (*irq_cpu_online)(struct irq_data *data); | ||
| 366 | void (*irq_cpu_offline)(struct irq_data *data); | ||
| 367 | |||
| 322 | void (*irq_print_chip)(struct irq_data *data, struct seq_file *p); | 368 | void (*irq_print_chip)(struct irq_data *data, struct seq_file *p); |
| 323 | 369 | ||
| 324 | unsigned long flags; | 370 | unsigned long flags; |
| @@ -335,11 +381,14 @@ struct irq_chip { | |||
| 335 | * IRQCHIP_SET_TYPE_MASKED: Mask before calling chip.irq_set_type() | 381 | * IRQCHIP_SET_TYPE_MASKED: Mask before calling chip.irq_set_type() |
| 336 | * IRQCHIP_EOI_IF_HANDLED: Only issue irq_eoi() when irq was handled | 382 | * IRQCHIP_EOI_IF_HANDLED: Only issue irq_eoi() when irq was handled |
| 337 | * IRQCHIP_MASK_ON_SUSPEND: Mask non wake irqs in the suspend path | 383 | * IRQCHIP_MASK_ON_SUSPEND: Mask non wake irqs in the suspend path |
| 384 | * IRQCHIP_ONOFFLINE_ENABLED: Only call irq_on/off_line callbacks | ||
| 385 | * when irq enabled | ||
| 338 | */ | 386 | */ |
| 339 | enum { | 387 | enum { |
| 340 | IRQCHIP_SET_TYPE_MASKED = (1 << 0), | 388 | IRQCHIP_SET_TYPE_MASKED = (1 << 0), |
| 341 | IRQCHIP_EOI_IF_HANDLED = (1 << 1), | 389 | IRQCHIP_EOI_IF_HANDLED = (1 << 1), |
| 342 | IRQCHIP_MASK_ON_SUSPEND = (1 << 2), | 390 | IRQCHIP_MASK_ON_SUSPEND = (1 << 2), |
| 391 | IRQCHIP_ONOFFLINE_ENABLED = (1 << 3), | ||
| 343 | }; | 392 | }; |
| 344 | 393 | ||
| 345 | /* This include will go away once we isolated irq_desc usage to core code */ | 394 | /* This include will go away once we isolated irq_desc usage to core code */ |
| @@ -364,6 +413,10 @@ struct irqaction; | |||
| 364 | extern int setup_irq(unsigned int irq, struct irqaction *new); | 413 | extern int setup_irq(unsigned int irq, struct irqaction *new); |
| 365 | extern void remove_irq(unsigned int irq, struct irqaction *act); | 414 | extern void remove_irq(unsigned int irq, struct irqaction *act); |
| 366 | 415 | ||
| 416 | extern void irq_cpu_online(void); | ||
| 417 | extern void irq_cpu_offline(void); | ||
| 418 | extern int __irq_set_affinity_locked(struct irq_data *data, const struct cpumask *cpumask); | ||
| 419 | |||
| 367 | #ifdef CONFIG_GENERIC_HARDIRQS | 420 | #ifdef CONFIG_GENERIC_HARDIRQS |
| 368 | 421 | ||
| 369 | #if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_PENDING_IRQ) | 422 | #if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_PENDING_IRQ) |
| @@ -380,9 +433,6 @@ static inline void irq_move_masked_irq(struct irq_data *data) { } | |||
| 380 | 433 | ||
| 381 | extern int no_irq_affinity; | 434 | extern int no_irq_affinity; |
| 382 | 435 | ||
| 383 | /* Handle irq action chains: */ | ||
| 384 | extern irqreturn_t handle_IRQ_event(unsigned int irq, struct irqaction *action); | ||
| 385 | |||
| 386 | /* | 436 | /* |
| 387 | * Built-in IRQ handlers for various IRQ types, | 437 | * Built-in IRQ handlers for various IRQ types, |
| 388 | * callable via desc->handle_irq() | 438 | * callable via desc->handle_irq() |
| @@ -390,6 +440,7 @@ extern irqreturn_t handle_IRQ_event(unsigned int irq, struct irqaction *action); | |||
| 390 | extern void handle_level_irq(unsigned int irq, struct irq_desc *desc); | 440 | extern void handle_level_irq(unsigned int irq, struct irq_desc *desc); |
| 391 | extern void handle_fasteoi_irq(unsigned int irq, struct irq_desc *desc); | 441 | extern void handle_fasteoi_irq(unsigned int irq, struct irq_desc *desc); |
| 392 | extern void handle_edge_irq(unsigned int irq, struct irq_desc *desc); | 442 | extern void handle_edge_irq(unsigned int irq, struct irq_desc *desc); |
| 443 | extern void handle_edge_eoi_irq(unsigned int irq, struct irq_desc *desc); | ||
| 393 | extern void handle_simple_irq(unsigned int irq, struct irq_desc *desc); | 444 | extern void handle_simple_irq(unsigned int irq, struct irq_desc *desc); |
| 394 | extern void handle_percpu_irq(unsigned int irq, struct irq_desc *desc); | 445 | extern void handle_percpu_irq(unsigned int irq, struct irq_desc *desc); |
| 395 | extern void handle_bad_irq(unsigned int irq, struct irq_desc *desc); | 446 | extern void handle_bad_irq(unsigned int irq, struct irq_desc *desc); |
