Broadcom SPI controller The Broadcom SPI controller is a SPI master found on various SOCs, including BRCMSTB (BCM7XXX), Cygnus, NSP and NS2. The Broadcom Master SPI hw IP consits of : MSPI : SPI master controller can read and write to a SPI slave device BSPI : Broadcom SPI in combination with the MSPI hw IP provides acceleration for flash reads and be configured to do single, double, quad lane io with 3-byte and 4-byte addressing support. Supported Broadcom SoCs have one instance of MSPI+BSPI controller IP. MSPI master can be used wihout BSPI. BRCMSTB SoCs have an additional instance of a MSPI master without the BSPI to use with non flash slave devices that use SPI protocol. Required properties: - #address-cells: Must be <1>, as required by generic SPI binding. - #size-cells: Must be <0>, also as required by generic SPI binding. - compatible: Must be one of : "brcm,spi-bcm-qspi", "brcm,spi-brcmstb-qspi" : MSPI+BSPI on BRCMSTB SoCs "brcm,spi-bcm-qspi", "brcm,spi-brcmstb-mspi" : Second Instance of MSPI BRCMSTB SoCs "brcm,spi-bcm-qspi", "brcm,spi-nsp-qspi" : MSPI+BSPI on Cygnus, NSP "brcm,spi-bcm-qspi", "brcm,spi-ns2-qspi" : NS2 SoCs - reg: Define the bases and ranges of the associated I/O address spaces. The required range is MSPI controller registers. - reg-names: First name does not matter, but must be reserved for the MSPI controller register range as mentioned in 'reg' above, and will typically contain - "bspi_regs": BSPI register range, not required with compatible "spi-brcmstb-mspi" - "mspi_regs": MSPI register range is required for compatible strings - "intr_regs", "intr_status_reg" : Interrupt and status register for NSP, NS2, Cygnus SoC - interrupts The interrupts used by the MSPI and/or BSPI controller. - interrupt-names: Names of interrupts associated with MSPI - "mspi_halted" : - "mspi_done": Indicates that the requested SPI operation is complete. - "spi_lr_fullness_reached" : Linear read BSPI pipe full - "spi_lr_session_aborted" : Linear read BSPI pipe aborted - "spi_lr_impatient" : Linear read BSPI requested when pipe empty - "spi_lr_session_done" : Linear read BSPI session done - clocks: A phandle to the reference clock for this block. Optional properties: - native-endian Defined when using BE SoC and device uses BE register read/write Recommended optional m25p80 properties: - spi-rx-bus-width: Definition as per Documentation/devicetree/bindings/spi/spi-bus.txt Examples: BRCMSTB SoC Example: SPI Master (MSPI+BSPI) for SPI-NOR access: spi@f03e3400 { #address-cells = <0x1>; #size-cells = <0x0>; compatible = "brcm,spi-brcmstb-qspi", "brcm,spi-brcmstb-qspi"; reg = <0xf03e0920 0x4 0xf03e3400 0x188 0xf03e3200 0x50>; reg-names = "cs_reg", "mspi", "bspi"; interrupts = <0x6 0x5 0x4 0x3 0x2 0x1 0x0>; interrupt-parent = <0x1c>; interrupt-names = "mspi_halted", "mspi_done", "spi_lr_overread", "spi_lr_session_done", "spi_lr_impatient", "spi_lr_session_aborted", "spi_lr_fullness_reached"; clocks = <&hif_spi>; clock-names = "sw_spi"; m25p80@0 { #size-cells = <0x2>; #address-cells = <0x2>; compatible = "m25p80"; reg = <0x0>; spi-max-frequency = <0x2625a00>; spi-cpol; spi-cpha; m25p,fast-read; flash0.bolt@0 { reg = <0x0 0x0 0x0 0x100000>; }; flash0.macadr@100000 { reg = <0x0 0x100000 0x0 0x10000>; }; flash0.nvram@110000 { reg = <0x0 0x110000 0x0 0x10000>; }; flash0.kernel@120000 { reg = <0x0 0x120000 0x0 0x400000>; }; flash0.devtree@520000 { reg = <0x0 0x520000 0x0 0x10000>; }; flash0.splash@530000 { reg = <0x0 0x530000 0x0 0x80000>; }; flash0@0 { reg = <0x0 0x0 0x0 0x4000000>; }; }; }; MSPI master for any SPI device : spi@f0416000 { #address-cells = <1>; #size-cells = <0>; clocks = <&upg_fixed>; compatible = "brcm,spi-brcmstb-qspi", "brcm,spi-brcmstb-mspi"; reg = <0xf0416000 0x180>; reg-names = "mspi"; interrupts = <0x14>; interrupt-parent = <&irq0_aon_intc>; interrupt-names = "mspi_done"; }; iProc SoC Example: qspi: spi@18027200 { compatible = "brcm,spi-bcm-qspi", "brcm,spi-nsp-qspi"; reg = <0x18027200 0x184>, <0x18027000 0x124>, <0x1811c408 0x004>, <0x180273a0 0x01c>; reg-names = "mspi_regs", "bspi_regs", "intr_regs", "intr_status_reg"; interrupts = , , , , , , ; interrupt-names = "spi_lr_fullness_reached", "spi_lr_session_aborted", "spi_lr_impatient", "spi_lr_session_done", "mspi_done", "mspi_halted"; clocks = <&iprocmed>; clock-names = "iprocmed"; num-cs = <2>; #address-cells = <1>; #size-cells = <0>; }; NS2 SoC Example: qspi: spi@66470200 { compatible = "brcm,spi-bcm-qspi", "brcm,spi-ns2-qspi"; reg = <0x66470200 0x184>, <0x66470000 0x124>, <0x67017408 0x004>, <0x664703a0 0x01c>; reg-names = "mspi", "bspi", "intr_regs", "intr_status_reg"; interrupts = ; interrupt-names = "spi_l1_intr"; clocks = <&iprocmed>; clock-names = "iprocmed"; num-cs = <2>; #address-cells = <1>; #size-cells = <0>; }; m25p80 node for NSP, NS2 &qspi { flash: m25p80@0 { #address-cells = <1>; #size-cells = <1>; compatible = "m25p80"; reg = <0x0>; spi-max-frequency = <12500000>; m25p,fast-read; spi-cpol; spi-cpha; partition@0 { label = "boot"; reg = <0x00000000 0x000a0000>; }; partition@a0000 { label = "env"; reg = <0x000a0000 0x00060000>; }; partition@100000 { label = "system"; reg = <0x00100000 0x00600000>; }; partition@700000 { label = "rootfs"; reg = <0x00700000 0x01900000>; }; };