18c2ecf20Sopenharmony_ciBroadcom SPI controller 28c2ecf20Sopenharmony_ci 38c2ecf20Sopenharmony_ciThe Broadcom SPI controller is a SPI master found on various SOCs, including 48c2ecf20Sopenharmony_ciBRCMSTB (BCM7XXX), Cygnus, NSP and NS2. The Broadcom Master SPI hw IP consits 58c2ecf20Sopenharmony_ciof : 68c2ecf20Sopenharmony_ci MSPI : SPI master controller can read and write to a SPI slave device 78c2ecf20Sopenharmony_ci BSPI : Broadcom SPI in combination with the MSPI hw IP provides acceleration 88c2ecf20Sopenharmony_ci for flash reads and be configured to do single, double, quad lane 98c2ecf20Sopenharmony_ci io with 3-byte and 4-byte addressing support. 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci Supported Broadcom SoCs have one instance of MSPI+BSPI controller IP. 128c2ecf20Sopenharmony_ci MSPI master can be used wihout BSPI. BRCMSTB SoCs have an additional instance 138c2ecf20Sopenharmony_ci of a MSPI master without the BSPI to use with non flash slave devices that 148c2ecf20Sopenharmony_ci use SPI protocol. 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ciRequired properties: 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci- #address-cells: 198c2ecf20Sopenharmony_ci Must be <1>, as required by generic SPI binding. 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci- #size-cells: 228c2ecf20Sopenharmony_ci Must be <0>, also as required by generic SPI binding. 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci- compatible: 258c2ecf20Sopenharmony_ci Must be one of : 268c2ecf20Sopenharmony_ci "brcm,spi-brcmstb-qspi", "brcm,spi-bcm-qspi" : MSPI+BSPI on BRCMSTB SoCs 278c2ecf20Sopenharmony_ci "brcm,spi-brcmstb-mspi", "brcm,spi-bcm-qspi" : Second Instance of MSPI 288c2ecf20Sopenharmony_ci BRCMSTB SoCs 298c2ecf20Sopenharmony_ci "brcm,spi-bcm7425-qspi", "brcm,spi-bcm-qspi", "brcm,spi-brcmstb-mspi" : Second Instance of MSPI 308c2ecf20Sopenharmony_ci BRCMSTB SoCs 318c2ecf20Sopenharmony_ci "brcm,spi-bcm7429-qspi", "brcm,spi-bcm-qspi", "brcm,spi-brcmstb-mspi" : Second Instance of MSPI 328c2ecf20Sopenharmony_ci BRCMSTB SoCs 338c2ecf20Sopenharmony_ci "brcm,spi-bcm7435-qspi", "brcm,spi-bcm-qspi", "brcm,spi-brcmstb-mspi" : Second Instance of MSPI 348c2ecf20Sopenharmony_ci BRCMSTB SoCs 358c2ecf20Sopenharmony_ci "brcm,spi-bcm7445-qspi", "brcm,spi-bcm-qspi", "brcm,spi-brcmstb-mspi" : Second Instance of MSPI 368c2ecf20Sopenharmony_ci BRCMSTB SoCs 378c2ecf20Sopenharmony_ci "brcm,spi-bcm7216-qspi", "brcm,spi-bcm-qspi", "brcm,spi-brcmstb-mspi" : Second Instance of MSPI 388c2ecf20Sopenharmony_ci BRCMSTB SoCs 398c2ecf20Sopenharmony_ci "brcm,spi-bcm7278-qspi", "brcm,spi-bcm-qspi", "brcm,spi-brcmstb-mspi" : Second Instance of MSPI 408c2ecf20Sopenharmony_ci BRCMSTB SoCs 418c2ecf20Sopenharmony_ci "brcm,spi-nsp-qspi", "brcm,spi-bcm-qspi" : MSPI+BSPI on Cygnus, NSP 428c2ecf20Sopenharmony_ci "brcm,spi-ns2-qspi", "brcm,spi-bcm-qspi" : NS2 SoCs 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci- reg: 458c2ecf20Sopenharmony_ci Define the bases and ranges of the associated I/O address spaces. 468c2ecf20Sopenharmony_ci The required range is MSPI controller registers. 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci- reg-names: 498c2ecf20Sopenharmony_ci First name does not matter, but must be reserved for the MSPI controller 508c2ecf20Sopenharmony_ci register range as mentioned in 'reg' above, and will typically contain 518c2ecf20Sopenharmony_ci - "bspi_regs": BSPI register range, not required with compatible 528c2ecf20Sopenharmony_ci "spi-brcmstb-mspi" 538c2ecf20Sopenharmony_ci - "mspi_regs": MSPI register range is required for compatible strings 548c2ecf20Sopenharmony_ci - "intr_regs", "intr_status_reg" : Interrupt and status register for 558c2ecf20Sopenharmony_ci NSP, NS2, Cygnus SoC 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ci- interrupts 588c2ecf20Sopenharmony_ci The interrupts used by the MSPI and/or BSPI controller. 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_ci- interrupt-names: 618c2ecf20Sopenharmony_ci Names of interrupts associated with MSPI 628c2ecf20Sopenharmony_ci - "mspi_halted" : 638c2ecf20Sopenharmony_ci - "mspi_done": Indicates that the requested SPI operation is complete. 648c2ecf20Sopenharmony_ci - "spi_lr_fullness_reached" : Linear read BSPI pipe full 658c2ecf20Sopenharmony_ci - "spi_lr_session_aborted" : Linear read BSPI pipe aborted 668c2ecf20Sopenharmony_ci - "spi_lr_impatient" : Linear read BSPI requested when pipe empty 678c2ecf20Sopenharmony_ci - "spi_lr_session_done" : Linear read BSPI session done 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ci- clocks: 708c2ecf20Sopenharmony_ci A phandle to the reference clock for this block. 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_ciOptional properties: 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_ci 758c2ecf20Sopenharmony_ci- native-endian 768c2ecf20Sopenharmony_ci Defined when using BE SoC and device uses BE register read/write 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_ciRecommended optional m25p80 properties: 798c2ecf20Sopenharmony_ci- spi-rx-bus-width: Definition as per 808c2ecf20Sopenharmony_ci Documentation/devicetree/bindings/spi/spi-bus.txt 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_ciExamples: 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_ciBRCMSTB SoC Example: 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_ci SPI Master (MSPI+BSPI) for SPI-NOR access: 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_ci spi@f03e3400 { 898c2ecf20Sopenharmony_ci #address-cells = <0x1>; 908c2ecf20Sopenharmony_ci #size-cells = <0x0>; 918c2ecf20Sopenharmony_ci compatible = "brcm,spi-brcmstb-qspi", "brcm,spi-bcm-qspi"; 928c2ecf20Sopenharmony_ci reg = <0xf03e0920 0x4 0xf03e3400 0x188 0xf03e3200 0x50>; 938c2ecf20Sopenharmony_ci reg-names = "cs_reg", "mspi", "bspi"; 948c2ecf20Sopenharmony_ci interrupts = <0x6 0x5 0x4 0x3 0x2 0x1 0x0>; 958c2ecf20Sopenharmony_ci interrupt-parent = <0x1c>; 968c2ecf20Sopenharmony_ci interrupt-names = "mspi_halted", 978c2ecf20Sopenharmony_ci "mspi_done", 988c2ecf20Sopenharmony_ci "spi_lr_overread", 998c2ecf20Sopenharmony_ci "spi_lr_session_done", 1008c2ecf20Sopenharmony_ci "spi_lr_impatient", 1018c2ecf20Sopenharmony_ci "spi_lr_session_aborted", 1028c2ecf20Sopenharmony_ci "spi_lr_fullness_reached"; 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_ci clocks = <&hif_spi>; 1058c2ecf20Sopenharmony_ci clock-names = "sw_spi"; 1068c2ecf20Sopenharmony_ci 1078c2ecf20Sopenharmony_ci m25p80@0 { 1088c2ecf20Sopenharmony_ci #size-cells = <0x2>; 1098c2ecf20Sopenharmony_ci #address-cells = <0x2>; 1108c2ecf20Sopenharmony_ci compatible = "m25p80"; 1118c2ecf20Sopenharmony_ci reg = <0x0>; 1128c2ecf20Sopenharmony_ci spi-max-frequency = <0x2625a00>; 1138c2ecf20Sopenharmony_ci spi-cpol; 1148c2ecf20Sopenharmony_ci spi-cpha; 1158c2ecf20Sopenharmony_ci m25p,fast-read; 1168c2ecf20Sopenharmony_ci 1178c2ecf20Sopenharmony_ci flash0.bolt@0 { 1188c2ecf20Sopenharmony_ci reg = <0x0 0x0 0x0 0x100000>; 1198c2ecf20Sopenharmony_ci }; 1208c2ecf20Sopenharmony_ci 1218c2ecf20Sopenharmony_ci flash0.macadr@100000 { 1228c2ecf20Sopenharmony_ci reg = <0x0 0x100000 0x0 0x10000>; 1238c2ecf20Sopenharmony_ci }; 1248c2ecf20Sopenharmony_ci 1258c2ecf20Sopenharmony_ci flash0.nvram@110000 { 1268c2ecf20Sopenharmony_ci reg = <0x0 0x110000 0x0 0x10000>; 1278c2ecf20Sopenharmony_ci }; 1288c2ecf20Sopenharmony_ci 1298c2ecf20Sopenharmony_ci flash0.kernel@120000 { 1308c2ecf20Sopenharmony_ci reg = <0x0 0x120000 0x0 0x400000>; 1318c2ecf20Sopenharmony_ci }; 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_ci flash0.devtree@520000 { 1348c2ecf20Sopenharmony_ci reg = <0x0 0x520000 0x0 0x10000>; 1358c2ecf20Sopenharmony_ci }; 1368c2ecf20Sopenharmony_ci 1378c2ecf20Sopenharmony_ci flash0.splash@530000 { 1388c2ecf20Sopenharmony_ci reg = <0x0 0x530000 0x0 0x80000>; 1398c2ecf20Sopenharmony_ci }; 1408c2ecf20Sopenharmony_ci 1418c2ecf20Sopenharmony_ci flash0@0 { 1428c2ecf20Sopenharmony_ci reg = <0x0 0x0 0x0 0x4000000>; 1438c2ecf20Sopenharmony_ci }; 1448c2ecf20Sopenharmony_ci }; 1458c2ecf20Sopenharmony_ci }; 1468c2ecf20Sopenharmony_ci 1478c2ecf20Sopenharmony_ci 1488c2ecf20Sopenharmony_ci MSPI master for any SPI device : 1498c2ecf20Sopenharmony_ci 1508c2ecf20Sopenharmony_ci spi@f0416000 { 1518c2ecf20Sopenharmony_ci #address-cells = <1>; 1528c2ecf20Sopenharmony_ci #size-cells = <0>; 1538c2ecf20Sopenharmony_ci clocks = <&upg_fixed>; 1548c2ecf20Sopenharmony_ci compatible = "brcm,spi-brcmstb-mspi", "brcm,spi-bcm-qspi"; 1558c2ecf20Sopenharmony_ci reg = <0xf0416000 0x180>; 1568c2ecf20Sopenharmony_ci reg-names = "mspi"; 1578c2ecf20Sopenharmony_ci interrupts = <0x14>; 1588c2ecf20Sopenharmony_ci interrupt-parent = <&irq0_aon_intc>; 1598c2ecf20Sopenharmony_ci interrupt-names = "mspi_done"; 1608c2ecf20Sopenharmony_ci }; 1618c2ecf20Sopenharmony_ci 1628c2ecf20Sopenharmony_ciiProc SoC Example: 1638c2ecf20Sopenharmony_ci 1648c2ecf20Sopenharmony_ci qspi: spi@18027200 { 1658c2ecf20Sopenharmony_ci compatible = "brcm,spi-nsp-qspi", "brcm,spi-bcm-qspi"; 1668c2ecf20Sopenharmony_ci reg = <0x18027200 0x184>, 1678c2ecf20Sopenharmony_ci <0x18027000 0x124>, 1688c2ecf20Sopenharmony_ci <0x1811c408 0x004>, 1698c2ecf20Sopenharmony_ci <0x180273a0 0x01c>; 1708c2ecf20Sopenharmony_ci reg-names = "mspi_regs", "bspi_regs", "intr_regs", "intr_status_reg"; 1718c2ecf20Sopenharmony_ci interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>, 1728c2ecf20Sopenharmony_ci <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>, 1738c2ecf20Sopenharmony_ci <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>, 1748c2ecf20Sopenharmony_ci <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>, 1758c2ecf20Sopenharmony_ci <GIC_SPI 76 IRQ_TYPE_LEVEL_HIGH>, 1768c2ecf20Sopenharmony_ci <GIC_SPI 77 IRQ_TYPE_LEVEL_HIGH>, 1778c2ecf20Sopenharmony_ci <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>; 1788c2ecf20Sopenharmony_ci interrupt-names = 1798c2ecf20Sopenharmony_ci "spi_lr_fullness_reached", 1808c2ecf20Sopenharmony_ci "spi_lr_session_aborted", 1818c2ecf20Sopenharmony_ci "spi_lr_impatient", 1828c2ecf20Sopenharmony_ci "spi_lr_session_done", 1838c2ecf20Sopenharmony_ci "mspi_done", 1848c2ecf20Sopenharmony_ci "mspi_halted"; 1858c2ecf20Sopenharmony_ci clocks = <&iprocmed>; 1868c2ecf20Sopenharmony_ci clock-names = "iprocmed"; 1878c2ecf20Sopenharmony_ci num-cs = <2>; 1888c2ecf20Sopenharmony_ci #address-cells = <1>; 1898c2ecf20Sopenharmony_ci #size-cells = <0>; 1908c2ecf20Sopenharmony_ci }; 1918c2ecf20Sopenharmony_ci 1928c2ecf20Sopenharmony_ci 1938c2ecf20Sopenharmony_ci NS2 SoC Example: 1948c2ecf20Sopenharmony_ci 1958c2ecf20Sopenharmony_ci qspi: spi@66470200 { 1968c2ecf20Sopenharmony_ci compatible = "brcm,spi-ns2-qspi", "brcm,spi-bcm-qspi"; 1978c2ecf20Sopenharmony_ci reg = <0x66470200 0x184>, 1988c2ecf20Sopenharmony_ci <0x66470000 0x124>, 1998c2ecf20Sopenharmony_ci <0x67017408 0x004>, 2008c2ecf20Sopenharmony_ci <0x664703a0 0x01c>; 2018c2ecf20Sopenharmony_ci reg-names = "mspi", "bspi", "intr_regs", 2028c2ecf20Sopenharmony_ci "intr_status_reg"; 2038c2ecf20Sopenharmony_ci interrupts = <GIC_SPI 419 IRQ_TYPE_LEVEL_HIGH>; 2048c2ecf20Sopenharmony_ci interrupt-names = "spi_l1_intr"; 2058c2ecf20Sopenharmony_ci clocks = <&iprocmed>; 2068c2ecf20Sopenharmony_ci clock-names = "iprocmed"; 2078c2ecf20Sopenharmony_ci num-cs = <2>; 2088c2ecf20Sopenharmony_ci #address-cells = <1>; 2098c2ecf20Sopenharmony_ci #size-cells = <0>; 2108c2ecf20Sopenharmony_ci }; 2118c2ecf20Sopenharmony_ci 2128c2ecf20Sopenharmony_ci 2138c2ecf20Sopenharmony_ci m25p80 node for NSP, NS2 2148c2ecf20Sopenharmony_ci 2158c2ecf20Sopenharmony_ci &qspi { 2168c2ecf20Sopenharmony_ci flash: m25p80@0 { 2178c2ecf20Sopenharmony_ci #address-cells = <1>; 2188c2ecf20Sopenharmony_ci #size-cells = <1>; 2198c2ecf20Sopenharmony_ci compatible = "m25p80"; 2208c2ecf20Sopenharmony_ci reg = <0x0>; 2218c2ecf20Sopenharmony_ci spi-max-frequency = <12500000>; 2228c2ecf20Sopenharmony_ci m25p,fast-read; 2238c2ecf20Sopenharmony_ci spi-cpol; 2248c2ecf20Sopenharmony_ci spi-cpha; 2258c2ecf20Sopenharmony_ci 2268c2ecf20Sopenharmony_ci partition@0 { 2278c2ecf20Sopenharmony_ci label = "boot"; 2288c2ecf20Sopenharmony_ci reg = <0x00000000 0x000a0000>; 2298c2ecf20Sopenharmony_ci }; 2308c2ecf20Sopenharmony_ci 2318c2ecf20Sopenharmony_ci partition@a0000 { 2328c2ecf20Sopenharmony_ci label = "env"; 2338c2ecf20Sopenharmony_ci reg = <0x000a0000 0x00060000>; 2348c2ecf20Sopenharmony_ci }; 2358c2ecf20Sopenharmony_ci 2368c2ecf20Sopenharmony_ci partition@100000 { 2378c2ecf20Sopenharmony_ci label = "system"; 2388c2ecf20Sopenharmony_ci reg = <0x00100000 0x00600000>; 2398c2ecf20Sopenharmony_ci }; 2408c2ecf20Sopenharmony_ci 2418c2ecf20Sopenharmony_ci partition@700000 { 2428c2ecf20Sopenharmony_ci label = "rootfs"; 2438c2ecf20Sopenharmony_ci reg = <0x00700000 0x01900000>; 2448c2ecf20Sopenharmony_ci }; 2458c2ecf20Sopenharmony_ci }; 246