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