€•uŒsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…””}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ'/translations/zh_CN/arch/arm/interrupts”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ'/translations/zh_TW/arch/arm/interrupts”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ'/translations/it_IT/arch/arm/interrupts”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ'/translations/ja_JP/arch/arm/interrupts”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ'/translations/ko_KR/arch/arm/interrupts”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒPortuguese (Brazilian)”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ'/translations/pt_BR/arch/arm/interrupts”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ'/translations/sp_SP/arch/arm/interrupts”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒ Interrupts”h]”hŒ Interrupts”…””}”(hh¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhh·h²hh³ŒA/var/lib/git/docbuild/linux/Documentation/arch/arm/interrupts.rst”h´KubhŒdefinition_list”“”)”}”(hhh]”hŒdefinition_list_item”“”)”}”(hŒ{2.5.2-rmk5: This is the first kernel that contains a major shake up of some of the major architecture-specific subsystems. ”h]”(hŒterm”“”)”}”(hŒ 2.5.2-rmk5:”h]”hŒ 2.5.2-rmk5:”…””}”(hhØh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´KhhÒubhŒ definition”“”)”}”(hhh]”hŒ paragraph”“”)”}”(hŒnThis is the first kernel that contains a major shake up of some of the major architecture-specific subsystems.”h]”hŒnThis is the first kernel that contains a major shake up of some of the major architecture-specific subsystems.”…””}”(hhíh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Khhèubah}”(h]”h ]”h"]”h$]”h&]”uh1hæhhÒubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÐh³hÊh´KhhÍubah}”(h]”h ]”h"]”h$]”h&]”uh1hËhh·h²hh³hÊh´Nubhì)”}”(hX”Firstly, it contains some pretty major changes to the way we handle the MMU TLB. Each MMU TLB variant is now handled completely separately - we have TLB v3, TLB v4 (without write buffer), TLB v4 (with write buffer), and finally TLB v4 (with write buffer, with I TLB invalidate entry). There is more assembly code inside each of these functions, mainly to allow more flexible TLB handling for the future.”h]”hX”Firstly, it contains some pretty major changes to the way we handle the MMU TLB. Each MMU TLB variant is now handled completely separately - we have TLB v3, TLB v4 (without write buffer), TLB v4 (with write buffer), and finally TLB v4 (with write buffer, with I TLB invalidate entry). There is more assembly code inside each of these functions, mainly to allow more flexible TLB handling for the future.”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K hh·h²hubhì)”}”(hŒSecondly, the IRQ subsystem.”h]”hŒSecondly, the IRQ subsystem.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Khh·h²hubhì)”}”(hŒúThe 2.5 kernels will be having major changes to the way IRQs are handled. Unfortunately, this means that machine types that touch the irq_desc[] array (basically all machine types) will break, and this means every machine type that we currently have.”h]”hŒúThe 2.5 kernels will be having major changes to the way IRQs are handled. Unfortunately, this means that machine types that touch the irq_desc[] array (basically all machine types) will break, and this means every machine type that we currently have.”…””}”(hj)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Khh·h²hubhì)”}”(hŒ>Lets take an example. On the Assabet with Neponset, we have::”h]”hŒ=Lets take an example. On the Assabet with Neponset, we have:”…””}”(hj7h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Khh·h²hubhŒ literal_block”“”)”}”(hX  GPIO25 IRR:2 SA1100 ------------> Neponset -----------> SA1111 IIR:1 -----------> USAR IIR:0 -----------> SMC9196”h]”hX  GPIO25 IRR:2 SA1100 ------------> Neponset -----------> SA1111 IIR:1 -----------> USAR IIR:0 -----------> SMC9196”…””}”hjGsbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1jEh³hÊh´Khh·h²hubhì)”}”(hX'The way stuff currently works, all SA1111 interrupts are mutually exclusive of each other - if you're processing one interrupt from the SA1111 and another comes in, you have to wait for that interrupt to finish processing before you can service the new interrupt. Eg, an IDE PIO-based interrupt on the SA1111 excludes all other SA1111 and SMC9196 interrupts until it has finished transferring its multi-sector data, which can be a long time. Note also that since we loop in the SA1111 IRQ handler, SA1111 IRQs can hold off SMC9196 IRQs indefinitely.”h]”hX)The way stuff currently works, all SA1111 interrupts are mutually exclusive of each other - if you’re processing one interrupt from the SA1111 and another comes in, you have to wait for that interrupt to finish processing before you can service the new interrupt. Eg, an IDE PIO-based interrupt on the SA1111 excludes all other SA1111 and SMC9196 interrupts until it has finished transferring its multi-sector data, which can be a long time. Note also that since we loop in the SA1111 IRQ handler, SA1111 IRQs can hold off SMC9196 IRQs indefinitely.”…””}”(hjWh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K hh·h²hubhì)”}”(hŒ,The new approach brings several new ideas...”h]”hŒ,The new approach brings several new ideas...”…””}”(hjeh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K*hh·h²hubhì)”}”(hŒ¦We introduce the concept of a "parent" and a "child". For example, to the Neponset handler, the "parent" is GPIO25, and the "children"d are SA1111, SMC9196 and USAR.”h]”hŒ¶We introduce the concept of a “parent†and a “childâ€. For example, to the Neponset handler, the “parent†is GPIO25, and the “childrenâ€d are SA1111, SMC9196 and USAR.”…””}”(hjsh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K,hh·h²hubhì)”}”(hXWe also bring the idea of an IRQ "chip" (mainly to reduce the size of the irqdesc array). This doesn't have to be a real "IC"; indeed the SA11x0 IRQs are handled by two separate "chip" structures, one for GPIO0-10, and another for all the rest. It is just a container for the various operations (maybe this'll change to a better name). This structure has the following operations::”h]”hXŽWe also bring the idea of an IRQ “chip†(mainly to reduce the size of the irqdesc array). This doesn’t have to be a real “ICâ€; indeed the SA11x0 IRQs are handled by two separate “chip†structures, one for GPIO0-10, and another for all the rest. It is just a container for the various operations (maybe this’ll change to a better name). This structure has the following operations:”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K0hh·h²hubjF)”}”(hXnstruct irqchip { /* * Acknowledge the IRQ. * If this is a level-based IRQ, then it is expected to mask the IRQ * as well. */ void (*ack)(unsigned int irq); /* * Mask the IRQ in hardware. */ void (*mask)(unsigned int irq); /* * Unmask the IRQ in hardware. */ void (*unmask)(unsigned int irq); /* * Re-run the IRQ */ void (*rerun)(unsigned int irq); /* * Set the type of the IRQ. */ int (*type)(unsigned int irq, unsigned int, type); };”h]”hXnstruct irqchip { /* * Acknowledge the IRQ. * If this is a level-based IRQ, then it is expected to mask the IRQ * as well. */ void (*ack)(unsigned int irq); /* * Mask the IRQ in hardware. */ void (*mask)(unsigned int irq); /* * Unmask the IRQ in hardware. */ void (*unmask)(unsigned int irq); /* * Re-run the IRQ */ void (*rerun)(unsigned int irq); /* * Set the type of the IRQ. */ int (*type)(unsigned int irq, unsigned int, type); };”…””}”hjsbah}”(h]”h ]”h"]”h$]”h&]”jUjVuh1jEh³hÊh´K7hh·h²hubhÌ)”}”(hhh]”(hÑ)”}”(hŒUack - required. May be the same function as mask for IRQs handled by do_level_IRQ.”h]”(h×)”}”(hŒack”h]”hŒack”…””}”(hj¤h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´KQhj ubhç)”}”(hhh]”hŒ bullet_list”“”)”}”(hhh]”hŒ list_item”“”)”}”(hŒMrequired. May be the same function as mask for IRQs handled by do_level_IRQ.”h]”hì)”}”(hŒMrequired. May be the same function as mask for IRQs handled by do_level_IRQ.”h]”hŒMrequired. May be the same function as mask for IRQs handled by do_level_IRQ.”…””}”(hjÀh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KQhj¼ubah}”(h]”h ]”h"]”h$]”h&]”uh1jºhj·ubah}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1jµh³hÊh´KQhj²ubah}”(h]”h ]”h"]”h$]”h&]”uh1hæhj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÐh³hÊh´KQhjubhÑ)”}”(hŒmask - required.”h]”(h×)”}”(hŒmask”h]”hŒmask”…””}”(hjìh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´KShjèubhç)”}”(hhh]”j¶)”}”(hhh]”j»)”}”(hŒ required.”h]”hì)”}”(hjh]”hŒ required.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KThjubah}”(h]”h ]”h"]”h$]”h&]”uh1jºhjýubah}”(h]”h ]”h"]”h$]”h&]”jÚjÛuh1jµh³hÊh´KThjúubah}”(h]”h ]”h"]”h$]”h&]”uh1hæhjèubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÐh³hÊh´KShjh²hubhÑ)”}”(hŒunmask - required.”h]”(h×)”}”(hŒunmask”h]”hŒunmask”…””}”(hj-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´KUhj)ubhç)”}”(hhh]”j¶)”}”(hhh]”j»)”}”(hŒ required.”h]”hì)”}”(hjCh]”hŒ required.”…””}”(hjEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KVhjAubah}”(h]”h ]”h"]”h$]”h&]”uh1jºhj>ubah}”(h]”h ]”h"]”h$]”h&]”jÚjÛuh1jµh³hÊh´KVhj;ubah}”(h]”h ]”h"]”h$]”h&]”uh1hæhj)ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÐh³hÊh´KUhjh²hubhÑ)”}”(hŒÐrerun - optional. Not required if you're using do_level_IRQ for all IRQs that use this 'irqchip'. Generally expected to re-trigger the hardware IRQ if possible. If not, may call the handler directly.”h]”(h×)”}”(hŒrerun”h]”hŒrerun”…””}”(hjnh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´KZhjjubhç)”}”(hhh]”j¶)”}”(hhh]”j»)”}”(hŒÂoptional. Not required if you're using do_level_IRQ for all IRQs that use this 'irqchip'. Generally expected to re-trigger the hardware IRQ if possible. If not, may call the handler directly.”h]”hì)”}”(hŒÂoptional. Not required if you're using do_level_IRQ for all IRQs that use this 'irqchip'. Generally expected to re-trigger the hardware IRQ if possible. If not, may call the handler directly.”h]”hŒÈoptional. Not required if you’re using do_level_IRQ for all IRQs that use this ‘irqchip’. Generally expected to re-trigger the hardware IRQ if possible. If not, may call the handler directly.”…””}”(hj†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KXhj‚ubah}”(h]”h ]”h"]”h$]”h&]”uh1jºhjubah}”(h]”h ]”h"]”h$]”h&]”jÚjÛuh1jµh³hÊh´KXhj|ubah}”(h]”h ]”h"]”h$]”h&]”uh1hæhjjubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÐh³hÊh´KZhjh²hubhÑ)”}”(hŒ—type - optional. If you don't support changing the type of an IRQ, it should be null so people can detect if they are unable to set the IRQ type. ”h]”(h×)”}”(hŒtype”h]”hŒtype”…””}”(hj°h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´K_hj¬ubhç)”}”(hhh]”j¶)”}”(hhh]”j»)”}”(hŒŒoptional. If you don't support changing the type of an IRQ, it should be null so people can detect if they are unable to set the IRQ type. ”h]”hì)”}”(hŒ‹optional. If you don't support changing the type of an IRQ, it should be null so people can detect if they are unable to set the IRQ type.”h]”hŒoptional. If you don’t support changing the type of an IRQ, it should be null so people can detect if they are unable to set the IRQ type.”…””}”(hjÈh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K]hjÄubah}”(h]”h ]”h"]”h$]”h&]”uh1jºhjÁubah}”(h]”h ]”h"]”h$]”h&]”jÚjÛuh1jµh³hÊh´K]hj¾ubah}”(h]”h ]”h"]”h$]”h&]”uh1hæhj¬ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÐh³hÊh´K_hjh²hubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËhh·h²hh³Nh´Nubhì)”}”(hŒ0For each IRQ, we keep the following information:”h]”hŒ0For each IRQ, we keep the following information:”…””}”(hjôh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Kahh·h²hubhŒ block_quote”“”)”}”(hŒû- "disable" depth (number of disable_irq()s without enable_irq()s) - flags indicating what we can do with this IRQ (valid, probe, noautounmask) as before - status of the IRQ (probing, enable, etc) - chip - per-IRQ handler - irqaction structure list ”h]”j¶)”}”(hhh]”(j»)”}”(hŒ@"disable" depth (number of disable_irq()s without enable_irq()s)”h]”hì)”}”(hj h]”hŒD“disable†depth (number of disable_irq()s without enable_irq()s)”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Kchj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jºhjubj»)”}”(hŒTflags indicating what we can do with this IRQ (valid, probe, noautounmask) as before”h]”hì)”}”(hŒTflags indicating what we can do with this IRQ (valid, probe, noautounmask) as before”h]”hŒTflags indicating what we can do with this IRQ (valid, probe, noautounmask) as before”…””}”(hj&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Kdhj"ubah}”(h]”h ]”h"]”h$]”h&]”uh1jºhjubj»)”}”(hŒ(status of the IRQ (probing, enable, etc)”h]”hì)”}”(hj<h]”hŒ(status of the IRQ (probing, enable, etc)”…””}”(hj>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Kfhj:ubah}”(h]”h ]”h"]”h$]”h&]”uh1jºhjubj»)”}”(hŒchip”h]”hì)”}”(hjSh]”hŒchip”…””}”(hjUh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KghjQubah}”(h]”h ]”h"]”h$]”h&]”uh1jºhjubj»)”}”(hŒper-IRQ handler”h]”hì)”}”(hjjh]”hŒper-IRQ handler”…””}”(hjlh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Khhjhubah}”(h]”h ]”h"]”h$]”h&]”uh1jºhjubj»)”}”(hŒirqaction structure list ”h]”hì)”}”(hŒirqaction structure list”h]”hŒirqaction structure list”…””}”(hjƒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Kihjubah}”(h]”h ]”h"]”h$]”h&]”uh1jºhjubeh}”(h]”h ]”h"]”h$]”h&]”jÚjÛuh1jµh³hÊh´Kchjubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÊh´Kchh·h²hubhì)”}”(hŒ“The handler can be one of the 3 standard handlers - "level", "edge" and "simple", or your own specific handler if you need to do something special.”h]”hŒŸThe handler can be one of the 3 standard handlers - “levelâ€, “edge†and “simpleâ€, or your own specific handler if you need to do something special.”…””}”(hj£h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Kkhh·h²hubhì)”}”(hXºThe "level" handler is what we currently have - its pretty simple. "edge" knows about the brokenness of such IRQ implementations - that you need to leave the hardware IRQ enabled while processing it, and queueing further IRQ events should the IRQ happen again while processing. The "simple" handler is very basic, and does not perform any hardware manipulation, nor state tracking. This is useful for things like the SMC9196 and USAR above.”h]”hXÆThe “level†handler is what we currently have - its pretty simple. “edge†knows about the brokenness of such IRQ implementations - that you need to leave the hardware IRQ enabled while processing it, and queueing further IRQ events should the IRQ happen again while processing. The “simple†handler is very basic, and does not perform any hardware manipulation, nor state tracking. This is useful for things like the SMC9196 and USAR above.”…””}”(hj±h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Knhh·h²hubh¶)”}”(hhh]”(h»)”}”(hŒSo, what's changed?”h]”hŒSo, what’s changed?”…””}”(hjÂh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj¿h²hh³hÊh´KwubhŒenumerated_list”“”)”}”(hhh]”(j»)”}”(hŒ=Machine implementations must not write to the irqdesc array. ”h]”hì)”}”(hŒ ”h]”(hì)”}”(hŒëNew functions to manipulate the irqdesc array. The first 4 are expected to be useful only to machine specific code. The last is recommended to only be used by machine specific code, but may be used in drivers if absolutely necessary.”h]”hŒëNew functions to manipulate the irqdesc array. The first 4 are expected to be useful only to machine specific code. The last is recommended to only be used by machine specific code, but may be used in drivers if absolutely necessary.”…””}”(hjñh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K{hjíubj)”}”(hX€set_irq_chip(irq,chip) Set the mask/unmask methods for handling this IRQ set_irq_handler(irq,handler) Set the handler for this IRQ (level, edge, simple) set_irq_chained_handler(irq,handler) Set a "chained" handler for this IRQ - automatically enables this IRQ (eg, Neponset and SA1111 handlers). set_irq_flags(irq,flags) Set the valid/probe/noautoenable flags. set_irq_type(irq,type) Set active the IRQ edge(s)/level. This replaces the SA1111 INTPOL manipulation, and the set_GPIO_IRQ_edge() function. Type should be one of IRQ_TYPE_xxx defined in ”h]”hÌ)”}”(hhh]”(hÑ)”}”(hŒIset_irq_chip(irq,chip) Set the mask/unmask methods for handling this IRQ ”h]”(h×)”}”(hŒset_irq_chip(irq,chip)”h]”hŒset_irq_chip(irq,chip)”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Khjubhç)”}”(hhh]”hì)”}”(hŒ1Set the mask/unmask methods for handling this IRQ”h]”hŒ1Set the mask/unmask methods for handling this IRQ”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Khjubah}”(h]”h ]”h"]”h$]”h&]”uh1hæhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÐh³hÊh´KhjubhÑ)”}”(hŒPset_irq_handler(irq,handler) Set the handler for this IRQ (level, edge, simple) ”h]”(h×)”}”(hŒset_irq_handler(irq,handler)”h]”hŒset_irq_handler(irq,handler)”…””}”(hj9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´K„hj5ubhç)”}”(hhh]”hì)”}”(hŒ2Set the handler for this IRQ (level, edge, simple)”h]”hŒ2Set the handler for this IRQ (level, edge, simple)”…””}”(hjJh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K„hjGubah}”(h]”h ]”h"]”h$]”h&]”uh1hæhj5ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÐh³hÊh´K„hjubhÑ)”}”(hŒset_irq_chained_handler(irq,handler) Set a "chained" handler for this IRQ - automatically enables this IRQ (eg, Neponset and SA1111 handlers). ”h]”(h×)”}”(hŒ$set_irq_chained_handler(irq,handler)”h]”hŒ$set_irq_chained_handler(irq,handler)”…””}”(hjhh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´Kˆhjdubhç)”}”(hhh]”hì)”}”(hŒiSet a "chained" handler for this IRQ - automatically enables this IRQ (eg, Neponset and SA1111 handlers).”h]”hŒmSet a “chained†handler for this IRQ - automatically enables this IRQ (eg, Neponset and SA1111 handlers).”…””}”(hjyh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K‡hjvubah}”(h]”h ]”h"]”h$]”h&]”uh1hæhjdubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÐh³hÊh´KˆhjubhÑ)”}”(hŒAset_irq_flags(irq,flags) Set the valid/probe/noautoenable flags. ”h]”(h×)”}”(hŒset_irq_flags(irq,flags)”h]”hŒset_irq_flags(irq,flags)”…””}”(hj—h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´K‹hj“ubhç)”}”(hhh]”hì)”}”(hŒ'Set the valid/probe/noautoenable flags.”h]”hŒ'Set the valid/probe/noautoenable flags.”…””}”(hj¨h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K‹hj¥ubah}”(h]”h ]”h"]”h$]”h&]”uh1hæhj“ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÐh³hÊh´K‹hjubhÑ)”}”(hŒËset_irq_type(irq,type) Set active the IRQ edge(s)/level. This replaces the SA1111 INTPOL manipulation, and the set_GPIO_IRQ_edge() function. Type should be one of IRQ_TYPE_xxx defined in ”h]”(h×)”}”(hŒset_irq_type(irq,type)”h]”hŒset_irq_type(irq,type)”…””}”(hjÆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÖh³hÊh´K‘hjÂubhç)”}”(hhh]”hì)”}”(hŒ³Set active the IRQ edge(s)/level. This replaces the SA1111 INTPOL manipulation, and the set_GPIO_IRQ_edge() function. Type should be one of IRQ_TYPE_xxx defined in ”h]”hŒ³Set active the IRQ edge(s)/level. This replaces the SA1111 INTPOL manipulation, and the set_GPIO_IRQ_edge() function. Type should be one of IRQ_TYPE_xxx defined in ”…””}”(hj×h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KŽhjÔubah}”(h]”h ]”h"]”h$]”h&]”uh1hæhjÂubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÐh³hÊh´K‘hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËhjÿubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÊh´K€hjíubeh}”(h]”h ]”h"]”h$]”h&]”uh1jºhjÒh²hh³hÊh´Nubj»)”}”(hŒIset_GPIO_IRQ_edge() is obsolete, and should be replaced by set_irq_type. ”h]”hì)”}”(hŒHset_GPIO_IRQ_edge() is obsolete, and should be replaced by set_irq_type.”h]”hŒHset_GPIO_IRQ_edge() is obsolete, and should be replaced by set_irq_type.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K“hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jºhjÒh²hh³hÊh´Nubj»)”}”(hŒIDirect access to SA1111 INTPOL is deprecated. Use set_irq_type instead. ”h]”hì)”}”(hŒHDirect access to SA1111 INTPOL is deprecated. Use set_irq_type instead.”h]”hŒHDirect access to SA1111 INTPOL is deprecated. Use set_irq_type instead.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K•hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jºhjÒh²hh³hÊh´Nubj»)”}”(hXA handler is expected to perform any necessary acknowledgement of the parent IRQ via the correct chip specific function. For instance, if the SA1111 is directly connected to a SA1110 GPIO, then you should acknowledge the SA1110 IRQ each time you re-read the SA1111 IRQ status. ”h]”hì)”}”(hXA handler is expected to perform any necessary acknowledgement of the parent IRQ via the correct chip specific function. For instance, if the SA1111 is directly connected to a SA1110 GPIO, then you should acknowledge the SA1110 IRQ each time you re-read the SA1111 IRQ status.”h]”hXA handler is expected to perform any necessary acknowledgement of the parent IRQ via the correct chip specific function. For instance, if the SA1111 is directly connected to a SA1110 GPIO, then you should acknowledge the SA1110 IRQ each time you re-read the SA1111 IRQ status.”…””}”(hj7h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K—hj3ubah}”(h]”h ]”h"]”h$]”h&]”uh1jºhjÒh²hh³hÊh´Nubj»)”}”(hX®For any child which doesn't have its own IRQ enable/disable controls (eg, SMC9196), the handler must mask or acknowledge the parent IRQ while the child handler is called, and the child handler should be the "simple" handler (not "edge" nor "level"). After the handler completes, the parent IRQ should be unmasked, and the status of all children must be re-checked for pending events. (see the Neponset IRQ handler for details). ”h]”hì)”}”(hX­For any child which doesn't have its own IRQ enable/disable controls (eg, SMC9196), the handler must mask or acknowledge the parent IRQ while the child handler is called, and the child handler should be the "simple" handler (not "edge" nor "level"). After the handler completes, the parent IRQ should be unmasked, and the status of all children must be re-checked for pending events. (see the Neponset IRQ handler for details).”h]”hX»For any child which doesn’t have its own IRQ enable/disable controls (eg, SMC9196), the handler must mask or acknowledge the parent IRQ while the child handler is called, and the child handler should be the “simple†handler (not “edge†nor “levelâ€). After the handler completes, the parent IRQ should be unmasked, and the status of all children must be re-checked for pending events. (see the Neponset IRQ handler for details).”…””}”(hjOh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KœhjKubah}”(h]”h ]”h"]”h$]”h&]”uh1jºhjÒh²hh³hÊh´Nubj»)”}”(hŒ@fixup_irq() is gone, as is `arch/arm/mach-*/include/mach/irq.h` ”h]”hì)”}”(hŒ?fixup_irq() is gone, as is `arch/arm/mach-*/include/mach/irq.h`”h]”(hŒfixup_irq() is gone, as is ”…””}”(hjgh²hh³Nh´NubhŒtitle_reference”“”)”}”(hŒ$`arch/arm/mach-*/include/mach/irq.h`”h]”hŒ"arch/arm/mach-*/include/mach/irq.h”…””}”(hjqh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1johjgubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K¤hjcubah}”(h]”h ]”h"]”h$]”h&]”uh1jºhjÒh²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”Œenumtype”Œarabic”Œprefix”hŒsuffix”Œ.”uh1jÐhj¿h²hh³hÊh´Kyubhì)”}”(hXPlease note that this will not solve all problems - some of them are hardware based. Mixing level-based and edge-based IRQs on the same parent signal (eg neponset) is one such area where a software based solution can't provide the full answer to low IRQ latency.”h]”hX Please note that this will not solve all problems - some of them are hardware based. Mixing level-based and edge-based IRQs on the same parent signal (eg neponset) is one such area where a software based solution can’t provide the full answer to low IRQ latency.”…””}”(hj–h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K¦hj¿h²hubeh}”(h]”Œso-what-s-changed”ah ]”h"]”Œso, what's changed?”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kwubeh}”(h]”Œ interrupts”ah ]”h"]”Œ interrupts”ah$]”h&]”uh1hµhhh²hh³hÊh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÊuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)”}”(hºNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”j׌error_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÊŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(j±j®j©j¦uŒ nametypes”}”(j±‰j©‰uh}”(j®h·j¦j¿uŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.