162306a36Sopenharmony_ci.. include:: <isonum.txt> 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci========================== 462306a36Sopenharmony_ciLinux generic IRQ handling 562306a36Sopenharmony_ci========================== 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci:Copyright: |copy| 2005-2010: Thomas Gleixner 862306a36Sopenharmony_ci:Copyright: |copy| 2005-2006: Ingo Molnar 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ciIntroduction 1162306a36Sopenharmony_ci============ 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ciThe generic interrupt handling layer is designed to provide a complete 1462306a36Sopenharmony_ciabstraction of interrupt handling for device drivers. It is able to 1562306a36Sopenharmony_cihandle all the different types of interrupt controller hardware. Device 1662306a36Sopenharmony_cidrivers use generic API functions to request, enable, disable and free 1762306a36Sopenharmony_ciinterrupts. The drivers do not have to know anything about interrupt 1862306a36Sopenharmony_cihardware details, so they can be used on different platforms without 1962306a36Sopenharmony_cicode changes. 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ciThis documentation is provided to developers who want to implement an 2262306a36Sopenharmony_ciinterrupt subsystem based for their architecture, with the help of the 2362306a36Sopenharmony_cigeneric IRQ handling layer. 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ciRationale 2662306a36Sopenharmony_ci========= 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ciThe original implementation of interrupt handling in Linux uses the 2962306a36Sopenharmony_ci__do_IRQ() super-handler, which is able to deal with every type of 3062306a36Sopenharmony_ciinterrupt logic. 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ciOriginally, Russell King identified different types of handlers to build 3362306a36Sopenharmony_cia quite universal set for the ARM interrupt handler implementation in 3462306a36Sopenharmony_ciLinux 2.5/2.6. He distinguished between: 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci- Level type 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci- Edge type 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci- Simple type 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ciDuring the implementation we identified another type: 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci- Fast EOI type 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ciIn the SMP world of the __do_IRQ() super-handler another type was 4762306a36Sopenharmony_ciidentified: 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci- Per CPU type 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ciThis split implementation of high-level IRQ handlers allows us to 5262306a36Sopenharmony_cioptimize the flow of the interrupt handling for each specific interrupt 5362306a36Sopenharmony_citype. This reduces complexity in that particular code path and allows 5462306a36Sopenharmony_cithe optimized handling of a given type. 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ciThe original general IRQ implementation used hw_interrupt_type 5762306a36Sopenharmony_cistructures and their ``->ack``, ``->end`` [etc.] callbacks to differentiate 5862306a36Sopenharmony_cithe flow control in the super-handler. This leads to a mix of flow logic 5962306a36Sopenharmony_ciand low-level hardware logic, and it also leads to unnecessary code 6062306a36Sopenharmony_ciduplication: for example in i386, there is an ``ioapic_level_irq`` and an 6162306a36Sopenharmony_ci``ioapic_edge_irq`` IRQ-type which share many of the low-level details but 6262306a36Sopenharmony_cihave different flow handling. 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ciA more natural abstraction is the clean separation of the 'irq flow' and 6562306a36Sopenharmony_cithe 'chip details'. 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ciAnalysing a couple of architecture's IRQ subsystem implementations 6862306a36Sopenharmony_cireveals that most of them can use a generic set of 'irq flow' methods 6962306a36Sopenharmony_ciand only need to add the chip-level specific code. The separation is 7062306a36Sopenharmony_cialso valuable for (sub)architectures which need specific quirks in the 7162306a36Sopenharmony_ciIRQ flow itself but not in the chip details - and thus provides a more 7262306a36Sopenharmony_citransparent IRQ subsystem design. 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ciEach interrupt descriptor is assigned its own high-level flow handler, 7562306a36Sopenharmony_ciwhich is normally one of the generic implementations. (This high-level 7662306a36Sopenharmony_ciflow handler implementation also makes it simple to provide 7762306a36Sopenharmony_cidemultiplexing handlers which can be found in embedded platforms on 7862306a36Sopenharmony_civarious architectures.) 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ciThe separation makes the generic interrupt handling layer more flexible 8162306a36Sopenharmony_ciand extensible. For example, an (sub)architecture can use a generic 8262306a36Sopenharmony_ciIRQ-flow implementation for 'level type' interrupts and add a 8362306a36Sopenharmony_ci(sub)architecture specific 'edge type' implementation. 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ciTo make the transition to the new model easier and prevent the breakage 8662306a36Sopenharmony_ciof existing implementations, the __do_IRQ() super-handler is still 8762306a36Sopenharmony_ciavailable. This leads to a kind of duality for the time being. Over time 8862306a36Sopenharmony_cithe new model should be used in more and more architectures, as it 8962306a36Sopenharmony_cienables smaller and cleaner IRQ subsystems. It's deprecated for three 9062306a36Sopenharmony_ciyears now and about to be removed. 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ciKnown Bugs And Assumptions 9362306a36Sopenharmony_ci========================== 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ciNone (knock on wood). 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ciAbstraction layers 9862306a36Sopenharmony_ci================== 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ciThere are three main levels of abstraction in the interrupt code: 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci1. High-level driver API 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci2. High-level IRQ flow handlers 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci3. Chip-level hardware encapsulation 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ciInterrupt control flow 10962306a36Sopenharmony_ci---------------------- 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ciEach interrupt is described by an interrupt descriptor structure 11262306a36Sopenharmony_ciirq_desc. The interrupt is referenced by an 'unsigned int' numeric 11362306a36Sopenharmony_civalue which selects the corresponding interrupt description structure in 11462306a36Sopenharmony_cithe descriptor structures array. The descriptor structure contains 11562306a36Sopenharmony_cistatus information and pointers to the interrupt flow method and the 11662306a36Sopenharmony_ciinterrupt chip structure which are assigned to this interrupt. 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ciWhenever an interrupt triggers, the low-level architecture code calls 11962306a36Sopenharmony_ciinto the generic interrupt code by calling desc->handle_irq(). This 12062306a36Sopenharmony_cihigh-level IRQ handling function only uses desc->irq_data.chip 12162306a36Sopenharmony_ciprimitives referenced by the assigned chip descriptor structure. 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ciHigh-level Driver API 12462306a36Sopenharmony_ci--------------------- 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ciThe high-level Driver API consists of following functions: 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci- request_irq() 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci- request_threaded_irq() 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci- free_irq() 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci- disable_irq() 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci- enable_irq() 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci- disable_irq_nosync() (SMP only) 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci- synchronize_irq() (SMP only) 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci- irq_set_irq_type() 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci- irq_set_irq_wake() 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci- irq_set_handler_data() 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ci- irq_set_chip() 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci- irq_set_chip_data() 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ciSee the autogenerated function documentation for details. 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ciHigh-level IRQ flow handlers 15562306a36Sopenharmony_ci---------------------------- 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_ciThe generic layer provides a set of pre-defined irq-flow methods: 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_ci- handle_level_irq() 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci- handle_edge_irq() 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci- handle_fasteoi_irq() 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_ci- handle_simple_irq() 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_ci- handle_percpu_irq() 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ci- handle_edge_eoi_irq() 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ci- handle_bad_irq() 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ciThe interrupt flow handlers (either pre-defined or architecture 17462306a36Sopenharmony_cispecific) are assigned to specific interrupts by the architecture either 17562306a36Sopenharmony_ciduring bootup or during device initialization. 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ciDefault flow implementations 17862306a36Sopenharmony_ci~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ciHelper functions 18162306a36Sopenharmony_ci^^^^^^^^^^^^^^^^ 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ciThe helper functions call the chip primitives and are used by the 18462306a36Sopenharmony_cidefault flow implementations. The following helper functions are 18562306a36Sopenharmony_ciimplemented (simplified excerpt):: 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ci default_enable(struct irq_data *data) 18862306a36Sopenharmony_ci { 18962306a36Sopenharmony_ci desc->irq_data.chip->irq_unmask(data); 19062306a36Sopenharmony_ci } 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_ci default_disable(struct irq_data *data) 19362306a36Sopenharmony_ci { 19462306a36Sopenharmony_ci if (!delay_disable(data)) 19562306a36Sopenharmony_ci desc->irq_data.chip->irq_mask(data); 19662306a36Sopenharmony_ci } 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_ci default_ack(struct irq_data *data) 19962306a36Sopenharmony_ci { 20062306a36Sopenharmony_ci chip->irq_ack(data); 20162306a36Sopenharmony_ci } 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ci default_mask_ack(struct irq_data *data) 20462306a36Sopenharmony_ci { 20562306a36Sopenharmony_ci if (chip->irq_mask_ack) { 20662306a36Sopenharmony_ci chip->irq_mask_ack(data); 20762306a36Sopenharmony_ci } else { 20862306a36Sopenharmony_ci chip->irq_mask(data); 20962306a36Sopenharmony_ci chip->irq_ack(data); 21062306a36Sopenharmony_ci } 21162306a36Sopenharmony_ci } 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_ci noop(struct irq_data *data)) 21462306a36Sopenharmony_ci { 21562306a36Sopenharmony_ci } 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_ciDefault flow handler implementations 22062306a36Sopenharmony_ci~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 22162306a36Sopenharmony_ci 22262306a36Sopenharmony_ciDefault Level IRQ flow handler 22362306a36Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_cihandle_level_irq provides a generic implementation for level-triggered 22662306a36Sopenharmony_ciinterrupts. 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_ciThe following control flow is implemented (simplified excerpt):: 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_ci desc->irq_data.chip->irq_mask_ack(); 23162306a36Sopenharmony_ci handle_irq_event(desc->action); 23262306a36Sopenharmony_ci desc->irq_data.chip->irq_unmask(); 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_ciDefault Fast EOI IRQ flow handler 23662306a36Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_cihandle_fasteoi_irq provides a generic implementation for interrupts, 23962306a36Sopenharmony_ciwhich only need an EOI at the end of the handler. 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_ciThe following control flow is implemented (simplified excerpt):: 24262306a36Sopenharmony_ci 24362306a36Sopenharmony_ci handle_irq_event(desc->action); 24462306a36Sopenharmony_ci desc->irq_data.chip->irq_eoi(); 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_ciDefault Edge IRQ flow handler 24862306a36Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 24962306a36Sopenharmony_ci 25062306a36Sopenharmony_cihandle_edge_irq provides a generic implementation for edge-triggered 25162306a36Sopenharmony_ciinterrupts. 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_ciThe following control flow is implemented (simplified excerpt):: 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_ci if (desc->status & running) { 25662306a36Sopenharmony_ci desc->irq_data.chip->irq_mask_ack(); 25762306a36Sopenharmony_ci desc->status |= pending | masked; 25862306a36Sopenharmony_ci return; 25962306a36Sopenharmony_ci } 26062306a36Sopenharmony_ci desc->irq_data.chip->irq_ack(); 26162306a36Sopenharmony_ci desc->status |= running; 26262306a36Sopenharmony_ci do { 26362306a36Sopenharmony_ci if (desc->status & masked) 26462306a36Sopenharmony_ci desc->irq_data.chip->irq_unmask(); 26562306a36Sopenharmony_ci desc->status &= ~pending; 26662306a36Sopenharmony_ci handle_irq_event(desc->action); 26762306a36Sopenharmony_ci } while (desc->status & pending); 26862306a36Sopenharmony_ci desc->status &= ~running; 26962306a36Sopenharmony_ci 27062306a36Sopenharmony_ci 27162306a36Sopenharmony_ciDefault simple IRQ flow handler 27262306a36Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 27362306a36Sopenharmony_ci 27462306a36Sopenharmony_cihandle_simple_irq provides a generic implementation for simple 27562306a36Sopenharmony_ciinterrupts. 27662306a36Sopenharmony_ci 27762306a36Sopenharmony_ci.. note:: 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_ci The simple flow handler does not call any handler/chip primitives. 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_ciThe following control flow is implemented (simplified excerpt):: 28262306a36Sopenharmony_ci 28362306a36Sopenharmony_ci handle_irq_event(desc->action); 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_ciDefault per CPU flow handler 28762306a36Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_cihandle_percpu_irq provides a generic implementation for per CPU 29062306a36Sopenharmony_ciinterrupts. 29162306a36Sopenharmony_ci 29262306a36Sopenharmony_ciPer CPU interrupts are only available on SMP and the handler provides a 29362306a36Sopenharmony_cisimplified version without locking. 29462306a36Sopenharmony_ci 29562306a36Sopenharmony_ciThe following control flow is implemented (simplified excerpt):: 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_ci if (desc->irq_data.chip->irq_ack) 29862306a36Sopenharmony_ci desc->irq_data.chip->irq_ack(); 29962306a36Sopenharmony_ci handle_irq_event(desc->action); 30062306a36Sopenharmony_ci if (desc->irq_data.chip->irq_eoi) 30162306a36Sopenharmony_ci desc->irq_data.chip->irq_eoi(); 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ciEOI Edge IRQ flow handler 30562306a36Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^ 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_cihandle_edge_eoi_irq provides an abnomination of the edge handler 30862306a36Sopenharmony_ciwhich is solely used to tame a badly wreckaged irq controller on 30962306a36Sopenharmony_cipowerpc/cell. 31062306a36Sopenharmony_ci 31162306a36Sopenharmony_ciBad IRQ flow handler 31262306a36Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^ 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_cihandle_bad_irq is used for spurious interrupts which have no real 31562306a36Sopenharmony_cihandler assigned.. 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_ciQuirks and optimizations 31862306a36Sopenharmony_ci~~~~~~~~~~~~~~~~~~~~~~~~ 31962306a36Sopenharmony_ci 32062306a36Sopenharmony_ciThe generic functions are intended for 'clean' architectures and chips, 32162306a36Sopenharmony_ciwhich have no platform-specific IRQ handling quirks. If an architecture 32262306a36Sopenharmony_cineeds to implement quirks on the 'flow' level then it can do so by 32362306a36Sopenharmony_cioverriding the high-level irq-flow handler. 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_ciDelayed interrupt disable 32662306a36Sopenharmony_ci~~~~~~~~~~~~~~~~~~~~~~~~~ 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_ciThis per interrupt selectable feature, which was introduced by Russell 32962306a36Sopenharmony_ciKing in the ARM interrupt implementation, does not mask an interrupt at 33062306a36Sopenharmony_cithe hardware level when disable_irq() is called. The interrupt is kept 33162306a36Sopenharmony_cienabled and is masked in the flow handler when an interrupt event 33262306a36Sopenharmony_cihappens. This prevents losing edge interrupts on hardware which does not 33362306a36Sopenharmony_cistore an edge interrupt event while the interrupt is disabled at the 33462306a36Sopenharmony_cihardware level. When an interrupt arrives while the IRQ_DISABLED flag 33562306a36Sopenharmony_ciis set, then the interrupt is masked at the hardware level and the 33662306a36Sopenharmony_ciIRQ_PENDING bit is set. When the interrupt is re-enabled by 33762306a36Sopenharmony_cienable_irq() the pending bit is checked and if it is set, the interrupt 33862306a36Sopenharmony_ciis resent either via hardware or by a software resend mechanism. (It's 33962306a36Sopenharmony_cinecessary to enable CONFIG_HARDIRQS_SW_RESEND when you want to use 34062306a36Sopenharmony_cithe delayed interrupt disable feature and your hardware is not capable 34162306a36Sopenharmony_ciof retriggering an interrupt.) The delayed interrupt disable is not 34262306a36Sopenharmony_ciconfigurable. 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ciChip-level hardware encapsulation 34562306a36Sopenharmony_ci--------------------------------- 34662306a36Sopenharmony_ci 34762306a36Sopenharmony_ciThe chip-level hardware descriptor structure :c:type:`irq_chip` contains all 34862306a36Sopenharmony_cithe direct chip relevant functions, which can be utilized by the irq flow 34962306a36Sopenharmony_ciimplementations. 35062306a36Sopenharmony_ci 35162306a36Sopenharmony_ci- ``irq_ack`` 35262306a36Sopenharmony_ci 35362306a36Sopenharmony_ci- ``irq_mask_ack`` - Optional, recommended for performance 35462306a36Sopenharmony_ci 35562306a36Sopenharmony_ci- ``irq_mask`` 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_ci- ``irq_unmask`` 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_ci- ``irq_eoi`` - Optional, required for EOI flow handlers 36062306a36Sopenharmony_ci 36162306a36Sopenharmony_ci- ``irq_retrigger`` - Optional 36262306a36Sopenharmony_ci 36362306a36Sopenharmony_ci- ``irq_set_type`` - Optional 36462306a36Sopenharmony_ci 36562306a36Sopenharmony_ci- ``irq_set_wake`` - Optional 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_ciThese primitives are strictly intended to mean what they say: ack means 36862306a36Sopenharmony_ciACK, masking means masking of an IRQ line, etc. It is up to the flow 36962306a36Sopenharmony_cihandler(s) to use these basic units of low-level functionality. 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_ci__do_IRQ entry point 37262306a36Sopenharmony_ci==================== 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_ciThe original implementation __do_IRQ() was an alternative entry point 37562306a36Sopenharmony_cifor all types of interrupts. It no longer exists. 37662306a36Sopenharmony_ci 37762306a36Sopenharmony_ciThis handler turned out to be not suitable for all interrupt hardware 37862306a36Sopenharmony_ciand was therefore reimplemented with split functionality for 37962306a36Sopenharmony_ciedge/level/simple/percpu interrupts. This is not only a functional 38062306a36Sopenharmony_cioptimization. It also shortens code paths for interrupts. 38162306a36Sopenharmony_ci 38262306a36Sopenharmony_ciLocking on SMP 38362306a36Sopenharmony_ci============== 38462306a36Sopenharmony_ci 38562306a36Sopenharmony_ciThe locking of chip registers is up to the architecture that defines the 38662306a36Sopenharmony_cichip primitives. The per-irq structure is protected via desc->lock, by 38762306a36Sopenharmony_cithe generic layer. 38862306a36Sopenharmony_ci 38962306a36Sopenharmony_ciGeneric interrupt chip 39062306a36Sopenharmony_ci====================== 39162306a36Sopenharmony_ci 39262306a36Sopenharmony_ciTo avoid copies of identical implementations of IRQ chips the core 39362306a36Sopenharmony_ciprovides a configurable generic interrupt chip implementation. 39462306a36Sopenharmony_ciDevelopers should check carefully whether the generic chip fits their 39562306a36Sopenharmony_cineeds before implementing the same functionality slightly differently 39662306a36Sopenharmony_cithemselves. 39762306a36Sopenharmony_ci 39862306a36Sopenharmony_ci.. kernel-doc:: kernel/irq/generic-chip.c 39962306a36Sopenharmony_ci :export: 40062306a36Sopenharmony_ci 40162306a36Sopenharmony_ciStructures 40262306a36Sopenharmony_ci========== 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_ciThis chapter contains the autogenerated documentation of the structures 40562306a36Sopenharmony_ciwhich are used in the generic IRQ layer. 40662306a36Sopenharmony_ci 40762306a36Sopenharmony_ci.. kernel-doc:: include/linux/irq.h 40862306a36Sopenharmony_ci :internal: 40962306a36Sopenharmony_ci 41062306a36Sopenharmony_ci.. kernel-doc:: include/linux/interrupt.h 41162306a36Sopenharmony_ci :internal: 41262306a36Sopenharmony_ci 41362306a36Sopenharmony_ciPublic Functions Provided 41462306a36Sopenharmony_ci========================= 41562306a36Sopenharmony_ci 41662306a36Sopenharmony_ciThis chapter contains the autogenerated documentation of the kernel API 41762306a36Sopenharmony_cifunctions which are exported. 41862306a36Sopenharmony_ci 41962306a36Sopenharmony_ci.. kernel-doc:: kernel/irq/manage.c 42062306a36Sopenharmony_ci 42162306a36Sopenharmony_ci.. kernel-doc:: kernel/irq/chip.c 42262306a36Sopenharmony_ci :export: 42362306a36Sopenharmony_ci 42462306a36Sopenharmony_ciInternal Functions Provided 42562306a36Sopenharmony_ci=========================== 42662306a36Sopenharmony_ci 42762306a36Sopenharmony_ciThis chapter contains the autogenerated documentation of the internal 42862306a36Sopenharmony_cifunctions. 42962306a36Sopenharmony_ci 43062306a36Sopenharmony_ci.. kernel-doc:: kernel/irq/irqdesc.c 43162306a36Sopenharmony_ci 43262306a36Sopenharmony_ci.. kernel-doc:: kernel/irq/handle.c 43362306a36Sopenharmony_ci 43462306a36Sopenharmony_ci.. kernel-doc:: kernel/irq/chip.c 43562306a36Sopenharmony_ci :internal: 43662306a36Sopenharmony_ci 43762306a36Sopenharmony_ciCredits 43862306a36Sopenharmony_ci======= 43962306a36Sopenharmony_ci 44062306a36Sopenharmony_ciThe following people have contributed to this document: 44162306a36Sopenharmony_ci 44262306a36Sopenharmony_ci1. Thomas Gleixner tglx@linutronix.de 44362306a36Sopenharmony_ci 44462306a36Sopenharmony_ci2. Ingo Molnar mingo@elte.hu 445