1c66ec88fSEmmanuel VadotBroadcom SPI controller 2c66ec88fSEmmanuel Vadot 3c66ec88fSEmmanuel VadotThe Broadcom SPI controller is a SPI master found on various SOCs, including 4c66ec88fSEmmanuel VadotBRCMSTB (BCM7XXX), Cygnus, NSP and NS2. The Broadcom Master SPI hw IP consits 5c66ec88fSEmmanuel Vadotof : 6c66ec88fSEmmanuel Vadot MSPI : SPI master controller can read and write to a SPI slave device 7c66ec88fSEmmanuel Vadot BSPI : Broadcom SPI in combination with the MSPI hw IP provides acceleration 8c66ec88fSEmmanuel Vadot for flash reads and be configured to do single, double, quad lane 9c66ec88fSEmmanuel Vadot io with 3-byte and 4-byte addressing support. 10c66ec88fSEmmanuel Vadot 11c66ec88fSEmmanuel Vadot Supported Broadcom SoCs have one instance of MSPI+BSPI controller IP. 12c66ec88fSEmmanuel Vadot MSPI master can be used wihout BSPI. BRCMSTB SoCs have an additional instance 13c66ec88fSEmmanuel Vadot of a MSPI master without the BSPI to use with non flash slave devices that 14c66ec88fSEmmanuel Vadot use SPI protocol. 15c66ec88fSEmmanuel Vadot 16c66ec88fSEmmanuel VadotRequired properties: 17c66ec88fSEmmanuel Vadot 18c66ec88fSEmmanuel Vadot- #address-cells: 19c66ec88fSEmmanuel Vadot Must be <1>, as required by generic SPI binding. 20c66ec88fSEmmanuel Vadot 21c66ec88fSEmmanuel Vadot- #size-cells: 22c66ec88fSEmmanuel Vadot Must be <0>, also as required by generic SPI binding. 23c66ec88fSEmmanuel Vadot 24c66ec88fSEmmanuel Vadot- compatible: 25c66ec88fSEmmanuel Vadot Must be one of : 26c66ec88fSEmmanuel Vadot "brcm,spi-brcmstb-qspi", "brcm,spi-bcm-qspi" : MSPI+BSPI on BRCMSTB SoCs 27c66ec88fSEmmanuel Vadot "brcm,spi-brcmstb-mspi", "brcm,spi-bcm-qspi" : Second Instance of MSPI 28c66ec88fSEmmanuel Vadot BRCMSTB SoCs 29c66ec88fSEmmanuel Vadot "brcm,spi-bcm7425-qspi", "brcm,spi-bcm-qspi", "brcm,spi-brcmstb-mspi" : Second Instance of MSPI 30c66ec88fSEmmanuel Vadot BRCMSTB SoCs 31c66ec88fSEmmanuel Vadot "brcm,spi-bcm7429-qspi", "brcm,spi-bcm-qspi", "brcm,spi-brcmstb-mspi" : Second Instance of MSPI 32c66ec88fSEmmanuel Vadot BRCMSTB SoCs 33c66ec88fSEmmanuel Vadot "brcm,spi-bcm7435-qspi", "brcm,spi-bcm-qspi", "brcm,spi-brcmstb-mspi" : Second Instance of MSPI 34c66ec88fSEmmanuel Vadot BRCMSTB SoCs 35*6be33864SEmmanuel Vadot "brcm,spi-bcm7445-qspi", "brcm,spi-bcm-qspi", "brcm,spi-brcmstb-mspi" : Second Instance of MSPI 36*6be33864SEmmanuel Vadot BRCMSTB SoCs 37c66ec88fSEmmanuel Vadot "brcm,spi-bcm7216-qspi", "brcm,spi-bcm-qspi", "brcm,spi-brcmstb-mspi" : Second Instance of MSPI 38c66ec88fSEmmanuel Vadot BRCMSTB SoCs 39c66ec88fSEmmanuel Vadot "brcm,spi-bcm7278-qspi", "brcm,spi-bcm-qspi", "brcm,spi-brcmstb-mspi" : Second Instance of MSPI 40c66ec88fSEmmanuel Vadot BRCMSTB SoCs 41c66ec88fSEmmanuel Vadot "brcm,spi-nsp-qspi", "brcm,spi-bcm-qspi" : MSPI+BSPI on Cygnus, NSP 42c66ec88fSEmmanuel Vadot "brcm,spi-ns2-qspi", "brcm,spi-bcm-qspi" : NS2 SoCs 43c66ec88fSEmmanuel Vadot 44c66ec88fSEmmanuel Vadot- reg: 45c66ec88fSEmmanuel Vadot Define the bases and ranges of the associated I/O address spaces. 46c66ec88fSEmmanuel Vadot The required range is MSPI controller registers. 47c66ec88fSEmmanuel Vadot 48c66ec88fSEmmanuel Vadot- reg-names: 49c66ec88fSEmmanuel Vadot First name does not matter, but must be reserved for the MSPI controller 50c66ec88fSEmmanuel Vadot register range as mentioned in 'reg' above, and will typically contain 51c66ec88fSEmmanuel Vadot - "bspi_regs": BSPI register range, not required with compatible 52c66ec88fSEmmanuel Vadot "spi-brcmstb-mspi" 53c66ec88fSEmmanuel Vadot - "mspi_regs": MSPI register range is required for compatible strings 54c66ec88fSEmmanuel Vadot - "intr_regs", "intr_status_reg" : Interrupt and status register for 55c66ec88fSEmmanuel Vadot NSP, NS2, Cygnus SoC 56c66ec88fSEmmanuel Vadot 57c66ec88fSEmmanuel Vadot- interrupts 58c66ec88fSEmmanuel Vadot The interrupts used by the MSPI and/or BSPI controller. 59c66ec88fSEmmanuel Vadot 60c66ec88fSEmmanuel Vadot- interrupt-names: 61c66ec88fSEmmanuel Vadot Names of interrupts associated with MSPI 62c66ec88fSEmmanuel Vadot - "mspi_halted" : 63c66ec88fSEmmanuel Vadot - "mspi_done": Indicates that the requested SPI operation is complete. 64c66ec88fSEmmanuel Vadot - "spi_lr_fullness_reached" : Linear read BSPI pipe full 65c66ec88fSEmmanuel Vadot - "spi_lr_session_aborted" : Linear read BSPI pipe aborted 66c66ec88fSEmmanuel Vadot - "spi_lr_impatient" : Linear read BSPI requested when pipe empty 67c66ec88fSEmmanuel Vadot - "spi_lr_session_done" : Linear read BSPI session done 68c66ec88fSEmmanuel Vadot 69c66ec88fSEmmanuel Vadot- clocks: 70c66ec88fSEmmanuel Vadot A phandle to the reference clock for this block. 71c66ec88fSEmmanuel Vadot 72c66ec88fSEmmanuel VadotOptional properties: 73c66ec88fSEmmanuel Vadot 74c66ec88fSEmmanuel Vadot 75c66ec88fSEmmanuel Vadot- native-endian 76c66ec88fSEmmanuel Vadot Defined when using BE SoC and device uses BE register read/write 77c66ec88fSEmmanuel Vadot 78c66ec88fSEmmanuel VadotRecommended optional m25p80 properties: 79c66ec88fSEmmanuel Vadot- spi-rx-bus-width: Definition as per 80c66ec88fSEmmanuel Vadot Documentation/devicetree/bindings/spi/spi-bus.txt 81c66ec88fSEmmanuel Vadot 82c66ec88fSEmmanuel VadotExamples: 83c66ec88fSEmmanuel Vadot 84c66ec88fSEmmanuel VadotBRCMSTB SoC Example: 85c66ec88fSEmmanuel Vadot 86c66ec88fSEmmanuel Vadot SPI Master (MSPI+BSPI) for SPI-NOR access: 87c66ec88fSEmmanuel Vadot 88c66ec88fSEmmanuel Vadot spi@f03e3400 { 89c66ec88fSEmmanuel Vadot #address-cells = <0x1>; 90c66ec88fSEmmanuel Vadot #size-cells = <0x0>; 91c66ec88fSEmmanuel Vadot compatible = "brcm,spi-brcmstb-qspi", "brcm,spi-bcm-qspi"; 92c66ec88fSEmmanuel Vadot reg = <0xf03e0920 0x4 0xf03e3400 0x188 0xf03e3200 0x50>; 93c66ec88fSEmmanuel Vadot reg-names = "cs_reg", "mspi", "bspi"; 94c66ec88fSEmmanuel Vadot interrupts = <0x6 0x5 0x4 0x3 0x2 0x1 0x0>; 95c66ec88fSEmmanuel Vadot interrupt-parent = <0x1c>; 96c66ec88fSEmmanuel Vadot interrupt-names = "mspi_halted", 97c66ec88fSEmmanuel Vadot "mspi_done", 98c66ec88fSEmmanuel Vadot "spi_lr_overread", 99c66ec88fSEmmanuel Vadot "spi_lr_session_done", 100c66ec88fSEmmanuel Vadot "spi_lr_impatient", 101c66ec88fSEmmanuel Vadot "spi_lr_session_aborted", 102c66ec88fSEmmanuel Vadot "spi_lr_fullness_reached"; 103c66ec88fSEmmanuel Vadot 104c66ec88fSEmmanuel Vadot clocks = <&hif_spi>; 105c66ec88fSEmmanuel Vadot clock-names = "sw_spi"; 106c66ec88fSEmmanuel Vadot 107c66ec88fSEmmanuel Vadot m25p80@0 { 108c66ec88fSEmmanuel Vadot #size-cells = <0x2>; 109c66ec88fSEmmanuel Vadot #address-cells = <0x2>; 110c66ec88fSEmmanuel Vadot compatible = "m25p80"; 111c66ec88fSEmmanuel Vadot reg = <0x0>; 112c66ec88fSEmmanuel Vadot spi-max-frequency = <0x2625a00>; 113c66ec88fSEmmanuel Vadot spi-cpol; 114c66ec88fSEmmanuel Vadot spi-cpha; 115c66ec88fSEmmanuel Vadot m25p,fast-read; 116c66ec88fSEmmanuel Vadot 117c66ec88fSEmmanuel Vadot flash0.bolt@0 { 118c66ec88fSEmmanuel Vadot reg = <0x0 0x0 0x0 0x100000>; 119c66ec88fSEmmanuel Vadot }; 120c66ec88fSEmmanuel Vadot 121c66ec88fSEmmanuel Vadot flash0.macadr@100000 { 122c66ec88fSEmmanuel Vadot reg = <0x0 0x100000 0x0 0x10000>; 123c66ec88fSEmmanuel Vadot }; 124c66ec88fSEmmanuel Vadot 125c66ec88fSEmmanuel Vadot flash0.nvram@110000 { 126c66ec88fSEmmanuel Vadot reg = <0x0 0x110000 0x0 0x10000>; 127c66ec88fSEmmanuel Vadot }; 128c66ec88fSEmmanuel Vadot 129c66ec88fSEmmanuel Vadot flash0.kernel@120000 { 130c66ec88fSEmmanuel Vadot reg = <0x0 0x120000 0x0 0x400000>; 131c66ec88fSEmmanuel Vadot }; 132c66ec88fSEmmanuel Vadot 133c66ec88fSEmmanuel Vadot flash0.devtree@520000 { 134c66ec88fSEmmanuel Vadot reg = <0x0 0x520000 0x0 0x10000>; 135c66ec88fSEmmanuel Vadot }; 136c66ec88fSEmmanuel Vadot 137c66ec88fSEmmanuel Vadot flash0.splash@530000 { 138c66ec88fSEmmanuel Vadot reg = <0x0 0x530000 0x0 0x80000>; 139c66ec88fSEmmanuel Vadot }; 140c66ec88fSEmmanuel Vadot 141c66ec88fSEmmanuel Vadot flash0@0 { 142c66ec88fSEmmanuel Vadot reg = <0x0 0x0 0x0 0x4000000>; 143c66ec88fSEmmanuel Vadot }; 144c66ec88fSEmmanuel Vadot }; 145c66ec88fSEmmanuel Vadot }; 146c66ec88fSEmmanuel Vadot 147c66ec88fSEmmanuel Vadot 148c66ec88fSEmmanuel Vadot MSPI master for any SPI device : 149c66ec88fSEmmanuel Vadot 150c66ec88fSEmmanuel Vadot spi@f0416000 { 151c66ec88fSEmmanuel Vadot #address-cells = <1>; 152c66ec88fSEmmanuel Vadot #size-cells = <0>; 153c66ec88fSEmmanuel Vadot clocks = <&upg_fixed>; 154c66ec88fSEmmanuel Vadot compatible = "brcm,spi-brcmstb-mspi", "brcm,spi-bcm-qspi"; 155c66ec88fSEmmanuel Vadot reg = <0xf0416000 0x180>; 156c66ec88fSEmmanuel Vadot reg-names = "mspi"; 157c66ec88fSEmmanuel Vadot interrupts = <0x14>; 158c66ec88fSEmmanuel Vadot interrupt-parent = <&irq0_aon_intc>; 159c66ec88fSEmmanuel Vadot interrupt-names = "mspi_done"; 160c66ec88fSEmmanuel Vadot }; 161c66ec88fSEmmanuel Vadot 162c66ec88fSEmmanuel VadotiProc SoC Example: 163c66ec88fSEmmanuel Vadot 164c66ec88fSEmmanuel Vadot qspi: spi@18027200 { 165c66ec88fSEmmanuel Vadot compatible = "brcm,spi-nsp-qspi", "brcm,spi-bcm-qspi"; 166c66ec88fSEmmanuel Vadot reg = <0x18027200 0x184>, 167c66ec88fSEmmanuel Vadot <0x18027000 0x124>, 168c66ec88fSEmmanuel Vadot <0x1811c408 0x004>, 169c66ec88fSEmmanuel Vadot <0x180273a0 0x01c>; 170c66ec88fSEmmanuel Vadot reg-names = "mspi_regs", "bspi_regs", "intr_regs", "intr_status_reg"; 171c66ec88fSEmmanuel Vadot interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>, 172c66ec88fSEmmanuel Vadot <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>, 173c66ec88fSEmmanuel Vadot <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>, 174c66ec88fSEmmanuel Vadot <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>, 175c66ec88fSEmmanuel Vadot <GIC_SPI 76 IRQ_TYPE_LEVEL_HIGH>, 176c66ec88fSEmmanuel Vadot <GIC_SPI 77 IRQ_TYPE_LEVEL_HIGH>, 177c66ec88fSEmmanuel Vadot <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>; 178c66ec88fSEmmanuel Vadot interrupt-names = 179c66ec88fSEmmanuel Vadot "spi_lr_fullness_reached", 180c66ec88fSEmmanuel Vadot "spi_lr_session_aborted", 181c66ec88fSEmmanuel Vadot "spi_lr_impatient", 182c66ec88fSEmmanuel Vadot "spi_lr_session_done", 183c66ec88fSEmmanuel Vadot "mspi_done", 184c66ec88fSEmmanuel Vadot "mspi_halted"; 185c66ec88fSEmmanuel Vadot clocks = <&iprocmed>; 186c66ec88fSEmmanuel Vadot clock-names = "iprocmed"; 187c66ec88fSEmmanuel Vadot num-cs = <2>; 188c66ec88fSEmmanuel Vadot #address-cells = <1>; 189c66ec88fSEmmanuel Vadot #size-cells = <0>; 190c66ec88fSEmmanuel Vadot }; 191c66ec88fSEmmanuel Vadot 192c66ec88fSEmmanuel Vadot 193c66ec88fSEmmanuel Vadot NS2 SoC Example: 194c66ec88fSEmmanuel Vadot 195c66ec88fSEmmanuel Vadot qspi: spi@66470200 { 196c66ec88fSEmmanuel Vadot compatible = "brcm,spi-ns2-qspi", "brcm,spi-bcm-qspi"; 197c66ec88fSEmmanuel Vadot reg = <0x66470200 0x184>, 198c66ec88fSEmmanuel Vadot <0x66470000 0x124>, 199c66ec88fSEmmanuel Vadot <0x67017408 0x004>, 200c66ec88fSEmmanuel Vadot <0x664703a0 0x01c>; 201c66ec88fSEmmanuel Vadot reg-names = "mspi", "bspi", "intr_regs", 202c66ec88fSEmmanuel Vadot "intr_status_reg"; 203c66ec88fSEmmanuel Vadot interrupts = <GIC_SPI 419 IRQ_TYPE_LEVEL_HIGH>; 204c66ec88fSEmmanuel Vadot interrupt-names = "spi_l1_intr"; 205c66ec88fSEmmanuel Vadot clocks = <&iprocmed>; 206c66ec88fSEmmanuel Vadot clock-names = "iprocmed"; 207c66ec88fSEmmanuel Vadot num-cs = <2>; 208c66ec88fSEmmanuel Vadot #address-cells = <1>; 209c66ec88fSEmmanuel Vadot #size-cells = <0>; 210c66ec88fSEmmanuel Vadot }; 211c66ec88fSEmmanuel Vadot 212c66ec88fSEmmanuel Vadot 213c66ec88fSEmmanuel Vadot m25p80 node for NSP, NS2 214c66ec88fSEmmanuel Vadot 215c66ec88fSEmmanuel Vadot &qspi { 216c66ec88fSEmmanuel Vadot flash: m25p80@0 { 217c66ec88fSEmmanuel Vadot #address-cells = <1>; 218c66ec88fSEmmanuel Vadot #size-cells = <1>; 219c66ec88fSEmmanuel Vadot compatible = "m25p80"; 220c66ec88fSEmmanuel Vadot reg = <0x0>; 221c66ec88fSEmmanuel Vadot spi-max-frequency = <12500000>; 222c66ec88fSEmmanuel Vadot m25p,fast-read; 223c66ec88fSEmmanuel Vadot spi-cpol; 224c66ec88fSEmmanuel Vadot spi-cpha; 225c66ec88fSEmmanuel Vadot 226c66ec88fSEmmanuel Vadot partition@0 { 227c66ec88fSEmmanuel Vadot label = "boot"; 228c66ec88fSEmmanuel Vadot reg = <0x00000000 0x000a0000>; 229c66ec88fSEmmanuel Vadot }; 230c66ec88fSEmmanuel Vadot 231c66ec88fSEmmanuel Vadot partition@a0000 { 232c66ec88fSEmmanuel Vadot label = "env"; 233c66ec88fSEmmanuel Vadot reg = <0x000a0000 0x00060000>; 234c66ec88fSEmmanuel Vadot }; 235c66ec88fSEmmanuel Vadot 236c66ec88fSEmmanuel Vadot partition@100000 { 237c66ec88fSEmmanuel Vadot label = "system"; 238c66ec88fSEmmanuel Vadot reg = <0x00100000 0x00600000>; 239c66ec88fSEmmanuel Vadot }; 240c66ec88fSEmmanuel Vadot 241c66ec88fSEmmanuel Vadot partition@700000 { 242c66ec88fSEmmanuel Vadot label = "rootfs"; 243c66ec88fSEmmanuel Vadot reg = <0x00700000 0x01900000>; 244c66ec88fSEmmanuel Vadot }; 245c66ec88fSEmmanuel Vadot }; 246