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