Kernel-4.18.0-80.el8_brcm,spi-bcm-qspi

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 = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>,
         <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>,
         <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>,
         <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>,
         <GIC_SPI 76 IRQ_TYPE_LEVEL_HIGH>,
         <GIC_SPI 77 IRQ_TYPE_LEVEL_HIGH>,
         <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>;
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 = <GIC_SPI 419 IRQ_TYPE_LEVEL_HIGH>;
           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>;
          };
};