diff options
author | Barry Song <21cnbao@gmail.com> | 2014-01-03 11:34:46 +0800 |
---|---|---|
committer | Olof Johansson <olof@lixom.net> | 2014-01-08 22:02:14 -0800 |
commit | a87010ef3261912999302b3d82bd2e155898f816 (patch) | |
tree | 9784c968e983c1ec3ed0b1e605d05ecfa5fe3f66 /drivers/dio | |
parent | b93a35b170f9ad599e852855224b74982de2bde1 (diff) | |
download | op-kernel-dev-a87010ef3261912999302b3d82bd2e155898f816.zip op-kernel-dev-a87010ef3261912999302b3d82bd2e155898f816.tar.gz |
irqchip: sirf: set IRQ_LEVEL status_flags
SiRF internal interrupts are using level trigger. we need to tell the irq
core this information. otherwise, we might get some problems as below
1. disable_irq(n)
here irq core will mark the disabled flag but still keep the irq enabled
due to involved lazy-disable
2. doing someting after disable_irq(n)
in step 2, if one interrupt n comes, irq core will mark it as pending and
mask the HW interrupt really. we name the coming interrupt as "X".
3. enable_irq(n)
this will unmask the interrupt, so the level-trigger HW interrupt will come
again, irq_handler will enter as "E1". after that, irq core will also check
whether irq n is pending, if yes, and pending interrupt is not level-trigger,
irq core will execute the pending irq_handler.
so if we don't set the IRQ_LEVEL flag here, irq core will execute pending
X again as "E2", but actually the pending interrupt has been handled by "E1".
that makes a level-trigger HW interrupt is executed twice.
here we fix the issue to avoid redundant interrupt overload.
Signed-off-by: Barry Song <Baohua.Song@csr.com>
Signed-off-by: Huayi Li <Huayi.Li@csr.com>
Signed-off-by: Olof Johansson <olof@lixom.net>
Diffstat (limited to 'drivers/dio')
0 files changed, 0 insertions, 0 deletions