diff options
| -rw-r--r-- | include/linux/irq.h | 62 | ||||
| -rw-r--r-- | kernel/irq/chip.c | 8 |
2 files changed, 66 insertions, 4 deletions
diff --git a/include/linux/irq.h b/include/linux/irq.h index e7e7ac83edd8..bea40556c5a6 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h | |||
| @@ -85,6 +85,7 @@ typedef void (*irq_flow_handler_t)(unsigned int irq, | |||
| 85 | #endif | 85 | #endif |
| 86 | 86 | ||
| 87 | struct msi_desc; | 87 | struct msi_desc; |
| 88 | struct irq_2_iommu; | ||
| 88 | 89 | ||
| 89 | /** | 90 | /** |
| 90 | * struct irq_data - per irq and irq chip data passed down to chip functions | 91 | * struct irq_data - per irq and irq chip data passed down to chip functions |
| @@ -332,11 +333,64 @@ extern int set_irq_data(unsigned int irq, void *data); | |||
| 332 | extern int set_irq_chip_data(unsigned int irq, void *data); | 333 | extern int set_irq_chip_data(unsigned int irq, void *data); |
| 333 | extern int set_irq_type(unsigned int irq, unsigned int type); | 334 | extern int set_irq_type(unsigned int irq, unsigned int type); |
| 334 | extern int set_irq_msi(unsigned int irq, struct msi_desc *entry); | 335 | extern int set_irq_msi(unsigned int irq, struct msi_desc *entry); |
| 336 | extern struct irq_data *irq_get_irq_data(unsigned int irq); | ||
| 335 | 337 | ||
| 336 | #define get_irq_chip(irq) (irq_to_desc(irq)->irq_data.chip) | 338 | static inline struct irq_chip *get_irq_chip(unsigned int irq) |
| 337 | #define get_irq_chip_data(irq) (irq_to_desc(irq)->irq_data.chip_data) | 339 | { |
| 338 | #define get_irq_data(irq) (irq_to_desc(irq)->irq_data.handler_data) | 340 | struct irq_data *d = irq_get_irq_data(irq); |
| 339 | #define get_irq_msi(irq) (irq_to_desc(irq)->irq_data.msi_desc) | 341 | return d ? d->chip : NULL; |
| 342 | } | ||
| 343 | |||
| 344 | static inline struct irq_chip *irq_data_get_irq_chip(struct irq_data *d) | ||
| 345 | { | ||
| 346 | return d->chip; | ||
| 347 | } | ||
| 348 | |||
| 349 | static inline void *get_irq_chip_data(unsigned int irq) | ||
| 350 | { | ||
| 351 | struct irq_data *d = irq_get_irq_data(irq); | ||
| 352 | return d ? d->chip_data : NULL; | ||
| 353 | } | ||
| 354 | |||
| 355 | static inline void *irq_data_get_irq_chip_data(struct irq_data *d) | ||
| 356 | { | ||
| 357 | return d->chip_data; | ||
| 358 | } | ||
| 359 | |||
| 360 | static inline void *get_irq_data(unsigned int irq) | ||
| 361 | { | ||
| 362 | struct irq_data *d = irq_get_irq_data(irq); | ||
| 363 | return d ? d->handler_data : NULL; | ||
| 364 | } | ||
| 365 | |||
| 366 | static inline void *irq_data_get_irq_data(struct irq_data *d) | ||
| 367 | { | ||
| 368 | return d->handler_data; | ||
| 369 | } | ||
| 370 | |||
| 371 | static inline struct msi_desc *get_irq_msi(unsigned int irq) | ||
| 372 | { | ||
| 373 | struct irq_data *d = irq_get_irq_data(irq); | ||
| 374 | return d ? d->msi_desc : NULL; | ||
| 375 | } | ||
| 376 | |||
| 377 | static inline struct msi_desc *irq_data_get_msi(struct irq_data *d) | ||
| 378 | { | ||
| 379 | return d->msi_desc; | ||
| 380 | } | ||
| 381 | |||
| 382 | #ifdef CONFIG_INTR_REMAP | ||
| 383 | static inline struct irq_2_iommu *get_irq_iommu(unsigned int irq) | ||
| 384 | { | ||
| 385 | struct irq_data *d = irq_get_irq_data(irq); | ||
| 386 | return d ? d->irq_2_iommu : NULL; | ||
| 387 | } | ||
| 388 | |||
| 389 | static inline struct irq_2_iommu *irq_data_get_iommu(struct irq_data *d) | ||
| 390 | { | ||
| 391 | return d->irq_2_iommu; | ||
| 392 | } | ||
| 393 | #endif | ||
| 340 | 394 | ||
| 341 | #endif /* CONFIG_GENERIC_HARDIRQS */ | 395 | #endif /* CONFIG_GENERIC_HARDIRQS */ |
| 342 | 396 | ||
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index 2b1f6906b824..659be326c8e8 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c | |||
| @@ -256,6 +256,14 @@ int set_irq_chip_data(unsigned int irq, void *data) | |||
| 256 | } | 256 | } |
| 257 | EXPORT_SYMBOL(set_irq_chip_data); | 257 | EXPORT_SYMBOL(set_irq_chip_data); |
| 258 | 258 | ||
| 259 | struct irq_data *irq_get_irq_data(unsigned int irq) | ||
| 260 | { | ||
| 261 | struct irq_desc *desc = irq_to_desc(irq); | ||
| 262 | |||
| 263 | return desc ? &desc->irq_data : NULL; | ||
| 264 | } | ||
| 265 | EXPORT_SYMBOL_GPL(irq_get_irq_data); | ||
| 266 | |||
| 259 | /** | 267 | /** |
| 260 | * set_irq_nested_thread - Set/Reset the IRQ_NESTED_THREAD flag of an irq | 268 | * set_irq_nested_thread - Set/Reset the IRQ_NESTED_THREAD flag of an irq |
| 261 | * | 269 | * |
