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