• Krzysztof Kozlowski's avatar
    spi: spi-fsl-dspi: Fix external abort on interrupt in resume or exit paths · 3d87b613
    Krzysztof Kozlowski authored
    If shared interrupt comes late, during probe error path or device remove
    (could be triggered with CONFIG_DEBUG_SHIRQ), the interrupt handler
    dspi_interrupt() will access registers with the clock being disabled.
    This leads to external abort on non-linefetch on Toradex Colibri VF50
    module (with Vybrid VF5xx):
    
        $ echo 4002d000.spi > /sys/devices/platform/soc/40000000.bus/4002d000.spi/driver/unbind
    
        Unhandled fault: external abort on non-linefetch (0x1008) at 0x8887f02c
        Internal error: : 1008 [#1] ARM
        Hardware name: Freescale Vybrid VF5xx/VF6xx (Device Tree)
        Backtrace:
          (regmap_mmio_read32le)
          (regmap_mmio_read)
          (_regmap_bus_reg_read)
          (_regmap_read)
          (regmap_read)
          (dspi_interrupt)
          (free_irq)
          (devm_irq_release)
          (release_nodes)
          (devres_release_all)
          (device_release_driver_internal)
    
    The resource-managed framework should not be used for shared interrupt
    handling, because the interrupt handler might be called after releasing
    other resources and disabling clocks.
    
    Similar bug could happen during suspend - the shared interrupt handler
    could be invoked after suspending the device.  Each device sharing this
    interrupt line should disable the IRQ during suspend so handler will be
    invoked only in following cases:
    1. None suspended,
    2. All devices resumed.
    
    Fixes: 349ad66c ("spi:Add Freescale DSPI driver for Vybrid VF610 platform")
    Signed-off-by: default avatarKrzysztof Kozlowski <krzk@kernel.org>
    Tested-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Reviewed-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20200622110543.5035-3-krzk@kernel.orgSigned-off-by: default avatarMark Brown <broonie@kernel.org>
    3d87b613
spi-fsl-dspi.c 36.5 KB