• Grzegorz Jaszczyk's avatar
    irqchip/irq-pruss-intc: Add a PRUSS irqchip driver for PRUSS interrupts · 04e2d1e0
    Grzegorz Jaszczyk authored
    The Programmable Real-Time Unit Subsystem (PRUSS) contains a local
    interrupt controller (INTC) that can handle various system input events
    and post interrupts back to the device-level initiators. The INTC can
    support upto 64 input events with individual control configuration and
    hardware prioritization. These events are mapped onto 10 output interrupt
    lines through two levels of many-to-one mapping support. Different
    interrupt lines are routed to the individual PRU cores or to the host
    CPU, or to other devices on the SoC. Some of these events are sourced
    from peripherals or other sub-modules within that PRUSS, while a few
    others are sourced from SoC-level peripherals/devices.
    
    The PRUSS INTC platform driver manages this PRUSS interrupt controller
    and implements an irqchip driver to provide a Linux standard way for
    the PRU client users to enable/disable/ack/re-trigger a PRUSS system
    event. The system events to interrupt channels and output interrupts
    relies on the mapping configuration provided either through the PRU
    firmware blob (for interrupts routed to PRU cores) or via the PRU
    application's device tree node (for interrupt routed to the main CPU).
    In the first case the mappings will be programmed on PRU remoteproc
    driver demand (via irq_create_fwspec_mapping) during the boot of a PRU
    core and cleaned up after the PRU core is stopped.
    
    Reference counting is used to allow multiple system events to share a
    single channel and to allow multiple channels to share a single host
    event.
    
    The PRUSS INTC module is reference counted during the interrupt
    setup phase through the irqchip's irq_request_resources() and
    irq_release_resources() ops. This restricts the module from being
    removed as long as there are active interrupt users.
    
    The driver currently supports and can be built for OMAP architecture
    based AM335x, AM437x and AM57xx SoCs; Keystone2 architecture based
    66AK2G SoCs and Davinci architecture based OMAP-L13x/AM18x/DA850 SoCs.
    All of these SoCs support 64 system events, 10 interrupt channels and
    10 output interrupt lines per PRUSS INTC with a few SoC integration
    differences.
    
    NOTE:
    Each PRU-ICSS's INTC on AM57xx SoCs is preceded by a Crossbar that
    enables multiple external events to be routed to a specific number
    of input interrupt events. Any non-default external interrupt event
    directed towards PRUSS needs this crossbar to be setup properly.
    Co-developed-by: default avatarSuman Anna <s-anna@ti.com>
    Co-developed-by: default avatarAndrew F. Davis <afd@ti.com>
    Co-developed-by: default avatarRoger Quadros <rogerq@ti.com>
    Co-developed-by: default avatarDavid Lechner <david@lechnology.com>
    Signed-off-by: default avatarSuman Anna <s-anna@ti.com>
    Signed-off-by: default avatarAndrew F. Davis <afd@ti.com>
    Signed-off-by: default avatarRoger Quadros <rogerq@ti.com>
    Signed-off-by: default avatarDavid Lechner <david@lechnology.com>
    Signed-off-by: default avatarGrzegorz Jaszczyk <grzegorz.jaszczyk@linaro.org>
    Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
    04e2d1e0
irq-pruss-intc.c 15.9 KB