• Barry Song's avatar
    irqchip: sirf: set IRQ_LEVEL status_flags · a87010ef
    Barry Song authored
    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: default avatarBarry Song <Baohua.Song@csr.com>
    Signed-off-by: default avatarHuayi Li <Huayi.Li@csr.com>
    Signed-off-by: default avatarOlof Johansson <olof@lixom.net>
    a87010ef
irq-sirfsoc.c 3.51 KB