| # Copyright (c) 2018 Foundries.io | 
 | # Copyright (c) 2020 ATL Electronics | 
 | # SPDX-License-Identifier: Apache-2.0 | 
 |  | 
 | description: | | 
 |   Cypress Interrupt Multiplex | 
 |  | 
 |   The PSoC-6 Cortex-M0+ NVIC can handle up to 32 interrupts. This means that | 
 |   user can select up to 32 interrupts sources from the 240 possible vectors | 
 |   to be processed in the Cortex-M0+ CPU. | 
 |  | 
 |   At CPU Sub System (CPUSS) there are 8 special registers (intmux[0~7]) to | 
 |   configure the 32 NVIC lines for Cortex-M0+ CPU. Each register handles up to | 
 |   4 interrupt sources by grouping intmux channels. These means that each byte | 
 |   from intmux[0~7] store a 'vector number' which selects the peripheral | 
 |   interrupt source in the multiplexer. The multiplexer is placed before | 
 |   Cortex-M0+ NVIC controller. Note that Cortex-M4 have all interrupt sources | 
 |   directly connected to NVIC and doesn't require any special configuration. | 
 |  | 
 |   On a general view, the below represents the Interrupt Multiplexer | 
 |   configuration and how the Cortex-M0+ NVIC sources are organized. Each | 
 |   channel chX represents a Cortex-M0+ NVIC line and it stores a vector number. | 
 |   The vector number selects the PSoC-6 peripheral interrupt source for the | 
 |   Cortex-M0+ NVIC controller line. | 
 |  | 
 |   intmux[0] = {ch03, ch02, ch01, ch00} | 
 |   intmux[1] = {ch07, ch06, ch05, ch04} | 
 |   ... | 
 |   intmux[7] = {ch31, ch30, ch29, ch28} | 
 |  | 
 |   In pratical terms, the Cortex-M0+ requires user to define all NVIC interrupt | 
 |   sources and the proper NVIC interrupt order. With that, the system configures | 
 |   the Cortex-M0+ Interrupt Multiplexer and interrupts can be processed. | 
 |   More information about it at PSoC-6 Architecture Technical Reference Manual, | 
 |   section CPU Sub System (CPUSS) Registers. | 
 |  | 
 |  | 
 |   The below fragment configure the GPIO Port 0 to generate an interrupt at | 
 |   Cortex-M0+ NVIC: | 
 |  | 
 |   At psoc6.dtsi file the gpio_prt0 peripheral had the interrupt source 2: | 
 |  | 
 |   gpio_prt0: gpio@40320100 { | 
 |     interrupts = <2 1>; | 
 |   }; | 
 |  | 
 |   In order to enable gpio_prt0 interrupt at Cortex-M0+ an interrupt parent | 
 |   must be defined at gpio_prt0 node selecting the Interrupt Multiplex Channel. | 
 |   This can be defined at <board>_m0.dts file: | 
 |  | 
 |   &gpio_prt0 { | 
 |     interrupt-parent = <&intmux_ch20>; | 
 |   }; | 
 |  | 
 |   The translation of these two definitions is: | 
 |          CH   REGS  INT NUM    CH   CH/REG | 
 |   intmux[20 mod 8] |= 0x02 << (20 mod 4); | 
 |  | 
 |   These results in Cortex-M0+ NVIC line 20 handling PSoC-6 interrupt source 2. | 
 |   The interrupt can be enabled/disable at NVIC at line 20 as usual. | 
 |  | 
 |   Notes: | 
 |   1) Multiple definitions will generate multiple interrutps | 
 |   2) The interrupt sources are shared between Cortex-M0+/M4. These means, can | 
 |      trigger action in parallel in both processors. | 
 |   3) User can change priority at Cortex-M0+ NVIC by changing interrupt channels | 
 |      at interrupt-parent properties. | 
 |   4) Only the peripherals used by Cortex-M0+ should be configured. | 
 |  | 
 | compatible: "cypress,psoc6-intmux" | 
 |  | 
 | include: base.yaml | 
 |  | 
 | properties: | 
 |   reg: | 
 |       required: true | 
 |  | 
 |   label: | 
 |       required: true |